変動値の従う分布(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  
  • 図は下。

f:id:denovor:20210117131603p:plain

  • 平均、標準偏差は以前に計算した結論と矛盾しない。

denovor.hatenablog.com

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)

f:id:denovor:20210118074333p:plain

  • ピークや裾での当てはまりはそれほど良くない。