【日経225先物】売買システム開発に向けた統計的分析①

本記事ではこれまでに「Python3ではじめるシステムトレード ──環境構築と売買戦略」で学んだことを活かして、取引戦略を考えていきます。

これまでは、pandas-datareaderから日経平均株価のデータを用いて分析をしました。
しかし、日経平均株価は直接売買することができません。

実際の取引では、指数採用全銘柄を売買するか、指数に連動する投資信託か先物を売買することになります。
個人の資金力では、指数採用全銘柄を売買するのは到底困難ですので、先物を対象に取引戦略を考えていきます。
日経平均株価が連動する先物は、大阪取引所(大証)に日経225先物(ラージ)と日経225miniが上場しております。

そこで、今回は日経先物225を対象にしてみます。

データ取得

225Laboというサイトから取得します。今回は、こちらをダウンロードしました。
取得できたデータは4本値で分足(1分, 3分, 5分, 10分, 15分, 20分, 30分, 60分)、日足(日中, ナイト場, 終日)です。
分足は、2020年1月~直近まであります。
日足は日中と終日が1990年~直近、ナイト場が2007年~直近となっております。

今回は、日中とナイト場の両方を用いた戦略を考えるので、日足(日中、ナイト場)で2007年~のデータを扱います。

分析

まずは、立会での価格の動きに何か特徴があるかを調べます。

今回調べてみるのは、以下の4パターンです。

  • 日中取引の寄りから引けまでの価格の動き(daytime)
  • 日中立ち合いの引けから夜間立ち合いの寄りまでの価格の動き(d_to_n)
  • 夜間立ち合いの寄りから引けまでの価格の動き(night)
  • 夜間立ち合いの引けから日中立ち合いの寄りまでの価格の動き(n_to_d)

上記の4パターンごとに1日ごとの価格差の累積和をグラフにしてみます。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# 日経225先物データを読み込む
N225_daytime = pd.read_excel('./data/N225f_2020.xlsx', sheet_name='日中日足', index_col='日付')
N225_night = pd.read_excel('./data/N225f_2020.xlsx', sheet_name='ナイト場足', index_col='日付')
# 結合
df = pd.merge(N225_daytime, N225_night, on='日付', suffixes=['_D', '_N']) # D:daytime, N:night
# 各パターンの価格差を求める
daytime = df['終値_D'] - df['始値_D'] 
d_to_n = df['始値_N'] - df['終値_D'] 
night = df['終値_N'] - df['始値_N']
n_to_d = df['始値_D'] - df['終値_N'].shift(1)
# 価格差の累積和をグラフにする
plt.figure(figsize=(8, 6))
daytime.cumsum().plot(label='daytime')
d_to_n.cumsum().plot(label='d_to_n')
night.cumsum().plot(label='night')
n_to_d.cumsum().plot(label='n_to_d')
plt.legend(loc='upper left')

グラフを見みると、2013年を期に赤線と橙色線のパフォーマンスが入れ替わっている様子が目立ちます。緑線は着実にリターンを伸ばしている様子が見られます。

2013年といえば、アベノミクス開始や東京オリンピック開催決定などの経済イベントが関係あるのかもしれないです。
取引時間で考えると、夜間取引にシフトしていることから海外投資家やシステム取引の影響も考えられます。

あるいは、情報の伝達速度が関係あるのかもしれないです。
日中のイベント情報は、日中の引けまでにマーケットに織り込まれる為、リターンは得られませんが、夜間取引時間~翌日中取引時間では情報伝達速度に差があり、リターンを生む可能性があるのかもしれないです。

ここまでで、近年では夜間取引時間か日中引け~夜間寄り付きの2つの時間において取引戦略を考えるのが有効あるように見えます。

次にヒストグラムと記述統計を算出し、特徴を見てみます。

# ヒストグラムを書く
plt.figure(figsize=(12, 4))
ax1 = plt.subplot(1, 2, 1)
daytime.hist(label='daytime', histtype='step', linewidth=3, ax=ax1)
d_to_n.hist(label='d_to_n', color='lightgreen', rwidth=0.7, ax=ax1)
plt.legend()
ax2 = plt.subplot(1, 2, 2)
night.hist(label='night', histtype='step', linewidth=3, ax=ax2)
n_to_d.hist(label='n_to_d', color='lightgreen', rwidth=0.7, ax=ax2)
plt.legend()
# 記述統計を算出
stats_desc = pd.concat([daytime.describe(), d_to_n.describe(), night.describe(), n_to_d.describe()],axis=1)
stats_desc.columns = ['daytime', 'd_to_n', 'night', 'n_to_d'] 
pd.options.display.precision = 4 # dfの桁数を調整
stats_desc

折れ線グラフ見られたように、夜間、夜間~日中は平均がプラスとなっています。

ヒストグラムは、日中(daytime)はマイナスにすそ野が伸びており、尖度が高くなると思われます。
日中~夜間(d_to_n)は左右対称ですがプラスにすそ野が伸びているので、歪度はプラスになると思われます。
夜間(night)と夜間~日中(n_to_d)はともに左右対称で歪度は低くなりそうです。

次に、ADF検定(ランダムウォークの検証)、t検定(平均値の状態)、JB検定(残差の正規性)を行います。

結果は以下の通り。(左が有意水準15%, 右が有意水準10%)

alpha = 0.15
patterns = {'daytime': daytime,
            'd_to_n' : d_to_n,
            'night'  : night,
            'n_to_d' : n_to_d}
results = []
for key in patterns.keys():
    target = patterns[key].dropna()
    # ADF検定
    adf_nc = sm.tsa.adfuller(target, regression='nc')[1] #p値:ドリフト項無し
    adf_c  = sm.tsa.adfuller(target, regression='c')[1] #p値:ドリフト項付き
    adf_ct = sm.tsa.adfuller(target, regression='ct')[1] #p値:ドリフト項+時間項付き
    # t検定
    t_value = target.mean() * np.sqrt(target.count()) / target.std()
    t0 = t.ppf(1-alpha, target.count()-1)
    if t_value > t0:
        t_result = 'μ>0'
    elif t_value < -t0:
        t_result = 'μ<0'
    else:
        t_result = 'μ=0'
    # JB検定
    JB = sms.jarque_bera(target) # JB, p値, 歪度, 尖度
    
    # 結果を保存
    results.append([adf_nc, adf_c, adf_ct, t_result, JB[1], JB[2], JB[3]])
# dfにまとめる
df_result = pd.DataFrame(results, index=patterns.keys())
df_result.columns = ['ADF nc', 'ADF c', 'ADF ct', 't', 'JB', '歪度', '尖度']
df_result.T
有意水準:15%
有意水準:15%

各検定結果は以下の通り。

ADF検定価格差は非定常過程でない可能性が高い
JB検定残差は正規性を持たない可能性が高い
t検定有意水準10%以下では平均値はゼロである可能性が高い。
有意水準15%とすると、夜間取引(night)では平均がプラスに有意である可能性がある

グラフを見てみると、夜間(緑線)は開始時点から安定して右上がりの傾向があります。
nightの歪度はマイナスであり、平均がプラスであることは、価格差がマイナスの場合の下落幅は、プラスの場合の上昇幅より小さく、総じてプラスになっているように思われます。

ここまでの結果を踏まえると、夜間取引において戦略次第では安定したリターンを得る可能性があるように思われます。

まとめ

ここまでの結果、日経225では夜間取引(寄り付きで買い、引けで売る)でプラスのリターンを得られる可能性が見れました。

今回の統計的検定の結果は、2007年~直近の全期間を対象としたものとなっております。
上で触れたがグラフを見ると、2013年を期にパターンごとの価格差における累積和が逆転している様子が見られます。つまり、平均はゼロに回帰しやすいものとなっていることがわかります。

そこで、2013年以降のデータで分析をするこで他のパターンでも平均が優位にプラスorマイナスになる可能性があるのではないかと思われます
しかも今回は有意水準15%でしか有意性が見られませんでしたが、信頼区間を狭めても有意性が出る可能性が残されているのではないでしょうか。

次回は2013年以降に期間を狭めて統計的に分析をしてみます。

コメント

タイトルとURLをコピーしました