ランダムな仕掛けでバックテストをしてみました

『タープ博士のトレード学校 ポジションサイジング入門』のランダムな仕掛けの売買ルールでバックテストをしてみました。

いくつかバックテストをやってきて思うことがあります。 思いついたアイデアを試してみても期待値をゼロに持っていくことすら簡単じゃないです。 コイントスなら何も考えなくても 50% の確率で表になるのに。 学んだことを取り入れた売買ルールなら、わずかでも期待値をプラスにすることができそうに安易に思うんだけれども。 全然そんなことない。 むしろ安易な小細工ならしない方がマシ…。

それで、ランダムな仕掛けのバックテストの結果を書いておこうと思いました。 これをやってみて「仕掛けより手仕舞いが大事」だということが少しだけ経験を持って理解できたような気がします。

仕掛けよりも手仕舞いが大事

トレードはだれにだってできるが、だれもが成功するとは限らない。 いつ、どのように手仕舞うべきかを知る人こそがトレードで成功する人である。 あえて言えば、ほとんどのトレードは、たとえでたらめに行っても、いつかは利益が出るものだ。 しかし、損失を抑えながらより大きな利益を得るためには、しっかりした手仕舞い戦略が必要だ。 このように手仕舞いはトレードにおいてきわめて重要な要素であるにもかかわらず、仕掛けと同程度に重要視している書籍がないのは驚くべきことである。 損失を少なくするための手仕舞い戦略なくして、トレードで成功することは不可能だ。

高勝率トレード学のススメ 第9章 手仕舞いとストップ


仕掛けよりも手仕舞いが大事

ケンカを仕掛けるのはバカでもできる……しかし、勝者になれるかどうかはまた別の問題だ。

ラリー・ウィリアムズの短期売買法【改定第2版】 第12章 投機ビジネスについての考察

『マーケットの魔術師』を読み返していたのですが、明確に「仕掛けよりも手仕舞いが大事」的なことが書いてあるものが見つけられなかったので、他の本から引用しました。

バックテスト

次のような Python の関数を作りました。

def test(df, pip=0.01, spread=0.3, unit=10000, periods=20, x=3.0):
    sp = pip * spread * unit
    df2 = pd.concat([df, df['close'].shift(1), atr(df, periods=periods).shift(1)], axis=1)
    pl = pd.Series(np.full(df2.index.size, np.nan), index=df2.index)
    ls = entry = stop = np.nan
    for row in df2.itertuples():
        time, open_, high, low, close, close2, atr_ = row
        if np.isnan([close2, atr_]).any():
            continue
        if np.isnan(ls):
            # entry
            ls = random.choice([-1, 1])
            entry = open_
            stop = close2 - (atr_ * x * ls)
        if not np.isnan(ls):
            tmp = close2 - (atr_ * x * ls)
            if (0 < ls and stop < tmp) or (ls < 0 and tmp < stop):
                # trailing stop
                stop = tmp
            if (0 < ls and low <= stop) or (ls < 0 and stop <= high):
                # exit
                pl[time] = (stop - entry) * unit * ls - sp
                ls = entry = stop = np.nan
    if not np.isnan(ls):
        pl[time] = (close - entry) * unit * ls - sp
        ls = entry = stop = np.nan
    return pl

パラメーターは ATR を計算するためのもの(periods)と、ストップを決めるためのもの(x)の 2 つです。 ATR は 20 期間、ストップは ATR の 3 倍の位置を初期値としています。

具体的な売買ルールは Gist にアップロードした Jupyter Notebook のファイルに記載してあります。

結果

これを通貨の市場(21 通貨ペア)でバックテストしてみました。 ヒストリカルデータは前に作ったものです(2005 年から 2017 年までのデータを使いました)。

結果です。

  トレード数 勝率(%) 平均利益 平均損失 平均利益÷平均損失 1トレード当たりの平均損益 最大損失額 総損益 期待値
AUDJPY 111 42.34 35512.26 24336.35 1.46 1004.95 -366615.49 111549.59 0.04
AUDNZD 97 34.02 264.14 204.73 1.29 -45.22 -6632.89 -4385.86 -0.22
AUDUSD 125 33.60 306.00 183.90 1.66 -19.29 -3175.72 -2411.82 -0.10
CADJPY 113 30.97 42834.15 26058.98 1.64 -4720.40 -699132.96 -533405.30 -0.18
CHFJPY 110 38.18 35284.02 21963.98 1.61 -105.65 -416493.78 -11621.93 -0.00
EURAUD 98 36.73 578.25 300.71 1.92 22.17 -4531.74 2172.88 0.07
EURGBP 117 35.90 200.90 108.44 1.85 2.60 -2713.34 304.76 0.02
EURJPY 129 36.43 41620.26 29152.25 1.43 -3366.92 -548688.28 -434332.17 -0.12
EURUSD 109 36.70 474.63 202.82 2.34 45.79 -2709.92 4990.58 0.23
GBPAUD 102 40.20 669.70 486.68 1.38 -21.86 -10640.83 -2229.65 -0.04
GBPJPY 124 36.29 64150.32 33946.97 1.89 1652.85 -774488.36 204954.02 0.05
GBPUSD 121 28.93 554.99 244.36 2.27 -13.15 -6580.72 -1590.58 -0.05
HKDJPY 92 36.96 4483.95 2805.81 1.60 -111.77 -43681.93 -10282.77 -0.04
NZDJPY 127 26.77 34242.54 23121.41 1.48 -7764.13 -1129705.63 -986044.81 -0.34
NZDUSD 117 35.04 243.12 172.52 1.41 -26.87 -4212.32 -3143.50 -0.16
SGDJPY 82 36.59 25494.73 12610.73 2.02 1330.30 -141829.50 109084.23 0.11
USDCAD 105 34.29 436.56 169.17 2.58 38.51 -2390.50 4043.55 0.23
USDCHF 111 38.74 319.29 179.89 1.77 13.49 -2483.77 1497.24 0.07
USDHKD 77 27.27 168.85 75.18 2.25 -8.63 -1659.83 -664.40 -0.11
USDJPY 124 32.26 35318.30 19818.82 1.78 -2032.65 -343857.70 -252048.53 -0.10
USDSGD 104 39.42 234.10 175.31 1.34 -13.91 -3894.67 -1446.62 -0.08

期待値を見るとちょっとマイナスが目立つかなあ。 ランダムな仕掛けなのでテストするたびに結果が変わります。

このときの期待値の平均は次の通りでした。

-0.0342

マイナスでした。

参考程度に 1 つだけ損益のグラフを載せておきたいと思います。 米ドル/円の損益のグラフです。

25 万円くらいのマイナスになってしまいました…。

都市伝説--仕掛けはそれほど重要ではない

いや、重要だ。 マーケットにある程度長くかかわっているなら、手仕舞いは重要だが、仕掛けはそれほど重要ではないという信念に、もう出くわしたかもしれない。 この信念を支持する人たちは相場で強いトレンドが見られたチャートを指して、こうした大きな値動きでは仕掛けは重要ではないと言う。 トレンドのほとんどを確実にとらえるために大切なのは手仕舞いだと言う。 たしかに振り返れば、そうした観察も理解できる。 大きな値動きのあとでは手仕舞いは非常に重要だ。 できるだけ多くの利益をきちんと確保するためには、仕掛けと手仕舞いを比べるなら、後者のほうが重要だろう。 利益を手放して、喜ぶ人はいない。 だが、それは後知恵だ。 支持者は強いトレンドがすでに現れている、絵に描いたように見事なチャートを示しながら話す。 ポジションと取るときに、強いトレンドになるかどうかはまったく分からない。 だから、私は彼らの立場にはまったく賛成できない。 私がそういう話を読んだり聞いたりしたら、自動的にその人のトレーディングの経歴は怪しいと思ってしまう。

システムトレード 基本と原則 第9章 売買ルール

この記事の最初に引用した「仕掛けよりも手仕舞いが大事」に対立する意見ですけれども。 トレードはトレードオフなことばかりです。 利益を伸ばそうと思ったら勝率が犠牲になったりします。

でも、どちらかの意見が正しいということじゃない。 他の誰かの意見が正しいということじゃない。

矛盾しない答えを自分で出さなきゃいけないと考えています(今のところは…)。 誰かから答えを聞いてしまったということは、トレーダーとして成長する機会を奪われてしまったということです。 それは残念に思わなきゃいけない。

終わり

Jupyter Notebook のファイルを Gist にアップロードしておきました。