スムーズ・ボラティリティ・バンド戦略

作者: リン・ハーンチャオチャン,日付: 2024-01-29 16:22:14
タグ:

img

概要

この戦略は,価格の変動を緩和した価格帯に基づいて価格帯を生成し,価格帯を突破すると取引信号を生成します.

戦略の論理

この戦略は,まず,一定の期間における価格の平均変動幅を計算し,その後指数移動平均を使用して変動幅を平滑させ,平滑した変動率を生成する.平滑した変動率を係数で掛けると帯の範囲が得られる.価格が上部帯を超えると,購入信号が生成される.価格が下部帯を下回ると,販売信号が生成される.

価格帯の上帯 hバンドと下帯 lバンドは,その後,smrngに基づいて計算される.そのに基づいて,ロング条件 longConditionとショート条件 shortConditionが設定される.ロング条件が満たされると,購入信号が生成される.ショート条件が満たされると,販売信号が生成される.

利点分析

この戦略の利点は次のとおりです.

  1. 価格変動を活用して取引信号を構成することで,市場の変化を効果的に追跡できます.

  2. 指数関数移動平均値で波動性を平滑させるとノイズをフィルタリングし,より信頼できる取引信号を生成できます.

  3. バンドの範囲は変動率によって調整され,戦略がより柔軟になります.

  4. 突破判断と組み合わせると 傾向の逆転が起きたときに 取引機会を適時に把握できます

リスク分析

この戦略にはいくつかのリスクもあります:

  1. 異常な市場変動では,平滑した変動は実際の変動を正確に反映できず,間違った信号につながる可能性があります. モデルを改善するためにパラメータを最適化することができます.

  2. 帯域の設定が不適切である場合,過剰取引または信号が不十分になる可能性があります.最適な範囲を見つけるために異なるパラメータをテストすることができます.

  3. 突破信号には時間遅れがあり,早期入入または遅刻入入を引き起こす可能性があります. 確認のために他の指標を導入することができます.

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

戦略を最適化するには

  1. 変動を計算するのに最も適した期間を見つけるために,異なる価格データサイクルをテストする.

  2. 移動平均を試しています

  3. 取引量や他の指標を導入し,ブレイクシグナルを確認する.

  4. 取引ごとに損失を制御するためにストップ・ロストまたはトラッキング・ストップを設定する.

  5. 最適帯域を決定するために波動系数マルチを最適化する.

概要

この戦略の全体的な論理は明確で,価格波動を帯と価格ブレイクを構築するために使用し,市場のトレンド変化を効果的に追跡できる取引信号を生成します. しかし,パラメータ最適化,信号確認などを通じて戦略をより堅牢にするために改善の余地があります.


/*backtest
start: 2023-01-22 00:00:00
end: 2024-01-28 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("1SmSm1 Strategy", shorttitle="1SmSm1", overlay=true)

// Source
src = input(defval=close, title="Source")

// Sampling Period
per = input(defval=100, minval=1, title="Sampling Period")

// Range Multiplier
mult = input(defval=3.0, minval=0.1, title="Range Multiplier")

// Smooth Average Range
smoothrng(x, t, m) =>
    wper = (t * 2) - 1
    avrng = ema(abs(x - x[1]), t)
    smoothrng = ema(avrng, wper) * m
    smoothrng

smrng = smoothrng(src, per, mult)

// Range Filter
rngfilt(x, r) =>
    rngfilt = x
    rngfilt := x > nz(rngfilt[1]) ? ((x - r) < nz(rngfilt[1]) ? nz(rngfilt[1]) : (x - r)) : ((x + r) > nz(rngfilt[1]) ? nz(rngfilt[1]) : (x + r))
    rngfilt

filt = rngfilt(src, smrng)

// Filter Direction
upward = 0.0
upward := filt > filt[1] ? nz(upward[1]) + 1 : filt < filt[1] ? 0 : nz(upward[1])

downward = 0.0
downward := filt < filt[1] ? nz(downward[1]) + 1 : filt > filt[1] ? 0 : nz(downward[1])

// Target Bands
hband = filt + smrng
lband = filt - smrng

// Breakouts
longCondition = (src > filt) and (src > src[1]) and (upward > 0)
shortCondition = (src < filt) and (src < src[1]) and (downward > 0)

strategy.entry("Buy", strategy.long, when = longCondition)
strategy.entry("Sell", strategy.short, when = shortCondition)

// Plotting
plot(filt, color=upward > 0 ? color.lime : downward > 0 ? color.red : color.orange, linewidth=3, title="Range Filter")
hbandplot = plot(hband, color=color.aqua, transp=100, title="High Target")
lbandplot = plot(lband, color=color.fuchsia, transp=100, title="Low Target")

// Fills
fill(hbandplot, lbandplot, color=color.aqua, title="Target Range")

// Bar Color
barcolor(longCondition ? color.green : shortCondition ? color.red : na)

// Alerts
alertcondition(longCondition, title="Buy Alert", message="BUY")
alertcondition(shortCondition, title="Sell Alert", message="SELL")

もっと