バックテストにおけるマネーマネジメントについてです

バックテストで評価したいことはその売買ルールの期待値でした。 だからマネーマネジメントを考慮していませんでした。 ですがマネーマネジメントは期待値にも影響してくるようでした。 今回はそのことを書いてみました。

マネーマネジメントの重要性

最初にマネーマネジメントの重要性について、いくつか引用してみました。

「富を作りだすのは、システムではなくマネーマネジメントです」

マーケットの魔術師 システムトレーダー編 ラリー・ウィリアムズ


投機家の富は怪しげなシステムや錬金術師の秘術によって創造されるのではなく、資産管理によって創造されるのである。 トレーディングで成功すればお金は儲けられるが、そのお金を正しいマネーマネジメントで管理すれば巨額の富を築くことができる。

ラリー・ウィリアムズの短期売買法【改定第2版】 第13章 マネーマネジメント--王国へのカギ


勝ちトレーダーになるか負けトレーダーになるかの最大の決め手は、マネーマネジメントにあると言ってよいだろう。 あなたがどういったタイプのトレーダーであるかは問題ではない。 トレンドフォロー型システムを使っている人だろうとリバーサルシステムを使っている人だろうと、スキャルパーだろうと長期トレーダーだろうと、あるいは純粋にメカニカルなシステムを使っている人だろうと自由裁量型システムを使っている人だろうと、厳密なマネーマネジメントプランに従う人こそがゲームの勝者になれる人だ。 マネーマネジメントプランを持たないトレーダーは多く、たとえ持っていたとしても、それが何をやるものなのかを知らない人もいる。 自分の資産の管理方法を知らない人は、たとえ世界一強運のトレーダーだとしても、お金を儲けることはできないだろう。

高勝率トレード学のススメ 第14章 マネーマネジメントプラン


この章では、トレーディングを実際に行ううえで最も重要な要素である資金管理について説明する。 これはトレーディングの3本の柱の1本目で、破産リスクを避けるのに大切な武器だ。 トレーディングの目的は生き残ることだから、適切な資金管理について理解したうえで、それを実行する必要がある。 そうしないと、ほぼ間違いなく90%の負け組の終身会員となる。 10%の勝ち組に加わるようにという誘いは来ないだろう。

システムトレード 基本と原則 第8章 資金管理

これまでいくつか本を読んできていますが、数え切れないくらいマネーマネジメントの重要性を聞いてきました。

バックテスト

今回、マネーマネジメントを考慮してバックテストをしてみようと思ったきっかけは、以前やったランダムな仕掛けの売買ルールの結果が次のように感じられなかったからです。

こうして自分のシステムを検証した結果、トム・バッソの結果と一致した。 つまり、ランダムに仕掛けても着実にお金を稼ぐことができるということである。 大金を稼ぎ出すわけではなく、ドローダウンも乗り切らなければならないが、10年間という期間で見れば利益が出た。

実際にランダムな仕掛けを何度もやっていると、マイナスの期待値になることの方が多いように感じました。

マネーマネジメントを考慮したら同じ結果になるかと思って、次の内容を考慮することにしました。

1ポジション当たりのリスクとしては100万ドル口座の1%に設定した

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

def test(df, pip=0.01, spread=0.3, unit=10000, periods=20, x=3.0, money=100000000, ratio=0.01):
    lot = lambda money, entry, stop, unit, ratio: math.floor(round(money * ratio / abs(entry - stop), 2) / unit) * unit
    sp = pip * spread * unit
    m = money
    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 = lot_ = 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 = istop = close2 - (atr_ * x * ls)
            lot_ = lot(m, entry, stop, unit, ratio)
            if lot_ <= 0:
                ls = entry = stop = lot_ = np.nan
        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
                p = (stop - entry) * lot_ * ls - sp
                pl[time] = p
                m += p
                ls = entry = stop = lot_ = np.nan
    if not np.isnan(ls):
        p = (close - entry) * lot_ * ls - sp
        pl[time] = p
        m += p
        ls = entry = stop = lot_ = np.nan
    return pl

結果

21 通貨ペアでテストした結果です。 ヒストリカルデータは以前作ったものです(2005 年から 2017 年までのデータを使いました)。

損益のグラフを 3 つだけ載せておきます。

ユーロ/米ドルです。

75,000 米ドル程度の利益になったようです。

米ドル/円です。

10,000,000 円程度の利益になったようです。

ユーロ/円です。

米ドル/円とは対照的に 10,000,000 円程度の損失になったようです。

けっこう額が大きいですけれども、口座残高は 100 万米ドル程度、 1 億円程度から始めています。 ストップがかなり大きいので、 1 万米ドルとか 100 万円じゃトレードができないほどでした…(1 万通貨単位の場合)。

評価の一覧表です。

  トレード数 勝率(%) 平均利益 平均損失 平均利益÷平均損失 1トレード当たりの平均損益 最大損失額 総損益 期待値
AUDJPY 110 44.55 1062923.49 700608.31 1.52 84964.95 -9151615.39 9346144.51 0.12
AUDNZD 97 35.05 8713.89 5780.46 1.51 -699.97 -93455.65 -67896.85 -0.12
AUDUSD 130 30.77 9038.00 5614.07 1.61 -1105.74 -189945.95 -143746.01 -0.20
CADJPY 109 31.19 1106369.71 595416.33 1.86 -64583.99 -12369262.86 -7039654.81 -0.11
CHFJPY 114 39.47 832445.49 608384.92 1.37 -39636.07 -12314499.71 -4518512.47 -0.07
EURAUD 107 32.71 10968.02 6173.44 1.78 -566.42 -105460.64 -60607.06 -0.09
EURGBP 122 36.07 8063.96 5801.42 1.39 -800.79 -126822.72 -97696.40 -0.14
EURJPY 132 34.85 1036875.61 667343.65 1.55 -73449.06 -18969912.58 -9695276.15 -0.11
EURUSD 114 35.09 12065.54 5484.08 2.20 673.68 -100194.08 76799.57 0.12
GBPAUD 105 40.00 10379.03 6638.73 1.56 168.37 -97375.27 17679.31 0.03
GBPJPY 120 35.83 1338024.69 637445.07 2.10 70431.59 -8016954.33 8451790.77 0.11
GBPUSD 124 31.45 10097.97 5471.78 1.85 -574.84 -135377.08 -71280.30 -0.11
HKDJPY 99 31.31 1395856.10 688266.23 2.03 -35662.26 -10232481.46 -3530564.16 -0.05
NZDJPY 106 43.40 1239166.30 691216.98 1.79 146496.52 -5257997.72 15528630.86 0.21
NZDUSD 114 36.84 11075.89 5595.58 1.98 546.54 -86988.10 62305.32 0.10
SGDJPY 78 39.74 1373167.22 569303.07 2.41 202704.35 -5358410.63 15810939.49 0.36
USDCAD 112 34.82 11269.43 5628.40 2.00 255.67 -97621.22 28634.69 0.05
USDCHF 117 36.75 8295.43 5976.40 1.39 -731.20 -150825.95 -85550.13 -0.12
USDHKD 62 38.71 12422.21 6913.51 1.80 571.28 -87422.25 35419.49 0.08
USDJPY 116 37.93 1248358.30 622388.72 2.01 87204.98 -10851268.05 10115777.60 0.14
USDSGD 91 42.86 14143.33 6212.77 2.28 2511.28 -61372.84 228526.23 0.40

期待値の平均は

0.0285

でした。

わずかではありますが、プラスではありました。

それぞれの通貨ペアの期待値を見ると、以前の結果とあまり変わらないようにも見えました。 なので、これを 10 回ずつやって期待値の平均を比較してみました。

まず、マネージメントを考慮しない(すべて 10,000 通貨単位)でテストした結果です。

No. 期待値の平均
1 -0.01
2 -0.02
3 -0.01
4 -0.01
5 -0.04
6 -0.02
7 0.04
8 0.02
9 -0.02
10 -0.01

21 通貨ペアの平均の期待値を 10 回分見てもやっぱりマイナスが目立つみたいでした。 マイナスになったのは 8 つでした。

次に、マネージメントを考慮してテストした結果です。

No. 期待値の平均
1 0.05
2 0.04
3 -0.02
4 0.11
5 0.06
6 -0.0
7 0.08
8 0.05
9 0.01
10 0.04

マイナスになったのは 2 つしかありませんでした(よく見たらひとつはゼロでした)。

ランダムなのでこの差がもっと小さいこともありました。 どちらもマイナスが 1 つしかなかったり。 でもそのときに 10 回分の期待値の平均をさらに平均してみたら、マネーマネジメントを考慮した方が良い結果になっていました。

やっぱり期待値を見るだけであってもマネーマネジメントを考慮した方が良さそうでした。

マネージメントは最も重要…なのか?

「優秀なマネー・マネジメントができるならば、貧困なシステムでも稼げる」と言う人がいる。 ナンセンスな議論である。 貧困な取引戦略の下で優秀なマネー・マネジメントができることといったら、ゆっくりと損失を出していくことくらいのものである。

新マーケットの魔術師 第六章 カネ儲けマシーン ブレアー・ハル


トレードに関して、鉄則としていることは何ですか?

必ず有利に立つこと。 自分の有利性が何かを知ること。 先に話したように、厳密なリスク管理規制を持つこと。 基本的には、稼ぐためにはトレード上の有利性、しっかりしたマネー・マネジメントが必要なのです。 いいマネー・マネジメントだけで有利性を高めることはできないのです。 そして、使っているシステムが機能していなければ、いくら優秀なリスク管理をもってしても損をすることになるのです。 しかし、稼げるアプローチがあれば、マネー・マネジメントが成功と失敗を決定することになるのです。

新マーケットの魔術師 第三章 先物取引--バラエティに富んだマーケット モンロー・トラウト

ある時点の誰かにとって何が最も重要かなんて言えないと思います。

マネーマネジメント だけ を必死に勉強してきた人に「マネーマネジメントが最も重要だ」と言ったところであまり効果はないと思います。 心理 だけ を必死に勉強してきた人に「心理が最も重要だ」と言ったところであまり効果はないと思います。

でも一般的にはそういう人はあまりいないとは思います。 何も知識がないうちは、安く買える方法(手法)や高く売れる方法(手法)さえ理解すれば儲けられる気がするからです。 そうやって最初に手法を必死に勉強してきたからこそ、「マネーマネジメントが最も重要だ」とか「心理が最も重要だ」と言えるんだと思います。

だから、最初から「マネーマネジメントが最も重要だ」とか「心理が最も重要だ」って聞いてしまうと、ちょっと不幸なことになってしまうかもしれません。 手法が身についていないにも関わらず、「手法は適当でいい」みたいな勘違いした状態になっているかもしれないですから。

終わり

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