Estrategia de reversión de la volatilidad media de precios

El autor:¿ Qué pasa?, fecha: 2023-10-11 16:03:36
Las etiquetas:

Resumen general

Esta estrategia detecta oportunidades de inversión de precios mediante el cálculo de la desviación estándar de la volatilidad de los precios.

Principio

La estrategia utiliza dos indicadores principales:

  1. Indicador VixFix: Calcula la desviación estándar del precio durante un cierto período para determinar si existe una volatilidad de precios anómala.
wvf = ((highest(close, pd)-low)/(highest(close, pd)))*100
sDev = mult * stdev(wvf, bbl) 
midLine = sma(wvf, bbl)
lowerBand = midLine - sDev 
upperBand = midLine + sDev

Donde wvf es la volatilidad de precios, sDev es la desviación estándar, midLine es la línea media, lowerBand y upperBand son las líneas límite inferior y superior.

  1. Indicador RSI: Calcula el índice de fortaleza relativa del precio para determinar el momento de la inversión de precios.
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))

Cuando el RSI está por debajo de un umbral, indica estado de sobreventa y potencial rebote.

Entrada y salida

La lógica de entrada y salida es:

Entrada larga: Cuando el precio excede el límite superior o la volatilidad excede el umbral, y el RSI está por debajo de un valor, vaya largo.

Entrada corta: Cuando el precio excede el límite superior o la volatilidad excede el umbral, y el RSI excede un valor, vaya corto.

Salida: Cuando la dirección del cuerpo del candelabro es opuesta a la dirección de la posición, posición cerrada.

Ventajas

  • Utiliza las propiedades estadísticas de la volatilidad anómala de los precios para determinar la inversión de precios con una amplia cobertura.
  • La combinación con el RSI para juzgar sobrecomprado/sobrevendido mejora la precisión de entrada.
  • Romper la banda de desviación inferior como señal de entrada reduce las oportunidades perdidas.
  • La reversión del cuerpo del candelero como stop loss se da cuenta de la pérdida rápida y reduce las pérdidas.

Los riesgos

  • La banda de desviación inferior puede necesitar un ajuste para la optimización de parámetros.
  • Romper la banda inferior no garantiza la inversión, se corre el riesgo de quedar atrapado.
  • Los parámetros del RSI necesitan optimización, valores incorrectos conducen a señales inexactas.
  • La pérdida del cuerpo del candelabro puede ser demasiado agresiva, necesita ajuste.

Direcciones de optimización

  • Optimizar el período de cálculo de la desviación estándar para captar mejor la volatilidad anómala.
  • Optimizar los parámetros del RSI para encontrar mejores criterios de sobrecompra/sobreventa.
  • Intenta combinar otros indicadores como KDJ, MACD para determinar el tiempo de reversión.
  • Optimizar el mecanismo de stop loss, establecer el retracement del precio como punto de referencia de stop loss.

Conclusión

La estrategia detecta la volatilidad anómala de los precios mediante el cálculo de la desviación estándar de la volatilidad de los precios, para capturar oportunidades de reversión. El RSI se combina para juzgar el estado de sobrecompra / sobreventa para mejorar la precisión de entrada. Se utiliza una sencilla dirección del cuerpo de la vela para detener la pérdida. En general, la estrategia es efectiva para usar datos estadísticos para detectar la volatilidad anómala, pero necesita una mayor optimización de parámetros para mejorar la estabilidad. Si el mecanismo de stop loss se puede optimizar razonablemente para reducir las pérdidas, la estrategia funcionaría aún mejor.


/*backtest
start: 2022-10-04 00:00:00
end: 2023-10-10 00:00:00
period: 2d
basePeriod: 1d
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//Noro
//2018

//@version=2
strategy(title = "Noro's VixFix + RSI Strategy v1.0", shorttitle = "VixFix + RSI str 1.0", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100, pyramiding = 5)

//Settings
needlong = input(true, defval = true, title = "Long")
needshort = input(true, defval = true, title = "Short")
leverage = input(1, defval = 1, minval = 1, maxval = 100, title = "leverage")
limit = input(40, defval = 40, minval = 2, maxval = 50, title = "RSI Limit")

pd = input(22, title="LookBack Period Standard Deviation High")
bbl = input(20, title="Bolinger Band Length")
mult = input(2.0, minval = 1, maxval = 5, title = "Bollinger Band Standard Devaition Up")
lb = input(50, title="Look Back Period Percentile High")
ph = input(.85, title="Highest Percentile - 0.90=90%, 0.95=95%, 0.99=99%")
pl = input(1.01, title="Lowest Percentile - 1.10=90%, 1.05=95%, 1.01=99%")
hp = input(false, title="Show High Range - Based on Percentile and LookBack Period?")
sd = input(false, title="Show Standard Deviation Line?")

fromyear = input(1900, defval = 1900, 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")

//Vix Fix
wvf = ((highest(close, pd)-low)/(highest(close, pd)))*100
sDev = mult * stdev(wvf, bbl)
midLine = sma(wvf, bbl)
lowerBand = midLine - sDev
upperBand = midLine + sDev
rangeHigh = (highest(wvf, lb)) * ph
rangeLow = (lowest(wvf, lb)) * pl

col = wvf >= upperBand or wvf >= rangeHigh ? lime : gray

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

//Body
body = abs(close - open)
abody = sma(body, 10)

//Signals
up = (wvf >= upperBand or wvf >= rangeHigh) and fastrsi < limit and close < open
dn = (wvf >= upperBand or wvf >= rangeHigh) and fastrsi > (100 - limit) and close > open
exit = ((strategy.position_size > 0 and close > open) or (strategy.position_size < 0 and close < open)) and body > abody / 3

//Trading
lot = strategy.position_size == 0 ? strategy.equity / close * leverage : lot[1]

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

if dn
    if strategy.position_size > 0
        strategy.close_all()
        
    strategy.entry("Top", 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.