Estrategia de impulso estocástico

El autor:¿ Qué pasa?, Fecha: 2024-01-22 10:13:23
Las etiquetas:

img

Resumen general

La Estrategia de Momentum Estocástico es una estrategia de trading cuantitativa que combina el Índice de Momentum Estocástico (SMI) y el Índice de Fuerza Relativa (RSI). Utiliza el SMI para identificar áreas de sobrecompra y sobreventa en el mercado, con el RSI rápido actuando como un filtro de señal. También implementa un filtro corporal para una selección de señal más confiable.

Principios de estrategia

Indice de impulso estocástico

El índice de impulso estocástico (SMI) es un indicador técnico común utilizado en el comercio cuantitativo que combina los puntos fuertes de los indicadores de impulso y oscilación.

Específicamente, el SMI se calcula como:

SMI = (cerca - (HH + LL) /2)/(0,5*(HH - LL)) * 100

donde HH es el precio más alto durante los últimos N días y LL es el precio más bajo.

El SMI es un indicador de los movimientos de los mercados, que incluye tanto el juicio de impulso de tendencia como el juicio de reversión de la oscilación.

Indicador de RSI rápido

El índice de fortaleza relativa (RSI) es un indicador estándar de sobrecompra/sobreventa.

Las lecturas por debajo de 20 se consideran sobrevendidas, mientras que las por encima de 80 se consideran sobrecompradas por el RSI rápido.

Filtro del cuerpo

La estrategia también implementa un filtro corporal comprobando el tamaño del cuerpo del candelabro para filtrar ciertas señales.

Esto filtra algunas señales falsas y aumenta la confiabilidad.

Ventajas

Combinación de varios indicadores

Este enfoque combina el SMI, el RSI rápido y el filtro corporal en un sistema robusto de 3 partes.

Detección de sobrecompra/sobreventa

Tanto el SMI como el RSI rápido son excelentes para detectar tendencias agotadas.

Comercio de dos vías

La capacidad de comprar tanto caídas como subidas cortas maximiza las oportunidades en todas las condiciones del mercado.

Control de riesgos

El filtro de la carrocería evita las aserraduras rechazando señales de baja convicción en condiciones agitadas.

Los riesgos

Las cuchillas

El cambio frecuente entre largo y corto conlleva un riesgo de serrucha.

Negocios abarrotados

Las señales pueden agrupar a los participantes del mercado y estimular rápidas reversiones al entrar.

Los cisnes negros

Los eventos extremos pueden cambiar todos los modelos.

Mejoras

Optimización de parámetros

La prueba de diferentes períodos SMI/RSI y umbrales de filtro de cuerpo podría revelar valores óptimos para mayores rendimientos.

Paradas dinámicas

La incorporación de paradas basadas en la volatilidad o ATR contenería mejor el riesgo de posición y de cartera.

Aprendizaje automático

Los modelos que predicen los niveles futuros de los indicadores podrían identificar los puntos de inflexión antes, lo que mejoraría el poder predictivo.

Conclusión

En resumen, al integrar el SMI, el RSI rápido y el filtro corporal, esta estrategia ha creado un sistema de sobrecompra/sobreventa bastante completo. El enfoque de múltiples señales mejora la precisión, mientras que la capacidad de comercio bidireccional y los controles de riesgos contribuyen al equilibrio.


/*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()

Más.