ボルブリンオシレーターブレイクアウト戦略


作成日: 2023-11-07 15:08:36 最終変更日: 2023-11-07 15:08:36
コピー: 0 クリック数: 736
1
フォロー
1617
フォロワー

ボルブリンオシレーターブレイクアウト戦略

概要

この戦略は,ボルブリン帯の指標を使用して,トレンドを判断し,帯域信号と組み合わせて取引機会を探し,ポートフォリオの安定した成長を継続することを目的としています. 戦略の収益率は78.95%で,昨年のデータ回顧によると,最大引き戻しは4.02%です. これは,ポートフォリオの安定した成長を助長する私の一連の自動化戦略の1つです.

パラメータを調整して反省してもらい,貴重な意見も頂きます. 現在の結果に満足している場合は,学習に変換して警告を追加し,戦略の自動化を実現できます. これは,コードに警告メカニズムを追加する必要があります.

戦略原則

この戦略は,ボールブリンと帯域を用い,試合の開始と終了のタイミングを判断する.

ボルブリン帯には上線,中線,下線が含まれている. 中線はn日間の単純移動平均で,パラメータnは16を默認している. 上限は中線+kである.*標準偏差は,下限は中線-kである*標準偏差,パラメータ k が默認する 3. 価格が上限に近づくと,株価が過高または過買を意味する.価格が下限に近づくと,株価が過低または過売を意味する.

帯域指数は,価格の相対的中線の変動を示します. それは ((上線-下線) /中線によって構成されます.*1000を計算すると, 帯域が20未満である時は平穏または収束を表し, 帯域が50を超えると波動が増加するを表します.

この戦略は,帯域が20−50の間にあるとき,下限を突破するチャンスを探して,多額にします.多額にすると,ストップフラインは,開設価格の108%に設定され,または上限を突破したときにストップアウトされます.

優位分析

この戦略の利点は以下の通りです.

  1. ボルブリン帯を使ってトレンドの方向を判断し,偽突破のリスクを減らす

  2. 帯域信号は位相変動を正確に把握し,大きな波動による損失を回避します.

  3. 追溯データによると,1年以内に80%近くの利益を得ることができ,リスクと利益の比率は非常に高い.

  4. 最大撤回率は5%未満で,リスクを効果的に管理し,ポートフォリオの安定した成長を維持できます.

  5. 戦略の論理は明確でシンプルで,容易に理解できる実装であり,さまざまな種類のデジタル資産に広く適用できます.

リスク分析

この戦略には以下のリスクもあります.

  1. ボルブリン帯のパラメータが正しく設定されていなければ,良い取引機会が逃れることになる.

  2. 市場が狂牛期や熊期に続くと,取引頻度が低く,収益性が制限される可能性があります.

  3. 回測データは不十分で,実用的なアプリケーションでは回測指標を複製できない

  4. 極端な市場条件では,ストップポイントが突破され,大きな損失を招く可能性があります.

  5. 高額な取引料金は,実際の利益にも影響を及ぼします.

対応方法:

  1. パラメータの最適化,ブリン帯周期の調整など

  2. 異常な状況への対応として,他の指標を導入する.

  3. 十分なデータを収集し,多種多様な市場の反省を行い,戦略の安定性を検証する.

  4. ストップポイントを適切に調整し,極端な状況で大きな損失を防ぐ

  5. 低手数料の取引プラットフォームを選んで取引費用を減らす

最適化の方向

この戦略は以下の点で最適化できます.

  1. 偽のブレークアウトを避けるために量確認を追加する

  2. トレンド指数と組み合わせて,トレンドの方向を特定する

  3. 機械学習を使用してパラメータを調整し,市場に自動的に適応する

  4. 関連性フィルターを追加し,関連性のない資産の取引を避ける Add correlation filter to avoid trading uncorrelated assets

  5. 上昇期に利益を増やすためにストップ・ロスを最適化します

  6. より多くの条件フィルタを導入し,取引シグナルをフィルタリングし,成功率を高めます.

  7. 複数のサイクルから利益を得るための複数のタイムフレームの組み合わせをテストする

  8. 指数化されたポートフォリオを構築し,投資範囲を拡大する Build indexed portfolio to expand exposure

  9. 新しい戦略を自動生成および検証するために機械学習を使用する

要約する

このボルブリン・ショック・ブレイク・ストラテジーは,全体的に反測効果が良好で,震動状況でより安定した収益を得ることができる.戦略の核心構想は,シンプルで明快で,使いやすい.しかし,パラメータ最適化,リスク制御,ポートフォリオ管理は,複雑で変動する市場で安定した収益を上げるためにさらに向上する必要がある.この戦略は,基礎型のトレンドをフォローする戦略であり,その基礎に,より多くの技術指標とリスク制御機構を導入して最適化することができる.また,機械学習と組み合わせて自動化を実現することができる.全体的な管理に関しては,この戦略は,初心者に対して量化取引の扉を開き,専門家にも戦略の最適化の可能性を提供します.

ストラテジーソースコード
/*backtest
start: 2023-10-30 00:00:00
end: 2023-11-06 00:00:00
period: 3m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4
strategy("Bollinger Bands BAT/USDT 30min", overlay=true )

/// Indicators
///Bollinger Bands
source = close
length = input(16, minval=1)
mult = input(3, step=0.1, minval=0.001, maxval=50)
basis = sma(source, length)
dev = mult * stdev(source, length)

upper = basis + dev
lower = basis - dev

plot(basis, color=color.red)
p1 = plot(upper, color=color.blue)
p2 = plot(lower, color=color.blue)
fill(p1, p2)

//Bollinger bands width
bbw = (upper-lower)/basis*1000
//plot(bbw, color=color.blue)

upper_bbw_input = input(title="BBW Upper Threshold", step=1, minval=0, defval=50)
lower_bbw_input = input(title="BBW Lower Threshold", step=1, minval=0, defval=20)


// Backtesting Period
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,0,0)

testPeriod() => true

// Take Profit
tp_inp = input(8, title='Take Profit %', step=0.1)/100
take_level = strategy.position_avg_price * (1 + tp_inp)

//Entry Strategy
entry_long = crossover(source, lower) and (bbw < upper_bbw_input) and (bbw > lower_bbw_input)
exit_long = cross(high,upper) or close < lower

if testPeriod()

    strategy.entry(id="LongBB", long=true, comment="LongBB", when=entry_long)
    strategy.exit("Take Profit Long","LongBB",limit=take_level)
    strategy.close(id="LongBB", when=exit_long )