VIXは恐怖指数と言われることもありますが、米国株指数とどのような関係があるのでしょうか?それともないのでしょうか?この記事では新型コロナウイルス以降の米国株の動向をVIXをもとに検証していきます。
元記事は 2020/06/07 noteに書いた記事になります。
以前のコードでは動かくなっているようですので、こちらのサイトで修正したものをリライトして、載せていきます。
2021/07/28時点で以下のコードはエラーなく動いていることを確認しています。
米国株の指数S&P500で見ると2/24日から本格的に落ち始め、約35%下落したのち、6/5日の段階で高値更新まで約10%のところまで戻ってきた状態になります。
VIX(世間では恐怖指数などといわれていますが)などを参考指標にして、分析、可視化(プロットテクニック)の手順を記述したいと思います。
1990年からのデータを使うことで、ITバブル、リーマンショック、今回のコロナショックでの傾向を見ます。また、2/24以降のコロナショックだけ抜き出し、以前の下落との比較も行います。
人によっては個別株や、同じ指数でも戻しの強いナスダックなど変更することもできると思います
目次
- 目標とすること
- 使用するツール
- 実際のコードとやっていること
- 分析・解析
- VIXとS&P500の関係
- 2/24日以降の傾向
- 今回の記事でできること
目標とすること
目標とするのはプログラム言語Pythonを使って米国株の指数データやVIXのデータを取得し、グラフ・チャートを表示し、分析することです。初心者の方にも簡単にできるように使い方、コードを書いてありますので、入門編としても最適だと思います。
使用するツール
使用するツールはGoogle Colaboratoryのpythonを使いますので、無料で、簡単に行うことができます。Google Colaboratoryについては以前書いた記事をご参照いただければと思います。
実際のコードとやっていること
コードの前半部分は以下の通りです。
!pip install yfinance --upgrade --no-cache-dir
import datetime
import yfinance as yf
import matplotlib.dates as mdates
import matplotlib.pyplot as plt
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')
start = datetime.date(1990,1,1)
end = datetime.date.today()
codelist = ["^GSPC","^VIX"]
data2 = yf.download(codelist, start=start, end=end)["Adj Close"]
display(data2[codelist].head(2).append(data2[codelist].tail(2)))
plt.rcParams["font.size"] = 18
yyyymm=mdates.DateFormatter('%y/%m')
fig, (ax1 ,ax2 )= plt.subplots(2,1,figsize=(10,9),
gridspec_kw = {'height_ratios':[1, 1]},sharex=True)
ax1.plot(data2.index,data2["^GSPC"],label="SPX")
ax1.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=18)
ax1.set_yscale('log')
ax1.grid(True)
ax2.plot(data2.index,data2["^VIX"],label="VIX")
ax2.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=18)
ax2.grid(True)
Yahoo USからS&P500の指数とVIXのデータを1990年から現在の日付まで日時ベースでダウンロードし、Y軸をそろえた上で上下の2つのチャートとして表示します。
以前の結果はこちらとなります。その後、順調に指数は高値を更新しました。
S&P500は359から3193まで30年間で約10倍になっていますので、ここでは対数表示にしています。
分析・解析
データは準備できましたので、ここから分析・解析の開始になります。
分析の対象データそのもののデータを使うのではなく、パーセントでの変化率での取り扱いを行います。さらに精度よく分析したい方は対数正規分布の考え方で行う方もいらっしゃるかもしれませんが、ここではパーセントでいきます。
また、今回参照するデータVIXはS&P500と同時に動いています。もし、参照データとして使う場合は前日のデータ以前のものを使わないと、「未来のデータ」を利用しての分析・解析になってしまいますので、「正しい将来の予想」ができないことになってしまいます。
ですので、以下のコードでS&P500のパーセントを計算させ、VIXについては前日の値を参照させるようにします。グラフ・チャートについては累積積を算出して実際の価格推移に変更します。累積積とは1番目の要素 * 2番目の要素 * 三番目の要素 * … と和が累積されていく計算のことです。
単純にパーセントを足していくだけでは正確な価格推移になりませんのでcumprod() 累積積を使っています。似たような関数で、cumsum() 累積和というものもあります。
df_all=data2.copy()
df_all["SPXpct"]=df_all["^GSPC"].pct_change()
df_all["VIXpre"]=df_all["^VIX"].shift()
display(df_all.head(2).append(df_all.tail(2)))
plt.rcParams["font.size"] = 18
yyyymm=mdates.DateFormatter('%y/%m')
fig, (ax1 ,ax2 )= plt.subplots(2,1,figsize=(10,9),
gridspec_kw = {'height_ratios':[1, 1]},sharex=True)
ax1.plot(df_all.index,(1+df_all["SPXpct"]).cumprod(),label="SPX")
ax1.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=18)
ax1.set_yscale('log')
ax1.grid(True)
ax2.plot(df_all.index,df_all["VIXpre"],label="VIX pre")
ax2.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=18)
ax2.grid(True)
VIXとS&P500の関係
VIXとS&P500の値動き(変化率)にはどのような相関があるのでしょうか。
それを見るにはクロスプロットを行えば簡単に見ることができます。
今回は同時に動いているVIXと実際のトレーで参考にできるであろう前日のVIXのデータとのクロスプロットを比較してみます。
コードは以下のようになります。
ーーーーーーー以前はここまでが無料で読める記事でした。
import seaborn as sns
plt.rc("legend", fontsize=18)
sns.jointplot("^VIX","SPXpct",df_all,kind='reg',size=5)
plt.tick_params(axis='both', labelsize=18)
plt.grid(True)
sns.jointplot("VIXpre","SPXpct",df_all,kind='reg',size=5)
plt.tick_params(axis='both', labelsize=18)
plt.grid(True)
世間一般で言われていますが、VIX(恐怖指数)が上昇するとS&P500は下落しやすいように見えます。が、VIXが50以上の日でも指数は大きく上昇する日もあるようで、「前日比で値幅として大きく動く」ということは言えそうですが、明確に下落するとは実は言いにくいことも見て取れます。
さらに、前日のVIXの値が高いからといって、翌日下落するかは実は言えないということが前日のVIXの値とのクロスプロットから見て取れます。
線形回帰直線も引けますので、この直線の傾きからもその傾向は見て取れると思います。
2/24日以降の傾向
では、今回のコロナ騒動の2/24以降はどうだったのでしょうか。上記の分析が2008年のリーマンショックだけで起こっていて、今回の下落とリーマンショックと何か相違があったり、逆に前回も今回も同じなのでしょうか。
2/24日以降のデータだけ取り出して、別の色で表示させてみます。
df_covid=df_all.copy()
df_covid['COVIDflg']="before"
df_covid.loc[df_covid.index >= "2020-02-24", 'COVIDflg'] ="with/after COVID "
g = sns.lmplot(x="^VIX", y="SPXpct", hue="COVIDflg", data=df_covid,height=5, aspect=1.5)
plt.grid(True)
g = sns.lmplot(x="VIXpre", y="SPXpct", hue="COVIDflg", data=df_covid,height=5, aspect=1.5)
plt.grid(True)
以下は2020/06/07時点でのデータです。傾向はそれほど大きく変わってないように見えます。
2/24以降のデータを別の色でプロットしましたが、今回も特別大きく変わった傾向ではないようですね。
今回の記事でできること
・Yahoo USからS&P500の指数とVIXのダウンロードし
・Y軸をそろえた上で上下の2つのチャートとして表示
・対数表示のグラフの作成
・パーセントへの変換、前日のデータを参照
・累積積を算出とプロット
・値動きの比較のためのクロスプロット
・線形回帰直線のプロット
・条件をつけた時のプロット
この結果をどのように実際のトレードに生かしていくかも含め、検討しただければと思います。
駆け足で、VIXと米国株指数の関係を分析し、グラフ・チャートを表示する手順を示しました。
このたびは、noteを購入していただき、大変ありがとうございました。
この記事が今後の投資活動において、お役に立つことを願っています。
この部分はどうなのか、ここを知りたいのだが、、というような希望があればご連絡いただければ幸いです。すべてにこたえられるかは分かりませんが、是非前向きに検討してみようと思います。
また、短い文でも構いませんので、感想などいただけるとモチベーションの向上、今後の改善への励みになりますので、是非ともよろしくお願いいたします。
最後まで読んでいただき、大変ありがとうございました。
コメント