ランダムウォークの歪度と計算期間の関係

ランダムウォークの歪度は0のはずだが…

ランダムウォークの歪度と計算期間の関係を調べてみる。ところで、ランダムウォークは正規分布に従っており、歪度は0のはずである。しかし、乱数を使っていることにより、歪度がちょうど0になることはほとんどない。

歪度は計算期間の平方根に反比例

平均は計算期間に比例し、標準偏差は計算期間の平方根に比例することが知られている。私は経験的に歪度は計算期間の平方根に反比例しているように予想していた。そこで

歪度の予測値 = 基準となる計算期間の歪度 / sqrt(計算期間 / 基準となる計算期間)

として歪度の予測値を求め、実際の歪度と比較してみた。

手順としては先ず平均=0、標準偏差=0.0001、歪度=100に従う乱数で5分足データを1年分作成した。歪度が0だと小さすぎて比較しにくいかもしれないと考えた。そこで、あえて100という極端に大きい数値を指定した。

次に計算期間ごとの歪度とその予測値を求めてグラフにした。

実測値と予測値はほぼ一致しているように思われる。本来なら数学的に証明すべきだろうが、とりあえずランダムウォークの歪度は計算期間の平方根に反比例すると考えてよさそうだ。

サンプルプログラム

①以下のコマンドを端末にコピー&ペーストして「Enter」キーを押す。

%run -t ~/py/make_randomwalk_data.py --mean 0.0 --std 0.0001 --skew 100.0

②以下のコマンドをSpyderの「IPython console」にコピー&ペーストして「Enter」キーを2回押す。

import forex_system as fs
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
from datetime import datetime

fs.remove_temp_folder()

start = datetime.strptime('2016.01.01 00:00', '%Y.%m.%d %H:%M')
end = datetime.strptime('2016.12.31 23:59', '%Y.%m.%d %H:%M')
period = np.array(range(5, 55, 5))
skew = np.empty(10)

for i in range(10):
    ret = fs.i_log_return('RANDOM', 5, period[i], 0)[start:end]
    skew[i] = stats.skew(ret)

pred = skew[0] / np.sqrt(period / period[0])

plt.plot(period, skew, label='skew')
plt.plot(period, pred, label='pred')
plt.title('Skew and Period')
plt.xlabel('Period')
plt.ylabel('Skew')
plt.legend()
plt.savefig('skew_and_period.png', format='png', dpi=150)
plt.show()

fs.remove_temp_folder()
(2017/02/01更新)