見出し画像

VIXと米国株指数の関係 コロナ前・コロナ後 [python]

ーーーーーーーーーーー2021/07/29 追記ーーーーーーーーーーー
全文無料で読めるようにしました。

Pythonの一部仕様変更などでうまく動いていなかった部分を新しいサイトでは修正しました。

今後適宜修正や改修を行おうとは思いますが、すべてを改修できるわけではないことはご承知おきください。

2021/07/28時点では動いていることは確認しております。

今後こちらに移行します。

ーーーーーーーーーーー2021/07/29 追記ーーーーーーーーーーー

新型コロナウイルス以降の米国株の動向をVIXをもとに検証していきます。

米国株の指数S&P500で見ると2/24日から本格的に落ち始め、約35%下落したのち、6/5日の段階で高値更新まで約10%のところまで戻ってきた状態になります。

VIX(世間では恐怖指数などといわれていますが)などを参考指標にして、分析、可視化(プロットテクニック)の手順を記述したいと思います。

1990年からのデータを使うことで、ITバブル、リーマンショック、今回のコロナショックでの傾向を見ます。また、2/24以降のコロナショックだけ抜き出し、以前の下落との比較も行います。

人によっては個別株や、同じ指数でも戻しの強いナスダックなど変更することもできると思います

目標とすること

目標とするのはプログラム言語Pythonを使って米国株の指数データやVIXのデータを取得し、グラフ・チャートを表示し、分析することです。初心者の方にも簡単にできるように使い方、コードを書いてありますので、入門編としても最適だと思います。

使用するツール

使用するツールはGoogle Colaboratoryのpythonを使いますので、無料で、簡単に行うことができます。Google Colaboratoryについては以前書いた記事をご参照いただければと思います。

実際のコードとやっていること

コードの前半部分は以下の通りです。

import datetime
import matplotlib.dates as mdates
import fix_yahoo_finance as yf
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つのチャートとして表示します。

画像1

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)

画像2

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)

画像3

世間一般で言われていますが、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)

画像4

2/24以降のデータを別の色でプロットしましたが、今回も特別大きく変わった傾向ではないようですね。

今回の記事でできること

・Yahoo USからS&P500の指数とVIXのダウンロードし
・Y軸をそろえた上で上下の2つのチャートとして表示
・対数表示のグラフの作成
・パーセントへの変換、前日のデータを参照
・累積積を算出とプロット
・値動きの比較のためのクロスプロット
・線形回帰直線のプロット
・条件をつけた時のプロット

この結果をどのように実際のトレードに生かしていくかも含め、検討しただければと思います。

駆け足で、VIXと米国株指数の関係を分析し、グラフ・チャートを表示する手順を示しました。

このたびは、noteを購入していただき、大変ありがとうございました。
この記事が今後の投資活動において、お役に立つことを願っています。

この部分はどうなのか、ここを知りたいのだが、、というような希望があればご連絡いただければ幸いです。すべてにこたえられるかは分かりませんが、是非前向きに検討してみようと思います。

また、短い文でも構いませんので、感想などいただけるとモチベーションの向上、今後の改善への励みになりますので、是非ともよろしくお願いいたします。

最後まで読んでいただき、大変ありがとうございました。


------------------------------------告知枠------------------------------------------

Pythonで米国株を中心とした資産運用モデルについての記事を集めました。

米国株だけでなく投資信託のパフォーマンスもPythonで調べる記事も書いています。

興味あれば読んでみてください。

ここから先は

0字

¥ 300

サポートしていただき大変ありがとうございます。 励みになります。