Стратегия динамического импульса

Автор:Чао Чжан, Дата: 2023-10-07 15:47:42
Тэги:

Обзор

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

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

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

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

В частности, эта стратегия устанавливает диапазон периода RSI на уровне 20-50 по умолчанию. После расчета коэффициента корреляции между ценой и импульсом она использует линейное отображение, чтобы отобразить коэффициент корреляции в диапазоне 20-50 как окончательный период сглаживания RSI.

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

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

  • Динамическая корректировка параметров адаптируется к изменениям рынка
  • Избегает ограничений показателей фиксированного периода
  • Период сглаживания автоматически оптимизируется, нет необходимости вручную выбирать лучший параметр
  • Конфигурируемый диапазон периода RSI работает для различных продуктов

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

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

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

  • Попробуйте различные методы расчета корреляции для уменьшения задержки
  • Рассмотрим больше факторов, а не только корреляцию, чтобы определить период RSI
  • Бактэст на различных продуктах для поиска оптимального интервала периода RSI по умолчанию
  • Может устанавливать весы корреляционных факторов, вместо чисто линейного отображения
  • Добавление фильтров для предотвращения неблагоприятных периодов RSI в определенных рыночных условиях

Резюме

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


/*backtest
start: 2023-09-06 00:00:00
end: 2023-10-06 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/


//@version=5
strategy("Dynamic RSI Momentum", "DRM Strategy", process_orders_on_close = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 50 )

// +++++++++++++++++++++
// ++      INPUT      ++ 
// +++++++++++++++++++++

// Momentum
len = input.int(10, "Momentum Length", 1,      group = "Dynamic RSI Momentum")
src = input.source(close, "Source",   group = "Dynamic RSI Momentum")

min_rsi = input.int(20, "Min RSI", group = "Dynamic RSI Momentum")
max_rsi = input.int(50, "Max RSI", group = "Dynamic RSI Momentum")

upLvl = input.float(70, "OverBought", 0, 100, group = "Dynamic RSI Momentum")
dnLvl = input.float(30, "OverSold",   0, 100, group = "Dynamic RSI Momentum")

// +++++++++++++++++++++
// ++   CALCULATION   ++ 
// +++++++++++++++++++++

// RMA Function
rmaFun(src, len) =>
    sma   = ta.sma(src, len) 
	alpha = 1/len
	sum   = 0.0
	sum  := na(sum[1]) ? sma : alpha * src + (1 - alpha) * nz(sum[1])

// RSI Function 
rsiFun(src, len) =>     
    100 - 100 / (1 + rmaFun(src - src[1] > 0 ? src - src[1] : 0, len) / 
                     rmaFun(src[1] - src > 0 ? src[1] - src : 0, len))

// Momentum
momVal = src - src[len]

// Calculation Price vs Momentum
corr  = ta.correlation(src, momVal, len)
corr := corr > 1 or corr < -1 ? float(na) : corr

rsiLen = 0
rsiLen := int(min_rsi + nz(math.round((1 - corr) * (max_rsi-min_rsi) / 2, 0), 0))

rsiMom = rsiFun(src, rsiLen)


// +++++++++++++++++++++
// ++    STRATEGY     ++ 
// +++++++++++++++++++++

long  = ta.crossover(rsiMom, dnLvl)
short = ta.crossunder(rsiMom, upLvl) 


// +++> Long <+++++
if long and not na(rsiMom)
    strategy.entry("Long", strategy.long)

// +++> Short <+++++
if short and not na(rsiMom)
    strategy.entry("Short", strategy.short)

// +++++++++++++++++++++
// ++      PLOT       ++ 
// +++++++++++++++++++++

plot(rsiMom, "Dynamic RSI Momentum", rsiMom < dnLvl ? color.green : rsiMom > upLvl ? color.red : color.yellow)

hline(50, "Mid Line", color.gray)

upperLine = hline(upLvl, "Upper Line", color.gray)
lowerLine = hline(dnLvl, "Lower Line", color.gray)
fill(upperLine, lowerLine, color.new(color.purple, 90), "Background Fill")



Больше