Линейная регрессионная стратегия торговли каналом прорыва

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

img

Обзор

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

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

Основная логика этой стратегии основана на верхней полосе, нижней полосе и средней линии линейного регрессионного канала.

  1. Вычислить значение линейной регрессии linreg цен, и следующий периодs линейного значения регрессии linreg_p

  2. Вычислить наклон наклон и пересечение пересечения линейной регрессионной линии на основе линерег

  3. Расчет отклонения отклонения цен относительно регрессионной линии

  4. Установите множитель дева отклонения, чтобы получить смещение верхних и нижних полос

  5. Когда цена выходит вверх из нижней полосы, настроить сигнал покупки купить

  6. Когда цена выходит вниз из верхней полосы, настроить сигнал продажи продать

  7. Когда цена отступает от средней линии канала, установленный сигнал выхода прибыли

  8. Настройка логики торговли на основе сигналов покупки, продажи и выхода

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

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

  1. Высшие и нижние диапазоны могут эффективно отражать нормальный диапазон колебаний цен. Использование их для установки торговых сигналов может уменьшить ложные сигналы.

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

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

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

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

Эта стратегия сопряжена с некоторыми рисками:

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

  2. Неправильное настройка множителя отклонений также может привести к ложным сигналам.

  3. Если полагаться только на сигналы прорыва, это может привести к потерям.

  4. Есть некоторые риски, связанные с корректировкой кривой.

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

Основные направления оптимизации этой стратегии:

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

  2. Оптимизировать множитель отклонений для улучшения качества сигнала при максимальном контроле рисков.

  3. Добавить другие индикаторы для фильтрации сигнала для улучшения показателя выигрыша, например, EMA, KDJ и т.д.

  4. Добавить механизмы остановки потерь, такие как ATR, отслеживающие остановку потерь.

  5. Проверить влияние различных источников данных на стратегию, например, скорректированные закрытия, индексные данные и т.д.

  6. Динамическое регулирование параметров или весов сигнала на основе рыночных условий.

Заключение

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


/*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"}]
*/

//Robotrading
//@version=4

strategy("robotrading linreg", "linreg", overlay=true, default_qty_type = strategy.percent_of_equity, default_qty_value = 10, commission_value = 0.1)

//Settings
source      = input(close)
length      = input(100, minval=1)
offset      = input(0, minval=0)
dev         = input(2.0, "Deviation")
smoothing   = input(1, minval=1)
mtf_val     = input("", "Resolution", input.resolution)
signals     = input("Recent", "Signals Display", options=["Recent", "All"])
goto        = input(0, "End At Bar Index")

//Lin.reg.
cc(x) => x=="Red"?color.red:x=="Lime"?color.lime:x=="Orange"?color.orange:x=="Teal"?color.teal:x=="Yellow"?color.yellow:x=="Black"?color.black:color.white
data(x) => sma(security(syminfo.tickerid, mtf_val!="" ? mtf_val : timeframe.period, x), smoothing)
linreg = data(linreg(source, length, offset))
linreg_p = data(linreg(source, length, offset+1))

//Deviation
x = bar_index
slope = linreg - linreg_p
intercept = linreg - x*slope
deviationSum = 0.0
for i = 0 to length-1
    deviationSum:= deviationSum + pow(source[i]-(slope*(x-i)+intercept), 2)  
deviation = sqrt(deviationSum/(length))
x1 = x-length
x2 = x
y1 = slope*(x-length)+intercept
y2 = linreg

//Cross
dm_current = -deviation*dev + y2
dp_current = deviation*dev + y2
ex_current = (dm_current + dp_current) / 2
buy = crossunder(close, dm_current)
sell = crossover(close, dp_current)
exit = crossover(close, ex_current) or crossunder(close, ex_current)

//Channel
updating = goto <= 0 or x < goto
// if updating
//     line b = line.new(x1, y1, x2, y2, xloc.bar_index, extend.right, color.aqua, width = 3)
//     line.delete(b[1])
//     line dp = line.new(x1, deviation*dev + y1, x2, deviation*dev + y2, xloc.bar_index, extend.right, color.red, width = 3)
//     line.delete(dp[1])
//     line dm = line.new(x1, -deviation*dev + y1, x2, -deviation*dev + y2, xloc.bar_index, extend.right, color.lime, width = 3)
//     line.delete(dm[1])

//Lines
plot(dm_current, color = color.lime)
plot(dp_current, color = color.red)
plot(ex_current)
    
//Trading
if ex_current > 0
    strategy.entry("Long", strategy.long, na, limit = dm_current)
    strategy.entry("Short", strategy.short, na, limit = dp_current)
    strategy.exit("ExitLong", "Long", limit = ex_current)
    strategy.exit("ExitShort", "Short", limit = ex_current)

Больше