どんな記事
この記事を読むと、
- 超長期のボリンジャーバンドのバックテストが自分でも
- 「コピー → ペースト → 1クリック」の簡単操作で(コードを無料公開)
- 「22銘柄12年 ✕ 4テスト」の検証結果がわかる
追記
2018年12月9日
「TradingViewでも公開しています!」を追加しました
タートルズ流 投資の魔術 からの引用
まずは、この記事の主題でもある「ボリンジャー・ブレイクアウト」について書かれている箇所を「伝説のトレーダー集団 タートルズ流投資の魔術」から引用します。
このシステムは、1992年に出版されたチャック・ルボーとデビット・ルーカスの共著『マーケットのテクニカル秘録』で説明されている(チャネル幅にさまざまな日数の移動平均とさまざまな標準偏差を用いている)。
ボリンジャー・バンドはジョン・ボリンジャーによって考案された変動性チャネルだ。これは、終値の350日移動平均に標準偏差の2.5倍を加算・減算したもので、前日の終値がチャネルの上限を超えたら、寄り付きから買い持ちのトレードを仕掛け、前日の終値がチャネルの下限を下回れば、売り持ちとなる。終値が移動平均値とクロスし て下へ抜けたら、取引は手じまいだ。
この記事は、上記の手法をTradingViewで再現することを目的としたものです。
ストラテジーを作成
チャートが再現できているか確認するために、「伝説のトレーダー集団 タートルズ流投資の魔術」の P.167 図22 と同じものを作成してみました。
前回同様、限月とつなぎ足の違いはあると思いますが、貴金属が限月間の差が少ないのか大きな違いはなく(ほぼ)同じ形のチャートを作成することができました。かなり近い形で再現できていると思います。
パラメーターやコードは「Pineスクリプト」をご覧ください。
エントリーとイグジット
買いエントリー
- 「SMA350+標準偏差の2.5倍」を終値で上抜けたら買い エントリー
- 買い持ちの状態で「SMA350」を終値で下抜けたら決済
売りエントリー
- 「SMA350-標準偏差の2.5倍」を終値で下抜けたら売りエントリー
- 売り持ちの状態で「SMA350」を終値で上抜けたら決済
ボリンジャー・ブレイクアウトも「The トレンドフォロー」ですね。前回のATRチャネル・ブレイクアウトより勝率が高めな気がします。
バックテスト
同じ条件で手法を比べるために、以下の「基本条件」でテストしていきます。
バックテストの基本条件
期間
- 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 設定
MA | Stev upper | Stev lower | Losscut | Pyramiding |
---|---|---|---|---|
350 | 2.5 | 2.5 | None | None |
テスト1 結果
損益 | 最大DD | 取引数 | 勝数 | 勝率 | RR比 | |
---|---|---|---|---|---|---|
Total | 159 | 73 | 45.91 | 2.950 | ||
USDJPY | 48.64 | 4.98 | 5 | 3 | 60.00 | 5.889 |
EURJPY | 15.68 | 25.32 | 8 | 3 | 37.50 | 2.462 |
GBPJPY | 141.55 | 5.22 | 5 | 4 | 80.00 | 7.028 |
CHFJPY | 2.72 | 14.57 | 7 | 2 | 28.57 | 2.729 |
CADJPY | -0.21 | 9.52 | 9 | 4 | 44.44 | 1.236 |
NKY | 11027.16 | 1409.97 | 6 | 4 | 66.67 | 2.620 |
DJI | 5444.31 | 3114.88 | 8 | 4 | 50.00 | 2.127 |
DAX | -443.16 | 2306.59 | 5 | 2 | 40.00 | 1.212 |
UKX | 125.80 | 1186.90 | 7 | 3 | 42.86 | 1.419 |
HSI | -13836.28 | 20811.90 | 8 | 1 | 12.50 | 2.346 |
6098 | 1208.00 | 0.00 | 1 | 1 | 100.00 | - |
4452 | 2316.00 | 878.00 | 7 | 3 | 42.86 | 3.168 |
5711 | -3385.00 | 4845.00 | 8 | 2 | 25.00 | 1.049 |
7201 | -211.00 | 392.00 | 5 | 1 | 20.00 | 2.61 |
9984 | 4306.00 | 183.00 | 6 | 4 | 66.67 | 8.329 |
AAPL | 61.69 | 6.79 | 6 | 5 | 83.33 | 2.017 |
AXP | 32.89 | 5.79 | 6 | 3 | 50.00 | 3.157 |
BA | 164.40 | 52.59 | 8 | 4 | 50.00 | 3.591 |
JNJ | 14.70 | 21.36 | 7 | 2 | 38.57 | 3.851 |
MCD | 33.60 | 16.15 | 7 | 4 | 57.14 | 1.974 |
GOLD | 78130.00 | 21370.00 | 5 | 3 | 60.00 | 3.104 |
PLATINUM | 16365.00 | 27100.00 | 4 | 2 | 50.00 | 1.605 |
WTI | -3380.00 | 48590.00 | 7 | 3 | 42.86 | 1.260 |
CORN | -2900.00 | 8700.00 | 8 | 3 | 37.50 | 1.336 |
SOY BEANS | 5212.50 | 18325.00 | 6 | 3 | 50.00 | 1.198 |
以下のことが言えそうです。
- 勝率高め、RRもかなり優秀
- ATRチャネル・ブレイクアウトよりもかなり優秀
- 日本の個別株は苦手そう
- その他はほぼプラス以上
日本個別株は、超長期の手法が苦手な可能性がありそうです。5銘柄だけなので何とも判断がつきませんが。
テスト1 統計
破産の確率 | 期待値/リスク |
---|---|
0.00% | 0.81 |
破産の確率は、損失の許容=2%で算出しています。期待値と収益の見込みは以下の計算式で算出しています。
破産の確率は0%ですね。期待値を算出してみると、前回のATRチャネル・ブレイクアウトよりもかなり優秀です。シリーズの終わりにすべての手法を比較してみたいと思いますが、かなり優秀な期待値じゃないかと思います。
テスト2
次にピラミッティングを追加してテストしてみます。
テスト2 設定
MA | Stev upper | Stev lower | Losscut | Pyramiding |
---|---|---|---|---|
350 | 2.5 | 2.5 | None | 10-ATR 上限4 |
エントリー後、プラス方向に20日ATRの10倍ごとに追加します。最初のものを含めて4回のエントリーが上限です。タートルズの用語で言うと「ロード」の状態ですね。
テスト2 結果
損益 | 最大DD | 取引数 | 勝数 | 勝率 | RR比 | |
---|---|---|---|---|---|---|
Total | 319 | 156 | 48.90 | 1.950 | ||
USDJPY | 116.30 | 6.89 | 10 | 7 | 70.00 | 4.233 |
EURJPY | 12.59 | 24.44 | 13 | 5 | 38.46 | 2.030 |
GBPJPY | 170.97 | 31.56 | 16 | 9 | 56.25 | 2.403 |
CHFJPY | 10.95 | 36.26 | 12 | 5 | 41.67 | 1.699 |
CADJPY | -23.47 | 33.34 | 14 | 5 | 35.71 | 0.825 |
NKY | 19069.57 | 3866.40 | 15 | 11 | 73.33 | 1.335 |
DJI | 8957.34 | 5238.15 | 19 | 11 | 57.89 | 1.366 |
DAX | 2373.58 | 2306.59 | 8 | 6 | 62.50 | 1.217 |
UKX | 946.90 | 1482.00 | 12 | 6 | 50.00 | 1.387 |
HSI | -3980.33 | 20811.90 | 11 | 4 | 36.36 | 1.421 |
6098 | 3030.00 | 0.00 | 4 | 4 | 100.00 | - |
4452 | 7300.00 | 2524.00 | 13 | 6 | 46.15 | 3.167 |
5711 | -4005.00 | 6155.00 | 12 | 3 | 25.00 | 1.156 |
7201 | -830.00 | 830.00 | 8 | 1 | 12.50 | 2.261 |
9984 | 409.00 | 3192.00 | 15 | 6 | 40.00 | 1.585 |
AAPL | -28.54 | 118.87 | 21 | 8 | 38.10 | 1.294 |
AXP | 34.42 | 21.04 | 12 | 6 | 50.00 | 1.849 |
BA | 400.47 | 55.42 | 17 | 10 | 58.82 | 4.32 |
JNJ | 37.73 | 21.36 | 12 | 6 | 50.00 | 1.932 |
MCD | 16.91 | 26.95 | 16 | 8 | 50.00 | 1.285 |
GOLD | 174830.00 | 29490.00 | 12 | 8 | 66.67 | 3.232 |
PLATINUM | 79885.00 | 27100.00 | 9 | 6 | 66.67 | 1.787 |
WTI | -87820.00 | 145190.00 | 14 | 5 | 35.71 | 0.846 |
CORN | -34387.00 | 34387.00 | 15 | 4 | 26.67 | 0.744 |
SOY BEANS | 32000.00 | 18325.00 | 9 | 6 | 66.67 | 1.109 |
テストが終わった段階で、ちょっと悪くなった印象でした。とはいえ、勝率48.9%とRR比1.95倍なので、単利でやれば十分勝てる手法です。確認のため期待値を算出してみると次のようになります。
テスト2 統計
破産の確率 | 期待値/リスク |
---|---|
0.00% | 0.44 |
破産の確率は、損失の許容=2%で算出しています。期待値と収益の見込みは以下の計算式で算出しています。
テスト1と比較して「0.81 → 0.44」とかなり悪化しています。「取引回数を考慮するとどうなるか」を「テスト結果の比較」で見てみたいと思います。
テスト3
次は、一般的によく使われる「標準偏差の2倍」にしてみます。
テスト3 設定
MA | Stev upper | Stev lower | Losscut | Pyramiding |
---|---|---|---|---|
350 | 2 | 2 | None | None |
テスト3 結果
損益 | 最大DD | 取引数 | 勝数 | 勝率 | RR比 | |
---|---|---|---|---|---|---|
Total | 204 | 88 | 43.14 | 3.050 | ||
USDJPY | 42.51 | 17.00 | 8 | 3 | 37.50 | 5.622 |
EURJPY | 26.78 | 13.37 | 10 | 4 | 40.00 | 2.990 |
GBPJPY | 149.08 | 12.61 | 6 | 4 | 66.67 | 6.409 |
CHFJPY | 23.67 | 8.65 | 8 | 3 | 37.50 | 4.493 |
CADJPY | -17.13 | 22.36 | 13 | 5 | 38.46 | 0.968 |
NKY | 9443.43 | 2747.39 | 8 | 4 | 50.00 | 3.004 |
DJI | 6484.98 | 2765.62 | 10 | 4 | 40.00 | 3.290 |
DAX | 3520.08 | 868.84 | 7 | 5 | 71.43 | 1.449 |
UKX | -555.80 | 1940.80 | 11 | 4 | 36.36 | 1.443 |
HSI | 2364.60 | 8764.19 | 9 | 2 | 22.22 | 4.444 |
6098 | 1173.00 | 142.00 | 2 | 1 | 50.00 | 9.261 |
4452 | 2145.00 | 1319.00 | 9 | 3 | 33.33 | 3.979 |
5711 | -2080.00 | 3880.00 | 9 | 3 | 33.33 | 1.102 |
7201 | -521.00 | 521.00 | 9 | 1 | 11.11 | 3.405 |
9984 | 4062.00 | 585.00 | 8 | 5 | 62.50 | 2.500 |
AAPL | 93.63 | 15.31 | 7 | 5 | 71.43 | 2.320 |
AXP | 50.06 | 8.10 | 7 | 4 | 57.14 | 3.861 |
BA | 219.82 | 40.31 | 8 | 5 | 62.50 | 3.293 |
JNJ | 15.68 | 21.91 | 8 | 2 | 25.00 | 4.454 |
MCD | 31.99 | 30.18 | 11 | 4 | 36.36 | 3.119 |
GOLD | 98100.00 | 9880.00 | 5 | 3 | 60.00 | 7.286 |
PLATINUM | 530.00 | 45625.00 | 7 | 3 | 42.86 | 1.347 |
WTI | 10690.00 | 74140.00 | 9 | 4 | 44.44 | 1.461 |
CORN | 362.50 | 13462.50 | 9 | 4 | 44.44 | 1.277 |
SOY BEANS | 19837.50 | 11825.00 | 6 | 3 | 50.00 | 2.062 |
条件を標準偏差の「2.5倍」から「2倍」にした分、取引回数が増えています。これで期待値が悪くならなければ、テスト1よりも良いと言えそうです。
テスト3 統計
破産の確率 | 期待値/リスク |
---|---|
0.00% | 0.75 |
破産の確率は、損失の許容=2%で算出しています。期待値と収益の見込みは以下の計算式で算出しています。
期待値を算出してみると、テスト1と比較して「0.81 → 0.75」となり、それほど悪化していないことがわかります。この点も「テスト結果の比較」で、もうちょっとだけ細かく見てみたいと思います。
テスト4
最後に、テスト3にピラミッティングを加えたものをテストしてみます。
テスト4 設定
MA | Stev upper | Stev lower | Losscut | Pyramiding |
---|---|---|---|---|
350 | 2 | 2 | None | 10-ATR 上限4 |
テスト4 結果
損益 | 最大DD | 取引数 | 勝数 | 勝率 | RR比 | |
---|---|---|---|---|---|---|
Total | 401 | 188 | 46.88 | 2.41 | ||
USDJPY | 119.77 | 17.00 | 14 | 8 | 57.14 | 5.070 |
EURJPY | 12.36 | 28.94 | 18 | 7 | 38.89 | 1.873 |
GBPJPY | 237.82 | 32.55 | 17 | 11 | 64.71 | 2.803 |
CHFJPY | 33.24 | 30.34 | 14 | 6 | 42.86 | 2.464 |
CADJPY | -42.18 | 50.42 | 19 | 6 | 31.58 | 0.888 |
NKY | 17695.86 | 6599.18 | 18 | 11 | 61.11 | 1.695 |
DJI | 12927.77 | 454.2 | 22 | 11 | 50.00 | 2.232 |
DAX | 4252.88 | 3569.55 | 15 | 8 | 53.33 | 1.649 |
UKX | -936.20 | 4056.80 | 18 | 8 | 44.44 | 1.029 |
HSI | 3241.96 | 22692.00 | 17 | 6 | 35.29 | 2.060 |
6098 | 3528.00 | 142.00 | 5 | 4 | 80.00 | 6.461 |
4452 | 7513.00 | -2688.00 | 15 | 6 | 40.00 | 3.876 |
5711 | -2480.00 | 6110.00 | 14 | 5 | 35.71 | 1.149 |
7201 | -1829.00 | 1829.00 | 15 | 2 | 13.33 | 1.404 |
9984 | 2331.00 | 3424.00 | 18 | 8 | 44.44 | 1.635 |
AAPL | 197.42 | 44.93 | 21 | 14 | 66.67 | 2.207 |
AXP | 50.20 | 14.78 | 13 | 4 | 53.85 | 2.195 |
BA | 597.56 | 42.44 | 20 | 13 | 65.00 | 4.362 |
JNJ | 47.36 | 21.91 | 15 | 6 | 40.00 | 2.710 |
MCD | 44.37 | 40.00 | 21 | 10 | 47.62 | 1.788 |
GOLD | 213750.00 | 18000.00 | 12 | 9 | 75.00 | 4.310 |
PLATINUM | 66845.00 | 45625.00 | 13 | 7 | 53.85 | 1.820 |
WTI | -54260.00 | 130270.00 | 17 | 7 | 41.18 | 0.909 |
CORN | -36750.00 | 40962.50 | 18 | 5 | 27.78 | 0.857 |
SOY BEANS | 11362.50 | 40075.00 | 12 | 6 | 50.00 | 1.227 |
テスト4 統計
破産の確率 | 期待値/リスク |
---|---|
0.00% | 0.6 |
破産の確率は、損失の許容=2%で算出しています。期待値と収益の見込みは以下の計算式で算出しています。
期待値は 0.6 になりましたが、取引数はもっとも多くなりました。はたして「どのテストが優秀なのか」次で比べてみたいと思います。
テスト結果の比較
さて、テスト1からテスト4まで行いましたが、手法の良し悪しは「期待値と取引回数のバランス」で決まります。対象となる銘柄を増やせば高い期待値のまま取引回数を増やせますが、バックテストの比較ではまったく関係のない話です。
取引回数 | 勝率 | RR比 | 破産の確率 | 期待値 | 収益の見込み | |
---|---|---|---|---|---|---|
テスト1 | 159 | 45.91 | 2.950 | 0.81 | 128.79 | |
テスト2 | 319 | 48.90 | 1.950 | 0.44 | 140.36 | |
テスト3 | 204 | 43.14 | 3.050 | 0.75 | 153.00 | |
テスト4 | 401 | 46.88 | 2.410 | 0.60 | 240.60 |
収益の見込みは、それぞれ以下で算出しました。
- テスト1: 0.81 ✕ 159 = 128.79
- テスト2: 0.44 ✕ 319 = 140.36
- テスト3: 0.75 ✕ 204 = 153.00
- テスト4: 0.60 ✕ 401 = 240.60
こうやって計算してみると、成績が良いのは〝ダントツ〟で「テスト4」ですね。わかりやすい。
期待値が良くても取引回数(チャンス)が少なければ意味がないし、取引回数が多くても期待値がマイナスなら損してしまう。つまり、この2つのバランスが重要です。
考察
今回、2つの変数を調整してみました。「標準偏差を何倍にするか」と「ピラミッティングの有無」です。
まず、どちらの調整もプラスに作用したことがわかります。
- テスト1 → テスト2: 128.79 → 140.36
- テスト1 → テスト3: 128.79 → 153.00
組み合わせてみると、さらに良い結果になりました。
- テスト4: 240.60
最適化の問題は、短期間の偏ったデータを対象に行なうテストで行うことで生じます。このように、バックテストの〝量〟と〝質〟を確保した上で効果的な変数を探ることは、非常に有意義だと考えています。
また、実際のトレードでは「取引対象を増やすこと」で「高い期待値を維持しながら取引回数を増やすこと」も可能です。実際のトレードとバックテスト、それぞれのメリットとデメリットを把握して良い点を活かしていきたいものです。
Pineスクリプト
今回行ったバックテストに用いたストラテジーのコード(Pineスクリプト)を公開します。販売や二次配布以外は自由にご利用いただいて差し支えありません。ご自由にお使いください!
strategy("Strategy Turtle Bollinger Break Out"
,default_qty_type=strategy.fixed
,default_qty_value=1
,pyramiding=4
,overlay=true)
src = close
len = input(350 ,minval=1 ,title="ma length")
up_n = input(2 ,minval=1 ,title="stdev upper n")
low_n = input(2 ,minval=1 ,title="stdev lower n")
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(10 ,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)
SMA = sma(close ,len)
STD = stdev(close ,len)
UPPER = SMA + STD * up_n
LOWER = SMA - STD * low_n
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]
losscut = close
losscut := strategy.position_size==0 or SO_bool==false ? na : losscut[1]
L_EntrySig = close >= UPPER
S_EntrySig = close <= LOWER
if(strategy.position_size != 0)
L_ExitSig = (close <= SMA or S_EntrySig) and strategy.position_size > 0
S_ExitSig = (close >= SMA 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)
lo_sig2 = lo2 < high
lo_sig3 = lo3 < high
lo_sig4 = lo4 < high
if(lo_sig2 and MAX_N >= 2)
if(SO_bool)
strategy.entry("L-Entry2" ,strategy.long ,stop=close-atr_SO ,comment="L-Entry2")
strategy.exit("L-Entry1" ,stop=close-atr_SO)
else
strategy.entry("L-Entry2" ,strategy.long ,comment="L-Entry2")
lo2 := na
losscut := SO_bool ? close - atr_SO : na
if(lo_sig3 and MAX_N >= 3)
if(SO_bool)
strategy.entry("L-Entry3" ,strategy.long ,stop=close-atr_SO ,comment="L-Entry3")
strategy.exit("L-Entry2" ,stop=close-atr_SO)
strategy.exit("L-Entry1" ,stop=close-atr_SO)
else
strategy.entry("L-Entry3" ,strategy.long ,comment="L-Entry3")
lo3 := na
losscut := SO_bool ? close - atr_SO : na
if(lo_sig4 and MAX_N >= 4)
if(SO_bool)
strategy.entry("L-Entry4" ,strategy.long ,stop=close-atr_SO ,comment="L-Entry4")
strategy.exit("L-Entry3" ,stop=close-atr_SO)
strategy.exit("L-Entry2" ,stop=close-atr_SO)
strategy.exit("L-Entry1" ,stop=close-atr_SO)
else
strategy.entry("L-Entry4" ,strategy.long ,comment="L-Entry4")
lo4 := na
losscut := SO_bool ? close - atr_SO : na
if(strategy.position_size < 0)
lo_sig2 = lo2 > low
lo_sig3 = lo3 > low
lo_sig4 = lo4 > low
if(lo_sig2 and MAX_N >= 2)
if(SO_bool)
strategy.entry("S-Entry2" ,strategy.short ,stop=close+atr_SO ,comment="S-Entry2")
strategy.exit("S-Entry1" ,stop=close+atr_SO)
else
strategy.entry("S-Entry2" ,strategy.short ,comment="S-Entry2")
lo2 := na
losscut := SO_bool ? close + atr_SO : na
if(lo_sig3 and MAX_N >= 3)
if(SO_bool)
strategy.entry("S-Entry3" ,strategy.short ,stop=close+atr_SO ,comment="S-Entry3")
strategy.exit("S-Entry2" ,stop=close+atr_SO)
strategy.exit("S-Entry1" ,stop=close+atr_SO)
else
strategy.entry("S-Entry3" ,strategy.short ,comment="S-Entry3")
lo3 := na
losscut := SO_bool ? close + atr_SO : na
if(lo_sig4 and MAX_N >= 4)
if(SO_bool)
strategy.entry("S-Entry4" ,strategy.short ,stop=close+atr_SO ,comment="S-Entry4")
strategy.exit("S-Entry3" ,stop=close+atr_SO)
strategy.exit("S-Entry2" ,stop=close+atr_SO)
strategy.exit("S-Entry1" ,stop=close+atr_SO)
else
strategy.entry("S-Entry4" ,strategy.short ,comment="S-Entry4")
lo4 := na
losscut := SO_bool ? close + atr_SO : na
if((L_EntrySig or S_EntrySig) and isWork and strategy.position_size==0)
countTradingDays := 0
entry1 := close
if(L_EntrySig)
if(SO_bool)
strategy.entry("L-Entry1" ,strategy.long ,stop=close-atr_SO ,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
losscut := SO_bool ? close - atr_SO : na
if(S_EntrySig)
if(SO_bool)
strategy.entry("S-Entry1" ,strategy.short ,stop=close+atr_SO ,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
losscut := SO_bool ? close + atr_SO : 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(losscut ,title="losscut" ,color=red ,transp=0 ,style=linebr)
plot(atr_SO ,transp=0 ,title="ATR_SO")
plot(atr_LO ,transp=0 ,title="ATR_LO")
p1 = plot(UPPER ,color=#303F9F ,title="UPPER" ,style=line ,linewidth=2, transp=0)
p2 = plot(LOWER ,color=#4CAF50 ,title="LOWER" ,style=line ,linewidth=2, transp=0)
plot(SMA ,color=red ,title="EMA" ,style=line ,linewidth=2 ,transp=0)
fill(p1 ,p2 ,color=#2196F3 ,title="fill" ,transp=60)
TradingViewでも公開しています!
TradingView のインジケーターの検索で「bollinger break out」と検索するとでてきます。上記のコードと同じストラテジーを使用することができます。
バックテストならTradingView
TradingViewのテストは大変便利で、かなり自由の効くバックテストを短時間で簡単に、価格データを用意することなく豊富な銘柄と足種を対象に行うことができます。
一方で、その簡便さと引き換えに、TradingViewではできないバックテストも多くあります。
たとえば「分散投資」や「資金管理」があげられますが、これらは投資において非常に重要な要素でもあり、これらを含めたバックテストをするならリアルさが不可欠です。こういったバックテストをするためには 、やはりPythonなどのプログラミング言語で自作していくしかないと考えています。
とはいえ、TradingViewが便利であることは間違いなく、最近では、手法の検証はTradingViewで行い、良い手法が見つかったら更に詳細なテストをPythonで行うようにしています。できるものはTradingViewでサクサクやってしまいます。
- 記事をシェア