変動値の従う分布(python)
- 結論まで一気に。
import pandas as pd import numpy as np from scipy import stats from matplotlib import pylab as plt import seaborn as sns sns.set() sns.set_style("darkgrid") import math import pymc3 as pm fx_data = pd.read_csv("/Users/ユーザー名/Documents/FX/foreign_exchange_historical_data/USDJPY/USDJPY_DAY.csv")#データの読み込み #pandasの計算は遅いので、全てnumpy配列に変換 opening = np.array(fx_data["opening"])#始値 high = np.array(fx_data["high"])#高値 low = np.array(fx_data["low"])#低音 closing = np.array(fx_data["closing"])#終値 co = closing - opening with pm.Model() as model_t: mu = pm.Uniform("mu", min(co), max(co)) sigma = pm.Uniform("sigma", 0, 20) nu = pm.Uniform("nu", 0, 100) y = pm.StudentT("y", mu = mu, sd = sigma, nu = nu, observed = co) trace_t = pm.sample(11000) chain_t = trace_t[1000:]
- pymc3のmodelでは平均、標準偏差、自由度ともに事前分布として一様分布を指定している。また、burn inも行っている。
- 結論は以下。
pm.summary(chain_t) mean sd hdi_3% hdi_97% mcse_mean mcse_sd ess_mean ess_sd \ mu 0.008 0.009 -0.009 0.025 0.000 0.000 14798.0 12565.0 sigma 0.421 0.010 0.403 0.439 0.000 0.000 10321.0 10314.0 nu 3.430 0.234 3.011 3.879 0.002 0.002 10575.0 10525.0 ess_bulk ess_tail r_hat mu 14798.0 12540.0 1.0 sigma 10331.0 13017.0 1.0 nu 10656.0 12559.0 1.0
- 図は下。
- 平均、標準偏差は以前に計算した結論と矛盾しない。
- もとのヒストグラムと重ねてみる。
mu_new = chain_t["mu"].mean() sigma_new = chain_t["sigma"].mean() nu_new = chain_t["nu"].mean() x = np.linspace(min(co), max(co), 1000) y_pred = stats.t.pdf(x, loc = mu_new, scale = sigma_new, df = nu_new) #まとめて選択 plt.plot(x, y_pred, lw = 2) plt.fill_between(x, 0, y_pred, color = "skyblue", linewidth = 2, edgecolor = "skyblue", alpha = 0.6) plt.hist(co, bins = 100, histtype = "stepfilled", alpha = 0.2, density = True, color = "blue", label = "co") plt.title("Student’s T sample") plt.xlim(min(co), max(co)) plt.legend(loc="upper left") plt.savefig("/Users/ユーザー名/Desktop/img002.png", dpi = 300)
- ピークや裾での当てはまりはそれほど良くない。