Twitterで出てくる知見は本当か自分で調べてみるシリーズです。株式投資において、曜日による特徴的な値動きや有利なポジションでの新規エントリーや手じまいなど可能なのでしょうか?Pythonによる分析で確認してみたいと思います。
また、株式投資をしない人でもPythonで日付から曜日を文字列として取得・判別するなど”実務”の視点からすぐに使える、コピペで使えるものとなっています!
記事を書こうと思ったきっかけ
以下のようなTweetを拝見しました。
上記内容によると、月曜日はポジションを持たなければいい!というように感じます、いいことを聞いた!!ただ、1928年からという事で、ちょっと期間が長すぎるようにも思いますし、直近コロナ底以降はどうなのでしょうか?
前回同様、命の次に大事なお金が減ることを考えたら、必要ないはやらなくていいけど、めんどくさいはやる!の精神で調べてみましょう。
目標とすること
・S&P500の曜日ごとのパフォーマンスを調べる
・コロナ後でもその傾向は続いているのか調べる
・平均だけでなく、時系列的にその戦略の損益曲線を出し可視化する
使用するツール
使用するツールはGoogle Colaboratoryのpythonを使いますので、無料で、簡単に行うことができます。Google Colaboratoryについては以前書いた記事をご参照いただければと思います。
実際のコードとやっていること
以前書いた記事”株式投資での時間帯における投資行動の違いは大きい Twitterで出てくる知見は本当か自分で調べてみよう。”などを参考にしながらコーディングしていきます。
実際のコードは以下の通りです。
今回使ったコードはGoogle Colabのファイルとして以下にシェアしてあります。
!pip install yfinance --upgrade --no-cache-dir
import yfinance as yf
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import datetime
start_D="1928-1-1"
end_D=datetime.date.today()
codelist1 = ["^GSPC"]
data2 = yf.download(codelist1, start=start_D, end=end_D)
display(data2.dropna().head(1).append(data2.dropna().tail(1)))
data2["Adj Close"].plot()
plt.show()
データは1928年から取れているようです。また始値:高値:安値:終値:分割など調整後の終値:出来高などが取得できているようです。今回の分析では調整後の終値を用います。
df=pd.DataFrame()
df["SPX"]=data2["Adj Close"].pct_change().copy()
display(df.dropna().head().append(df.dropna().tail()))
(1+df["SPX"]).cumprod().plot()
plt.show()
価格データからパーセントへの変化率のデータの変換したのち、累積積でのプロット行い実際の価格データと同じであることを確認しています。
##曜日を数値から文字に変換
def ToDayOfWeek(date):
day_of_week = datetime.date(2022, 8, date).strftime("%A")
return day_of_week
df1=pd.DataFrame()
for i in range(0,7):
day_of_week=ToDayOfWeek(i+1)
print(day_of_week)
df1[day_of_week]=df[df.index.weekday==i].mean()
display(100*df1)
plt.figure(figsize=(6,4))
df1.plot(kind='bar', figsize=(9, 4))
plt.axhline(y=0, linewidth=4, color='r')
plt.show()
Pythonでは月曜日を0、火曜日を1として扱うのですが、それでは少し煩雑になりますので、自作の関数ToDayOfWeekにて曜日をMonday, Tuesdayなど視認しやすいものに変更します。
1月、2月、などをJanuary,Februaryなどと変換する関数については”【アノマリー】4月は上昇しやすい【季節性】は本当か?Pythonで自分で調べてみよう!(Python コードあり)【コピペで動く!】Twitterで出てくる知見は本当か自分で調べてみようシリーズ”にて紹介しています。
また平均値については
ほぼ同じような数値、傾向が見て取れると思います。
月曜日が弱いのはわかりましたが、ではこの情報を用いて、収益をあげたり、トレードとして利用できたりするのでしょうか?もう少し深堀してみたいと思います。
曜日毎にトレードした場合の損益曲線
月曜のみトレードした場合や、水曜日のみトレードした場合の損益曲線はどうなるのでしょうか?
1928年から今までその傾向は変わっていないのでしょうか?もしくは、月曜日は空売りを仕掛ければ利益となるのでしょうか?確認してみたいと思います。
df2=df.copy()
display(df2.head().append(df2.tail()))
for i in range(0,5):
day_of_week=ToDayOfWeek(i+1)
df2[day_of_week]=df2["SPX"]
df2.loc[df2.index.weekday!=i,day_of_week] = np.nan
display(df2.head().append(df2.tail()))
df2.mean().plot.bar()
plt.show()
for i in df2.columns:
plt.plot(df2.index,df2[i].fillna(0).cumsum(),label=i)
plt.legend(loc='center left', bbox_to_anchor=(1, 0.5), fontsize=18)
新しいデータフレームにパーセントでの変化率のデータをコピーしておきます。
曜日ごとにデータを抜き出します。火曜日、水曜日など、データが階段状に並んでいるのが確認できると思います。
上段、棒グラフでは曜日ごとの平均の棒グラフは先ほどと当然同じになります。一番左側に曜日ごとに分けないときに平均・素のデータとしての値も確認できています。
下段、線グラフでは、SPXの全区間曜日に分けなかった時と、曜日毎の損益グラフになります。
月曜日が弱かったのは1950年から1990年あたりだったという事が見て取れます。
この時期何があったのでしょうか?この時期にこの値動きの特性や傾向を知っていた人は、大稼ぎできたかもしれませんね、、ただ、その後、この特性は以前ほどには聞いてないようににも見えます。
実際どうなのでしょうか?
コロナ後の曜日毎の傾向
コロナ後のデータで確認します。コロナの安値を付けた2020年3月23日以降として同じ分析をします。
df4=df["2020-03-23":].copy()
display(df4.head().append(df4.tail()))
for i in range(0,5):
day_of_week=ToDayOfWeek(i+1)
df4[day_of_week]=df2["SPX"]
df4.loc[df4.index.weekday!=i,day_of_week] = np.nan
display(df4.head().append(df4.tail()))
df4.mean().plot.bar()
plt.show()
2020年3月23日以降のデータで解析を行います。
!!なんと、この期間は月曜日の方が成績が良いようです!傾向が知れ渡ると、アマノジャクのように逆に動くのかもしれませんね、、
おまけ
月曜日は弱いのはわかったので、火曜日から金曜日ポジションを持ったらどうなのでしょうか。
結果だけ書くと以下のようになります。
また、直近の成績はどうなのでしょうか?
”20行で資産運用モデル作成 長期、中期、短期の3区分の期間チャートをPythonで作成”といった記事でのコードを利用すると以下のような結果となります。
上段でもありましたが、月曜日を外すとコロナ後は素のデータよりも劣後してしまうようです。
今年に関してはほぼ同等といった感じでしょうか。
今回は曜日での判定でしたが、もちろん月ごとの判定も可能です。
月ごとの場合は「【アノマリー】4月は上昇しやすい【季節性】は本当か?Pythonで自分で調べてみよう!(Python コードあり)【コピペで動く!】Twitterで出てくる知見は本当か自分で調べてみようシリーズ」にて紹介しています。
皆様の参考になれば幸いです。
ディスクレーマー
投資に関する免責事項情報の提供・作業代行を目的としており、投資勧誘を目的とするものではありません。
—
投資に関する記事をご紹介します。
コメント