Estrategia de trading cuantitativo basada en el índice de fuerza relativa


Fecha de creación: 2024-01-22 10:13:23 Última modificación: 2024-01-22 10:13:23
Copiar: 7 Número de Visitas: 831
1
Seguir
1617
Seguidores

Estrategia de trading cuantitativo basada en el índice de fuerza relativa

Descripción general

La estrategia de movimiento de la oscilación es una estrategia de negociación cuantitativa que combina un indicador de movimiento aleatorio con un indicador relativamente fuerte. La estrategia utiliza un indicador de movimiento aleatorio para determinar las zonas de sobreventa y sobrecompra en el mercado, junto con una señal de filtración de un indicador RSI rápido, y luego realiza una selección de señales de negociación más confiable a través de un filtro físico.

Principio de estrategia

Indicador de movimiento aleatorio

El índice de dinámica aleatoria (SMI) es un indicador técnico comúnmente utilizado en la transacción cuantitativa, que combina las ventajas de los indicadores de dinámica y de oscilación.

En concreto, la fórmula para calcular el SMI es:

SMI = (Close - (HH + LL)/2)/(0.5*(HH - LL)) * 100

De ellos, HH es el precio más alto de los últimos N días y LL es el precio más bajo de los últimos N días.

De esta manera, el SMI combina un juicio de tendencia de la dinámica y un juicio de reversión de la oscilación. Cuando el SMI es superior a 80 es sobrecomprado, y cuando es inferior a 20 es sobrevendido. La estrategia emite una señal de negociación en la zona de sobrecompra y sobreventa.

El RSI rápido

El índice de fuerza relativa (RSI) es un indicador común de sobreventa y sobreventa. La estrategia utiliza un RSI rápido de 7 ciclos para juzgar la situación de sobreventa y sobreventa en el corto plazo.

Cuando el RSI rápido está por debajo de 20 es sobreventa y por encima de 80 es sobreventa. La estrategia emite una señal de negociación en la zona de sobreventa sobreventa.

Filtrado de entidad

La estrategia también incorpora un filtro de entidad, que filtra una parte de la señal calculando el tamaño de la entidad de la línea K. La señal de transacción se emite solo cuando la entidad de la línea K supera un determinado umbral.

Esto puede filtrar algunas señales falsas y mejorar la fiabilidad de la señal.

Ventajas estratégicas

Combinación de varios indicadores

La estrategia combina las tres partes de los indicadores de dinámica aleatoria, el indicador RSI rápido y el filtro de entidades. Al combinar varios indicadores, se puede mejorar la precisión de la señal y aumentar la solidez de la estrategia.

El juicio de sobrecompra

Tanto el indicador de movimiento aleatorio como el indicador RSI rápido pueden determinar con precisión el estado de sobrecompra y sobreventa del mercado. La estrategia consiste en abrir posiciones en zonas de sobrecompra y sobreventa, siguiendo el principio de compra y venta de posiciones bajas y altas.

Transacciones de dos vías

La estrategia permite realizar transacciones en ambos sentidos, tanto en el sentido de la multiplicación como en el sentido del vacío, para maximizar las oportunidades de transacción en el mercado.

Control de riesgos

La adición de un filtro físico puede filtrar la mayor parte del ruido y evitar que se bloquee en situaciones de vibración.

Riesgo estratégico

Riesgo de la conmutación múltiple

La estrategia de negociación bidireccional, con múltiples y frecuentes cambios de cabeza vacía, es un punto de riesgo potencial. La lógica de apertura de posición adecuada puede reducir este riesgo.

El riesgo

Cuando el indicador da una señal, puede acumularse una gran cantidad de operadores de seguimiento en un corto período de tiempo, lo que genera un riesgo de reversión de la situación. Se puede reducir este riesgo optimizando los parámetros del indicador.

Riesgo sistémico del mercado

En casos extremos, todos los modelos pueden fallar. Esto requiere que se controle este tipo de riesgos mediante la configuración de un stop loss razonable.

Optimización de la estrategia

Optimización de parámetros

Se puede buscar el parámetro óptimo para aumentar la rentabilidad de la estrategia mediante la prueba de diferentes combinaciones de parámetros, como el ciclo SMI, el ciclo RSI, el umbral del filtro de la entidad, etc.

Dinámica de pérdidas

El establecimiento de un mecanismo de stop loss dinámico basado en el ATR o la volatilidad permite un mejor control del riesgo individual y global.

Aprendizaje automático

La introducción de algoritmos de aprendizaje automático para predecir el futuro de los valores de los indicadores a través de modelos. Esto permite determinar los puntos de inflexión de los indicadores con anticipación y aumentar la previsibilidad de las estrategias.

Resumir

En resumen, la estrategia integra indicadores de dinámica aleatoria, indicadores RSI rápidos y filtros de entidades para lograr un sistema de juicio de sobreventa y sobreventa más completo. La combinación de múltiples indicadores mejora la precisión de la señal, y el mecanismo de control de riesgo y de comercio bidireccional también hace que la estrategia sea más equilibrada. La estrategia tiene posibilidades de obtener mejores tasas de rendimiento mediante la optimización continua de los parámetros y modelos.

Código Fuente de la Estrategia
/*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()