Pythonで株式市場の「稲妻が輝く瞬間」について可視化してみる。

PythonのPandasとMatplotlibを使って、長期投資のメリットについて考えてみます。

## 背景

「敗者のゲーム」という投資の有名な本において、以下のような内容が書かれています。

* 株式市場には「稲妻が輝く瞬間」があり、この瞬間に市場に居合わせるためには長期投資が必要
* 短期トレードにおいて、この「稲妻が輝く瞬間」に居合わせることは確率的に不可能

これらを根拠に長期投資が勧められています。このことをPythonでデータを見ながら確かめてみます。

## データの読み込み

データは何でもよいですが、上場インデックスファンドTOPIX(1308)の2011/7/22～2021/7/21のデータを使用します。

```python
# データ読み込み
import os
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import japanize_matplotlib

file = 'data/FTOPIX.xlsx'
df = pd.read_excel(file)
df.head()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1951451/2dbea824-0271-34c5-edff-edd1475e2091.png)

## データの加工

最初の時点を1として、現在の株価が何倍になっているかを計算します。まずは前日比率を計算し、.cumprodを使って、その累積を求めています。

```python
# 前日比率の累積を計算
df["終値(前日)"] = df["終値"].shift(1)
df['前日比率'] = df['終値'] / df['終値(前日)']
df['前日比率累積'] = df['前日比率'].cumprod()

# 必要な列のみ抽出
df = df[['日付', '終値', '前日比率', '前日比率累積']]
df.head()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1951451/21de6b6e-de49-12fe-b05e-616db88d1d88.png)

## 時系列データの可視化

株価の時系列データを可視化します。

```python
plt.figure(figsize = (15, 3))
plt.plot(df['日付'], df['終値'])
plt.title('終値の推移')
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1951451/bbcf10ca-ac7b-d491-55ed-5b2cf8d0c957.png)

## 最も良い5日を逃すとどうなるか検証
株式市場には「稲妻が輝く瞬間」があるとのことなので、これを最も前日比率が高い5日間とする。そして、最も前日比率が高い5日間を逃してしまうと、リターンがどのように変化するかを検証する。

```python
# df2において、前日比率のベスト5を1に置換
df2 = df.copy()
df2 = df2.sort_values(by = '前日比率', ascending = False)

# 先頭5行の2列目を1に変更
df2.iloc[:5 ,2] = 1
df2.head(7)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1951451/22d48f51-b8a8-0b7f-7388-a7bb1a1f3087.png)


再度日付で並べ替えて、前日比率の累積を計算しなおします。これで準備完了です。

```python
# 日付で並べ替える
df2 = df2.sort_values(by='日付')

# 前日比率の累積を計算しなおす
df2['前日比率累積'] = df2['前日比率'].cumprod()
df2.head()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1951451/3804df68-8f88-625f-4074-40e922ebaf10.png)


## 比較
元のデータと、ベスト5日を逃した場合のリターンを比較します。.tailを使うだけで確認できます。

```python
# 元データ
df.tail()
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1951451/c3ae4560-0e64-7dab-2398-b7dc29c7f884.png)

```python
# ベスト5を逃した場合
df2.tail()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1951451/884c2df6-4c04-d9fb-4d41-c257ea8ff2ad.png)

ずっと保有していれば、2.26倍になっていたのに、ベスト5日を逃してしまうだけで1.66倍までリターンが下がってしまうことが分かります。

## 結果のグラフ化

計算した結果をグラフ化します。「稲妻が輝く瞬間」は暴落の後にくる傾向があります。つまり暴落時に手放してしまうと、「稲妻が輝く瞬間」を逃してしまい、リターンが下がってしまいます。

```python
# ベスト5のみのデータを抽出
df3 = df.iloc[df.sort_values(by = '前日比率', ascending = False).index[:5], :]

# 前日比率累積をグラフ化
plt.figure(figsize = (15, 3))
plt.plot(df['日付'], df['前日比率累積'], alpha = 0.8)
plt.plot(df2['日付'], df2['前日比率累積'], label = '最も良い5日を逃した場合', alpha=0.8)

# ベスト5の点をプロット
plt.scatter(df3['日付'], df3['前日比率累積'], c = 'black', label = '最も良い5日')

plt.title('終値の推移')
plt.legend()
plt.show()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1951451/dcb85faf-015c-a1c2-aa0a-83014e0cc2f6.png)

## まとめ

* 2447日中ベストな5日を逃すだけで、リターンが2.26倍から1.66倍まで下がってしまう
* このベストな5日は暴落の後にくるので、暴落して手放してしまうと逃してしまう

以上より、ベストな5日を当てることは難しいので、ベストな5日を享受できるように、長期で保有することは有効である。

## 参考
株を長期保有することのメリットについては、以下の分析でもふれています。

https://qiita.com/Mukai1/items/4d06436d0495cca2dd12

https://qiita.com/Mukai1/items/8b57e9ecc6b01960ef55