【Python】pandas-datareaderでVIX(恐怖指数)を取得してk-Mean法でクラスタリング

この記事は約5分で読めます。

 

 

日経ソフトウェア2018年9月号を読んでいたら恐怖指数がうんたらかんたらみたいな特集があって、サンプル通りに実行したら途中で、エラーになる謎コードがあり、前後関係も完全にイミフな内容だったので、書き直してみました

 

 

<開発環境>

  • Python3.6
  • JupyterLab
  • Windows10

 

 

# ライブラリの読み込み
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import pandas_datareader.data as web
import pandas as pd

# fredからVixを取得する
vix = web.DataReader("VIXCLS", "fred", "1949/1/1")

# fredからSP500を取得する
sp500 = web.DataReader("SP500", "fred", "1949/1/1")

 

 

FREDというのはアメリカにあるセントルイス中央銀行のデータベースのことです。ここには日経平均など主要な金融データが保存されています。

 

関連記事:【Python】pandasで日経平均の株価データをスクレイピングする

 

pandas-datareaderは仕様上時々死ぬことがあるので、コード実行に失敗した人は、ここここからcsvを落として以下のコードを実行して読み込んでください。(ディレクトリは任意で調整してください)

 

# pandasでcsvを読み込む
vix = pd.read_csv('vix.csv', index_col='DATE')
sp500 = pd.read_csv('sp500.csv', index_col='DATE')

 

ちなみに引数のindex_col='DATE'がないとインデックスがずれて後々エラーを吐くので、忘れないように注意してください。

 

# 対数変化率を計算する
vol = (np.log(sp500).diff().dropna().rolling(20).std() * np.sqrt(365) * 100)

# データを結合する
ts = pd.concat([vix, vol], axis=1)

# 欠損値を削除する
ts = ts.dropna(how='any')

# 列名を変更する
ts.columns = [ 'vix', 'vol']


ts

 

 

<実行結果>

 

 

エルボー法で最適なクラスタ数を求める

 

K-Means法で分類する前に、最適なクラスタ数つまり分類数のあたりを付けていきます。

 

 

inertia =[]
x = range(1, 50)

# 1~50までで最適なクラスタ数を繰り返しで計算する
for i in x:
    model = KMeans(n_clusters=i)
    model.fit(tsvix)
    inertia.append(model.inertia_)
plt.plot(x, inertia, marker='o')

 

<実行結果> 

 

 

何となくだが、分類するクラスタ数は5くらいでいいと思う(小並感)。

 

 

k-Mean法でVIXをクラスタリングする

 

from sklearn.cluster import KMeans
n_clusters = 5
model = KMeans(n_clusters=n_clusters)
tsvix = ts.iloc[:, :1]
ts['pred'] = model.fit_predict(tsvix)

# クラスタリングしたデータを0~4まで一種類ずつ取り出して上書きプロットしていく
for i  in range(n_clusters):
    # i(0~4)に当てはまるデータをデータフレームから抽出する
    ts2 = ts.loc[ts['pred'] == i]
    # 散布図をプロットする
    plt.scatter(ts2['vix'], ts2['vol']/100)
    # ラベルを付ける
    plt.xlabel("VIX")
    plt.ylabel("Logarithmic rate of return")

 

<実行結果>

 

 

当たり前ではあるが、VIXが大きくなっていくと対数収益率(ボラティリティ)、つまり金融工学におけるリスクもそれにともなって大きくなっていくのが分かる

 

 

関連記事:【Python】pandasでビットコイン価格のローソク足と移動平均線を計算してプロットする

 

関連記事:【Python】機械学習で株価を予測する~Scikit-Learnの決定木アルゴリズムを使う

 

 

 

コメント

タイトルとURLをコピーしました