superi

主にキャリアと金融を嗜むメディア

【FX】仲値時間にかけて円安になるのか、売買のタイミングを調整して検証してみた


スポンサーリンク

前回、仲値時間にかけて円安になるのか検証してみました。

www.superi.jp

09:30の始値で買って、09:55の始値で売るケースを想定したところ、2018年は堅調に収益が積み上がっていますが、それ以前は行ったり来たりといった結果でした。
今回は売買の時間を調整し、収益が最大となるようチューニングをおこなってみました。

前提条件

検証データは前々回取得&作成したデータを利用します。
www.superi.jp

バックテスト

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns

# データの取り込み
ticks_5T = pd.read_csv('data/usd_jpy_5T.csv',delimiter=',',parse_dates=['time'])
ticks_5T.set_index('time', inplace=True)

# 検証用と収益計算用にデータ分割
ticks_5T_train = ticks_5T[:'2015-12-31 23:59:00']
ticks_5T_test = ticks_5T['2016-01-01 00:00:00':]

# 期間内のprofit計算するファンクション
def mid_price_profit(x,y):
    #09:00から11:00までを想定
    buy_time = (datetime.datetime.combine(datetime.date(1,1,1),time(9,0)) + datetime.timedelta(minutes=5*(x-1))).time()
    sell_time = (datetime.datetime.combine(datetime.date(1,1,1),time(9,5)) + datetime.timedelta(minutes=5*y)).time()
    
    diff_train = ticks_5T_train['open'].diff(x)
    diff_train = diff_train.loc[sell_time]
    
    # Extract Thursday and Friday.
    diff_train = diff_train.reset_index()
    diff_train['week_day'] = diff_train['time'].dt.dayofweek
    #print(diff_test.groupby('week_day').mean())
    #金曜を対象とする
    diff_train = diff_train[(diff_train['week_day']==4)]
    diff_train.set_index('time', inplace=True)
    
    #収益を計算
    # add spred
    diff_train_sp = diff_train['open']-0.0029
    return buy_time,sell_time,diff_train_sp.sum()

#09:00から11:00までの間で、売買の時間を変えて収益計算する
result = pd.DataFrame([], columns=['buy','sell','profit'])
for x in range(1,24):
    for y in range(0,23):
        if x<=y:
            result = result.append(pd.Series(mid_price_profit(x,y), index=result.columns), ignore_index=True)
        else:
            pass

#収益が高かった売買時間上位5つを取得
result.sort_values(by=['profit'], ascending=False).head(5)

バックテストで収益が高かった売買時間上位5つを取得した結果がこちらです。

f:id:ukichang:20190420230003p:plain

09:45に買って10:00に売るのがベストなようです。
ではこのロジックでフォワードテストしてみます。

フォワードテスト

#2016年以降のデータで検証
from datetime import time

diff_test = ticks_5T_test['open'].diff(3)
diff_test = diff_test.loc[time(10,00)]

# Extract Thursday and Friday.
diff_test = diff_test.reset_index()
diff_test['week_day'] = diff_test['time'].dt.dayofweek
#print(diff_test.groupby('week_day').mean())
diff_test = diff_test[(diff_test['week_day']==4)]
diff_test.set_index('time', inplace=True)

# add spred
diff_test_sp = diff_test['open']-0.0029
diff_test_sp = pd.concat([diff_test_sp.cumsum(),ticks_5T['close']],axis=1, join='inner')

# Plot
diff_test_sp.plot( secondary_y=['close'])

f:id:ukichang:20190420232454p:plain
青色が累積収益のプロットです。いやービミョーですね、、
一応データがある全期間でプロットしてみましょう。

diff_test = ticks_5T['open'].diff(3)
diff_test = diff_test.loc[time(10,00)]

# Extract Thursday and Friday.
diff_test = diff_test.reset_index()
diff_test['week_day'] = diff_test['time'].dt.dayofweek
#print(diff_test.groupby('week_day').mean())
diff_test = diff_test[(diff_test['week_day']==4)]
diff_test.set_index('time', inplace=True)

# add spred
diff_test_sp = diff_test['open']-0.0029
diff_test_sp = pd.concat([diff_test_sp.cumsum(),ticks_5T['close']],axis=1, join='inner')

# Plot
diff_test_sp.plot( secondary_y=['close'])

f:id:ukichang:20190420232840p:plain
青色が累積収益を示しています。2012年以降は収益がサチッているように見えます。リーマンショックによって輸出企業によるドル需要が低下したためでしょうか。
今のところ積極的に仲値トレードをするのは憚られますね、、