基本的な平均回帰戦略

トレードルール

基本的な平均回帰戦略のトレードルールは以下の通りである。

買いエントリー

①zスコアがマイナスのエントリー閾値以下、かつ

②バンドウォークがマイナスのフィルター閾値以下。

売りエントリー

①zスコアがプラスのエントリー閾値以上、かつ

②バンドウォークがプラスのフィルター閾値以上。

買いエグジット

○zスコアが0以上。

売りエグジット

○zスコアが0以下。

備考

①この記事のzスコアとは終値を移動平均で減じ、それを移動標準偏差で除したものである。。

②この記事のバンドウォークとは安値が連続して移動平均を上回っている期間(符号はプラス)、または高値が連続して移動平均を下回っている期間(符号はマイナス)を標準化したものである。

③標準化に使用した傾き、切片はシミュレーションによって得たものなので厳密なものではない。

④四本値は対数変換したものを用いている。

サンプルプログラム

①以下のプログラムをSpyderの「エディタ」にコピー&ペーストし、ファイル名を「basic_mean_reversion.py」として「~/py」フォルダーに保存する。

# coding: utf-8

import forex_system as fs
# パラメータの設定
MINUTE = 60
ENTRY_THRESHOLD = 0.5
FILTER_THRESHOLD = 2.0
PARAMETER = [MINUTE, ENTRY_THRESHOLD, FILTER_THRESHOLD]
# 最適化の設定
START_MINUTE = 60
END_MINUTE = 300
STEP_MINUTE = 60
START_ENTRY_THRESHOLD = 0.5
END_ENTRY_THRESHOLD = 2.5
STEP_ENTRY_THRESHOLD = 0.5
START_FILTER_THRESHOLD = 0.5
END_FILTER_THRESHOLD = 2.5
STEP_FILTER_THRESHOLD = 0.5
RRANGES = (
    slice(START_MINUTE, END_MINUTE, STEP_MINUTE),
    slice(START_ENTRY_THRESHOLD, END_ENTRY_THRESHOLD, STEP_ENTRY_THRESHOLD),
    slice(START_FILTER_THRESHOLD, END_FILTER_THRESHOLD, STEP_FILTER_THRESHOLD),
)

def strategy(parameter, symbol, timeframe):
    '''戦略を記述する。
    Args:
        parameter: パラメーター。
        symbol: 通貨ペア。
        timeframe: 期間。
    Returns:
        シグナル。
    '''
    # パラメーターを格納する。
    minute = int(parameter[0])
    entry_threshold = float(parameter[1])
    filter_threshold = float(parameter[2])
    # 戦略を記述する。
    period = fs.convert_minute2period(minute, timeframe)
    slope = 0.608286152451
    intercept = -1.1255204743
    divisor = slope * period + intercept
    zscore1 = fs.i_zscore(symbol, timeframe, period, 'MODE_SMA', 1)
    bandwalk1 = (fs.i_bandwalk(symbol, timeframe, period, 'MODE_SMA', 1)
        / divisor)
    buy_entry = (
        (zscore1 <= -entry_threshold) &
        (bandwalk1 <= -filter_threshold)
        )
    buy_exit = zscore1 >= 0.0
    sell_entry = (
        (zscore1 >= entry_threshold) &
        (bandwalk1 >= filter_threshold)
        )
    sell_exit = zscore1 <= 0.0
    signal = fs.calc_signal(buy_entry, buy_exit, sell_entry, sell_exit)

    return signal

②以下のコマンドをSpyderの「IPython console」にコピー&ペーストして「Enter」キーを押す。

%run -t ~/py/backtest.py --ea1 basic_mean_reversion --symbol1 USDJPY --spread1 4 --timeframe 5 --start 2013.01.01 --end 2016.12.31 --optimization 2
(2017/01/30更新)

コメント

非公開コメント