ビットコインのボラティリティバンド反転戦略


作成日: 2023-10-12 17:38:39 最終変更日: 2023-10-12 17:38:39
コピー: 0 クリック数: 823
1
フォロー
1702
フォロワー

概要

この戦略は,高波動性のある証券のために設計された引き戻しシステムであり,ビットコインは非常に理想的な取引品である.この戦略は日線図またはより低い時間枠で使用できる (私は3時間の時間枠で良い結果を見つけましたが,1時間未満ではテストしていません).

戦略原則

この戦略は,前2つのK線の収束価格の変化を比較して波動性を計算し,この価格変化から移動平均を生成する.移動平均線に標準差の1つの帯を包み,内部は1つの標準差,外部は2つの標準差である.価格が既定の移動平均線フィルターよりも高い場合,我々は上昇傾向にあることを確認する.したがって,上昇傾向では,内部標準差の波が突破される引き戻しがあれば,買い信号を発信する.

ユーザーは,テストしたい日付の範囲を変更し,波動率の移動平均周期と内外波動帯の標準差を計算できます.ビットコインについては,内部と外部標準差の波動帯を標準設定で保持しましたが,3サイクルの波動率の追跡は1日間のチャート取引に適しており,5サイクルの波動率の追跡は3時間間のチャート取引に適しています.これは買って持てる戦略ではないため,取引する際には,最も流動的なコインに固執して,任意の取引所で迅速に入って出ることができます.この戦略を低波動の市場でテストする場合は,内部差の標準波動帯を約0.75に変更します.

戦略的優位性

  • 波動率取引を利用して市場の転換点を捉える
  • 双方向取引は,上下両方で利益を得ることができます.
  • 標準パラメータの設定はシンプルで使いやすい
  • 異なる標準に対応するためにパラメータを簡単に最適化できます
  • ストップとストップを合理的に設定し,有利に利益をロックする

戦略リスク

  • 高波動の指標で損失拡大のリスク
  • 多空間の切替が頻繁で,取引費用が高くなる
  • 短期的な操作,市場の変化に注意する
  • 通貨の流動性が不足すると 損をするのが難しい
  • パラメータを間違えれば過剰取引になる

リスク対策:

  1. 適切な波動標を選択し,単一ポジションをコントロールする.

  2. 取引の有効性を改善するパラメータ

  3. ストップ・ロスを採用し,厳格な資金管理を行います.

  4. 取引実行の効率を重視し,流動性の良い指標を選択する.

  5. 異なる標識の特性に合わせてパラメータを調整する.

戦略最適化の方向性

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

  1. 移動平均の周期を最適化して,異なる指標の変動率をよりよく追跡する.

  2. 波動率帯のパラメータを特定の標識の波動範囲に近似して調整する.

  3. 取引量の増幅などの他のフィルタリング条件を追加し,取引信号をさらに検証します.

  4. マシン・ラーニング技術を利用して,動的に最適化するパラメータを使用して,戦略をより適応的にします.

  5. 取引機会を捉えるため,より高い時間枠でテストする.

  6. ストップ・ストップ・ロスのモバイル・トラッキングが追加され,利益が口座に閉じ込められるようになりました.

  7. 他の指標やモデルと組み合わせた量化組合せ戦略を確立する.

要約する

この戦略は,全体的に単純で直観的で,波動率指標を活用して逆転状況を把握し,市場の転換点を捉える.戦略の最適化には大きな余地があり,パラメータを調整し,他の技術指標と組み合わせることで,戦略の安定性と収益性を向上させ続けることができます.しかし,トレーダーは過度の最適化と曲線適合の問題に注意する必要があります.この戦略は,短期間の取引に適しており,リスクを制御するために厳格な資金管理を必要とします.

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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © gary_trades
//This script is designed to be used on volatile securities/tickers so is best suited for day charts on Crypto (particularly good for BTC).
//It takes both long and short trades and the main indicator settings can be changed by the use so they can test for ideal settings for ticker of interest.

//@version=4

strategy("BTC Volatility Band Strategy", shorttitle="Vol Band Strategy", overlay=false, margin_long=100, margin_short=100)

//VOLATILTY
CandleChange = ((close - close[1])/close)*100         //OR CandleChange = ((close[2] - close[1])/close)*100
plot(CandleChange, color=color.red, linewidth = 1)

//VOLATILITY BANDS 
MAlen = input(7, minval=3, maxval=30, title=" MA Length")
MAout = sma(CandleChange, MAlen)
plot(MAout, color=color.black, display=display.none)

InnerBand = input(1.0, minval=0.5, maxval=5, title="Inner Band")
OuterBand = input(2.00, minval=0.5, maxval=10, title="Outer Band")
devInner = InnerBand * stdev(CandleChange, MAlen)
devOuter = OuterBand * stdev(CandleChange, MAlen)

upper1 = MAout + devInner
lower1 = MAout - devInner
b1 = plot(upper1, "Upper Inner", color=color.gray)
b2 = plot(lower1, "Lower Inner", color=color.gray)
upper2 = MAout + devOuter
lower2 = MAout - devOuter
b3 = plot(upper2, "Upper Outer", color=color.gray)
b4 = plot(lower2, "Lower Outer", color=color.gray)
fill(b1, b3, color.rgb(250,145,175,70), title="Background")
fill(b2, b4, color.rgb(250,145,175,70), title="Background")

band1 = hline(25, "Upper Band", color=color.gray, linestyle=hline.style_dotted, linewidth=2)
band0 = hline(-25, "Lower Band", color=color.gray, linestyle=hline.style_dotted, linewidth=2)

//LONG FILTER
VolFilterL = CandleChange <= lower1 and CandleChange > lower2
SMAFilterL = close[1] > sma(close[1], 50)
PriceFilterL = close > lowest(close,7)
LongFilter = VolFilterL and SMAFilterL and PriceFilterL
bgcolor(LongFilter ? color.new(color.green, 80) : na)

//SHORT FILTER
VolFilterS = CandleChange >= upper1 and CandleChange < upper2
SMAFilterS = close[1] < sma(close[1], 50)
PriceFilterS = close < highest(close,7)
ShortFilter = VolFilterS and SMAFilterS and PriceFilterS
bgcolor(ShortFilter ? color.new(color.red, 80) : na)

//SETTING BACK TEST INPUTS
fromDay = input(defval = 1, title = "From Day", minval = 1, maxval = 31)
fromMonth = input(defval = 1, title = "From Month", minval = 1, maxval = 12)
fromYear = input(defval = 2000, title = "From Year", minval = 1970)
 
toDay = input(defval = 1, title = "To Day", minval = 1, maxval = 31)
toMonth = input(defval = 1, title = "To Month", minval = 1, maxval = 12)
toYear = input(defval = 2100, title = "To Year", minval = 1970)

startDate = timestamp("America/New_York", fromYear, fromMonth, fromDay, 00, 00)
finishDate = timestamp("America/New_York", toYear, toMonth, toDay, 00, 00)
time_condition = time >= startDate and time <= finishDate

//ORDER DETAILS
Risk = (high[7] - low[7])/ 7
Profit = Risk*1.15
Loss = Risk*0.65

AlertMSG = "New stategy position" + tostring(strategy.position_size)

if (time_condition) 
    strategy.entry("Long", strategy.long, when = LongFilter, alert_message=AlertMSG)
    if (LongFilter)
        LongStop = strategy.position_avg_price - Loss
        LongProfit = strategy.position_avg_price + Profit 
        strategy.exit("TP/SL", "Long", stop=LongStop, limit=LongProfit)

if (time_condition)
    strategy.entry("Short", strategy.short, when = ShortFilter, alert_message=AlertMSG)
    if (ShortFilter)
        ShortStop = strategy.position_avg_price + Loss
        ShortProfit = strategy.position_avg_price - Profit 
        strategy.exit("TP/SL", "Short", stop=ShortStop, limit=ShortProfit)