Стратегия прорыва импульса

Автор:Чао Чжан, Дата: 2023-11-15 11:09:21
Тэги:

img

Обзор

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

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

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

Стратегия сначала рассчитывает импульс 18-периодный, который является текущим закрытием минус закрытие 18 периодов назад, хранится в mom0. Затем рассчитывает импульс 1-периодный mom0, хранится в mom1.

Когда mom0>0 и mom1>0, генерируется длинный сигнал, указывающий на сильный подъемный импульс.

Стратегия записывает время последнего длинного и короткого сигналов. Когда время длинного сигнала более недавнее, чем время короткого сигнала, он занимает длинную позицию. Когда время короткого сигнала более недавнее, чем время длинного сигнала, он занимает короткую позицию.

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

Преимущества этой стратегии включают:

  1. Логика проста и легко понятна, подходит для начинающих в количественной торговле.

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

  3. Двойной фильтр импульса помогает избежать потерь от ложных прорывов.

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

  5. Своевременный выход с остановкой потери контролирует размер потерь на одной сделке и избегает больших потерь от отмены.

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

Некоторые риски этой стратегии:

  1. Стоп-лосс выход во время краткосрочных pullbacks в восходящем тренде, не в состоянии захватить весь тренд.

  2. Частые открытые и закрытые сделки на различных рынках увеличивают затраты на комиссионные и сдвиги.

  3. Продолжающие держаться в первоначальном направлении после изменения тренда увеличивают убытки.

  4. Неправильное настройка параметров приводит к отсутствию сигналов или созданию ложных сигналов.

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

Некоторые способы оптимизации стратегии:

  1. Оптимизировать параметры импульса путем корректировки расчета длины импульса на основе временных рамок и рынка.

  2. Добавьте другие фильтры показателей, такие как MACD, KD, чтобы избежать потерь от переворота тренда.

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

  4. Добавить правила размещения позиций, чтобы уменьшить размер в не-тендерах и увеличить размер в трендах, чтобы получить больше прибыли.

  5. Оптимизировать параметры отдельно для различных продуктов для улучшения адаптивности.

  6. Включить алгоритмы машинного обучения для динамической оптимизации параметров.

Заключение

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


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

//@version=4
strategy("Momentum BF 🚀", overlay=true, precision=2, initial_capital=10000, default_qty_type=strategy.percent_of_equity, default_qty_value=100, commission_type=strategy.commission.percent, commission_value=0.075)

/////////////// Time Frame ///////////////
_0 = input(false,  "════════ Test Period ═══════")
testStartYear = input(2017, "Backtest Start Year") 
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay, 0, 0)

testStopYear = input(2019, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(31, "Backtest Stop Day")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay, 0, 0)

testPeriod() => true

///////////// Momentum /////////////
_1 = input(false, "═══════ Momentum ══════")
length = input(18)
price = close

momentum(seria, length) =>
    mom = seria - seria[length]
    mom

mom0 = momentum(price, length)
mom1 = momentum(mom0, 1)

/////////////// Strategy /////////////// 
long = mom0 > 0 and mom1 > 0
short = mom0 < 0 and mom1 < 0

last_long = 0.0
last_short = 0.0
last_long := long ? time : nz(last_long[1])
last_short := short ? time : nz(last_short[1])

long_signal = crossover(last_long, last_short)
short_signal = crossover(last_short, last_long)

last_open_long_signal = 0.0
last_open_short_signal = 0.0
last_open_long_signal := long_signal ? open : nz(last_open_long_signal[1])
last_open_short_signal := short_signal ? open : nz(last_open_short_signal[1])

last_long_signal = 0.0
last_short_signal = 0.0
last_long_signal := long_signal ? time : nz(last_long_signal[1])
last_short_signal := short_signal ? time : nz(last_short_signal[1])

in_long_signal = last_long_signal > last_short_signal
in_short_signal = last_short_signal > last_long_signal

last_high = 0.0
last_low = 0.0
last_high := not in_long_signal ? na : in_long_signal and (na(last_high[1]) or high > nz(last_high[1])) ? high : nz(last_high[1])
last_low := not in_short_signal ? na : in_short_signal and (na(last_low[1]) or low < nz(last_low[1])) ? low : nz(last_low[1])

since_longEntry = barssince(last_open_long_signal != last_open_long_signal[1]) 
since_shortEntry = barssince(last_open_short_signal != last_open_short_signal[1]) 

/////////////// Stop Losses Long ///////////////
_5 = input(false,  "═══════ Stop Loss L ══════")
SL_typel = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inpl = input(8.0, title='Fixed Stop Loss %') / 100
atrLkbl = input(20, minval=1, title='ATR Stop Period')
atrMultl = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1l = atr(atrLkbl)

longStop1l = 0.0
longStop1l := short_signal ? na : long_signal ? close - (atr1l * atrMultl) : longStop1l[1]

slLongl = in_long_signal ? strategy.position_avg_price * (1 - sl_inpl) : na
long_sll = in_long_signal ? slLongl : na

/////////////// Stop Losses Short ///////////////
_6 = input(false, "═══════ Stop Loss S ══════")
SL_types = input("Fixed", options=["Fixed", "ATR Derived"], title="Stop Loss Type")
sl_inps = input(7.0, title='Fixed Stop Loss %') / 100
atrLkbs = input(20, minval=1, title='ATR Stop Period')
atrMults = input(1.5, step=0.25, title='ATR Stop Multiplier') 
atr1s = atr(atrLkbs)

shortStop1s = 0.0
shortStop1s := long_signal ? na : short_signal ? close + (atr1s * atrMults) : shortStop1s[1]

slShorts = strategy.position_avg_price * (1 + sl_inps)
short_sls = in_short_signal ? slShorts : na

_7 = input(false, "══════ Longs or Shorts ═════")
useLongs = input(true, title="Use Longs")
useShorts = input(true, title="Use Shorts")

/////////////// Execution ///////////////
if testPeriod()
    if useLongs
        strategy.entry("L", strategy.long, when=long)
        strategy.exit("L SL", "L", stop = SL_typel == "Fixed" ? long_sll : longStop1l, when=since_longEntry > 0)
    if useShorts
        strategy.exit("S SL", "S", stop = SL_types == "Fixed" ? short_sls : shortStop1s, when=since_shortEntry > 0)
        strategy.entry("S", strategy.short, when=short)
    if not useShorts
        strategy.close("L", when=short)
    if not useLongs
        strategy.close("S", when=long)

/////////////// Plotting /////////////// 
bgcolor(long_signal ? color.lime : short_signal ? color.red : na, transp=40)
p0 = plot(close)
p1 = plot(strategy.position_size <= 0 ? na : SL_typel == "Fixed" ? long_sll : longStop1l, title="Long Stop Loss", color=color.yellow, style=plot.style_linebr, linewidth=2)
p2 = plot(strategy.position_size >= 0 ? na : SL_types == "Fixed" ? short_sls : shortStop1s, title="Short Stop Loss", color=color.orange, style=plot.style_linebr, linewidth=2)
p3 = plot(strategy.position_size <= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Long Entry", color=color.green, linewidth=2)
p4 = plot(strategy.position_size >= 0 ? na : strategy.position_avg_price, style=plot.style_linebr, title="Short Entry", color=color.red, linewidth=2)
fill(p0, p3, color = color.lime, transp=60)
fill(p0, p4, color = color.red, transp=60)

Больше