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

Автор:Чао Чжан, Дата: 2023-10-25 10:58:02
Тэги:

img

Обзор

Стратегия торговли линейной регрессионной скользящей средней генерирует сигналы купли-продажи на основе перекресток между линейной регрессионной линией и скользящей средней цены акций.

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

Стратегия сначала рассчитывает линейную регрессию на n дней и скользящую среднюю стоимость акций на м дней.

Когда скользящая средняя пересекает линию регрессии, она сигнализирует о усилении импульса вверх и генерирует сигнал покупки.

В частности, стратегия следует следующим шагам для определения торговых сигналов:

  1. Вычислить линейную регрессию цен на n дней

  2. Вычислить простую скользящую среднюю lrLine, называемую lrMA

  3. Вычислить экспоненциальную скользящую среднюю цены за m дней, называемую Ema

  4. Когда EMA пересекает IrMA, генерируется сигнал покупки longEntry

  5. Когда EMA пересекает уровень ниже lrMA, генерируется сигнал продажи longExit

  6. Подумайте только о покупке сигналов, когда рынок быстрый

  7. Исполнение сделок на основе сигналов

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

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

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

Риски

  • Частые перекрестки во время волатильности могут генерировать ложные сигналы
  • Неточные рыночные фильтры приводят к ошибочным записям
  • Плохая настройка параметров влияет на эффективность стратегии
  • Высокая частота торговли приводит к более высоким затратам

Параметры должны быть настроены для увеличения периодов скользящей средней и регрессионной линии и уменьшения частоты торговли. Для контроля рисков должны быть реализованы разумные стоп-потери. Для повышения точности можно улучшить рыночные фильтры.

Усовершенствования

Стратегия может быть оптимизирована в нескольких аспектах:

  1. Оптимизация скользящей средней путем тестирования различных типов МА

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

  3. Оптимизация фильтра рынка путем тестирования различных показателей

  4. Оптимизация параметров посредством строгого обратного тестирования

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

  6. Оптимизация затрат путем корректировки частоты торговли на основе затрат

Эти оптимизации могут еще больше улучшить стабильность и рентабельность стратегии.

Заключение

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


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

// This source code is subject to the terms of the Mozilla Public License 2.0 at https://mozilla.org/MPL/2.0/
// © lazy_capitalist

//@version=5
strategy('Linear Regression MA', overlay=true, initial_capital=10000)
datesGroup = "Date Info"
startMonth = input.int(defval = 1,    title = "Start Month",  minval = 1, maxval = 12,  group=datesGroup)
startDay   = input.int(defval = 1,    title = "Start Day",    minval = 1, maxval = 31,  group=datesGroup)
startYear  = input.int(defval = 2022, title = "Start Year",   minval = 1970,            group=datesGroup)

averagesGroup = "Averages"
lrLineInput     = input.int(title="Linear Regression Line",   defval=55, minval = 1, group=averagesGroup)
lrMAInput       = input.int(title="Linear Regression MA",     defval=55, minval = 1, group=averagesGroup)
emaInput        = input.int(title="EMA Length",               defval=55, minval = 1, group=averagesGroup)


tradesGroup = "Execute Trades"
executeLongInput    = input.bool(title="Execute Long Trades",       defval=true)
executeShortInput   = input.bool(title="Execute Short Trades",      defval=true)
executeStopLoss     = input.bool(title="Execute Stop Loss",         defval=true)

fourHrSMAExpr       = ta.sma(close, 200)
fourHrMA            = request.security(symbol=syminfo.tickerid, timeframe="240", expression=fourHrSMAExpr)

bullish             = close > fourHrMA ? true : false


maxProfitInput              = input.float(  title="Max Profit (%)",         defval=10.0,    minval=0.0)   * 0.01
stopLossPercentageInput     = input.float(  title="Stop Loss (%)",          defval=1.75,    minval=0.0)   * 0.01

start       = timestamp(startYear, startMonth, startDay, 00, 00)            // backtest start  window
window()    => time >= start ? true : false                              // create function "within window of time"
showDate    = input(defval = true, title = "Show Date Range")

lrLine = ta.linreg(close, lrLineInput, 0)
lrMA   = ta.sma(lrLine, lrMAInput)
ema     = ta.ema(close, emaInput)

longEntry   = ema   < lrMA
longExit    = lrMA  < ema

shortEntry  = lrMA  < ema
shortExit   = ema   < lrMA


maxProfitLong   = strategy.opentrades.entry_price(0) * (1 + maxProfitInput)
maxProfitShort  = strategy.opentrades.entry_price(0) * (1 - maxProfitInput)

stopLossPriceShort  = strategy.position_avg_price * (1 + stopLossPercentageInput)
stopLossPriceLong   = strategy.position_avg_price * (1 - stopLossPercentageInput)

if(executeLongInput and bullish)
    strategy.entry( id="long_entry", direction=strategy.long,   when=longEntry and window(),    qty=10,  comment="long_entry")
    strategy.close( id="long_entry", when=longExit,     comment="long_exit")
    // strategy.close( id="long_entry", when=maxProfitLong <= close, comment="long_exit_mp")
    
if(executeShortInput and not bullish)
    strategy.entry( id="short_entry", direction=strategy.short,   when=shortEntry and window(),    qty=10,  comment="short_entry")
    strategy.close( id="short_entry", when=shortExit,     comment="short_exit")
    // strategy.close( id="short_entry", when=maxProfitShort <= close, comment="short_exit_mp")

if(strategy.position_size > 0 and executeStopLoss)
    strategy.exit(  id="long_entry",        stop=stopLossPriceLong,             comment="exit_long_SL")
    strategy.exit(  id="short_entry",       stop=stopLossPriceShort,            comment="exit_short_SL")
    
// plot(series=lrLine,     color=color.green)
plot(series=lrMA,       color=color.red)
plot(series=ema,        color=color.blue)


Больше