ボリンジャー・バンド逆転に基づく定量戦略

作者: リン・ハーンチャオチャン, 日付: 2023年11月22日 17:44:40
タグ:

img

概要

この戦略は"ボリンジャーバンド逆転ベースの定量戦略"と呼ばれる.入口と出口を決定するためにボリンジャーバンドの上下線を利用する.価格がバンドの下線に近い状態で,下向きの突破の兆候を示すとき,価格は逆転している可能性があることを示唆する.価格が上部線に上昇すると,価格は下向きに逆転する可能性があることを示唆する.したがってショートに行く.

戦略の論理

この戦略は,ロングエントリを決定するためにRSI指標を使用する.特に,最新のバーの閉値が前6バーの最低値よりも低いかどうかをチェックする.一方,ボリンガーバンド幅 (BBW) は限界値を超えており,ボリンガーバンド比率 (BBR) は範囲内にある.これらの基準を満たす場合は,価格は逆転している可能性があることを示唆する.だからロングに行く.

出口は簡単です.RSIが70を超えると,価格が過熱していることを示し,ロングポジションを閉じる.

利点分析

この戦略の最大の利点は,エントリを決定するためにボリンジャーバンドの上下レールを利用することです. BBが方向を逆転すると,短期的な逆転機会を掴むために,ロングまたはショートに移動します. 単純なRSI戦略と比較して,この戦略はエントリに対するより慎重な基準を有し,誤った取引を回避します.

また,戦略はパラメータに敏感である.BBWとBBRを調整することで,異なる製品に最適化され,より良い結果が得られる.

リスク分析

主なリスクは,BBが価格逆転を完璧に予測できないことです.タイミングが不適切であれば,最も良いエントリや浮動損失を逃すことが容易です.

また,短期間の変動は,頻繁に入出を誘発し,手数料と滑り込みによるコストを増加させることがあります.逆転の勢いが十分でない場合,出出で損失を伴うリスクがあります.

オプティマイゼーションの方向性

戦略は以下の点で改善できる:

  1. BBW,BBR,その他のパラメータを異なる製品に対してより精密にテストし調整します.

  2. 最小損失を制限するために,ストップ損失を遅らせたり,タイムストップ損失などストップ損失メカニズムを追加します.

  3. KDJ や MACD などの他の指標を組み込むことで,エントリがより信頼性が高くなります.

  4. エクシートロジックを改良する. 現在のエクシートはシンプルです. 利得を取ったり,変動に基づいて退出したりすることで最適化できます.

結論

この戦略は,エントリーと出口の潜在的な逆転点を決定するためにボリンジャーバンドの特徴を利用する.RSIのような単一の指標と比較して,より正確なタイミングを持っています.パラメータ調節,ストップ損失と利益を取ることで,より信頼性があります.しかしBBの予測は完璧ではありません.したがって,パフォーマンスにはまだいくつかのランダム性があります.


/*backtest
start: 2022-11-15 00:00:00
end: 2023-11-21 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

//study(title = "Bolinger strategy", overlay=true)
strategy("Bolinger strategy",currency="SEK",default_qty_value=10000,default_qty_type=strategy.cash,max_bars_back=50)
len = 5
src = close
up = rma(max(change(src), 0), len)
down = rma(-min(change(src), 0), len)
rsi = down == 0 ? 100 : up == 0 ? 0 : 100 - (100 / (1 + up / down))


bbw3level = input(15, title="bbw3")
bbr3level = input(0.45, title="bbr3level")
bbrlower = input(0.4480, title="bbrlower")
bbrhigher = input(0.4560, title="bbrhigher")
sincelowestmin = input(7, title="sincelowestmin")
sincelowestmax = input(57, title="sincelowestmax")


length = input(20, minval=1)
mult = 20
src3 = close[3]
basis3 = sma(src3, length)
dev3 = mult * stdev(src3, length)
upper3 = basis3 + dev3
lower3 = basis3 - dev3
bbr3 = (src3 - lower3)/(upper3 - lower3)
bbw3 = (upper3-lower3)/basis3*100


basis = sma(src, length)
dev = mult * stdev(src, length)
upper = basis + dev
lower = basis - dev
bbr = (src - lower)/(upper - lower)
bbw = (upper-lower)/basis*100

criteriamet = 0
crossUnderB0 = crossunder(bbr,0)

since_x_under = barssince(crossUnderB0)


sincelowest = barssince(close[6] > close[3] and close[5] > close[3] and close[4] > close[3] and close[2] > close[3] and close[1] > close[3] and close > close[3] and bbw3 > bbw3level and bbr3 < bbr3level) //  and bbr3 < 0 

if sincelowest > sincelowestmin and sincelowest < sincelowestmax and bbr > bbrlower and bbr < bbrhigher
	criteriamet := 1
else
	criteriamet := 0	
//plot (criteriamet)

//exit 
exitmet = 0
if rsi > 70
	exitmet := 1
else
	exitmet := 0

if criteriamet == 1
	strategy.entry("long", strategy.long)
if exitmet == 1
	strategy.close("long")



もっと