勝率とドローダウン期間の関係

勝率とドローダウン期間の関係を調べてみる。トレーダーはドローダウン期間が続くと、自分の戦略に疑いを抱き、やたらと戦略に手を加えたくなるものである。だが、ドローダウンはトレードには付き物であって、ある程度は初めから覚悟しなければならない。

その「ある程度」とはどのくらいなのか、ということをシミュレーションによって調べてみる。単純化のためにいくつかの仮定を置く。

  • トレードのリターンは1%、または-1%のいずれかとする。つまりペイオフレシオ=1.0である。
  • トレードは1日に1回とする。
  • 1年の営業日を260日とする。

以上の仮定に基づいて1年間トレードするという試行を10回行い、平均のドローダウン期間を勝率ごとに求める。勝率は5%刻みで5%-100%まで調べる。結果は以下の通りである。

win_per durations
0.05    259.0
0.1     259.0
0.15    258.9
0.2     258.6
0.25    257.5
0.3     256.4
0.35    256.9
0.4     238.9
0.45    240.0
0.5     160.0
0.55    109.7
0.6     50.6
0.65    35.2
0.7     19.2
0.75    16.6
0.8     10.8
0.85    7.6
0.9     5.8
0.95    3.6
1.0     0.0

ペイオフレシオ1.0で勝率60%はなかなかのパフォーマンスである。それでも50.6日(2ヶ月強)のドローダウン期間がある。勝率70%となると、むしろありえないくらいの高パフォーマンスである。それでも19.2日(1ヶ月弱)のドローダウン期間がある。

トレーダーとしてはドローダウンの回復に1ヶ月も2ヶ月もかかったのでは大変つらいことである。だが、勝率60%、70%でもこの程度のドローダウン期間は避けがたいのである。だとすれば数ヶ月のドローダウン期間は覚悟すべきだろう。

サンプルプログラム

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

import forex_system as fs
import numpy as np
import pandas as pd

durations = np.zeros(20)
print('win_per' + '\t' + 'durations')
for i in range(20):
    win_per = (i + 1) / 20
    for j in range(10):
        ret = np.random.choice([0.01, -0.01], 260, p=[win_per, 1 - win_per])
        ret = pd.Series(ret)
        temp = fs.calc_durations(ret, 1440)
        durations[i] += temp
    durations[i] = durations[i] / 10
    print(str(win_per) + '\t' + str(durations[i]))
(2017/02/08更新)