通貨で TDW を確認していたところ、本の結果と同じようにならなかったので、 S&P500 でも確認してみました。
条件
バックテストの条件は次の通りです。
では、次に述べる条件が整ったときに翌日に何が起こるかを調べてみることにしよう。 条件--①今日の終値が30日前の終値よりも高い(上昇トレンド)、②今日の終値が9日前の終値を下回る(押し目)。 これらの条件が整ったら、翌日の寄り付きで買って、その日の大引けで売る。 市場が本当にランダムならば、全トレードのうち52%は勝ちトレードになるはずだ(50%でないのは、これらの調査期間では全体的に上昇トレンドにあったから。最初の調査で上げて引けた日が52%あったことがその何よりの証拠)。
ラリー・ウィリアムズの短期売買法【改定第2版】 第7章 勝つためのパターン
想定結果
想定する結果は次の通りです。
この第2版のために1998年から2011年まで同じパターンで検証してみた。 その結果を示したものが表7.2である。
曜日 トレード数 勝率(%) 平均利益 平均損失 平均利益÷平均損失 1トレード当たりの平均損益 最大損失額 総損益 月曜日 360 50 2801 -2229 1.26 286 -9575 102925 火曜日 382 47.12 2610 -2372 1.1 -24 -4250 -9325 水曜日 420 49.05 2629 -2385 1.1 74 -5750 31150 木曜日 372 47.31 2557 -2368 1.08 -38 -6625 -14100 金曜日 400 47.75 2733 -2436 1.12 32 -8925 12750 ラリー・ウィリアムズの短期売買法【改定第2版】 第7章 勝つためのパターン
ユーロ/米ドルのバックテストの結果
トレード数 | 勝率(%) | 平均利益 | 平均損失 | 平均利益÷平均損失 | 1トレード当たりの平均損益 | 最大損失額 | 総損益 | |
---|---|---|---|---|---|---|---|---|
Mon | 115 | 30.43 | 41.93 | 73.36 | 0.57 | -38.27 | -4322.61 | -4401.03 |
Tue | 123 | 37.40 | 60.49 | 69.48 | 0.87 | -20.87 | -3034.73 | -2567.05 |
Wed | 111 | 34.23 | 46.51 | 64.20 | 0.72 | -26.30 | -3078.44 | -2919.35 |
Thu | 125 | 35.20 | 52.93 | 65.16 | 0.81 | -23.59 | -2959.36 | -2949.07 |
Fri | 127 | 25.98 | 46.05 | 71.36 | 0.65 | -40.85 | -5262.89 | -5188.46 |
単純ではあるものの、条件をつけているのにすべての曜日の総損益がマイナスになってしまいました。
米ドル/円のバックテストの結果
トレード数 | 勝率(%) | 平均利益 | 平均損失 | 平均利益÷平均損失 | 1トレード当たりの平均損益 | 最大損失額 | 総損益 | |
---|---|---|---|---|---|---|---|---|
Mon | 118 | 56.78 | 3435.67 | 4995.40 | 0.69 | -208.27 | -126833.50 | -24575.41 |
Tue | 121 | 50.41 | 4517.90 | 5547.47 | 0.81 | -473.19 | -71004.51 | -57256.31 |
Wed | 121 | 54.55 | 4581.97 | 5285.03 | 0.87 | 96.97 | -76403.30 | 11733.69 |
Thu | 130 | 53.08 | 4871.44 | 5156.04 | 0.94 | 166.24 | -74259.60 | 21610.99 |
Fri | 127 | 40.94 | 4866.05 | 4869.37 | 1.00 | -883.21 | -115474.90 | -112168.10 |
ユーロ/米ドルの結果よりは良かったです。 が、もっと良くなってもいいように思っていました。
S&P500 のバックテスト
次のようなバックテストをしました。
def test(df, commission=50.0, unit=250):
df2 = pd.concat([df, df['close'].shift(30 + 1), df['close'].shift(9 + 1), df['close'].shift(1)], axis=1)
pl = pd.Series(np.full(df2.index.size, np.nan), index=df2.index)
for row in df2.dropna().itertuples():
# close2: 30日前の終値
# close3: 9日前の終値
# close4: 今日の終値
# open_: 翌日の寄り付き
# close: 翌日の大引け
time, open_, high, low, close, close2, close3, close4 = row
if not (close2 < close4 and close4 < close3):
# 次の条件に該当しない場合は取引しない
# ①今日の終値が30日前の終値よりも高い(上昇トレンド)
# ②今日の終値が9日前の終値を下回る(押し目)
continue
# unit: 1枚当たりの取引単位、指数値に250ドルを掛けた額
# commission: 50ドルの手数料
# 取引枚数は1枚
p = ((close - open_) * unit - commission)
p2 = math.floor(p * 100) / 100
pl[time] = p2
return pl
S&P500 の結果( 1998 年 5 月~ 2011 年 5 月)
S&P500 の同じ期間で確認してみました。
トレード数 | 勝率(%) | 平均利益 | 平均損失 | 平均利益÷平均損失 | 1トレード当たりの平均損益 | 最大損失額 | 総損益 | |
---|---|---|---|---|---|---|---|---|
Mon | 96 | 54.17 | 2318.74 | 2146.94 | 1.08 | 271.97 | -20955.05 | 26109.52 |
Tue | 105 | 53.33 | 2992.09 | 2743.37 | 1.09 | 315.54 | -14870.04 | 33131.83 |
Wed | 101 | 60.40 | 1990.65 | 2042.13 | 0.97 | 393.51 | -33832.51 | 39744.68 |
Thu | 114 | 57.89 | 2326.09 | 3037.04 | 0.77 | 67.93 | -50445.41 | 7744.39 |
Fri | 100 | 49.00 | 2367.65 | 2795.10 | 0.85 | -265.35 | -50687.77 | -26535.46 |
想定結果とかなり異なる結果になってしまいました。
トレード数がかなり少ないのはなぜだろう?
でも、通貨の場合と違って利益が残る結果になったみたいです。 水曜日が一番良かったみたいでした。
S&P500 の結果( 2011 年 6 月~ 2017 年 12 月)
その後の期間も確認してみました。
トレード数 | 勝率(%) | 平均利益 | 平均損失 | 平均利益÷平均損失 | 1トレード当たりの平均損益 | 最大損失額 | 総損益 | |
---|---|---|---|---|---|---|---|---|
Mon | 53 | 58.49 | 2582.17 | 2827.05 | 0.91 | 336.83 | -23355.08 | 17852.15 |
Tue | 50 | 58.00 | 3269.31 | 2764.52 | 1.18 | 735.10 | -14269.91 | 36754.92 |
Wed | 64 | 57.81 | 2816.95 | 2581.11 | 1.09 | 539.64 | -17775.02 | 34537.20 |
Thu | 61 | 47.54 | 3303.53 | 2815.94 | 1.17 | 93.32 | -39927.59 | 5692.38 |
Fri | 65 | 49.23 | 3119.91 | 2548.33 | 1.22 | 242.19 | -24212.56 | 15742.13 |
想定結果と比較するのはあまり意味がないので、 1998 年 5 月~ 2011 年 5 月の結果と比較してみます。
一番良かったのは水曜日でしたが、火曜日に変わっていました。 一番悪かったのは金曜日でしたが、木曜日に変わっていました。
考察
システムとは概してこんなものである。 ある一定期間は非常にうまく機能するが、そのあとは破綻する。
ラリー・ウィリアムズの短期売買法【改定第2版】 第4章 ボラティリティブレイクアウト--モメンタムブレイクスルー
システムって、長期的に機能するものが一番いいと思っていました。 でもそうでもないと考えるようになりました。
もっと重要なのは、短期的に機能するシステムであっても、それが機能する期間に運用できることだと思いました。 結局これができないと損失で終わるだろうからです。
その「長期的に機能する」のが明日、あるいは 1 年後に終わるかもしれないじゃないですか? 明日、あるいは 1 年後に終わらない保証がどこにあるんですか? 明日、あるいは 1 年後、あるいはそれ以降に機能しなくなったら、どうそれを判断するのですか?
2011年に加筆した部分--ここで第1版の続きを述べておこう。 ウップスは忘れられないパターンだ。 このパターンを使って100万ドル以上は稼いだと思うが、残念ながらこのパターンは今ではもう機能しない。 理由は簡単だ。 場立ちがいなくなってしまったからである。 場立ち取引が行われていたころは、市場は大引けから翌日の寄り付きまで16時間から18時間閉じ、その間に注文がたまり、人々の感情は高まった。 売りか買いかはともかく、この間に注文が急増し、翌日はギャップで寄り付いた。 しかし、電子取引に変わった今は市場が閉じている時間は極めて短く(数分、長くても数時間)、われわれにとって好都合だった抑圧された注文の「噴出」効果は消えた。
ラリー・ウィリアムズの短期売買法【改定第2版】 第7章 勝つためのパターン
まだ具体的にはわからないですけれども、機能する原因が何か把握していないことには、そのシステムは運用しちゃいけなそうです。 原因自体が変わったら運用を止めるときなんじゃないかなあ。
「システム」と書いていますけれども、裁量トレードでも同じことが言えると思っています。
終わり
本の結果と同じにはできなかったのですが、プログラムの誤りや、本の内容の解釈の誤りに気づいたりしましたら教えてください。
Gist に Jupyter Notebook のファイルをアップロードしておきました。