統計・確率のお勉強

統計学を中心に色々勉強するブログ

<時系列データ分析>ボラティリティを見る〜Pythonと株価データを使ってお勉強〜

ボラティリティ

ちゃんと本を読むまでボラティリティ のことを単純に標準偏差だと思っていたが、どうやら定義がいくつかあるようだ。詳しくはないのでWikipediaから引用する。

金融工学においてボラティリティ(volatility)とは、広義には資産価格の変動の激しさを表すパラメータ。

ボラティリティ - Wikipedia

細かいところはWikiをみてください。

とりあえずの理解としては株価のバラツキ具合だと思うことにする。株価のバラツキが大きいということは投資した場合に株価の値上がりで儲ける可能性も高いが、逆に失う可能性も高い。つまりはリスクが大きいということになる。ボラティリティは銘柄の特徴を捉えるのに重要な指標の一つのようだ。

ヒストリカル・ボラティリティ

ここではヒストリカル・ボラティリティの定義を確認する。ヒストリカル・ボラティリティは価格の対数差収益率の標準偏差で定義される。

t 時点の株価を P_t とした時の t 時点での対数差収益率を r_t とする。

$$
r_t = \log P_t - \log P_{t-1} = \log \frac{P_t}{P_{t-1}}
$$

そのため、ヒストリカル・ボラティリティn 個の収益率データ \{r_1, r_2, \ldots, r_n \} が得られているとき

$$
s = \sqrt{\frac{1}{n-1}\sum_{i=1}^n (r_i - \bar{r})^2 }
$$

で推定される。

対数差収益率をプロットする

各銘柄の変動のしやすさを視覚的に見るために対数差収益率をプロットしてみよう。
今回も前回同様銘柄は

の4つで行く。

import matplotlib.pyplot as plt
import quandl
import numpy as np

# データをquandlから取得
df_quick = quandl.get('TSE/4318')  # Quick
df_hitachi = quandl.get('TSE/6501') # 日立製作所
df_takeda = quandl.get('TSE/4502')  #武田薬品工業
df_Nikkei = quandl.get('NIKKEI/INDEX')  # 日経平均株価

# matplotlibの描画をかっこよく
plt.style.use('ggplot')

fig1 = plt.figure(figsize=(18, 10))
ax1_quick = fig1.add_subplot(221)
ax1_hitachi = fig1.add_subplot(222)
ax1_takeda = fig1.add_subplot(223)
ax1_Nikkei = fig1.add_subplot(224)

ax1_quick.plot(np.diff(np.log(df_quick.loc["2013-07-16":, ['Close']]), axis=0)*100, label='Quick', color='b')
ax1_hitachi.plot(np.diff(np.log(df_hitachi.loc["2013-07-16":, ['Close']]), axis=0)*100,label='HITACHI', color='r')
ax1_takeda.plot(np.diff(np.log(df_takeda.loc["2013-07-16":, ['Close']]), axis=0)*100 , label='Takeda', color='g')
ax1_Nikkei.plot(np.diff(np.log(df_Nikkei.loc["2013-07-16":, ['Close Price']])*100 , axis=0), label='Nikkei', color='purple')

ax1_quick.set_title('Quick')
ax1_quick.set_ylim=(-20,20)

ax1_hitachi.set_title('HITACHI')
ax1_hitachi.set_ylim(-20,20)

ax1_takeda.set_title('TAKEDA')
ax1_takeda.set_ylim(-20, 20)

ax1_Nikkei.set_title('NIKKEI')
ax1_Nikkei.set_ylim(-20, 20)

plt.show()

y軸の幅はQuickの変動幅が一番大きかったのを何回か実行する中で確認したので
それに合わせた。y軸の値は パーセント(%)

f:id:doratai:20180202170051p:plain

これを見るとボラティリティは Quick > 日立 > 武田薬品日経平均株価 となっている事が視覚的にわかる。

Quickは \pm 20 %と大きく変動しているが、日経平均武田薬品\pm 5 % の幅に収まっている。

つまり、この4つの中だとQuickが最もボラタイル(ボラティリティが大きい)である事がわかる。

データの要約

視覚的に見ることはできた。続いては、平均や分散のような統計量を求めて見ることにする。

収益率の平均

各銘柄の収益率の平均を求めてみよう。
次のようにすれば計算できる。

quick_mean = np.mean(np.diff(np.log(df_quick.loc["2013-07-16":, ['Close']]), axis=0)*100)
hitachi_mean = np.mean(np.diff(np.log(df_hitachi.loc["2013-07-16":, ['Close']]), axis=0)*100)
takeda_mean = np.mean(np.diff(np.log(df_takeda.loc["2013-07-16":, ['Close']]), axis=0)*100)
Nikkei_mean = np.mean(np.diff(np.log(df_Nikkei.loc["2013-07-16":, ['Close Price']]), axis=0)*100)

print("Quick : " + str(quick_mean))
print("HITACHI : " + str(hitachi_mean))
print("TAKEDA : " + str(takeda_mean))
print("Nikkei : " + str(Nikkei_mean))

結果は

銘柄名 QUICK 日立 武田薬品 日経平均
平均(%) 0.163 0.027 0.029 0.043

いづれの銘柄の平均値も正の値をとるが、どれも0に近く、小さな値になっている。

※計算結果(平均)
Quick : 0.162560953612
HITACHI : 0.0269943597075
TAKEDA : 0.0285518660969
Nikkei : 0.0426793473652

ボラティリティを計算する

続いては、各銘柄のボラティリティ標準偏差)を求める。
次のようにすれば計算できる。

quick_std = np.std(np.diff(np.log(df_quick.loc["2013-07-16":, ['Close']]), axis=0)*100)
hitachi_std = np.std(np.diff(np.log(df_hitachi.loc["2013-07-16":, ['Close']]), axis=0)*100)
takeda_std = np.std(np.diff(np.log(df_takeda.loc["2013-07-16":, ['Close']]), axis=0)*100)
Nikkei_std = np.std(np.diff(np.log(df_Nikkei.loc["2013-07-16":, ['Close Price']]), axis=0)*100)

print("Quick : " + str(quick_std))
print("HITACHI : " + str(hitachi_std))
print("TAKEDA : " + str(takeda_std))
print("Nikkei : " + str(Nikkei_std))

結果は

銘柄名 QUICK 日立 武田薬品 日経平均
ボラティリティ(%) 2.713 1.896 1.342 1.316

先ほどの図の印象と数字が一致している事がわかります。Quickのボラティリティは2.713% であり、武田薬品が 1.342% であることから大きさとしてはQuickは武田薬品の約2倍であり、より価格変動が大きい銘柄である事がわかる。


※計算結果(ボラティリティ)
Quick : 2.7130695301
HITACHI : 1.8958143491
TAKEDA : 1.34199583079
Nikkei : 1.31599308226

豆○ば〜

QUICKって、これを書く際に参考にしている「現場ですぐ使える時系列データ分析ーデータサイエンティストのための基礎知識ー」の著者が所属している会社なんだよ〜