Стратегия следования за трендом на основе регрессии Надарая-Уотсона и канала ATR


Дата создания: 2024-02-22 15:15:03 Последнее изменение: 2024-02-22 15:15:03
Копировать: 1 Количество просмотров: 962
1
Подписаться
1617
Подписчики

Стратегия следования за трендом на основе регрессии Надарая-Уотсона и канала ATR

Обзор

Эта стратегия является стратегией отслеживания тенденций, которая сочетает в себе регрессию Надарайя-Уотсона и канал ATR для определения направления тенденции и точек входа. Когда цена прорывается вниз, делайте больше; когда цена прорывается вверх, сделайте равновесную позицию.

Стратегический принцип

Во-первых, стратегия использует Nadaraya-Watson Core Regression для вычисления кривой регрессии для двух различных задержек, а затем сравнивает перекрестки двух кривых регрессии для определения направления тренда. В частности, для вычисления кривой регрессии для периодов h и h-lag соответственно, при прохождении кривой h на кривой h-lag считается лидером; при прохождении кривой h на кривой h-lag считается лидером.

Во-вторых, стратегия использует канал ATR для определения точки входа. Верхняя линия для кривой обратного отсчета добавляет кратное число n-х ATR, а нижняя линия для кривой обратного отсчета вычитает кратное число n-х ATR. Когда цена пробивается вверх, она смотрит вверх и входит в рынок, а когда она пробивается вниз, она смотрит вверх и входит в рынок.

Наконец, установлен механизм остановки убытков. Если цена в последовательном stopLossBars корневой K-линии ниже цены входа, то остановка убытков.

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

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

Кроме того, ATR-каналы устанавливают разумные точки входа, чтобы избежать ошибочных входов вблизи точек обратного тренда. Стоп-лосс также эффективно контролирует одиночные потери.

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

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

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

Кроме того, регрессионная кривая и ATR-каналы требуют определенной оптимизации параметров. Если параметры установлены неправильно, регрессионный анализ неэффективен, или ATR слишком большой или слишком маленький, это может повлиять на эффективность стратегии.

Направление оптимизации

Для повышения стабильности и точности стратегии можно рассмотреть возможность использования в сочетании с другими показателями для определения тенденций и обратных сигналов, таких как VOLUME, MACD и т. д.

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

ATR-циклы и кратность ATR-каналов также требуют повторного тестирования и оптимизации, чтобы найти оптимальную комбинацию параметров.

Подвести итог

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

Исходный код стратегии
/*backtest
start: 2024-01-01 00:00:00
end: 2024-01-31 23:59:59
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Custom Strategy with Stop Loss and EMA", overlay=true)

src = input(close, title='Source')
h = input(10, title='Lookback Window', tooltip='The number of bars used for the estimation.')
r = input(10, title='Relative Weighting', tooltip='Relative weighting of time frames.')
x_0 = input(50, title='Start Regression at Bar',  tooltip='Bar index on which to start regression.')
lag = input(2, title='Lag', tooltip='Lag for crossover detection.')
stopLossBars = input(3, title='Stop Loss Bars', tooltip='Number of bars to check for stop loss condition.')
emaPeriod = input(46, title='EMA Period',  tooltip='Period for Exponential Moving Averages.')

lenjeje = input(32, title='ATR Period', tooltip='Period to calculate upper and lower band')
coef = input(2.7, title='Multiplier', tooltip='Multiplier to calculate upper and lower band')

// Function for Nadaraya-Watson Kernel Regression
kernel_regression1(_src, _size, _h) =>
    _currentWeight = 0.0
    _cumulativeWeight = 0.0
    for i = 0 to _size + x_0
        y = _src[i] 
        w = math.pow(1 + (math.pow(i, 2) / ((math.pow(_h, 2) * 2 * r))), -r)
        _currentWeight += y * w
        _cumulativeWeight += w
    [_currentWeight, _cumulativeWeight]

// Calculate Nadaraya-Watson Regression
[currentWeight1, cumulativeWeight1] = kernel_regression1(src, h, h)
yhat1 = currentWeight1 / cumulativeWeight1
[currentWeight2, cumulativeWeight2] = kernel_regression1(src, h-lag, h-lag)
yhat2 = currentWeight2 / cumulativeWeight2

// Calculate Upper and Lower Bands
upperjeje = yhat1 + coef * ta.atr(lenjeje)
lowerjeje = yhat1 - coef * ta.atr(lenjeje)

// Plot Upper and Lower Bands
plot(upperjeje, color=color.rgb(0, 247, 8), title="Upper Band", linewidth=2)
plot(lowerjeje, color=color.rgb(255, 0, 0), title="Lower Band", linewidth=2)

// Calculate EMAs
emaLow = ta.ema(low, emaPeriod)
emaHigh = ta.ema(high, emaPeriod)

// Plot EMAs
plot(emaLow, color=color.rgb(33, 149, 243, 47), title="EMA (Low)", linewidth=2)
plot(emaHigh, color=color.rgb(255, 153, 0, 45), title="EMA (High)", linewidth=2)

// Long Entry Condition
longCondition = low < lowerjeje
strategy.entry("Long", strategy.long, when=longCondition)

// Stop Loss Condition
stopLossCondition = close[1] < strategy.position_avg_price and close[2] < strategy.position_avg_price and close[3] < strategy.position_avg_price
strategy.close("Long", when=stopLossCondition)

// Close and Reverse (Short) Condition
shortCondition = high > upperjeje
strategy.close("Long", when=shortCondition)
strategy.entry("Short", strategy.short, when=shortCondition)