Estrategia cuantitativa basada en el índice de momentum estocástico y el RSI


Fecha de creación: 2023-12-12 15:20:29 Última modificación: 2023-12-12 15:20:29
Copiar: 0 Número de Visitas: 1174
1
Seguir
1621
Seguidores

Estrategia cuantitativa basada en el índice de momentum estocástico y el RSI

Descripción general

Esta estrategia se basa principalmente en dos indicadores, el Índice de Momentum Estocástico (SMI) y el Índice de Fuerza Relativa (RSI). Además, se agregan filtros de color y filtros de entidades de línea K como criterios auxiliares. Se emite una señal de negociación basada en la señal de pluralidad de SMI y RSI, combinada con las condiciones de filtración.

Principio de estrategia

El núcleo de esta estrategia se basa en dos indicadores, el SMI y el RSI. En el SMI se determina si una acción está sobrecomprada, mientras que el RSI determina la relativa fortaleza de la acción.

  1. SMI sobrevendido (por debajo del límite inferior), considerado como una señal de compra
  2. El RSI está por debajo de la brecha y es una señal de compra
  3. Una señal de compra se emite cuando el SMI está sobrevendido y el RSI está a la vez por debajo del umbral correspondiente
  4. La lógica de juicio de señales en blanco es similar

Además, la estrategia también establece un modo de doble señales. Este modelo requiere que el SMI y el RSI emitan señales al mismo tiempo para poder operar. Esto puede reducir eficazmente las falsas señales.

Además, esta estrategia también incluye filtros de color y filtros de entidades de línea K. Estos filtros requieren que las entidades de la línea K sean más grandes y que el precio de cierre de la última línea K sea más alto que el precio de apertura. Esto puede evitar aún más falsos brechas en las transacciones.

Ventajas estratégicas

  1. Utiliza el SMI para determinar si está sobrecomprando o sobrevendido, el RSI para determinar si está relativamente fuerte y la doble confirmación para reducir las señales falsas
  2. La configuración de un modo de doble señal puede reducir considerablemente las transacciones no válidas
  3. El filtro de color y el filtro de entidad de línea K pueden filtrar efectivamente la brecha falsa
  4. La lógica de ejecución de la estrategia es clara y simple
  5. La mayoría de los parámetros son de configuración personalizada

Riesgo y optimización de la estrategia

  1. El SMI y el RSI pueden generar más falsas señales cuando se usan como indicadores independientes, por lo que debe tomarse precauciones.
  2. En el modo de doble señal, si los parámetros no están configurados correctamente, es posible que se pierda una mejor oportunidad de negociación
  3. Se puede probar el rendimiento de la estrategia bajo diferentes parámetros de ciclo para encontrar la combinación óptima de parámetros
  4. La configuración de los parámetros de valoración de umbral específicos se puede evaluar mediante simulación o retroalimentación
  5. Se pueden considerar estrategias de optimización de filtros adicionales

Resumir

Esta estrategia integra las señales de los dos indicadores SMI y RSI para emitir instrucciones de negociación mediante doble confirmación. Al mismo tiempo, el filtro de color y el filtro de entidad de línea K se pueden filtrar para filtrar brechas falsas. La lógica de funcionamiento de la estrategia es simple y clara, y la mayoría de los parámetros se pueden configurar.

Código Fuente de la Estrategia
/*backtest
start: 2023-12-04 00:00:00
end: 2023-12-06 19:00:00
period: 5m
basePeriod: 1m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's Stochastic Strategy v1.3", shorttitle = "Stochastic str 1.3", 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")
usecol = input(true, defval = true, title = "Use Color-Filter")
usebod = input(true, defval = true, title = "Use Body-Filter")
a = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent K Length")
b = input(2, defval = 2, minval = 2, maxval = 50, title = "SMI Percent D Length")
limitsmi = input(50, defval = 50, minval = 1, maxval = 100, title = "SMI Limit")
periodrsi = input(2, defval = 2, minval = 2, maxval = 50, title = "RSI Period")
limitrsi = input(10, defval = 10, minval = 1, maxval = 50, title = "RSI Limit")
double = input(false, defval = false, title = "SMI+RSI Mode")
showbg = input(false, defval = false, title = "Show background")
fromyear = input(2018, defval = 2018, 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), periodrsi)
fastdown = rma(-min(change(close), 0), periodrsi)
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)
avgrel = sma(sma(rdiff,b),b)
avgdiff = sma(sma(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(limitsmi, color = black, title = "Over Bought")
plot(-1 * limitsmi, color = black, title = "Over Sold")
plot(0, color = blue, title = "Zero Line")

//Color-Filter
gb = close > open or usecol == false
rb = close < open or usecol == false

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

//Signals
up1 = SMI < -1 * limitsmi and rb and body and usesmi
dn1 = SMI > limitsmi and gb and body and usesmi
up2 = fastrsi < limitrsi and rb and body and usersi
dn2 = fastrsi > 100 - limitrsi and gb and body and usersi
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body

//Background
redb = (SMI > limitsmi and usesmi) or (fastrsi > 100 - limitrsi and usersi)
limeb = (SMI < -1 * limitsmi and usesmi) or (fastrsi < limitrsi and usersi)
col = showbg == false ? na : redb ? red : limeb ? lime : na
bgcolor(col, transp = 50)

//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]

signalup = ((up1 or up2) and double == false) or (up1 and up2 and double)
if signalup
    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)))

signaldn = ((dn1 or dn2) and double == false) or (dn1 and dn2 and double)
if signaldn
    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()