移動平均に基づくボリンジャーバンド短期反転定量戦略


作成日: 2023-12-19 16:17:47 最終変更日: 2023-12-19 16:17:47
コピー: 0 クリック数: 665
1
フォロー
1621
フォロワー

移動平均に基づくボリンジャーバンド短期反転定量戦略

概要

この戦略は,ブリン帯の指標に基づくショートライン反転取引戦略である.これは,平均線,標準差,ブリン帯通路を組み合わせて,価格が異常に分散しているときに反転取引をする機会を探している.

戦略原則

  1. 平均線と標準差を計算する.sma () 関数を使用してsma平均線を計算し,stdev () 関数を使用して標準差を計算する.

  2. 平均線と標準差によるブリン帯の上下線計算.上線は価格+標準差*1,下線は価格 - 標準差*1。

  3. 価格が上位または下位を突破すると,価格の異常が発生することを示すので,反転取引を行うことを判断します.

  4. 具体的には,価格が下線より低ければ,多頭取引をします.価格が上線より高ければ,空頭取引をします.

優位分析

  1. ブリン帯通路は,価格の異常を判定するために使用され,反転取引の根拠となる.

  2. 均線因子と組み合わせると,部分的なノイズ取引を効率的にフィルタリングできます.

  3. 標準差因子の導入により,ブリン経路はより動的になり,価格の異常を判断するよりよい判断が可能になりました.

  4. この戦略は,小規模で安定した撤退を意味している.

リスク分析

  1. ブリン帯の指標は価格の異常を完全には判断できず,偽突破が発生する可能性がある.

  2. 取引頻度は高すぎるため,適切なパラメータを調整して取引頻度を制御することをお勧めします.

  3. ブリン帯を突破して下線信号に上るには時間がかかる可能性があり,より良い反転効果を得るためにパラメータを適切に調整する必要がある.

  4. リスク管理のための適切なストップを導入する.

最適化の方向

  1. 平均線周期と標準差のパラメータを最適化して,より合理的なブリン帯通路を得る.
  2. EMAやMACDなどの補助因子を加え,部分信号をフィルターする.
  3. ストップ・ロズとポジション・コントロールの導入
  4. ポジションの規模とポジション管理の最適化

要約する

この戦略は,ブリン帯指標によって価格異常を判断し,平均線と標準差のパラメータを配合して逆転取引を行う.一定の安定性がある.我々は,パラメータ最適化,補助因子の導入,ストップ・ロズ・マネジメント,ポジション・コントロールなどの手段によって戦略の最大撤退をさらに低減し,安定性を高める必要がある.

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

//@version=3
strategy("BCE Version of EMA, SMA Mean Reversion", overlay=true, default_qty_type=strategy.percent_of_equity, default_qty_value=100)
 
// Inputs
st_yr_inp = input(defval=2017, title='Backtest Start Year')
st_mn_inp = input(defval=01, title='Backtest Start Month')
st_dy_inp = input(defval=01, title='Backtest Start Day')
en_yr_inp = input(defval=2025, title='Backtest End Year')
en_mn_inp = input(defval=01, title='Backtest End Month')
en_dy_inp = input(defval=01, title='Backtest End Day')
sma_lookback = input(defval=100, title="Lookback Period For SMA")
ema_lookback = input(defval=10, title="Lookback Period For EMA")
long_diff_perc = input(defval=6, title="Percentage Deviation From SMA to go Long")/100
short_diff_perc = input(defval=20, title="Percentage Deviation From SMA to go Short")/100
ema_filter_bars = input(defval=4, title="The number of bars the EMA must rise/fall")
lng_allwd = input(defval=true, title="Allow Longs?")
srt_allwd = input(defval=true, title="Allow Shorts?")
use_stop = input(defval=true, title="Use Stoploss?")
stop_perc = input(defval=30, title="Stop Loss Percentage")/100
 
// Dates
start = timestamp(st_yr_inp, st_mn_inp, st_dy_inp,00,00)
end = timestamp(en_yr_inp, en_mn_inp, en_dy_inp,00,00)
can_trade = time >= start and time <= end
// Indicators Setup
sma = sma(close, sma_lookback)
ema = ema(close, ema_lookback)
 
// Strategy Calcuations
close_stdev = stdev(close, sma_lookback)
sd1_upper = close + (close_stdev * 1)
sd1_lower = close - (close_stdev * 1)
close_diff = (close - sma) / sma
 
// Entries and Exits
longCondition = close > sma and open > sma
if (time >= start and time <= end)
    if (longCondition)
        strategy.entry("Long", strategy.long)
    if use_stop
        stop_price = close * (1 - stop_perc)
        strategy.order("Long Stoploss", false, stop=stop_price)
 
shortCondition = close < sma and open < sma
if (shortCondition)
//    strategy.entry("Short", strategy.short)
//    if use_stop
//        stop_price = close * (1 + stop_perc)
//        strategy.order("Short Stoploss", true, stop=stop_price)
//if (time >= start)    
    strategy.close("Long", when=close < sma and open < sma)
//strategy.cancel("Long Stoploss", when=sma < sma[1])
//    strategy.close("Short", when=close > sma and open > sma)
//strategy.cancel("Short Stoploss", when=close_diff<=0)
 
// Plotting
sma_col = sma > sma[1] ? green : red
ema_fill = close_diff <= -long_diff_perc ? lime : close_diff >= short_diff_perc ? maroon : aqua
p_sma = plot(sma, color=sma_col, linewidth=3)
p_ema = plot(ema, color=black, linewidth=2)
p_sd1 = plot(sd1_upper, color=black, linewidth=1, transp=85)
p_sd2 = plot(sd1_lower, color=black, linewidth=1, transp=85)
fill(p_sd1, p_sd2, title='STDEV Fill', color=silver, transp=80)
fill(p_sma, p_ema, title='EMA > Mean Percentage', color=ema_fill, transp=80)