【時間アノマリー】1日の中で最も株価が上がる/下がる時間帯

＜あらすじ＞
株の世界には様々な**アノマリー**が存在します。
完全に肌感覚ですが、これまでに株価チャートを見ていると**1日の値動きにも規則性があるのではないか**という疑問が生じました。
そこで、日経平均株価を構成する全225銘柄と東証マザーズに上場する全333銘柄の実際のデータを使って、時間帯別に分析してみました。

【結論】
・全ての検証項目において圧倒的に9:00（寄り付き）の結果が突出
・寄り付きを除くと**9:10/10:00前後で最高値が出やすい**
・マザーズ全333銘柄では**寄り付きから10:00当たりまで大きく上下する**
※ただし、データ数が少なく説得力低い

十分なデータ量を用意できなかったため、めぼしい結果は得られなかったが検証の記録として投稿します。
少しでも興味がありましたら温かい目でご覧くださいませ...
（十分なデータ量が用意できたら再度検証予定）

#アノマリー
>アノマリー（Anomaly）とは、現代ポートフォリオ理論や相場に関する理論の枠組みでは説明することができないものの、経験的に観測できるマーケットの規則性のことです。
>[SMBC日興証券](https://www.smbcnikko.co.jp/terms/japan/a/J0253.html)

株の世界には様々な**アノマリー**が存在します。

▼有名なアノマリー
【月アノマリー】
1月効果：12月末から1月第一週までの株価は上げる
Sell in May：5月に売って相場から離れなさい
ハロウィン効果：10月31日のハロウィンの頃を境に反発後、上昇トレンドへ
【曜日アノマリー】
月曜日：週末の悪材料で株安
火曜日：月曜の流れを引き継いで株安
水曜日：株安からの反発
木曜日：反発が継続
金曜日：週末に備えた株安

有名なアノマリーについてはたくさんの方々が検証しています。
・[8月の日本株、「アノマリー」では押し目買いの好機？](https://moneyworld.jp/news/05_00030836_news)
・[日本株の「曜日効果」は本当に使えるのか？](https://moneyzine.jp/article/detail/214064)
・[投資アノマリーまとめ／株式市場の「経験則」一覧](https://nikkeiyosoku.com/blog/20170915-anomaly-ichiran/)

今回は**時間帯に規則性がある**のか、実際のデータを使って検証してみたいと思います。
<font color="DarkGray" size=1>
＜過去記事＞
・[日経225全銘柄の投資効率を検証](https://qiita.com/MandT500/items/f4aaafa0de824dab92c2)
・[日経平均株価の30%は5銘柄で決まることを投資先選びに生かせるか？](https://qiita.com/MandT500/items/2a1ae0d62118250ed01e)
・[分散投資でリスク回避の仕方【2銘柄編】](https://qiita.com/MandT500/items/594d5a860d21acdd3cf3)
・[日経平均株価が上がった次の日に上がる銘柄を見つけたい](https://qiita.com/MandT500/items/55c73b9d46aa39083d1c)
</font>


#検証方法
分足データから以下の項目を時間帯別に調査します。

＜検証項目＞
1. 最高値
2. 最低値
3. 最も変動した時間帯
4. 時間帯別の変化率
5. 時間帯別の出来高

＜対象銘柄＞
・日経平均株価を構成する全225銘柄
・東証マザーズに上場する全333銘柄

＜期間＞
・2020年12月7日~2020年12月11日の5日間
・9:00~11:30,12:30~15:00の5分単位で算出

1.最高値
1日の中で**最も株価が高かった時間**を調べ、その時間帯に1ポイント加算
全銘柄/全期間での合計ポイントを算出します。

2.最低値
1日の中で**最も株価が低かった時間**を調べ、その時間帯に1ポイント加算
全銘柄/全期間での合計ポイントを算出します。

3.最も変動した時間帯
1日の中で**最も株価の変動が大きかった時間**を調べ、その時間帯に1ポイント加算
全銘柄/全期間での合計ポイントを算出します。

4.時間帯別の変化率
9:00~11:30,12:30~15:00の**5分単位での変化率**を計算
全銘柄/全期間での5分当たりの平均の変化率を算出します。
※今回の検証では変化の幅を知るために変化率=(高値-安値)/安値としました

5.時間帯別の出来高
9:00~11:30,12:30~15:00の**5分単位での出来高**を計算
全銘柄/全期間での5分当たりの合計の出来高を算出します。

【例】
▼2020年12月7日のトヨタ自動車の場合
![example_toyota_20201207.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906836/3b894de7-02aa-021e-4a85-45a6f9bb6ad4.png)

算出するPythonプログラムは記事の最後に記載します。

#結果
＜検証項目＞
1. 最高値
2. 最低値
3. 最も変動した時間帯
4. 時間帯別の変化率
5. 時間帯別の出来高

＜対象銘柄＞
・日経平均株価を構成する全225銘柄
・東証マザーズに上場する全333銘柄

＜期間＞
・2020年12月7日~2020年12月11日の5日間

＜結果＞
下に検証結果のグラフを記載してありますが、ざっとまとめます。
・想像通りかもしれませんが、日経平均全225銘柄/マザーズ全333銘柄の両方で9:00（寄り付き）のとき、1.最高値,2.最低値,3.最も変動した時間帯,5.出来高の全てでポイントが圧倒的に高い⇒**寄り付きはリスク大**
・寄り付きを除くと後場（午後の取引）よりも前場（午前の取引）の方が最高値が出やすく、特に**9:10/10:00前後で最高値が出やすい**
・4.時間帯別の変化率より、日経平均全225銘柄/マザーズ全333銘柄の両方で**寄り付きに対して9:10当たりで逆方向に大きく動く**
・同様に4.時間帯別の変化率より、**マザーズ全333銘柄では寄り付きから10:00当たりまで大きく上下する**
・5.時間帯別の出来高より、日経平均全225銘柄/マザーズ全333銘柄の両方で**10:00に出来高が上がる**傾向がある
⇒ 短期トレードなら10:00までが勝負！？

▼ 1. 最高値
![result1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906836/457fa0c8-3555-cf54-6ac2-d2c58f9e7358.png)

▼ 2. 最低値
![result2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906836/fc927797-18d1-e1b9-1124-0cab8f0efa74.png)

▼ 3. 最も変動した時間帯
![result3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906836/a0ed5f47-584c-7682-aeb0-7591fee4f8c0.png)

▼ 4. 時間帯別の変化率
![result4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906836/c582c1d0-472f-bca7-a2e9-096513cc38b4.png)

▼ 5. 時間帯別の出来高
![result5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/906836/c904d77a-8f90-82c7-ff5a-a892194ebc49.png)
※12:30の出来高データが破損していたため「×」

#まとめ
**1日の値動きにも規則性があるのではないか**という疑問を解決するために時間帯別に以下の項目を検証しました。

＜検証項目＞
1. 最高値
2. 最低値
3. 最も変動した時間帯
4. 時間帯別の変化率
5. 時間帯別の出来高

いずれの場合も、寄り付きの結果が他の時間帯よりも突出しており「**寄り付きはリスク大**」という、想像通りの結果となってしまいました。また、ここでのリスクとは以前[「日経225全銘柄の投資効率を検証」](https://qiita.com/MandT500/items/f4aaafa0de824dab92c2)で紹介したように、損失の可能性が高いということに加えて、利益の可能性も高いということを意味します。そのため、良い悪いという判断はできません。言えることは「**精神的な負担を減らしたければ寄り付きでは買わない方が良い**」ということです。

・寄り付きを除くと9:10/10:00前後で最高値が出やすい
・マザーズ全333銘柄では寄り付きから10:00当たりまで大きく上下する
という特徴も現れましたが、2020年12月7日~2020年12月11日の5日間のデータではアノマリーとして説得力がありませんね...


#次は
今回の検証は完全にデータ数が不足していました。
各銘柄の分足データを十分に取得する手段を確立できていないため、まずはデータを蓄積する必要がありそうです。
十分なデータ量が用意できましたら、再度「**時間帯に規則性があるか**」検証を行いたいと思います。
また、寄り付きから10:00までの値動きが1日の値動きにどれだけ影響を与えるのかも検証してみたいです。

＜今後の予定＞
・日経平均株価が上がった5分後に上がる銘柄を見つけたい
・自作の取引シミュレーションプログラムを使ってテクニカル分析

#プログラム
以下を算出するPythonプログラムを記載します。
＜検証項目＞
1. 最高値
2. 最低値
3. 最も変動した時間帯
4. 時間帯別の変化率
5. 時間帯別の出来高

分足の株価データは[こちら](https://note.com/aiduudia/n/na9ea4f90e255)を参考にして用意しました。

```python:cal_time_point.py
import pandas as pd
import numpy as np
import datetime
# 株価分析用に用意した自作関数をまとめたもの
import trade_module as tm

# 使用データの選択
stock_name = tm.get_n225()

day = ["2020-12-{day:02}".format(day = i) for i in range(7,12)]

# ポイント表の生成
time_index = []
for h in range(9,15):
    for m in range(0,60,5):
        time_index.append(datetime.time(h,m,0,0))    
point = pd.DataFrame(0.0,index=time_index,columns = ["point_h","point_l","point_w","roc","volume"])
point.drop(index=point.loc[datetime.time(11,31,0,0):datetime.time(12,29,0,0),:].index, inplace=True)

# データの読み込み
for code in stock_name.code:
    stock = pd.read_csv(code+"_d5.csv",index_col=0, parse_dates=True)

    #　ポイント計算
    for d in day:
        data = stock[d]
        data=tm.change(data,"5T")
        data.drop(index=data.loc[d+" 11:31:00":d+" 12:29:00",:].index, inplace=True)
        # データが不足しているときの対策
        # 用意したデータは値動きがあった時刻からのデータのため9:00に値動きがない場合データ数が足りない
        if(len(data.index) != 61):
            #　データのテンプレート生成
            temp = '%Y-%m-%d %H:%M:%S'
            new_index = [datetime.datetime.strptime(d+point.index[i].strftime(" %H:%M:%S"),temp) for i in range(len(point.index))]
            df = pd.DataFrame(index=new_index)
            # テンプレートと株価データを結合し、VolumeのNaNを0で埋める
            data = pd.concat([df,data], axis=1)
            data["Volume"].fillna(0,inplace=True)
        # 用意したポイントのデータフレームに加算
        max_index = np.argmax(data["High"])
        min_index = np.argmin(data["Low"])
        width_index = np.argmax(data["High"]-data["Low"])
        point.loc[point.index[max_index],"point_h"] += 1
        point.loc[point.index[min_index],"point_l"] += 1
        point.loc[point.index[width_index],"point_w"] += 1
        for i in range(len(point.index)):
            if(not(np.isnan(data.iat[i,0]))):
                point.iat[i,3] += (data.iat[i,3]-data.iat[i,0])/data.iat[i,3]*100
        point["volume"] += np.array(data["Volume"])
    
# 結果を保存
point.to_csv("result.csv")

```
trade_module.pyは自分が株価分析用に関数をまとめたものです。
別の機会に内容を紹介する記事を書こうとは思っていますが、今回は使用した関数のみ記載します。

```Python:trade_module.py
# 日経平均株価（csvファイルの用意必須）
def get_n225():
    df = pd.read_csv("nikkei225_all_code.csv", engine="python", names=("code","name"))
    return df

# 日足→〇足/分足→〇足
# [freq] W-MON：週足 MS:月足 30T:30分足 4H:4時間足
def change(df,freq):
    d_ohlcv = {'Open': 'first',
           'High': 'max',
           'Low': 'min',
           'Close': 'last',
           'Volume': 'sum'}
    df = df.resample(freq, closed='left', label='left').agg(d_ohlcv)
    return df
```