セルインメイ(SELL IN MAY)数十年分ウェブサービスとPythonとで確認・解析してみました。
ーーーーーーーーーーー2021/08/12 追記ーーーーーーーーーーー
今後こちらに移行します。
ーーーーーーーーーーー2021/08/12 追記ーーーーーーーーーーー
今年の5月の株式市場はかなり大きな下落で、痛い思いをしている人もいるのではないかと思います。5月は「Sell in may(セルインメイ)」と呼ばれ、「株価が暴落しやすい」と警戒すべきという話もよく聞きます。
しかし、それは本当なのでしょうか?実際に簡単に確認できるサイトがあるので、それで20年分のデータを使って確認してみましょう。
使用するサイトは https://stockcharts.com です。
このサイトにアクセスしていただいて、$SPXとシンボルを打っていただくと下の図のようにS&P500の大型株指数が表示されます。
そのチャートの一番下、右に[Seasonality Chart]というのがありますので、クリックすると各年の成績を確認することができるのです。
ディフォルトでは5年間の成績が出ているのですが、ここでは、スライダーを左に伸ばして、20年間のデータで確認してみたいと思います。
結果は5月の上昇率は20年間で65%で特別に低いわけでも、高いわけでもないようです。むしろ今月6月の方が悪いくらいです。
次はどのような値動きをしたのか、各年の年初を基準とした値動きを見てみたいと思います。同じページの左下のボタンの真ん中をクリックしていただくと各年の%での価格推移が表示されます。
このまま20年分のデータがあると見にくいので、各5年ごとに見ていきましょう。表示させないためには上にあるその年の表示の部分をクリックして、グレーアウトしていきます。大変ですが、15個クリックしていただいて、非表示にして、今回は2015年から2019年のデータを表示してみたいと思います。
今年の落ち方は激しいですが、それ以外の年はそれほどでもないようです。最近セルインメイと言われなくなってきたのはこういう理由があったのかもしれませんね。
この調子で各年を見ていただければと思うのですが、2010年からはデータが線ではなくて、ドットになっていますので、それはご了承ください。
目立つ下落は2010年と、2012年でしょうか。
このあたりの下落が記憶に強く残ってセルインメイという言葉言われるようになったのかもしれませんね。
さらに言うと、今年は5月に下落しましたから、2012年型の値動きをするのでしょうか。それとも2010年型なのでしょうか。
それはわかりませんが、歴史は繰り返すといいますし、注目してもいいかもしれませんね。
このサイトでは今回 $SPX と打ったコードを $NIKK と打つと日経平均でのデータも確認できます。興味ある方は調べてみると面白いかもしれません。リンクをつけておきます。
追記:StockCharts.comの複数銘柄比較を行う方法 (同一銘柄配当&他銘柄パフォーマンス)へのリンクを追加します。
追記:Pythonでの解析を追加しました。
同じ結果になりますが、Pythonを使って、また少し違う角度からアプローチ・解析してみたいと思います。
この記事でできること
この記事でできることは以下の通りです。
・セルインメイ(SELL IN MAY)がどのくらい正しいのか、米国株指数の1980年から2019年(約39年間)におけるリターンを考察します。
・そのような解析を行うPythonのコードを習得することができます。
・おまけとして、他の月もどうなのか検証します。
対象者
この記事の対象者は、こんな人です。
1.セルインメイ(SELL IN MAY)がどのくらい正しいのか、どのくらい投資のリターンに影響を及ぼすか興味がある人。
2.プログラムを書くようなめんどくさいことはしたくないが、結果は知りたい人。
3.解析を行うPythonプログラムコードに興味のある人。
プログラムのコードに興味ある方はPythonの基礎程度は知っておいた方が良いと思います。ただ、知らなくてもコードの説明はしてありますので、必要に応じて、学習することもできると思います。
また、記事を読むだけでも結果はわかるようになっています。
解析結果のグラフを張ってあるので、グラフだけ見てもわかるのではないかと思います。
この記事で使用するもの
以下の機能を使います。
Google ColaboratoryのPython
Pythonのコードはすべて書いてあるので、これをコピー&ペーストすれば自分で同じ検証ができます。
Google Colaboratoryのpythonでの利用方法
以下の記事を読んで、Google Colaboratoryを利用できるようにしておいてください。こちらのnoteを見ると、Pythonの環境構築の方法が分かります。
上記の記事と同じ部分も多いですが、改めて、データ取得の部分のコードをのせておきます。
!pip install fix_yahoo_finance
import datetime
import fix_yahoo_finance as yf
import matplotlib.pyplot as plt
%matplotlib inline
start = datetime.date(1980,1,1)
end = datetime.date.today()
codelist=["^GSPC","^N225"]
data2 = yf.download(codelist, start=start, end=end)["Adj Close"]
display(data2["^GSPC"].dropna().head(1).append(data2["^GSPC"].dropna().tail(1)))
display(data2["^N225"].dropna().head(1).append(data2["^N225"].dropna().tail(1)))
(1+data2.pct_change()).cumprod().plot()
plt.show()
データ取得期間を1980年1月1日から現在の日付とし、取得する銘柄は
"^GSPC" : S&P 500
"^N225 : Nikkei 225
としています。
コードを入力した後はシフトキーを押しながらエンターを押す(「Shift + Enter」)と、以下の結果が出力されます
日経平均とS&P500のチャートが表示され、データがきちんと取り込まれているのが確認できます。
もし、
ValueError: zero-size array to reduction operation maximum which has no identity
というようなエラーメッセージがでてしまう場合はYahoo Financeへのアクセスが多くて、一時的にアクセス制限をしていることが考えられます。
10分程度おいて、再度 シフトキーを押しながらエンターを押して実行すると、結果が出てくると思います。
5月を調べるのは、以下のコードとなります。
analyse=100*data2.pct_change()
analyse_SIM=analyse[analyse["^GSPC"].index.month==5].groupby([lambda x: x.year]).sum()
display(analyse_SIM.mean())
analyse_SIM.plot.bar(figsize=(15,4),fontsize=18)
plt.grid(True)
plt.axhline(y=0, linewidth=4, color='r')
plt.show()
最初にパーセントでの騰落に変えて、それをanalyseというデータフレームに格納します。
次に、5月だけを取り出すのですが、以下の手順を踏みます。
analyse[analyse["^GSPC"].index.month==5]
でまず、5月だけのデータになります。それを
.groupby([lambda x: x.year]).sum()
で年毎のデータの合計値に変えます。次の行では全期間の平均値を出しています。結果は以下のようになります。
S&P500はプラスです(+0.84)が、日経平均はマイナス(-0.073)のようです。
また、S&P500は毎年落ちているようには見えませんが、2010年と2012年に大きな下落をしているようです。これは上の記事で見たとおりですね。
今年も例年に比べると比較的大きな下落ですね。
もうちょっと改変します。
for i in range(1,13):
analyse_NK=analyse[analyse.index.month==i]["^N225"].groupby([lambda x: x.year]).sum()
display(i,analyse_NK.mean())
analyse_NK.plot.bar(figsize=(15,4),fontsize=18)
plt.grid(True)
plt.axhline(y=0, linewidth=4, color='r')
plt.show()
行っているのは日経平均だけで、各月の39年分の動向を調べています。
for というループで、1月から12月まで順次回していきます。
結果は以下の通りです。
1月から3月ですが、1990年までは基本上がっている感じです。
2008年は1月から落ちていたんですね。
2011年の3月といえば、、悲しい時間を思い出します。
4月から6月ですが、2016年の6月Brexitが記憶に新しいです。日本株は5月落ちやすいのでしょうか。
7月から9月ですが、2015年8月の上海ショック記憶に残っています。
1990年は8月、9月とすさまじい下げですね。改めて、この下げを見たらまだまだ私なんか甘ちゃんか、、と思います。
10月から12月です。2008年のリーマンショックはやはり目立ちますね。昨年の12月も目立つ下げですが、1996年から数年間は12月弱かったのですね。あんまりよい年始が迎えられなさそうな、、そういう時代だったのでしょうか。
昔のデータみて、懐かしく思うようになったというのは私も歳をとったということでしょうか。汗・笑
みなさんも、あの時の。。。という時期があるのではないでしょうか。
株式市場は企業価値が上昇して、新たな価値が創造される場合、ゼロサムではなくプラスサムのゲームのはずなので、ぜひ市場が拡大して、全員の価値が増えるというような展開になってもらいたいものです。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
Pythonで資産運用モデルを作成する記事をまとめました。
Pythonを用いて、株価取得、チャート表示、株価分析、株価予測、株価の機械学習、ポートフォリオの構築、ポートフォリオの最適化、スクレイピングなどを行う記事を集めました。
もし興味を持っていただけるなら読んでみてください。
マーケットで言われていることが本当なのか、実際に皆さんに代わってめんどくさい検証作業をしている記事をまとめたものもあります。
興味を持っていただけるなら読んでみてください。