Estrategia de reversión de fluctuaciones anormales de precios


Fecha de creación: 2023-10-11 16:03:36 Última modificación: 2023-10-11 16:03:36
Copiar: 1 Número de Visitas: 689
1
Seguir
1617
Seguidores

Descripción general

La estrategia determina si hay una fluctuación inusualmente grande en el precio mediante el cálculo de la diferencia estándar del precio. Cuando hay una fluctuación inusualmente grande en el precio, se toma como una oportunidad de reversión del precio y se realiza una operación inversa.

El principio

La estrategia se basa en dos indicadores:

  1. Indicador VixFix: Calcula el diferencial estándar de los precios en un determinado período para determinar si los precios fluctúan de manera anormal. El método de cálculo es:
wvf = ((highest(close, pd)-low)/(highest(close, pd)))*100 
sDev = mult * stdev(wvf, bbl)
midLine = sma(wvf, bbl)  
lowerBand = midLine - sDev
upperBand = midLine + sDev

En este caso, wvf es la tasa de fluctuación del precio, sDev es la diferencia estándar, la línea media es la media, la banda inferior y la banda superior son la línea inferior y la línea superior respectivamente. Cuando el precio supera la línea superior, se considera que hay una fluctuación anormal.

  1. RSI: Indicador de la fuerza relativa de los precios para determinar el momento de la reversión de los precios. El método específico de cálculo es:
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 determinado valor, significa que el precio está sobrevendido y puede rebotar. Cuando el RSI está por encima de un determinado valor, significa que el precio está sobrecomprado y puede rebotar.

Entradas y Salidas

La lógica de entrada y salida de esta estrategia es la siguiente:

La entrada en una posición múltiple: cuando el precio supera la línea superior o la volatilidad supera el umbral y el RSI está por debajo de un determinado valor, haga más.

Entrada en posición vacía: cuando el precio supera la línea superior o la volatilidad supera el umbral, y el RSI supera un valor determinado, se hace una posición vacía.

Condiciones de salida: posición abierta en la dirección opuesta a la dirección de la entidad de la línea K.

Las ventajas

  • Utiliza las características estadísticas de las fluctuaciones anormales de los precios para determinar el momento en que los precios se revierten, con una amplia cobertura.
  • La combinación de los indicadores RSI para determinar el estado de sobrecompra y sobreventa puede mejorar la precisión de la entrada.
  • El uso de la brecha mínima de la diferencia estándar como señal de entrada puede reducir la posibilidad de perder.
  • El uso de la inversión de la entidad como método de parada de pérdidas puede detener rápidamente los pérdidas y reducir las pérdidas.

El riesgo

  • El límite inferior de la diferencia estándar puede ser ajustado y requiere parámetros de optimización.
  • La ruptura del límite mínimo de la diferencia estándar no necesariamente produce una reversión, existe el riesgo de que se aplique.
  • Los parámetros del RSI necesitan ser optimizados, si no son adecuados pueden causar una señal inexacta.
  • La dirección de la entidad determina que el stop loss puede ser demasiado radical y requiere ajustar los parámetros.

Optimización de las ideas

  • Optimizar el cálculo de los parámetros periódicos de diferencia estándar para que sea más capaz de capturar las fluctuaciones anormales de los precios.
  • Optimizar los parámetros del RSI para encontrar mejores criterios de determinación de la sobrecompra y la sobreventa.
  • Intentar combinar otros indicadores, como KDJ, MACD y otros para determinar el tiempo de reversión.
  • Optimización de los métodos de detención de pérdidas, estableciendo un margen de corrección de precios como criterio de detención de pérdidas.

Resumir

La estrategia utiliza la diferencia estándar para calcular la volatilidad de los precios, para determinar si los precios están fluctuando de manera anormal, para capturar oportunidades de reversión. En la elección de la hora de entrada, se combina con el indicador RSI para determinar el estado de sobreventa y sobreventa de los precios, para mejorar la precisión.

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