twitterで下記チャートを紹介しました。
このチャートは、
横軸はVIX(恐怖指数)、縦軸はその後100日(約半年)騰落率。VIXの水準とその後の騰落率には正の相関がありランダムウォークではない。今のVIXが40程度なので、過去ケースから見ると半年後のリターンがマイナスになることはなさそう(投資は自己責任!)
ということを意味しています。
このチャートは、Pythonのpandas_datareader
を使ってセントルイス連銀ウェブサイトからVIX(恐怖指数)とS&P500株価指数を取得して作りました。
ここにそのコードを保存しておきます。
まずライブラリの読み込み。
import pandas as pd
import numpy as np
import pandas_datareader.data as web
import datetime
import matplotlib.pyplot as plt
import seaborn as sns
sns.set()
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
#1.DataReaderでデータを取得
#取得するデータの開始日と最終日を指定
start = datetime.datetime(2010, 1, 1)
end = datetime.datetime(2020, 5, 1)
#S&P500のデータを取得
# 'SP500'がS&P500のティッカーシンボル。
# 'fred'が、データソースとしてセントルイス連銀を指定する。
#あとは開始日と最終日。
eq = web.DataReader('SP500', 'fred', start, end)
#VIXのデータを取得
# 'VIXCLS'がVIXのティッカーシンボル。
vix = web.DataReader('VIXCLS','fred', start, end)
#取得したデータを1つのデータフレームにまとめる
df = pd.DataFrame(index = eq.index)
df['Equity'] = eq
df['VIX'] = vix
df.dropna(inplace = True)
セントルイス連銀からは様々な経済・金融データを取得できます。
セントルイス連銀ウェブサイト各データのURLの、一番最後がシンボルティッカーです。
例:VIXの場合は下記アドレスの最後、VIXCLS
となります。
https://fred.stlouisfed.org/series/VIXCLS
#2. グラフを作成
#グラフを作る関数
def chart(days):
dfd = df.copy()
dfd['Return'] = (dfd['Equity'].shift(-days) / dfd['Equity'] -1)
dfd.dropna(inplace = True)
plt.figure(figsize = (8,4))
plt.scatter(x = dfd['VIX'], y = dfd['Return'], alpha = 0.6, c = dfd['VIX'])
plt.xlabel('VIX')
plt.ylabel(str(days)+' days Return')
plt.title('VIX and S&P500 '+str(days)+' days Returns (USD base)')
plt.savefig('VIX_SP500rtn',bbox_inches="tight")
#何日間のリターンを計算するかを指定して関数実行
chart(100)
↓このグラフが作られます。
plt.scatter(x = dfd['VIX'], y = dfd['Return'], alpha = 0.6, c = dfd['VIX'])
↑このコードのc = dfd['VIX']
によって、VIXの値に応じてグラフ内の点の色を変えて、グラデーション効果を出しています。
おまけ1:VIXチャート
df['VIX'].plot(title = 'VIX', figsize = (8,4))
おまけ2:SP500チャート
df['Equity'].plot(title = 'S&P500', figsize = (8,4))
おわりに
DataReaderでは、セントルイス連銀の経済データだけでなく、株価や為替など、様々なデータを取得することができます。詳しくはDataReaderのドキュメントをご参照ください。