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

Автор:Чао Чжан, Дата: 2024-01-22 10:13:23
Тэги:

img

Обзор

Стратегия стохастического импульса - это количественная стратегия торговли, которая сочетает в себе индекс стохастического импульса (SMI) и индекс относительной силы (RSI).

Принципы стратегии

Индекс стохастической динамики

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

В частности, SMI рассчитывается как:

SMI = (близкий - (HH + LL) /2)/(0,5*(HH - LL)) * 100

где HH - самая высокая цена за последние N дней, а LL - самая низкая цена.

Таким образом, SMI включает в себя как следующее за трендом суждение о импульсе, так и обратное суждение о колебании. Значения выше 80 считаются перекупленными, а значения ниже 20 - перепроданными. Стратегия генерирует торговые сигналы, когда SMI достигает этих уровней перекупленности или перепроданности.

Быстрый RSI

Индекс относительной силы (RSI) является стандартным показателем перекупленности/перепроданности.

Показатели ниже 20 считаются перепроданными, а показатели выше 80 считаются перекупленными по быстрому RSI. Сигналы генерируются при нарушении этих порогов.

Фильтр тела

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

Это отфильтровывает некоторые ложные сигналы и повышает надежность.

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

Комбинация из нескольких показателей

Этот подход объединяет SMI, быстрый RSI и фильтр корпуса в надежную трехчастную систему.

Выявление перекупленности/перепроданности

Как SMI, так и быстрый RSI отлично подходят для обнаружения исчерпанных тенденций.

Двусторонняя торговля

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

Контроль рисков

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

Риски

Стрелки

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

Переполненные торговцы

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

Черные лебеди

Экстремальные события могут перевернуть все модели. Интеллектуальные стоп-потери необходимы для контроля системных рисков.

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

Оптимизация параметров

Испытание различных периодов SMI/RSI и пороговых значений фильтра тела может выявить оптимальные значения для более высокой доходности.

Динамические остановки

Включение сдержек, основанных на волатильности или ATR, лучше содержит риск позиции и портфеля.

Машинное обучение

Модели, предсказывающие будущие уровни показателей, могли бы выявить поворотные моменты раньше.

Заключение

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


/*backtest
start: 2023-12-22 00:00:00
end: 2024-01-21 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.1", shorttitle = "Stochastic str 1.1", overlay = false, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 0)

//Settings 
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
usemar = input(false, defval = false, title = "Use Martingale")
capital = input(100, defval = 100, minval = 1, maxval = 10000, title = "Capital, %")
usesmi = input(true, defval = true, title = "Use SMI Strategy")
usersi = input(true, defval = true, title = "Use RSI Strategy")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(5, "SMI Percent K Length")
b = input(3, "SMI Percent D Length")
limit = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
fromyear = input(2017, defval = 2017, minval = 1900, maxval = 2100, title = "From Year")
toyear = input(2100, defval = 2100, minval = 1900, maxval = 2100, title = "To Year")
frommonth = input(01, defval = 01, minval = 01, maxval = 12, title = "From Month")
tomonth = input(12, defval = 12, minval = 01, maxval = 12, title = "To Month")
fromday = input(01, defval = 01, minval = 01, maxval = 31, title = "From day")
today = input(31, defval = 31, minval = 01, maxval = 31, title = "To day")

//Fast RSI
fastup = rma(max(change(close), 0), 7)
fastdown = rma(-min(change(close), 0), 7)
fastrsi = fastdown == 0 ? 100 : fastup == 0 ? 0 : 100 - (100 / (1 + fastup / fastdown))

//Stochastic Momentum Index
ll = lowest (low, a)
hh = highest (high, a)
diff = hh - ll
rdiff = close - (hh+ll)/2
avgrel = ema(ema(rdiff,b),b)
avgdiff = ema(ema(diff,b),b)
SMI = avgdiff != 0 ? (avgrel/(avgdiff/2)*100) : 0
SMIsignal = ema(SMI,b)

//Lines
plot(SMI, color = blue, linewidth = 3, title = "Stochastic Momentum Index")
plot(SMIsignal, color = red, linewidth = 3, title = "SMI Signal Line")
plot(limit, color = black, title = "Over Bought")
plot(-1 * limit, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Body Filter
nbody = abs(close - open)
abody = sma(nbody, 10)
body = nbody > abody / 3 or usebod == false

//Signals
up1 = SMIsignal < -1 * limit and close < open and body and usesmi
dn1 = SMIsignal > limit and close > open and body and usesmi
up2 = fastrsi < 20 and close < open and body and usersi
dn2 = fastrsi > 80 and close > open and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Trading
profit = exit ? ((strategy.position_size > 0 and close > strategy.position_avg_price) or (strategy.position_size < 0 and close < strategy.position_avg_price)) ? 1 : -1 : profit[1]
mult = usemar ? exit ? profit == -1 ? mult[1] * 2 : 1 : mult[1] : 1
lot = strategy.position_size == 0 ? strategy.equity / close * capital / 100 * mult : lot[1]

if up1 or up2
    if strategy.position_size < 0
        strategy.close_all()
        
    strategy.entry("long", strategy.long, needlong == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))

if dn1 or dn2
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Short", strategy.short, needshort == false ? 0 : lot, when=(time > timestamp(fromyear, frommonth, fromday, 00, 00) and time < timestamp(toyear, tomonth, today, 23, 59)))
    
if time > timestamp(toyear, tomonth, today, 23, 59) or exit
    strategy.close_all()

Больше