Bollinger Band Chiến lược định lượng đảo ngược ngắn hạn dựa trên đường trung bình động

Tác giả:ChaoZhang, Ngày: 2023-12-19 16:17:47
Tags:

img

Tổng quan

Chiến lược này là một chiến lược giao dịch đảo ngược ngắn hạn dựa trên chỉ số Bollinger Band. Nó kết hợp trung bình động, lệch chuẩn và Bollinger Bands để tìm kiếm các cơ hội giao dịch đảo ngược khi giá bị phân tán bất thường.

Nguyên tắc chiến lược

  1. Tính toán trung bình di chuyển và độ lệch chuẩn. Sử dụng hàm sma ((() để tính toán trung bình di chuyển sma và hàm stdev ((() để tính toán độ lệch chuẩn.

  2. Tính toán đường ray trên và dưới của dải Bollinger theo đường trung bình động và độ lệch chuẩn.1 và đường ray dưới là lệch chuẩn giá1.

  3. Khi giá vượt qua đường ray trên hoặc dưới, nó cho thấy giá là bất thường.

  4. Cụ thể, nếu giá thấp hơn đường ray dưới, chúng ta đi dài; nếu giá cao hơn đường ray trên, chúng ta đi ngắn.

Phân tích lợi thế

  1. Sử dụng kênh Bollinger Band để đánh giá giá bất thường, cung cấp cơ sở cho giao dịch ngược.

  2. Kết hợp với yếu tố trung bình động, một số giao dịch ồn ào có thể được lọc hiệu quả.

  3. Việc giới thiệu hệ số lệch chuẩn làm cho kênh băng Bollinger năng động hơn để đánh giá tốt hơn giá bất thường.

  4. Chiến lược này có lượng rút tương đối nhỏ và ổn định nhất định.

Phân tích rủi ro

  1. Chỉ số Bollinger Band không thể xác định hoàn toàn tình hình giá bất thường. Có thể có sự đột phá sai.

  2. Tần suất giao dịch có thể quá cao.

  3. Các tín hiệu đột phá của dải Bollinger phía trên và phía dưới có thể kéo dài trong một thời gian dài.

  4. Đưa ra lệnh dừng lỗ phù hợp để kiểm soát rủi ro.

Hướng dẫn tối ưu hóa

  1. Tối ưu hóa chu kỳ trung bình động và các tham số độ lệch chuẩn để có được kênh băng tần Bollinger hợp lý hơn.

  2. Tăng các yếu tố phụ trợ như EMA và MACD để lọc một số tín hiệu.

  3. Đưa ra các cơ chế dừng lỗ và điều khiển vị trí.

  4. Tối ưu hóa kích thước vị trí và các biện pháp kiểm soát vị trí.

Tóm lại

Chiến lược này đánh giá giá bất thường thông qua chỉ số Bollinger Band và thực hiện các giao dịch đảo ngược với đường trung bình động và các tham số lệch chuẩn. Nó có sự ổn định nhất định. Chúng ta cần giảm thêm mức rút tối đa của chiến lược và cải thiện sự ổn định thông qua các phương tiện như tối ưu hóa tham số, giới thiệu các yếu tố phụ trợ, quản lý dừng lỗ và kiểm soát vị trí.


/*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)

Thêm nữa