令和の「セルインメイ」をPythonで分析してみた

2023年6月28日

投資で一番有名な格言は「セルインメイ」でしょう。

セルインメイは続きがあって”Sell in May and go away. But remember to come back in September"が正しいようです。セプテンバーがセントレジャーズデーだったり色々バージョンがありますが、だいたい「9月に買い直せ」が共通の意味です。

今回はセルインメイは令和になっても有効なのかをGoogle Colabで調べてみました。

Google Colabの使い方は以前の記事でやってますので参考にしてください。

とりあえず日経225のデータを取得

Colabでライブラリのインポートと225のデータをダウンロードします。

import matplotlib.pyplot as plt 
%matplotlib inline
from pandas_datareader import data  as pdr
import datetime
import yfinance as yf 
yf.pdr_override() 

# 1321 == Nikkei 225 ETF
n225 = pdr.get_data_yahoo('1321.T',  datetime.datetime(2019,5,1), datetime.date.today() ).loc[:,'Adj Close']

令和元年2019年の5月から今日までのデータをダウンロードします。

5月は月初にGWがあるので、5月末に売って、9月頭に買い戻す計算をすることにしました。

土日は取引が休みなので、5月は31日が最終、30日が最後、29日が最終の3パターンがありますね。少し力技ですが、下のように5月末のデータを取得します。tryの処理ではatの後に指定したデータがなければexceptの処理に移行します。31日⇒30日⇒29日と試して、それでもデータがなければerrorを表示します。

try: 
  may = n225.at['2019-05-31'] 
  print("31")
except:
  try: 
    may =  n225.at['2019-05-30']
    print("30")
  except:
    try: 
      may =  n225.at['2019-05-29']
      print("29")
    except:
       print("error")

31

31が表示されました。2019年の5月の最後の取引日は31日のようです。

同じように9月も月の最初の取引日のデータを探します。

try: 
  sep = n225.at['2019-09-1'] 
  print("1")
except:
  try: 
    sep =  n225.at['2019-09-02']
    print("2")
  except:
    try: 
      sep =  n225.at['2019-09-03']
      print("3")
    except:
       print("error")

2

1日が日曜日なので2日から取引がありました。

mayとsepの差を表示します。

print(may - sep)

330

お。9月が5月より330円安いです。5月のデータから9月のデータを引くので戻ってくる値が正ならばセルインメイが正しかったことになります。

同じように2022まで計算します。

may – sep
2019330
2020950
2021-780
2022-60

勝率は五分五分ですが、幅でいうとセルインメイをした方が利益がでます。やはり令和でもセルインメイは健在でしょうか?

最後に

この記事では令和になってからもセルインメイが成り立つかテストしてみましたが、どうやら成り立っているようです。でも2021と2022がセルインメイが裏目に出ているので、2023はどうなるかわかりませんね。9月になったらまた計算してみます。

このColabのコードを保存しておきますので興味のある人は実行してみてください。

https://colab.research.google.com/drive/16lVf51g5WHM1WVy6HocZgnYPhd-MFLYK?usp=sharing