USD/JPYの為替変動率が正規分布に従うか確認してみる

ウォール街の物理学者

ウォール街の物理学者

為替変動率は正規分布に従うと以前読んだ「ウォール街の物理学者」に書かれていた気がするのですが、 実際にそうなのかPython, Pandas, Scipyを使って確認してみました。

www.m2j.co.jp

USD/JPYのヒストリカルデータを上記サイトからCSV形式でダウンロードしてきます。 文字コードがShit-JISになっているため、nkfUTF-8に変換しておきます。

nkf -w USDJPY.csv > USDJPY_w.csv

とりあえず2018年のチャートをJupyter Notebook上でプロットしてみます。

import pandas as pd
from matplotlib import pyplot as plt
import scipy.stats as stats

%matplotlib inline

df = pd.read_csv('USDJPY_w.csv', index_col='日付')
df.index = pd.to_datetime(df.index, format='%Y/%m/%d')
print(df['2018']['終値'].describe())
df['2018']['終値'].plot()

f:id:tx_driver:20181228223740p:plain

1月から4月までは円高基調ですが、その後は円安に転じていますね。

次に、変動率のヒストグラムを作成します。行間の変動率はpct_change()で求めることができます。

print(df.pct_change()['2018']['終値'].describe())
df.pct_change()['2018']['終値'].hist(bins=100)
count    257.000000
mean      -0.000037
std        0.004016
min       -0.010832
25%       -0.002305
50%       -0.000177
75%        0.002551
max        0.014240
Name: 終値, dtype: float64

f:id:tx_driver:20181228224055p:plain

見た目の印象ですが、概ね正規分布に従っているように思えます。 scipy.stat.probplot()でQ-Qプロットを作成してみます。

from matplotlib import pyplot as plt
stats.probplot(df.pct_change()['2018']['終値'], dist='norm', plot=plt)

f:id:tx_driver:20181228225900p:plain

プロットが一直線に並んでいればデータが観測値に従っているとみなせるそうです。 概ね直線に乗っているように思えます。

最後にscipy.stat.shapiro()でシャピロウィルク検定を実施してみます。

stats.shapiro(df.pct_change()['2018']['終値'])

# (W, p) = (0.9942488074302673, 0.43847721815109253)

p値>0.05となったので、データが正規分布に従っていないとはいえなさそうです。

付け焼き刃の統計知識で分析してみましたが、どうやら為替変動が正規分布に従うのは事実のようです。