平均回帰戦略 (2017/04/17)

平均回帰戦略を作成してみる。

トレンドは敵

「トレンドは友」と言われるが、平均回帰戦略ではトレンドは敵である。単に売られ過ぎを買い、買われ過ぎを売るというだけでは、なかなか勝てる戦略にはならない。トレンドが発生すると、それまでに稼いだ利益はごっそり持って行かれてしまう。

トレンドを回避する方法としては

①トレンド系指標でトレンドの方向を確認して、それに逆らわない形でエントリーする、

②より長い計算期間でトレンドの方向を確認して、それに逆らわない形でエントリーする、

③トレンドの変換を確認してからエントリーする、

といったことがテクニカル分析ではよく言われる。

ただ、私の経験上、少なくとも短期トレードでは1、2は役に立たず、3は利益の幅を縮小して結局勝てない、という印象が強い。

トレンドは回避するのではなくてやり過ごす

私はトレンドを回避するよりもやり過ごすのが有効だと考えている。そもそも、トレンドは発生の初期段階で認識することは難しい。トレンドが発生したことを認識できたときには、もはやトレンドに乗るには遅すぎ、といって反転するかいなかは分からないという微妙なタイミングである。

だが、トレンドは決して永続しない。トレンドの発生を確認し、しばらく待てばトレンドはいずれ収束する。少なくとも、それまでに稼いだ利益をごっそり持って行ってしまうほどの勢いは残されていないのである。

平均回帰戦略の売買ルール

以上の考えに基づき、以下のような売買ルールを考えてみる。

買いエントリー

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

②トレンド期間がマイナスのフィルター閾値以下。

売りエントリー

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

②トレンド期間がプラスのフィルター閾値以上。

買いエグジット

○zスコアが0以上。

売りエグジット

○zスコアが0以下。

備考

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

②この記事のトレンド期間とは価格が連続して移動平均の上に位置する期間(符号はプラス)、または下に位置する期間(符号はマイナス)のことである。

売買ルールの検証

では、上記の売買ルールに基づき、以下の内容で検証してみる。

  • 通貨ペア: USDJPY
  • スプレッド: 0.4pips
  • 足の種類: 5分足
  • 開始日: 2013年1月1日
  • 終了日: 2017年1月1日
  • 最適化: ウォークフォワードテスト

以下のコードを「mean_reversion.py」ファイルとして「~/py」フォルダーに保存する。

# coding: utf-8

import forex_system as fs

MINUTE = 60

# パラメータの設定
ENTRY_THRESHOLD = 0.0
FILTER_THRESHOLD = 0.0
PARAMETER = [ENTRY_THRESHOLD, FILTER_THRESHOLD]

# 最適化の設定
START_ENTRY_THRESHOLD = 0.5
END_ENTRY_THRESHOLD = 2.5
STEP_ENTRY_THRESHOLD = 0.5
START_FILTER_THRESHOLD = 0.25
END_FILTER_THRESHOLD = 1.25
STEP_FILTER_THRESHOLD = 0.25
RRANGES = (
    slice(START_ENTRY_THRESHOLD, END_ENTRY_THRESHOLD, STEP_ENTRY_THRESHOLD),
    slice(START_FILTER_THRESHOLD, END_FILTER_THRESHOLD, STEP_FILTER_THRESHOLD),
)

build_model = None

def strategy(parameter, symbol, timeframe):
    '''戦略を記述する。
    Args:
        parameter: パラメーター。
        symbol: 通貨ペア。
        timeframe: 期間。
    Returns:
        買いエントリー、買いエグジット、売りエントリー、売りエグジット、ユニット数。
    '''
    entry_threshold = parameter[0]
    filter_threshold = parameter[1]
    period = fs.convert_minute_to_period(MINUTE, timeframe)
    zscore1 = fs.i_zscore(symbol, timeframe, period, 'MODE_SMA', 1)
    trend_duration1 = fs.i_trend_duration(symbol, timeframe, period,
                                          'MODE_SMA', 1)
    trend_duration1 /= period
    buy_entry = ((zscore1 <= -entry_threshold) &
                 (trend_duration1 <= -filter_threshold))
    buy_exit = zscore1 >= 0.0
    sell_entry = ((zscore1 >= entry_threshold) &
                  (trend_duration1 >= filter_threshold))
    sell_exit = zscore1 <= 0.0
    index = zscore1.index
    units = fs.get_units(1.0, index)
    return buy_entry, buy_exit, sell_entry, sell_exit, units

if __name__ == '__main__':
    fs.platform()

以下のコマンドを実行してバックテストする。

%run -t ~/py/mean_reversion.py --mode backtest --symbol USDJPY --timeframe 5 --spread 0.4 --start 2013.01.01 --end 2017.01.01 --optimization 2


  start_test    end_test trades    apr sharpe    kelly drawdowns durations    parameter
  2013.12.27  2014.01.25    117 -0.001 -0.004   -0.096     0.012        18   [1.5, 0.5]
  2014.01.26  2014.02.24    123   0.35  9.565  264.891     0.006         4   [1.5, 0.5]
  2014.02.25  2014.03.26    111  0.196  6.653  227.406     0.005         7   [1.5, 0.5]
  2014.03.27  2014.04.25    124  0.095  3.348  117.649     0.005         8   [1.5, 0.5]
  2014.04.26  2014.05.25    103  0.011  0.528   24.182     0.005         7   [1.5, 0.5]
  2014.05.26  2014.06.24    114  0.101  6.127   373.18     0.002         2   [1.5, 0.5]
  2014.06.25  2014.07.24    113  0.007  0.465   30.847     0.005        17   [1.5, 0.5]
  2014.07.25  2014.08.23    112   0.04  2.006   99.139     0.003         7   [1.5, 0.5]
  2014.08.24  2014.09.22    117 -0.034 -1.099   -36.17     0.013        19   [1.5, 0.5]
  2014.09.23  2014.10.22    138  0.386  7.796  159.464     0.015         2   [1.5, 0.5]
  2014.10.23  2014.11.21    123  0.167  3.612   78.105     0.014         8   [1.5, 0.5]
  2014.11.22  2014.12.21    119   0.37  6.122  102.382     0.015         4   [1.5, 0.5]
  2014.12.22  2015.01.20    121  0.063   1.17   21.379      0.01        13   [1.5, 0.5]
  2015.01.21  2015.02.19    116  0.342  9.023  241.041     0.005         3   [1.5, 0.5]
  2015.02.20  2015.03.21    103    0.1  2.466   60.636     0.011         3   [1.5, 0.5]
  2015.03.22  2015.04.20    128 -0.014 -0.401  -12.087     0.012        17   [1.5, 0.5]
  2015.04.21  2015.05.20    123  0.083  2.707    88.46     0.006         5   [1.5, 0.5]
  2015.05.21  2015.06.19     61  0.096  4.099  175.404     0.004         5  [1.5, 0.75]
  2015.06.20  2015.07.19     61  0.107  4.547  193.778     0.005         5  [1.5, 0.75]
  2015.07.20  2015.08.18     26 -0.013 -0.811  -50.338     0.006        10   [1.5, 1.0]
  2015.08.19  2015.09.17     25  0.018  0.598   19.913     0.006        11   [1.5, 1.0]
  2015.09.18  2015.10.17     47 -0.041   -1.8  -78.528     0.007        12  [1.5, 0.75]
  2015.10.18  2015.11.16     27  0.031  1.857  110.617     0.004         5   [1.5, 1.0]
  2015.11.17  2015.12.16     36  0.018  1.124     69.4     0.005         6   [1.5, 1.0]
  2015.12.17  2016.01.15     62  0.256  9.889  386.208     0.004         4  [1.5, 0.75]
  2016.01.16  2016.02.14     55  0.207  4.995  121.295     0.007         5  [1.5, 0.75]
  2016.02.15  2016.03.15     68  0.104  2.922   81.683     0.008         6  [1.5, 0.75]
  2016.03.16  2016.04.14     28  0.048  2.316  111.077     0.005        17   [1.5, 1.0]
  2016.04.15  2016.05.14     56  0.051  1.484   43.073     0.009        15  [1.5, 0.75]
  2016.05.15  2016.06.13     64  0.092  2.781   84.173     0.005        10  [1.5, 0.75]
  2016.06.14  2016.07.13     51 -0.064 -1.383  -30.152     0.013        11  [1.5, 0.75]
  2016.07.14  2016.08.12    120 -0.108 -1.604  -24.186     0.021        14   [1.5, 0.5]
  2016.08.13  2016.09.11    106  0.108  2.632   64.107     0.013        10   [1.5, 0.5]
  2016.09.12  2016.10.11    111  0.258  5.663  125.334     0.007         7   [1.5, 0.5]
  2016.10.12  2016.11.10    112 -0.264 -3.963  -59.334      0.03        12   [1.5, 0.5]
  2016.11.11  2016.12.10    122   0.24   4.34   78.812     0.012         5   [1.5, 0.5]
  2013.12.27  2016.12.10   3243  0.108  2.518   67.426      0.03        78

年率は10.8%、シャープレシオは2.52となっており、まずまずである。

コメント

非公開コメント