Стратегия прорыва каналов с адаптивными скользящими средними

Автор:Чао Чжан, Дата: 2023-11-02 15:05:56
Тэги:

img

Обзор

Adaptive Moving Average Channel Breakout Strategy - это следующая за трендом стратегия выхода на рынок, основанная на Adaptive Moving Average (AMA) и адаптивном диапазоне каналов для генерации торговых сигналов.

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

Основным показателем этой стратегии является адаптивная скользящая средняя (AMA), которая используется для определения ценовой тенденции.

AMA (t) = α (t-1) * P (t) + [1 - α (t-1) ] * AMA (t-1)

где P (t) - текущая цена, а α (t) - постоянная сглаживания между 0 и 1. α (t) динамически регулируется в соответствии с определенными правилами для контроля чувствительности AMA к изменениям цены. В частности, α (t) пропорционален отклонению SNRT между AMA и ценой, которое рассчитывается как:

SNRT = (P(t) - AMA(t-1)) / AMA(t-1)

Таким образом, по мере увеличения колебаний цен α ((t) увеличивается, чтобы сделать AMA более чувствительным; когда колебания уменьшаются, α ((t) уменьшается, чтобы сделать AMA более плавным.

Основываясь на AMA, стратегия создает адаптивный диапазон каналов для обнаружения сигналов прорыва цены.

Верхний: H ((t) = (1 + β*H ((t-1)) * AMA ((t))

Нижнее: L ((t) = (1 - β*L ((t-1)) * AMA ((t))

В конце концов, стратегия генерирует сделки на основе ценовых прорывов уровней канала:

  • Введите длинный, когда цена превышает верхний уровень.

  • Входите в короткие позиции, когда цена опускается ниже нижнего уровня.

  • В противном случае, оставайтесь на месте.

Анализ преимуществ

Преимущества этой стратегии включают:

  1. AMA более гибко отслеживает ценовые тенденции по сравнению с простыми скользящими средними, особенно на волатильных рынках.

  2. Адаптивный канал может динамически регулировать свою ширину, расширяясь, когда тенденция неясна, и сужаясь, когда появляется тенденция.

  3. Сигналы прорыва цены могут своевременно зафиксировать тренд, начинающийся с более высоких показателей выигрыша.

  4. Логика проста и понятна, легко понять и автоматизировать для количественной торговли.

Анализ рисков

Риски этой стратегии включают:

  1. Неправильные параметры AMA могут упускать тенденции цен или генерировать ложные сигналы.

  2. Параметры адаптивного канала, такие как β, нуждаются в тщательной настройке, иначе может возникнуть слишком много випса или пропущенные тенденции.

  3. Прорывы цен подвержены ложным прорывам, требуя больше фильтров.

  4. Стратегия не включает в себя механизмы управления рисками или стоп-лосс.

Руководство по оптимизации

Стратегия может быть оптимизирована путем:

  1. Улучшение расчета α, чтобы сделать AMA более отзывчивым.

  2. Добавляем дополнительное подтверждение после первоначального прорыва, чтобы избежать ложных сигналов.

  3. Применение фильтров, таких как объем или волатильность, для проверки действительности прорыва.

  4. Включение остановки потери для закрепления прибыли и контроля риска.

  5. Оптимизация размеров позиций для различных классов активов.

Заключение

В целом, адаптивная стратегия переменного среднего канала является простой и практичной стратегией переменного канала, следующей за трендом. Она использует гибкую АМА для отслеживания ценовых тенденций и адаптивный канал для обнаружения сигналов переменного канала. Стратегия имеет некоторые преимущества, но также потенциальные риски. Благодаря оптимизации, такой как настройка параметров, добавление фильтров и улучшение остановок, она может стать более надежной.


/*backtest
start: 2022-10-26 00:00:00
end: 2023-11-01 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// CryptoStatistical - 2019
// AMA Strategy Channel Breakout Strategy from E. Durenard - Professional Automated Trading 
// https://www.amazon.com/Professional-Automated-Trading-Theory-Practice/dp/1118129857

strategy(title="[CS] AMA Strategy - Channel Break Out", shorttitle="AMA_ChannelBreakout_Strategy", initial_capital = 1000, overlay=true, pyramiding = 0, calc_on_every_tick=false, calc_on_order_fills=false, commission_type= strategy.commission.percent, commission_value = 0.08, currency=currency.USD)
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(6, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,0,0)

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

testPeriodBackground = input(title="Color Background?", type=input.bool, defval=true)
testPeriodBackgroundColor = testPeriodBackground and (time >= testPeriodStart) and (time <= testPeriodStop) ? #00FF00 : na
bgcolor(testPeriodBackgroundColor, transp=95)

testPeriod() =>  true

price = input(title='Price Source:', type=input.source, defval=close)

ama = price
hb = price
lb = price

// Static model parameters
minfactor = 0.
maxfactor = 1.
deviation_max = 1.
deviation_min = 1.
beta_hb = 1.
beta_lb = 1.
snr = 1.

normalized_atan= 0.
alpha = 0.5
// Suggested snr-factor from .5 upto 3.1 by .3 to find best parameter
snrfactor = input(title='SNR Factor:', type=input.float, minval=0.6, maxval=3.3, step=0.3, defval=2.1)

// Sensitivity Lookback search for the best perdiod from 5 to 20
lookback = input(title='Sensitivity Lookback:', type=input.integer, defval=5)

// Suggested Beta from .5 below 4.5 by .3, usually in the range 1.2, 1.5
beta = input(title='Beta:', type=input.float, minval=0.6, maxval=4.5, step=0.3, defval=2.1)

offsetlabel = input(title='Offset Label:', type=input.float, minval=0.001, maxval=0.03, step=0.001, defval=0.001)

// pi/2
pi2 = 1.5707963267948966

// Zero-lag resampled moving average (Durschner nwma)
f_nwma(_src, _period) =>
    fast = _period/2
    lambda = _period/fast
    alpha = lambda * (_period - 1)/(_period - lambda)
    average1 = wma(_src,_period)
    average2 = wma(average1,fast)
    nwma = (1+alpha)*average1 - alpha*average2

ama := alpha[1]*price + (1-alpha[1])*nz(ama[1])

deviation_max := alpha[1]*max((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_max[1])
deviation_min := -alpha[1]*min((price[0] - price[1])/price[1],0) + (1-alpha[1])*nz(deviation_min[1])

beta_hb := beta*deviation_max
beta_lb := beta*deviation_min
hb := (1 + beta_hb[1])*ama
lb := (1 - beta_lb[1])*ama

snr := if price > hb
    ((price - ama[1])/ama[1])/beta_lb
else
    if price < lb
        -((price - ama[1])/ama[1])/beta_hb
    else
        0

normalized_atan := (atan(snrfactor*snr) + pi2)/(2*pi2)
alpha := f_nwma(minfactor + (maxfactor - minfactor)*normalized_atan, lookback)

plot(ama, color=color.black)
plot(hb, color=color.green)
plot(lb, color=color.red)

// Buy Condition Var
bc = false
// Sell Condition Var
sc = false
d = color.black

// Buy Condition
if(price > hb)
    bc := true
    d := color.green

// Sell Condition
if(price < lb)
    sc := true
    d := color.red

if(testPeriod())
    strategy.entry("Long", strategy.long, when = bc)
    strategy.entry("Short", strategy.short, when = sc)

alertcondition(bc, title='BuyCondition', message='Buy')
alertcondition(sc, title='SellCondition', message='Sell')

plotshape(title='Buy', series=bc ? price * (1 - offsetlabel) : na, text='A1B', style=shape.labelup, location=location.absolute, color=d, textcolor=color.white, offset=0)
plotshape(title='Sell', series=sc ? price  * (1 + offsetlabel) : na, text='A1S', style=shape.labeldown, location=location.absolute, color=d, textcolor=color.white, offset=0)

Больше