Короткосрочная реверсионная количественная стратегия, основанная на скользящей средней

Автор:Чао Чжан, Дата: 2023-12-19 16:17:47
Тэги:

img

Обзор

Эта стратегия представляет собой краткосрочную обратную торговую стратегию, основанную на индикаторе полосы Боллинджера. Она сочетает в себе скользящие средние, стандартные отклонения и полосы Боллинджера для поиска возможностей для обратной торговли, когда цены аномально диспергированы.

Принцип стратегии

  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)

Больше