Q-Qプロット
株やら為替のリターンは、正規分布より裾が厚い分布になっているとなんとなく教えられてきたけど、本当にそうなの?と思って調べてみた。与えられた分布の正規性の確認方法は1.ヒストグラム2.Q-Qプロット3.検定(shapiro-wilk or kolmogorov-smirnov)のどれかみたいだけど、今回は2.Q-Qプロットをやってみる。
参考サイト
Q-Qプロットを理解するためPythonで描いてみる - Qiita
statsmodels.graphics.gofplots.qqplot — statsmodels
【Python】QQプロットとは?対数変換とは?|初心者向けに解説 | 月見ブログ
やってみた
statsmodels.api
内のqqplot
使うのが一番簡単そう。なので、使ったうえで、パラメータの挙動諸々を確認してみる。
使用データ
ドル円の対数リターンを使います。
実際のコード
Q-Qプロットなのでやっているのは「与えられた分布」と「設定した分布(正規分布など)」の分布が一致していそうかの確認。そのために、各分布上の点の分位数を算出し、一致するもの同士をプロットしていく。
とりあえず参考サイト上にあったコードをそのままコピペしてそれっぽく変数を変えてみます。このままでは、「ハア。。??」という感じではあるものの、上下に裾が大きくなっていそうなことは確認できる。
import statsmodels.api as sm import scipy.stats as stats id_ = "USDJPY Curncy" name = "log_chg" fig, ax = plt.subplots(1,1) sm.qqplot( df.loc[df.id == id_, name].dropna(), dist= stats.t, distargs=(4,), # 自由度 fit=True, line="45", ax = ax ) plt.show()
stats.modelのドキュメントを見ながら、パラメータなどについて確認してみます。主だったパラメータは以下の通りだと思います。
不変分散を基に母集団について検定するので、設定する分布はt分布ですね。ただ、サンプル数が5217と十分大きいので、ほぼ正規分布に一致しそうではある。
import statsmodels.api as sm import scipy.stats as stats id_ = "USDJPY Curncy" name = "log_chg" fig, ax = plt.subplots(1,1) sm.qqplot( data= df.loc[df.id == id_, name].dropna(), dist= stats.t, # 比較する分布 distargs=(len(df.loc[df.id == id_, name].dropna() - 1),), # distで設定した分布へのパラメータ(今回は自由度) fit=False, # dataをスケール line="s", ax = ax ) plt.show()
最後に作成したプロットをstatsmodel
を使わずに再現してみることで何しているのか確認してみる。いい感じに再現できているでしょう。サンプル数が5000くらい。
# Q-Qプロット手作成 # Q-Qプロット手作成 tmp = df.loc[df.id == id_, name] n=len(tmp) m=n+1 ii=np.arange(n)+1 # i=1~n qo=np.sort(tmp) qp=stats.norm.ppf( ii/m ) qpp=stats.norm.rvs( size= len(tmp), loc= tmp.mean(), scale= tmp.std(), ) # plot plt.plot(qp, np.sort(qpp)) plt.plot(qp,qo,'r*') plt.ylabel('Observed Quartile') plt.xlabel('Predicted Quartile') # # plt.savefig('qqplot.png',dpi=300)
こうみると、上も(正規分布に属しているなら)もっと小さな値で上位数パーセントの数値が出てくるところを、より大きな値で上位数パーセントが出てしまっている=右側の裾があつい、と解釈。下側も同様に解釈して左右の裾が正規分布と比較してあつくなっていることをわかりやすく表せました。
ドル円以外でもQ-Qプロットを作成してみる
ドル円以外はどうなのでしょう??TPXは下落の方が裾が大きくなっているみたいだけど、SPXはそんなことなさそう。(下落時の方が値幅は大きくなりそうなので、SPXの結果は意外)。為替はドル円は左右でそんなに変わらないけどEURUSDは上昇の方が大きいのが意外。リスクオフではドル買いでは。債券は米債欧州債ともに売られる方が値幅大きくて違和感なしって感じ。
最後に
QQプロットをとりあえず作成するなら一瞬だけど、色々確認するとまだ勉強不足で時間かかりますな。