資源の読み込みに... 荷物...

トリプルスタンダードデバイエーション ボリンガー帯 100日移動平均最適化によるブレイクアウト戦略

作者: リン・ハーンチャオチャン,日付: 2024年12月13日11時20分13秒
タグ:マルチBBSMASD

img

概要

この戦略は,ボリンジャーバンドのブレイクアウトに基づいた定量的な取引システムで,上帯の標準偏差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
// // =============================================================================

関連性

もっと