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

開発記録

 こんにちは。システムトレーダーの卵ことKenKenです。今回はこれまでに「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をコピーしました