技術メモ

役に立てる技術的な何か、時々自分用の覚書。幅広く色々なことに興味があります。

為替相場の値動きにウィナー過程を仮定するのはダメかもしれない

為替相場の値動きに本当にウィナー過程を当てはめていいんだろうか。
簡単に調べられそうだったので、ドル円相場で少し調べてみた。
結果から言うと、正規分布っぽくなくねって結論が出てしまった。

ウィナー過程…確率過程W_tにおいてW_{t+s} - W_tが平均0分散sの正規分布に従うような確率過程

為替データの取得

pandas_datareader

というライブラリを使えば、Web上の色々な情報を取ってくることができるらしい。
便利。
ドル円(USD/JPY)相場をとってくるにはパラメータを"DEXJPUS"とするようだ。
pandas-datareaderで株価や人口のデータを取得 | nkmk log

from pandas_datareader import data
start = datetime(2010,1,1)
end = datetime(2017,1,1)
usdjpy = data.DataReader("DEXJPUS","fred",start,end)

分析

分析では、2010年1月1日から2017年1月1日までの1日間隔の値動きを使った。
欠損値は除外した上で、1日の差分が正規分布に従うかどうかについて調べた。
正規性の検定にはシャピロウィルク検定を用いた。
pythonで正規性の検定【コロモゴロフスミルノフ検定(KS検定)】 - 技術メモ

結果

下の図は、青い線がヒストグラムKDE*1を表し、黒い線が正規分布にフィッティングしたものを表す。
f:id:swdrsker:20170711053739p:plain
p値は
7.15e-24
となって、正規分布じゃなくねって結論が出た。

見た目では、正規分布に比べると中心と裾にかけて広くなっていくような分布っぽい。
1分足とか1時間足で使えるデータが簡単に見つからなかったのでやってないが、それらでも試してみたい。

コード

from pandas_datareader import data, wb
from datetime import datetime
from math import isnan
from scipy import stats
import matplotlib.pyplot as plt
import numpy as np
import seaborn as sns
sns.set_style("whitegrid")

start = datetime(2010,1,1)
end = datetime(2017,1,1)
usdjpy = data.DataReader("DEXJPUS","fred",start,end)

subs = zip(usdjpy["DEXJPUS"][:-1],usdjpy["DEXJPUS"][1:])
sublist = []
for i,j in subs:
    if isnan(i) or isnan(j):
        continue
    sublist.append(j - i)

print(stats.shapiro(sublist)[1])

sns.distplot(sublist,fit=stats.norm)
plt.title("dist of 2010-2017 USD/JPY price movement")
plt.show()