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

Автор:Чао Чжан, Дата: 2024-02-19 15:38:02
Тэги:

img

Обзор

Adaptive Zero Lag Exponential Moving Average Quantitative Trading Strategy - это количественная стратегия торговли, разработанная на основе идеи Джона Элерса о Zero Lag Exponential Moving Average (ZLEMA). Эта стратегия использует экспоненциальную скользящую среднюю как базовый индикатор и включает адаптивный метод мгновенного измерения частоты (IFM) для динамической оптимизации параметра периода экспоненциальной скользящей средней.

Логика стратегии

Основная идея этой стратегии происходит из теории фильтров нулевого задержки Джона Элерса. Хотя экспоненциальная скользящая средняя является широко известным техническим показателем, она по своей сути имеет проблему задержки.

В стратегии адаптивной нулевой задержки EMA мы используем методы мгновенного измерения частоты для адаптивной оптимизации параметра периода ZLEMA. IFM состоит из двух методов - метода косина и метода инфаз-квадрат, который может измерять доминирующий цикл колебаний цен. Отслеживая в режиме реального времени оптимальные периоды, рассчитанные этими двумя измерениями, мы динамически устанавливаем параметр периода ZLEMA, чтобы лучше соответствовать текущим условиям рынка.

Когда быстрая EMA (ZLEMA) пересекает медленную EMA снизу, генерируется длинный сигнал. Когда быстрая EMA пересекает ниже медленной EMA, запускается короткий сигнал. Это формирует торговую стратегию, аналогичную системе пересечения скользящей средней.

Преимущества

Стратегия адаптивной EMA с нулевой задержкой сочетает в себе фильтр с нулевой задержкой и оптимизацию адаптивного периода с следующими преимуществами:

  1. Устраняет отставание и делает сигналы более чувствительными
  2. Параметр адаптивного периода для широкого спектра рынков
  3. Меньше параметров легко для тестирования и оптимизации
  4. Конфигурируемый фиксированный SL/TP для лучшего контроля рисков

Риски

В этой стратегии также есть некоторые риски:

  1. В некоторых рыночных условиях адаптивно-оптимизированный период может не работать
  2. Неправильные фиксированные настройки SL/TP могут привести к чрезмерным потерям или упущенной прибыли
  3. Недостаточные тесты оптимизации параметров могут привести к плохой производительности в режиме реального времени

Чтобы контролировать эти риски, нам необходимо полностью протестировать параметры в различных рыночных условиях, правильно корректировать SL/TP и имитировать среду торговли в режиме реального времени при обратных тестах.

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

Еще есть много возможностей для дальнейшей оптимизации этой стратегии:

  1. Альтернативные методы измерения адаптивного периода, например, MA с корректировкой по волатильности
  2. Дополнительные условия фильтрации, такие как объем, сочетания MA и т. д.
  3. Усовершенствованные методы SL/TP, например, остановки на задней панели или выход из люстры
  4. Динамическое размещение позиций в сочетании с управлением рисками
  5. Многократное подтверждение временных рамок для улучшения качества сигнала

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

Заключение

Adaptive Zero Lag EMA успешно сочетает в себе фильтр нулевого задержки и оптимизацию динамического периода. Благодаря меньшему количеству параметров и простоте работы, он особенно подходит для трендовых рынков. В сочетании с правильным стоп-лосом, размером позиций и другими методами управления рисками его стабильность и прибыльность могут быть еще более повышены.


/*backtest
start: 2024-01-19 00:00:00
end: 2024-02-18 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
strategy(title="Adaptive Zero Lag EMA v2", shorttitle="AZLEMA", overlay = true)

src = input(title="Source",  defval=close)
Period = input(title="Period",  defval = 20)
adaptive = input(title="Adaptive Method", options=["Off", "Cos IFM", "I-Q IFM", "Average"], defval="Off")
GainLimit = input(title="Gain Limit",  defval = 10)
Threshold = input(title="Threshold", type = float, defval=0.05, step=0.01)
fixedSL = input(title="SL Points", defval=70)
fixedTP = input(title="TP Points", defval=5)
risk = input(title='Risk', defval=0.01, step=0.01)

//##############################################################################
//I-Q IFM
//#############################################################################
range = input(title="Max Period",  defval=60, minval=8, maxval=100)

PI = 3.14159265359
imult = 0.635
qmult = 0.338
inphase = 0.0
quadrature = 0.0
re = 0.0
im = 0.0
deltaIQ = 0.0
instIQ = 0.0
lenIQ = 0.0
V = 0.0

P = src - src[7]
inphase := 1.25*(P[4] - imult*P[2]) + imult*nz(inphase[3])
quadrature := P[2] - qmult*P + qmult*nz(quadrature[2])
re := 0.2*(inphase*inphase[1] + quadrature*quadrature[1]) + 0.8*nz(re[1])
im := 0.2*(inphase*quadrature[1] - inphase[1]*quadrature) + 0.8*nz(im[1])
if (re!= 0.0)
    deltaIQ := atan(im/re)
for i=0 to range
    V := V + deltaIQ[i]
    if (V > 2*PI and instIQ == 0.0)
        instIQ := i
if (instIQ == 0.0)
    instIQ := nz(instIQ[1])
lenIQ := 0.25*instIQ + 0.75*nz(lenIQ[1])

//##############################################################################
//COSINE IFM
//#############################################################################
s2 = 0.0
s3 = 0.0
deltaC = 0.0
instC = 0.0
lenC = 0.0
v1 = 0.0
v2 = 0.0
v4 = 0.0

v1 := src - src[7]
s2 := 0.2*(v1[1] + v1)*(v1[1] + v1) + 0.8*nz(s2[1])
s3 := 0.2*(v1[1] - v1)*(v1[1] - v1) + 0.8*nz(s3[1])
if (s2 != 0)
    v2 := sqrt(s3/s2)
if (s3 != 0)
    deltaC := 2*atan(v2)
for i = 0 to range
    v4 := v4 + deltaC[i]
    if (v4 > 2*PI and instC == 0.0)
        instC := i - 1
if (instC == 0.0)
    instC := instC[1]
lenC := 0.25*instC + 0.75*nz(lenC[1])

if (adaptive == "Cos IFM")
    Period := round(lenC)
if (adaptive == "I-Q IFM")
    Period := round(lenIQ)
if (adaptive == "Average")
    Period := round((lenC + lenIQ)/2)

//##############################################################################
//ZERO LAG EXPONENTIAL MOVING AVERAGE
//##############################################################################
LeastError = 1000000.0
EC = 0.0
Gain = 0.0
EMA = 0.0
Error = 0.0
BestGain = 0.0

alpha =2/(Period + 1)
EMA := alpha*src + (1-alpha)*nz(EMA[1])

for i = -GainLimit to GainLimit
    Gain := i/10
    EC := alpha*(EMA + Gain*(src - nz(EC[1]))) + (1 - alpha)*nz(EC[1])
    Error := src - EC
    if(abs(Error)<LeastError)
        LeastError := abs(Error)
        BestGain := Gain

EC := alpha*(EMA + BestGain*(src - nz(EC[1]))) + (1-alpha)*nz(EC[1])

plot(EC, title="EC", color=orange, linewidth=2)
plot(EMA, title="EMA", color=red, linewidth=2)

buy = crossover(EC,EMA) and 100*LeastError/src > Threshold
sell = crossunder(EC,EMA) and 100*LeastError/src > Threshold
strategy.initial_capital = 50000
if (time>timestamp(2016, 1, 1 , 0, 0))
    //LONG
    balance = strategy.initial_capital + strategy.netprofit
    lots = ((risk * balance)/fixedSL)*1
    strategy.entry("BUY", strategy.long, qty=lots, oca_name="BUY",  when=buy)
    strategy.exit("B.Exit", "BUY", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP)
    //SHORT
    strategy.entry("SELL", strategy.short, qty=lots, oca_name="SELL", when=sell)
    strategy.exit("S.Exit", "SELL", qty_percent = 100, loss=fixedSL, trail_offset=15, trail_points=fixedTP)


Больше