日経平均HVを算出してみる

Python+金融 プロジェクト

今年も1年、お疲れ様でした。ということで、2017年の日経平均ボラティリティを計算してみようと思います。

スポンサーリンク

2017年の日経平均HVを算出する

まずは fred データベースから日経平均を取得します。ここまではいつもと同じ。

>>>import pandas as pd
>>>import pandas_datareader as web
>>>import numpy as np
>>>import matplotlib.pyplot as plt
>>>N225 = web.DataReader('NIKKEI225', 'fred', '2017').dropna()

前日比を算出したいので、dropna()でNaNデータを消しています。
次に、前日比を計算。

>>>dp = np.log(N225.NIKKEI225).diff()

これをもとに変動幅(HV:Historical Volatility)を算出します。

>>>HV = dp.std()
>>>HV
0.0073375301100961658

1日あたりのボラティリティではあまり意味がないので、年換算で変動幅を出します。
さきほどの式に市場の営業日数の平方根を掛けます。ちなみに、2017年の営業日数は247日だったみたいです。だいたい250の平方根を掛けておけば年率換算になるそうです。

>>>HV = (np.log(N225.NIKKEI225).diff()).std()*np.sqrt(len(N225))
>>>HV
0.11531833759117524

ということで、2017年のHV(ヒストリカルボラティリティ)は11.5%でした。

rolling分析でHVを算出してグラフにする

値動きが大きいと、ボラティリティが高くなるということを視覚的に理解するために、rolling分析で20営業日毎のHVをグラフにして表示したいと思います。
まずは先ほどと同じように前日比を算出します。

>>> import pandas as pd
>>> import pandas_datareader as web
>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> N225 = web.DataReader('NIKKEI225', 'fred', '2017').dropna()
>>> dp = np.log(N225.NIKKEI225).diff()

rolling 分析で、直近20日間の価格変動率を元に、年間の取引日を250日として年率を計算しています。

>>> HV = pd.Series.rolling(dp, window=20).std()*np.sqrt(250)

最後に、これをグラフに表示します。matplotlib難しいです。。。

>>> fig = plt.figure()
>>> ax1 = fig.add_subplot(2,1,1)
>>> ax2 = fig.add_subplot(2,1,2, sharex=ax1)
>>> ax1.plot(N225)
>>> ax2.plot(HV)
>>> plt.show()

まとめるとこんな感じです。
色々、数字をいじって実験してみようと思います。

#!/usr/bin/env python3
import pandas as pd
import pandas_datareader as web
import numpy as np
import matplotlib.pyplot as plt
 
N225 = web.DataReader('NIKKEI225', 'fred', '2017').dropna()
dp = np.log(N225.NIKKEI225).diff()
 
HV = pd.Series.rolling(dp, window=20).std()*np.sqrt(250)
fig = plt.figure()
ax1 = fig.add_subplot(2,1,1)
ax2 = fig.add_subplot(2,1,2, sharex=ax1)
ax1.plot(N225)
ax2.plot(HV)
plt.show()

スポンサーリンク

フォローする