3 倍の標準偏差ボリンジャー バンドの画期的な定量取引戦略と 100 日移動平均の最適化を組み合わせた

MA BB SMA SD
作成日: 2024-12-13 11:20:13 最終変更日: 2024-12-13 11:20:13
コピー: 3 クリック数: 483
1
フォロー
1617
フォロワー

3 倍の標準偏差ボリンジャー バンドの画期的な定量取引戦略と 100 日移動平均の最適化を組み合わせた

概要

この戦略はブリン帯突破に基づく量的な取引戦略で,3倍標準差の上位と1倍標準差の下位を採用し,100日移動平均を中位として組み合わせている.この戦略は,主に価格突破を検出して長期のトレンドを捉え,下位をストップシグナルとして使用する.戦略の核心思想は,強力な突破時に入場し,価格下位を踏む時に時効的にストップし,リスクが制御可能なトレンド追跡を実現する.

戦略原則

策略の核心原則は,ブリン帯の統計学的特性をベースとするものである.上線は3倍標準差を採用しており,これは正規分布の仮定では,価格が上線を突破する確率は0.15%にすぎないことを意味し,したがって,突破が発生すると,しばしば顕著なトレンドの形成を予告する.中線は100日移動平均を採用し,この周期は,短期市場のノイズを効果的にフィルターできるほど長くなります.下線は1倍標準差を採用し,ストップローズラインとして,これは比較的保守的に設定され,損失を一時停止するのに役立ちます.策略は,価格が上線を突破する時に多信号を発し,価格が下線を突破する時に平仓を出す.

戦略的優位性

  1. トレンド把握能力:標準差の3倍の設定により,重要なトレンドの突破の機会を効果的に捉えることができます.
  2. リスク管理は合理的:標準差の1倍を止損線として採用し,リスク管理は保守的である.
  3. パラメータは調整可能である.上下線の標準差倍数と移動平均周期は,異なる市場の特徴に応じて調整することができる.
  4. システム性強:戦略の論理が明確で,フィードバック機能が完備し,取引のパフォーマンスを正確に統計することができる.
  5. 適応性:株式市場や暗号通貨市場など,複数の分野に適用できます.

戦略リスク

  1. 偽の突破リスク: 市場が短期的な突破から急落して偽のシグナルを引き起こす可能性がある.
  2. 大きく引き下がる: 市場が激しく波動しているときに大きく引き下がる可能性があります.
  3. 遅滞リスク:100日平均線は遅滞性があり,速度の低い動きを逃す可能性があります.
  4. 市場環境依存: 変動する市場では,取引コストが過剰に増加する可能性があります.

戦略最適化の方向性

  1. 交付量確認の導入:交付量突破確認のメカニズムを追加して,信号の信頼性を高めることができる.
  2. 最適化ストップメカニズム: 追跡ストップまたはATRダイナミックストップの導入を検討し,ストップの柔軟性を向上させることができます.
  3. トレンドフィルターを追加: 長期トレンド判断指標を追加し,主要トレンドの方向のみで取引できます.
  4. ポジション管理の最適化: ポジションの大きさを突破の強さの動態に応じて調整できます.
  5. タイムフィルターを追加:特定の市場時間を回避する.

要約する

これは合理的で論理的に明確なトレンド追跡戦略である. ブリン帯の統計学特性と移動平均のトレンド追跡特性が,市場における重要な突破の機会を効果的に捕捉することができる. 撤回リスクはあるが,合理的なストップ・ペア設定とリスク管理によって,依然として優れた実用価値がある. 更に最適化できる空間は,信号確認,ストップ・ペア機構,ポジション管理などの側面である.

ストラテジーソースコード
/*backtest
start: 2024-11-12 00:00:00
end: 2024-12-11 08:00:00
period: 1h
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// This Pine Script™ code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © MounirTrades007

// @version=6
strategy("Bollinger Bands", overlay=true, initial_capital=100000, default_qty_type=strategy.percent_of_equity, default_qty_value=200)

// Get user input
var g_bb        = "Bollinger Band Settings"
upperBandSD     = input.float(title="Upper Band Std Dev", defval=3.0, tooltip="Upper band's standard deviation multiplier", group=g_bb)
lowerBandSD     = input.float(title="Lower Band Std Dev", defval=1.0, tooltip="Lower band's standard deviation multiplier", group=g_bb)
maPeriod        = input.int(title="Middle Band MA Length", defval=100, tooltip="Middle band's SMA period length", group=g_bb)
var g_tester    = "Backtester Settings"
drawTester      = input.bool(title="Draw Backtester", defval=true, group=g_tester, tooltip="Turn on/off inbuilt backtester display")

// Get Bollinger Bands
[bbIgnore1, bbHigh, bbIgnore2] = ta.bb(close, maPeriod, upperBandSD)
[bbMid, bbIgnore3, bbLow]      = ta.bb(close, maPeriod, lowerBandSD)

// Prepare trade persistent variables
drawEntry   = false
drawExit    = false

// Detect bollinger breakout
if close > bbHigh and barstate.isconfirmed and strategy.position_size == 0
    drawEntry := true
    strategy.entry(id="Trade", direction=strategy.long)
    alert("Bollinger Breakout Detected for " + syminfo.ticker, alert.freq_once_per_bar_close)

// Detect bollinger sell signal
if close < bbLow and barstate.isconfirmed and strategy.position_size != 0
    drawExit := true
    strategy.close(id="Trade")
    alert("Bollinger Exit detected for " + syminfo.ticker, alert.freq_once_per_bar_close)

// Draw bollinger bands
plot(bbMid, color=color.blue, title="Middle SMA")
plot(bbHigh, color=color.green, title="Upper Band")
plot(bbLow, color=color.red, title="Lower Band")

// Draw signals
plotshape(drawEntry, style=shape.triangleup, color=color.green, location=location.belowbar, size=size.normal, title="Buy Signal")
plotshape(drawExit, style=shape.xcross, color=color.red, location=location.belowbar, size=size.normal, title="Sell Signal")

// // =============================================================================
// // START BACKTEST CODE
// // =============================================================================

// // Prepare stats table
// var table testTable = table.new(position.top_right, 2, 2, border_width=1)
// f_fillCell(_table, _column, _row, _title, _value, _bgcolor, _txtcolor) =>
//     _cellText = _title + "\n" + _value
//     table.cell(_table, _column, _row, _cellText, bgcolor=_bgcolor, text_color=_txtcolor)

// // Draw stats table
// var bgcolor = color.black
// if barstate.islastconfirmedhistory
//     if drawTester
//         dollarReturn = strategy.equity - strategy.initial_capital
//         f_fillCell(testTable, 0, 0, "Total Trades:", str.tostring(strategy.closedtrades), bgcolor, color.white)
//         f_fillCell(testTable, 0, 1, "Win Rate:", str.tostring(strategy.wintrades / strategy.closedtrades * 100, "##.##") + "%", bgcolor, color.white)
//         f_fillCell(testTable, 1, 0, "Equity:", "$" + str.tostring(strategy.equity, "###,###.##"), bgcolor, color.white)
//         f_fillCell(testTable, 1, 1, "Return:", str.tostring((strategy.netprofit / strategy.initial_capital) * 100, "##.##") + "%", dollarReturn > 0 ? color.green : color.red, color.white)

// // =============================================================================
// // END BACKTEST CODE
// // =============================================================================