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使うのが一番簡単そう。なので、使ったうえで、パラメータの挙動諸々を確認してみる。

使用データ

ドル円の対数リターンを使います。 f:id:iiiiikamirin:20220209091712p:plain

実際のコード

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()

f:id:iiiiikamirin:20220209101149p:plain

stats.modelのドキュメントを見ながら、パラメータなどについて確認してみます。主だったパラメータは以下の通りだと思います。

  • dist:比較する分布(正規分布など)
  • distargs:比較する分布作成のためのパラメータ
  • fit:与えられた分布を平均や標準偏差で正規化するか

不変分散を基に母集団について検定するので、設定する分布は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()

f:id:iiiiikamirin:20220219132423p:plain

最後に作成したプロットを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)

f:id:iiiiikamirin:20220219131648p:plain

こうみると、上も(正規分布に属しているなら)もっと小さな値で上位数パーセントの数値が出てくるところを、より大きな値で上位数パーセントが出てしまっている=右側の裾があつい、と解釈。下側も同様に解釈して左右の裾が正規分布と比較してあつくなっていることをわかりやすく表せました。

ドル円以外でもQ-Qプロットを作成してみる

ドル円以外はどうなのでしょう??TPXは下落の方が裾が大きくなっているみたいだけど、SPXはそんなことなさそう。(下落時の方が値幅は大きくなりそうなので、SPXの結果は意外)。為替はドル円は左右でそんなに変わらないけどEURUSDは上昇の方が大きいのが意外。リスクオフではドル買いでは。債券は米債欧州債ともに売られる方が値幅大きくて違和感なしって感じ。 f:id:iiiiikamirin:20220209111755p:plain f:id:iiiiikamirin:20220209111821p:plain

最後に

QQプロットをとりあえず作成するなら一瞬だけど、色々確認するとまだ勉強不足で時間かかりますな。