pythonで日経平均株価の夜間リターンと日中リターンを比較する

# はじめに。
世界中の投資家を退場させたコロナショックから早一ヶ月、第一波の底打ちとみる声が徐々に増えてきています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409544/d74fbc07-555d-e6c7-4d0a-22d052e57162.png)
ところで、投資家にとって怖いのは、彼らが寝ている「夜間」。
たとえ東京証券取引所での取引が終了していても、ロンドン時間、ニューヨーク時間では、大阪証券取引所（いわゆる大証）でのナイト・セッションやシカゴ・マーカンタイル取引所で日経平均先物が活発に取引されており、夜間の知らぬ間に株価が大暴落して…朝起きたら**「おはぎゃあ！」**という話が珍しくありません。
ここでふと疑問に思ったのですが、夜間にポジションを持ち越す「中長期投資家」にとって今のマーケットは底打ちで絶好の押し目買いポイントなのかもしれませんが、夜間にポジションを持ち越さないデイトレーダーが見えている世界って全然違うのかもしれません。
今回は、世界中のデイトレーダー御用達の**MT5**のpython APIを使って日経平均株価の時間足データをダウンロードし、日経平均株価の夜間開けリターンと日中リターンの関係を分析してみました。

# 2020/3/27での日経平均株価
冒頭の通り、中長期投資家とデイトレーダーは見ているタイムスパンが全然違うので、同じ2020年3月27日の日経平均株価の「上昇」のイメージも大きく異なります。
とくに、中長期投資家からみればその日は「上昇」だったにも関わらず、デイトレーダーからみればその日は「GU（ギャップアップ）＆寄り天」と真逆に見えていることも決して珍しくはないのです。
## 中長期投資家から見た2020/3/27の日経平均株価
前日の終値18,832.21円から当日の終値19,389.43円まで**600円近くの大きめな上昇！**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409544/df0ce269-b0c5-77bf-62d6-eb1565cea513.png)
## デイトレーダーから見た2020/3/27の日経平均株価
当日の始値19,021.97円から、前場の終了は18,901.46円と▲100円近くの下落、続いて後場は19,045.80円から始まりデイトレーダーがポジションを閉じる15時は19,176.30円と＋100円程度の上昇…つまり！**デイトレーダーにとってはほとんど横ばいな一日だったのです。**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409544/1f7c8c7e-6a8e-8dd1-c7e9-ff438ad1b69b.png)

# pythonで分析しましょう！
上記の例から、何を分析したいかおわかりになったでしょうか。
それでは、早速MT5経由でブローカーから過去3年分の時間足データ（＝24時間 × 252営業日／年 × 3年）をダウンロードし、**寄りリターン（＝前日引け→当日寄り）**と**日中リターン（＝当日寄り→当日引け）**の関係性を調べてみましょう。

```python
# set time index to raw bar data
def time_set(rate):
    rate_time = rate.dropna(how='all', axis='index').reset_index()
    rate_time['time'] = pd.to_datetime(rate_time['time'], unit='s')
    rate_time = rate_time.set_index('time')
    return rate_time

# specify symbol to research
symbol = 'JP225Cash'

# get bar data from MT5
mt5.initialize()
_rate = pd.DataFrame(mt5.copy_rates_from_pos(symbol, mt5.TIMEFRAME_H1, 0, 24 * 252 * 3)).set_index('time')
mt5.shutdown()

rate = time_set(_rate)
# XM: GMT+3, JP: GMT+9, diff = 6
rate.index = [x + relativedelta(hours=6) for x in rate.index]
rate_open = rate[rate.index.hour == 9]['open']
rate_close = rate[rate.index.hour == 15]['close']
rate_close.index = [x - relativedelta(hours=6) for x in rate_close.index]
rate_TK = pd.concat([rate_open, rate_close], axis='columns')
rate_TK.columns = ['open', 'close']
rate_TK['close to open'] = (rate_TK['open'] / rate_TK['close'].shift(1) - 1) * 100
rate_TK['open to close'] = (rate_TK['close'] / rate_TK['open'] - 1) * 100
rate_TK['close to close'] = (rate_TK['close'] / rate_TK['close'].shift(1) - 1) * 100
rate_TK = rate_TK.dropna()

sns.jointplot('close to open', 'open to close', rate_TK)
plt.show()
```

※今回はデータ取得元のブローカーにXMを使いましたので、時差を6時間分調整しました（XMはGMT+3、東京時間はGMT+6）。

## 分析結果（全期間）
横軸が寄りリターン、縦軸が引けリターンです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409544/84b77426-9dc3-545b-e039-6d91aad625de.png)
まずはざっくりと3つの傾向が見えてきますね。
1. ±1σ程度の範囲では何の傾向もみられない（**ランダムウォーク**）。
2. 赤枠で囲っている真ん中２つのレンジ（±1σ～±2σ）で寄りリターンがプラスでもマイナスでも大きいと、日中リターンも乱高下している（**ボラティリティ・クラスタリング**）。
3. 赤枠＆黄色マーカーで囲っている左端のレンジ（-2σ以下）で寄りリターンが暴落しているときは、日中リターンは大きくプラス（**日銀砲？**）
ストラテジーを組むならば3.の日銀砲狙いですが、いかんせんサンプルが少なすぎて（過去3年でたったの2回）再現性には不安が残ります。
ただ、前回（pythonで暴落直後の上海総合株価指数を予測する）の投稿内容には通じるところがありますね（下げすぎた後には多かれ少なかれ自律的な反発がある）！

さて、ここまで分析したところで、観客からはこんな声が聞こえてきそうです。
**「中期的に上げトレンドのときと下げトレンドのときで、寄りの暴落（暴騰）は大きく意味合いが違ってくるのではないか？」**
**「下げトレンドの中での寄りの暴騰（まさに今のような状況）は利確売りで上値が重いのではないか？」**
なるほどそうかもしれません。
それでは、3ヶ月平均リターンがプラス（上げトレンド）とマイナス（下げトレンド）の２つの場合に分けて同じ分析をしてみましょう。

```python
# calc 3M average return
rate_TK['3M Mean'] = rate_TK['close to close'].rolling(63).mean()
# split 2 cases: up trend / down trend
rate_TK_3MUP = rate_TK[rate_TK['3M Mean'] >= 0]
rate_TK_3MDN = rate_TK[rate_TK['3M Mean'] < 0]
# plot
sns.jointplot('close to open', 'open to close', rate_TK_3MUP)
plt.show()
sns.jointplot('close to open', 'open to close', rate_TK_3MDN)
plt.show()
```

## 分析結果（上げトレンド期間限定）
景色がずいぶん変わりましたね！っていうか、明確な傾向がみられませんね。
すなわち、寄りリターンを見ても、日中リターンの予測は難しいということです。
**「株価は東京時間で下げて（＝日経平均）NY時間で上げている（＝ダウ）」などといった市場でまことしやかにささやかれる噂がありますが、こうやって実際のデータを用いて分析してみると、そんなに簡単なもんじゃないということがわかります。**
そして実際、「東京時間⇔NY時間アノマリー」戦略において、少なくとも上昇トレンド相場では、夜間にポジションを持ち越さず東京時間のintradayだけでのトレードで利益を出すのは難しそうです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409544/6d75f52a-4518-1450-3cbe-bbc74602ea7e.png)

## 分析結果（下げトレンド期間限定）
全期間でみられた結果がこちらに現れましたね。
やはり、**大きく稼いでいるデイトレーダーは、下げトレンドのなか火事場での猛反発を逃さず狩りに行っているのではないでしょうか？**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409544/41f21871-5775-f3c0-4928-911791f24116.png)

## そもそも相場の上昇のうち東京時間での寄与はどれくらいあるの？
ここで２つの投資パターンを考えてみましょう。
1. 日経平均株価をだまって3年間BUY&HOLDする（こちらを**世界経済買い持ち戦略**と呼びましょう）。
2. 日経平均株価を東京時間限定で買い持ちすることを3年間繰り返す（こちらを**アベノミクス買い持ち戦略**と呼びましょう）。
東京時間の動きだから日本経済を反映しているっていうのはずいぶん雑な捉え方ですが、ここで真面目に日本の経済対策の効果を計測するつもりはなく、あくまで**デイトレーダーが東京時間限定で日経平均株価を買い持ちしたときに相場全体の上昇の恩恵をどれだけ享受できるのか**を知りたいのです。
もしも株価の上昇が日本経済の回復によるものであれば、2.のアベノミクス買い持ち戦略でも上げていてほしいところです。

```python
# Global v.s. Abenomics
Buy_and_Hold = ((1 + rate_TK['close to close'] / 100).cumprod() - 1) * 100
Tokyo_time = ((1 + rate_TK['open to close'] / 100).cumprod() - 1) * 100

# plot
Buy_and_Hold.plot(legend='B&H')
Tokyo_time.plot(legend='TK time B&H')
(Tokyo_time - Buy_and_Hold).plot(kind='area', stacked=False)
plt.title('cumulative return')
plt.show()
```

上記コードで計算した各戦略の累積リターンをプロットしたものがこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/409544/d820c446-d7e1-01bf-4a88-ad1e616acbfe.png)
青のclose to closeが世界経済買い持ち戦略の累積リターン、オレンジのopen to closeがアベノミクス買い持ち戦略の累積リターン、緑の領域が２つの戦略リターンの差分（アベノミクスリターン－世界経済リターン）です。
こうして見てみると、アベノミクス買い持ち戦略もなかなかどうして捨てたものではないことがわかります、っていうか、**夜間に持ち越すより日中だけ買い持ちしてるほうがずっと良くない？おはぎゃあリスク回避でよくない？**
また、過去３年は長らく日経平均株価の上昇分の多くは夜間にもたらされていたが、直近１年には徐々にその差が縮まり、**コロナショックではとうとうアベノミクス買い持ち戦略が世界経済買い持ち戦略を大きくアウトパフォーム**したことがわかりますね！
安部さん、やるじゃん（？）。

# まとめ
* 上昇トレンド相場では、寄り天とか寄り底は日中リターンのシグナルにならない。
* 下落トレンド相場では、寄りのリターン水準が大きいほど日中リターンもボラタイルになる。
* とくに、寄りで-2σ超える爆下げしたら日中に日銀砲を期待できそう（関連：暴落直後の上海総合株価も半値戻す）。
* 必ずしも東京時間が駄目でNY時間が良いということではなさそう。むしろ、おはぎゃあリスク回避で高いリスクリターン効率が期待できるかも。アベノミクスは捨てたもんじゃなかった。