どんな記事
- 1980年代にウォール・ストリート・ジャーナルに取り上げられた投資集団の手法
- 年利平均80%を、リアルマネーで実現 した手法
- 10年前に出版された本でも有効であるとされた手法
そんな手法が「現在でも通用するのか」がわかります。
タートルズ流 投資の魔術 からの引用
まずは、「ドンチアン・トレンド・システム」について書かれて いる箇所を「伝説のトレーダー集団 タートルズ流投資の魔術」から引用します。
ここで紹介するドンチアン・トレンド・システムは、5章で説明しているが、わたしたちがタートル時代用いていたものを単純にしたバージョンだ。これは20日ブレイクアウトを仕掛けに、10日ブレイクアウトを手じまいに使用し、350日/25日移動平均をトレンドフィルターとして用いる。
取引は、速いほうの移動平均が示す方向にのみ行われる。25日移動平均が350日移動平均を上回っていれば、買いもちのみ、25日移動平均が350日移動平均を下回っていれば、売り持ちのみということになる。システムは当初のタートル・システムと同じように2ーATRストップを用いる。
この記事は、上記の手法をTradingViewで再現することを目的としたものです。
ストラテジーを作成
エントリーとイグジット
買いエントリー
- 「EMA25 が EMA350 を上回っている + 20日間の最高値をブレイク」で買いエントリー
- 買い持ちの状態で「10日最安値をブレイク」で決済
売りエントリー
- 「EMA25 が EMA350 を下回っている + 20日間の最安値をブレイク」で売りエントリー
- 売り持ちの状態で「10日最高値をブレイク」で決済
今回は、なんといっても取引回数が大幅に増えています。これが全体の成績にどのような影響を与えるかがポイントになりそうです。
バックテスト
同じ条件で手法を比べるために、以下の「基本条件」でテストしていきます。
バックテストの基本条件
期間
- 2005年1月1日 ~ 2017年12月31日(12年間)
資金管理
- 単利
銘柄
為替 | USDJPY、EURJPY、GBPJPY、CHFJPY、CADJPY |
株価指数 | NKY日経225、DJI NYダウ、DAXドイツ、UKXイギリスFTSE、HSI香港ハンセン |
日本株 | 6098リクルート、4452花王、5711三菱マテリアル、7201日産、9984ソフトバンクグループ |
米株 | AAPLアップル、AXPアメリカン・エクスプレス、BAボーイング、JNJジョンソン・エンド・ジョンソン、MCDマクドナルド |
海外商品 | 金、白金、原油、コーン、大豆 |
手法は、市場との相性があるケースも多いので、主要な各市場から5銘柄ずつピックアップしてテストしています。
テスト1
本に掲載されていたものと同じ設定でバックテストをしてみます。
テスト1 設定
DC-en | DC-ex | EMA-m | EMA-l | Losscut | Pyramiding |
---|---|---|---|---|---|
20 | 10 | 25 | 350 | 2-ATR | None |
テスト1 結果
損益 | 最大DD | 取引数 | 勝数 | 勝率 | RR比 | |
---|---|---|---|---|---|---|
Total | 2043 | 773 | 37.84 | 2.200 | ||
USDJPY | 11.97 | 15.49 | 89 | 25 | 28.09 | 2.971 |
EURJPY | 12.39 | 34.69 | 89 | 28 | 31.46 | 2.391 |
GBPJPY | 88.09 | 20.92 | 82 | 40 | 48.78 | 2.125 |
CHFJPY | 3.29 | 12.29 | 89 | 31 | 34.83 | 1.948 |
CADJPY | 3.59 | 35.85 | 85 | 29 | 34.12 | 2.012 |
NKY | 11113.52 | 3743.34 | 76 | 35 | 46.05 | 2.135 |
DJI | 8294.76 | 2905.75 | 88 | 32 | 36.36 | 3.035 |
DAX | 2261.61 | 3540.36 | 89 | 31 | 34.83 | 2.322 |
UKX | -2364.9 | 3704.3 | 94 | 33 | 35.11 | 1.266 |
HSI | 13234.81 | 5877.74 | 84 | 39 | 46.43 | 1.783 |
6098 | 659 | 248 | 11 | 4 | 59.09 | 4.433 |
4452 | 1753 | 1085 | 84 | 32 | 38.1 | 2.213 |
5711 | 6075 | 1250 | 69 | 27 | 39.13 | 3.056 |
7201 | -439.29 | 739.1 | 82 | 26 | 31.71 | 1.688 |
9984 | 4192 | 1920 | 73 | 30 | 41.1 | 2.168 |
AAPL | 85.64 | 23.38 | 81 | 37 | 45.68 | 2.399 |
AXP | -6.74 | 30.85 | 93 | 29 | 31.18 | 2.059 |
BA | 189.03 | 50.53 | 85 | 33 | 38.82 | 3.817 |
JNJ | 7.41 | 24.87 | 84 | 31 | 36.9 | 1.87 |
MCD | 12.99 | 26.03 | 87 | 33 | 37.93 | 1.863 |
GOLD | 32750 | 21400 | 82 | 40 | 48.78 | 1.342 |
PLATINUM | 26605 | 30440 | 85 | 39 | 35.29 | 2.275 |
WTI | 42200 | 69770 | 87 | 33 | 37.93 | 2.089 |
CORN | -4625 | 20625 | 89 | 24 | 26.97 | 2.44 |
SOY BEANS | 3237.05 | 30600 | 86 | 32 | 37.21 | 1.75 |
このシステムは取引回数が圧倒的です。総取引回数が 2043回で、「ボリンジャー・ブレイクアウト」の 159回、「ATRチャネル・ブレイクアウト」の 383回と比べても〝ダントツ〟です。
勝率やRR比は、「それぞれで比較しても分かりづらい」ので、「破産の確率」や「期待値」、「収益の見込み」を算出して比較します。本来は他にもたくさんの「比較する要素」があるのですが、TradingViewのバックテストだと、このあたりが(たぶん)限界です。手軽さを考えると十分すぎるくらいですが。
テスト1 統計
破産の確率 | 期待値/リスク | 収益の見込み |
---|---|---|
0.01% | 0.21 | 429.89 |
破産の確率は、損失の許容=2%で算出しています。期待値と収益の見込みは以下の計算式で算出しています。
実際に算出してみると、以下のようなことがわかりますね。
- 破産の心配はない
- 期待値はこれまでのテストでもっとも低い
- しかし、収益の見込みはこれまでのテストでもっとも多い
すこし変数を調整してバックテストをしてみます。
テスト2
以前、「ロスカットは必ずしも有効ではない」という記事を書いたことがあるのですが、それに習って「ロスカットなし」のテストをしてみます。
テスト2 設定
DC-en | DC-ex | EMA-m | EMA-l | Losscut | Pyramiding |
---|---|---|---|---|---|
20 | 10 | 25 | 350 | None | None |
テスト2 結果
損益 | 最大DD | 取引数 | 勝数 | 勝率 | RR比 | |
---|---|---|---|---|---|---|
Total | 1993 | 771 | 38.69 | 2.07 | ||
USDJPY | 15.02 | 19.04 | 89 | 26 | 30.23 | 2.784 |
EURJPY | 10.17 | 41.29 | 87 | 29 | 33.33 | 2.147 |
GBPJPY | 98.17 | 13.53 | 80 | 40 | 50 | 2.279 |
CHFJPY | -1.68 | 13.85 | 90 | 31 | 34.44 | 1.866 |
CADJPY | 5.07 | 40.77 | 81 | 29 | 35.8 | 1.901 |
NKY | 9679.24 | 4072.17 | 76 | 35 | 46.05 | 1.93 |
DJI | 9088.3 | 2292.62 | 84 | 32 | 38.1 | 3 |
DAX | 2014.5 | 4051.45 | 86 | 31 | 36.05 | 2.142 |
UKX | -3025.7 | 4818.1 | 90 | 33 | 36.67 | 1.1 |
HSI | 10194.4 | 8126.61 | 84 | 39 | 46.43 | 1.546 |
6098 | 596 | 260 | 11 | 4 | 36.36 | 3.932 |
4452 | 1292 | 1217 | 81 | 32 | 39.51 | 1.863 |
5711 | 6210 | 1590 | 67 | 28 | 41.79 | 2.723 |
7201 | -504.1 | 834.1 | 80 | 27 | 33.75 | 1.492 |
9984 | 3725 | 2076 | 73 | 31 | 51.03 | 1.922 |
AAPL | 107.75 | 18.85 | 75 | 38 | 50.67 | 2.506 |
AXP | -1.42 | 30.69 | 90 | 29 | 32.22 | 2.073 |
BA | 199.95 | 42.04 | 79 | 34 | 43.04 | 3.492 |
JNJ | 3.2 | 21.45 | 83 | 31 | 37.35 | 1.742 |
MCD | 15.65 | 25.65 | 85 | 33 | 38.83 | 1.845 |
GOLD | 38340 | 20840 | 80 | 40 | 50 | 1.342 |
PLATINUM | 33240 | 34585 | 83 | 30 | 36.14 | 2.307 |
WTI | 18470 | 79120 | 86 | 33 | 38.37 | 1.775 |
CORN | -5650 | 19937.5 | 87 | 24 | 27.59 | 2.32 |
SOY BEAN | -4012.5 | 34475 | 86 | 32 | 37.21 | 1.616 |
ロスカットがない分、取引回数が減っています。勝率が上がって、RR比は低下。
テスト2 統計
破産の確率 | 期待値/リスク | 収益の見込み |
---|---|---|
0.01% | 0.187 | 372.6 |
破産の確率は、損失の許容=2%で算出しています。期待値と収益の見込みは以下の計算式で算出しています。
収益の見込みを算出すると、テスト1と比較して「悪化した」ことが分かりますね。ドンチアン・トレンド・シス テムにおいては「ロスカットは有効(かもしれない)」ということが言えそうです。
テスト3
最後に、テスト1に「ピラミッティングを加えたシステム」のバックテストをしてみます。
テスト3 設定
DC-en | DC-ex | EMA-m | EMA-l | Losscut | Pyramiding |
---|---|---|---|---|---|
20 | 10 | 25 | 350 | 2-ATR | 1-ATR 上限4 |
「エントリーした価格からプラス方向にATRの1倍動いたらポジションを追加する」というものです。最初のものを含めて4回のエントリーが上限です。タートルズの用語で言うと「ロード」の状態ですね。
テスト3 結果
損益 | 最大DD | 取引数 | 勝数 | 勝率 | RR比 | |
---|---|---|---|---|---|---|
Total | 5187 | 1916 | 36.94% | 2.23 | ||
USDJPY | 51.9 | 42.89 | 204 | 70 | 34.31 | 2.492 |
EURJPY | -19.47 | 75.98 | 215 | 69 | 32.09 | 1.961 |
GBPJPY | 77.88 | 82.57 | 237 | 87 | 36.71 | 2.114 |
CHFJPY | -12.34 | 67.28 | 211 | 65 | 30.81 | 2.109 |
CADJPY | 0.4 | 86.21 | 204 | 69 | 33.82 | 1.946 |
NKY | 24196.85 | 7703.55 | 212 | 82 | 38.68 | 2.608 |
DJI | 29991.63 | 5830.94 | 217 | 102 | 27 | 2.564 |
DAX | 9162.11 | 5504.51 | 218 | 90 | 41.28 | 2.06 |
UKX | -7690.8 | 8475.6 | 234 | 73 | 31.2 | 1.222 |
HSI | 3538.84 | 32801.44 | 235 | 95 | 40.43 | 1.543 |
6098 | 2752 | 454 | 30 | 10 | 33.33 | 7.354 |
4452 | 1888 | 2858 | 213 | 75 | 35.21 | 2.09 |
5711 | 15660 | 2870 | 191 | 80 | 41.88 | 2.59 |
7201 | -2447.5 | 2660.4 | 217 | 60 | 27.65 | 1.483 |
9984 | 7991 | 5140 | 200 | 79 | 39.5 | 2.178 |
AAPL | 247.16 | 39.34 | 235 | 111 | 47.23 | 2.455 |
AXP | -26.53 | 100.92 | 227 | 76 | 33.48 | 1.789 |
BA | 518.54 | 77.84 | 223 | 90 | 40.36 | 3.857 |
JNJ | 49.57 | 47.19 | 192 | 71 | 36.98 | 2.246 |
MCD | 75.7 | 69.33 | 218 | 80 | 36.7 | 2.332 |
GOLD | 25220 | 83980 | 221 | 95 | 42.99 | 1.437 |
PLATINUM | 42340 | 99125 | 222 | 79 | 35.59 | 2.115 |
WTI | 138170 | 170150 | 211 | 74 | 35.07 | 2.544 |
CORN | 20900 | 34500 | 202 | 61 | 30.2 | 2.754 |
SOY BEAN | 50212.5 | 50712.5 | 198 | 73 | 36.87 | 2.17 |
テスト3 統計
破産の確率 | 期待値/リスク | 収益の見込み |
---|---|---|
0.02% | 0.19 | 1009.2 |
破産の確率は、損失の許容=2%で算出しています。期待値と 収益の見込みは以下の計算式で算出しています。
ピラミッティングはかなり効果的なようです。
- 「収益の見込み」がテスト1の倍以上に
- 「期待値」は低下、「取引回数」が大幅増
- 破産の危険が少し上昇
- 「期待値」が 0.2 くらいになると「破産の確率」が顕在化する?(単利・仮説)
テスト結果の比較
さて、今回もテスト結果をまとめて比較してみたいと思います。
取引回数 | 勝率 | RR比 | 破産の確率 | 期待値 | 収益の見込み | |
---|---|---|---|---|---|---|
テスト1 | 2043 | 37.84 | 2.200 | 0.01 | 0.210 | 429.88 |
テスト2 | 1993 | 38.69 | 2.070 | 0.01 | 0.187 | 372.60 |
テスト3 | 5187 | 36.94 | 2.230 | 0.02 | 0.190 | 1009.02 |
- もっとも成績が良いのはテスト3
- 手法の良し悪しは「期待値 ✕ 取引回数」
- 期待値の低下 ≒ 破産の確率の上昇
- RR比よりも勝率のほうが「破産の確率」に及ぼす影響が強そう
こんなところでしょうか。以前もやったことのあるテストですが、あらためて行ってみると、また新しい発見がでてきます。ここから考えられそうなことを少し書き出してみようと思います。
考察
ここまで、「儲かる」「勝てる」という結果ばかりで思わず忘れてしまいそうですが、(当然)いくつかの注意点もあります。大事な、決して忘れてはいけない注意点です。
- 破産の確率が「1トレードのリスクを全資金の2%」にしたものだということ
- ピラミッティングは「やれば良い」というものでもない
- 勝てるシステムは絶妙なバランスのもとに成り立っている
この辺りがわからない方は、わかるまでやらないほうが良いです。
何かひとつでも崩れたら、あっという間に破産してしまう――
勝てるシステムは、そんな絶妙なバランスのもとに成り立っています。別に、特別むずかしいことではないのですが、知らないとムリです。センスとかじゃなく「知ってるか知らないか」だと思いますので。
さて、今回のバックテストで強く感じたのは、次の点でした。
- 期待値よりも取引回数の方が増やしやすい
- 期待値(勝率もしくはRR比)を上げるの大変
- 取引回数を増やすのはそこまで大変じゃない
- つまり、儲けたいなら取引回数を増やす方が良い
- 短期のシステムにする
- 銘柄数を増やす
- 足種を短期間のものにする
リスクと資金の管理は必須です。あとは生活との相談。そして、ルールを遵守すること。
Pineスクリプト
今回行ったバックテストに用いたストラテジーのコード(Pineスクリプト)を公開します。販売や二次配布以外は自由にご利用いただいて差し支えありません。ご自由にお使いください!
strategy("Strategy Turtle Donchian Trend System"
,default_qty_type=strategy.fixed
,default_qty_value=1
,pyramiding=4
,overlay=true)
src = close
len_dc_entry = input(20 ,minval=1 ,title="length of dc entry")
len_dc_exit = input(10 ,minval=1 ,title="length of dc exit")
len_ema_m = input(25 ,minval=1 ,title="length of middle ema")
len_ema_l = input(350 ,minval=1 ,title="length of long ema")
SO_bool = input(false,type=bool ,title="loss cut")
SO_len = input(20 ,type=integer ,minval=1 ,title="loss cut ATR length")
SO_N = input(2 ,type=float ,minval=0.5 ,title="loss cut ATR*N")
MAX_N = input(1 ,type=integer ,minval=1 ,maxval=4 ,title="maximun num of unit")
LO_len = input(20 ,type=integer ,minval=1 ,title="pyramiding ATR length")
LO_N = input(1 ,type=float ,minval=0.5 ,title="pyramiding ATR*N")
Tm_bool = input(false,type=bool ,title="timed exit")
Tm_len = input(80 ,type=integer ,minval=1 ,title="timed exit length")
fromYear = input(2005 ,type=integer ,minval=1900 ,title="test start")
endYear = input(2017 ,type=integer ,minval=1900 ,title="test end")
isWork = timestamp(fromYear ,1 ,1 ,00 ,00) <= time and time < timestamp(endYear+1 ,1 ,1 ,00 ,00)
upper_en = highest(high ,len_dc_entry)[1]
upper_ex = highest(high ,len_dc_exit)[1]
lower_en = lowest(low ,len_dc_entry)[1]
lower_ex = lowest(low ,len_dc_exit)[1]
ema_m = ema(src ,len_ema_m)
ema_l = ema(src ,len_ema_l)
atr_SO_ = ema(tr ,SO_len)
atr_LO_ = ema(tr ,LO_len)
atr_SO = atr_SO_*SO_N
atr_LO = atr_LO_*LO_N
countTradingDays = na
countNonTradingDays = na
countTradingDays := strategy.position_size==0 ? 0 : countTradingDays[1] + 1
countNonTradingDays := strategy.position_size!=0 ? 0 : countNonTradingDays[1] + 1
entry1 = close
entry2 = close
entry3 = close
entry4 = close
entry1 := strategy.position_size==0 ? na : entry1[1]
entry2 := strategy.position_size==0 ? na : entry2[1]
entry3 := strategy.position_size==0 ? na : entry3[1]
entry4 := strategy.position_size==0 ? na : entry4[1]
lo2 = close
lo3 = close
lo4 = close
lo2 := strategy.position_size==0 ? na : lo2[1]
lo3 := strategy.position_size==0 ? na : lo3[1]
lo4 := strategy.position_size==0 ? na : lo4[1]
L_EntrySig = strategy.position_size==0 and high >= upper_en and ema_m >= ema_l
S_EntrySig = strategy.position_size==0 and low <= lower_en and ema_m <= ema_l
lo_sig2 = strategy.position_size>0 ? lo2 < high : strategy.position_size<0 ? lo2 > low : na
lo_sig3 = strategy.position_size>0 ? lo3 < high : strategy.position_size<0 ? lo3 > low : na
lo_sig4 = strategy.position_size>0 ? lo4 < high : strategy.position_size<0 ? lo4 > low : na
losscut = close
losscut := SO_bool==false ? na
: L_EntrySig ? close - atr_SO
: S_EntrySig ? close + atr_SO
: strategy.position_size>0 and (lo_sig2 or lo_sig3 or lo_sig4) ? close - atr_SO
: strategy.position_size<0 and (lo_sig2 or lo_sig3 or lo_sig4) ? close + atr_SO
: strategy.position_size!=0 ? losscut[1]
: na
ExitPrice = close
ExitPrice := L_EntrySig or strategy.position_size>0 ? SO_bool ? max(losscut ,lower_ex) : lower_ex
: S_EntrySig or strategy.position_size<0 ? SO_bool ? min(losscut ,upper_ex) : upper_ex
: na
if(strategy.position_size != 0)
L_ExitSig = (low <= lower_ex or S_EntrySig) and strategy.position_size > 0
S_ExitSig = (high >= upper_ex or L_EntrySig) and strategy.position_size < 0
TimedSig = countTradingDays > Tm_len and Tm_bool
strategy.close_all(when = L_ExitSig or S_ExitSig or TimedSig)
if(L_ExitSig or S_ExitSig)
entry1 := na
entry2 := na
entry3 := na
entry4 := na
lo2 := na
lo3 := na
lo4 := na
losscut := na
if(strategy.position_size > 0)
strategy.exit("L-Entry1" ,stop=ExitPrice)
if(entry2!=na)
strategy.exit("L-Entry2" ,stop=ExitPrice)
if(entry3!=na)
strategy.exit("L-Entry3" ,stop=ExitPrice)
if(entry4!=na)
strategy.exit("L-Entry4" ,stop=ExitPrice)
if(lo_sig2 and MAX_N >= 2)
lo2 := na
if(SO_bool)
strategy.entry("L-Entry2" ,strategy.long ,stop=ExitPrice ,comment="L-Entry2")
strategy.exit("L-Entry1" ,stop=ExitPrice)
else
strategy.entry("L-Entry2" ,strategy.long ,comment="L-Entry2")
if(lo_sig3 and MAX_N >= 3)
lo3 := na
if(SO_bool)
strategy.entry("L-Entry3" ,strategy.long ,stop=ExitPrice ,comment="L-Entry3")
strategy.exit("L-Entry2" ,stop=ExitPrice)
strategy.exit("L-Entry1" ,stop=ExitPrice)
else
strategy.entry("L-Entry3" ,strategy.long ,comment="L-Entry3")
if(lo_sig4 and MAX_N >= 4)
lo4 := na
if(SO_bool)
strategy.entry("L-Entry4" ,strategy.long ,stop=ExitPrice ,comment="L-Entry4")
strategy.exit("L-Entry3" ,stop=ExitPrice)
strategy.exit("L-Entry2" ,stop=ExitPrice)
strategy.exit("L-Entry1" ,stop=ExitPrice)
else
strategy.entry("L-Entry4" ,strategy.long ,comment="L-Entry4")
if(strategy.position_size < 0)
strategy.exit("S-Entry1" ,stop=ExitPrice)
if(entry2!=na)
strategy.exit("S-Entry2" ,stop=ExitPrice)
if(entry3!=na)
strategy.exit("S-Entry3" ,stop=ExitPrice)
if(entry4!=na)
strategy.exit("S-Entry4" ,stop=ExitPrice)
if(lo_sig2 and MAX_N >= 2)
lo2 := na
if(SO_bool)
strategy.entry("S-Entry2" ,strategy.short ,stop=ExitPrice ,comment="S-Entry2")
strategy.exit("S-Entry1" ,stop=ExitPrice)
else
strategy.entry("S-Entry2" ,strategy.short ,comment="S-Entry2")
if(lo_sig3 and MAX_N >= 3)
lo3 := na
if(SO_bool)
strategy.entry("S-Entry3" ,strategy.short ,stop=ExitPrice ,comment="S-Entry3")
strategy.exit("S-Entry2" ,stop=ExitPrice)
strategy.exit("S-Entry1" ,stop=ExitPrice)
else
strategy.entry("S-Entry3" ,strategy.short ,comment="S-Entry3")
if(lo_sig4 and MAX_N >= 4)
lo4 := na
if(SO_bool)
strategy.entry("S-Entry4" ,strategy.short ,stop=ExitPrice ,comment="S-Entry4")
strategy.exit("S-Entry3" ,stop=ExitPrice)
strategy.exit("S-Entry2" ,stop=ExitPrice)
strategy.exit("S-Entry1" ,stop=ExitPrice)
else
strategy.entry("S-Entry4" ,strategy.short ,comment="S-Entry4")
if((L_EntrySig or S_EntrySig) and isWork)
countTradingDays := 0
entry1 := close
if(L_EntrySig)
if(SO_bool)
strategy.entry("L-Entry1" ,strategy.long ,stop=ExitPrice ,comment="L-Entry1")
else
strategy.entry("L-Entry1" ,strategy.long ,comment="L-Entry1")
lo2 := MAX_N >= 2 ? close + atr_LO : na
lo3 := MAX_N >= 3 ? close + atr_LO * 2 : na
lo4 := MAX_N >= 4 ? close + atr_LO * 3 : na
if(S_EntrySig)
if(SO_bool)
strategy.entry("S-Entry1" ,strategy.short ,stop=ExitPrice ,comment="S-Entry1")
else
strategy.entry("S-Entry1" ,strategy.short ,comment="S-Entry1")
lo2 := MAX_N >= 2 ? close - atr_LO : na
lo3 := MAX_N >= 3 ? close - atr_LO * 2 : na
lo4 := MAX_N >= 4 ? close - atr_LO * 3 : na
plot(strategy.position_size ,transp=0 ,title="保有ポジションの数")
plot(strategy.openprofit ,transp=0 ,title="未決済の損益")
plot(strategy.netprofit ,transp=0 ,title="決済済みの損益")
plot(strategy.closedtrades ,transp=0 ,title="決済済み取引数")
plot(countTradingDays ,transp=0 ,title="取引日数")
plot(countNonTradingDays ,transp=0 ,title="ノンポジ日数")
plot(entry1 ,title="entry1" ,color=blue ,transp=0 ,style=linebr)
plot(lo2 ,title="lo2" ,color=red ,transp=0 ,style=linebr)
plot(lo3 ,title="lo3" ,color=red ,transp=0 ,style=linebr)
plot(lo4 ,title="lo4" ,color=red ,transp=0 ,style=linebr)
plot(ExitPrice ,title="ExitPrice" ,color=red ,transp=0 ,style=linebr)
plot(atr_SO ,transp=0 ,title="ATR_SO")
plot(atr_LO ,transp=0 ,title="ATR_LO")
p1 = plot(ema_m ,color=#303F9F ,title="ema_m" ,style=line ,linewidth=1, transp=0)
p2 = plot(ema_l ,color=#4CAF50 ,title="ema_l" ,style=line ,linewidth=1, transp=0)
fill(p1 ,p2 ,color=#2196F3 ,title="fill" ,transp=80)
p3 = plot(lower_en ,color=gray ,title="lower_entry" ,style=linebr ,linewidth=1 ,transp=40)
p4 = plot(upper_en ,color=gray ,title="upper_entry" ,style=linebr ,linewidth=1 ,transp=40)
fill(p3 ,p4 ,color=gray ,title="fill" ,transp=90)
plot(strategy.position_size>0 ? lower_ex : na ,color=red ,title="lower_exit" ,style=linebr ,linewidth=1 ,transp=30)
plot(strategy.position_size<0 ? upper_ex : na ,color=red ,title="upper_exit" ,style=linebr ,linewidth=1 ,transp=30)
TradingViewでも公開しています!
TradingView のインジケーターの検索で「donchian trend system」と検索するとでてきます。上記のコードと同じストラテジーを使用することができます。
バックテストならTradingView
TradingViewのテストは大変便利で、かなり自由の効くバックテストを短時間で簡単に、価格データを用意することなく豊富な銘柄と足種を対象に行うことができます。
一方で、その簡便さと引き換えに、TradingViewではできないバックテストも多くあります。
たとえば「分散投資」や「資金管理」があげられますが、これらは投資において非常に重要な要素でもあり、これらを含めたバックテストをするならリアルさが不可欠です。こういったバックテストをするためには、やはりPythonなどのプログラミング言語で自作していくしかないと考えています。
とはいえ、TradingViewが便利であることは間違いなく、最近では、手法の検証はTradingViewで行い、良い手法が見つかったら更に詳細なテストをPythonで行うようにしています。できるものはTradingViewでサクサクやってしまいます。
- 記事をシェア