Estrategia de negociación cuantitativa basada en el filtro Voss e indicador de tendencia

El autor:¿ Qué pasa?, Fecha: 2023-09-19 16:59:10
Las etiquetas:

Resumen general

Esta estrategia combina el filtro predictivo de Voss y el indicador de tendencia instantánea de Ehlers para identificar puntos de inflexión cíclicos en el mercado para el comercio cuantitativo. El filtro de Voss proporciona señales de compra / venta tempranas, mientras que el indicador de tendencia determina la dirección general de la tendencia para evitar engaños del filtro de Voss en los mercados de tendencia.

Estrategia lógica

Filtro predictivo de Voss

El filtro de Voss proviene del artículo de John F. Ehlers A Peek Into The Future. Su cálculo es el siguiente:

_filt = 0.5 * _s3 * _x1 + _f1 * _s2 * _filt[1] - _s1 * _filt[2] 
_voss = _x2 * _filt - _sumC

Donde _x1 es la diferencia de precio del primer orden; _x2 es un factor de suavizado; _s1, _s2, _s3 son parámetros del filtro; _f1 es el parámetro del ciclo; _filt es la salida del filtro; _voss es la salida final.

El filtro puede ser visto como un filtro suavizado que enfatiza la información del ciclo actual y pasado para generar señales tempranas.

Indicador de tendencia instantánea

El indicador de línea de tendencia se calcula de la siguiente manera:

_it = (_a-((_a*_a)/4.0))*_src+0.5*_a*_a*_src[1]-(_a-0.75*_a*_a)*_src[2]+2*(1-_a)*nz(_it[1])+-(1-_a)*(1-_a)*nz(_it[2]) 

Traza una línea de tendencia en tiempo real que se ajusta a la acción del precio, determinando con precisión la dirección y la fuerza de la tendencia.

Estrategia lógica

Una señal de compra se genera cuando el Voss cruza el resultado del filtro.

Se genera una señal de venta cuando el Voss cruza el resultado del filtro.

Las señales de negociación solo se aceptan si son confirmadas por el indicador de línea de tendencia, lo que evita señales erróneas del filtro Voss en los mercados de tendencia.

Ventajas

  • El filtro de Voss proporciona señales predictivas tempranas para atrapar giros cíclicos
  • El indicador de tendencia determina con precisión la dirección de la tendencia, evitando señales erróneas
  • Los parámetros se pueden optimizar para diferentes ciclos y entornos de mercado
  • Se pueden añadir paradas para controlar el riesgo

Riesgos y mitigación

  • La estrategia se basa en las primeras señales, potencialmente perdiendo algunas tendencias
  • Las señales de contratrend pueden aparecer en tendencias fuertes, causando pérdidas

Los riesgos pueden reducirse:

  • Parámetro del período de optimización para los ciclos de los instrumentos
  • Reducción del ancho de banda del filtro para disminuir las señales falsas
  • Añadir filtros de tendencia para evitar señales contra tendencias fuertes
  • Uso de paradas para controlar la pérdida por operación

Oportunidades de mejora

La estrategia puede mejorarse mediante:

  • Probando diferentes fuentes de precios como cerrar, promedios móviles, etc.
  • Período de ajuste del filtro para ciclos específicos del instrumento
  • Optimización de los parámetros de los indicadores de tendencia para una mejor detección de tendencias
  • Prueba de diferentes indicadores de tendencia para mejores combinaciones
  • Añadir paradas, paradas de seguimiento para un mejor control del riesgo
  • Optimización de parámetros para los mejores conjuntos de parámetros

Conclusión

Esta estrategia combina el filtro de Voss y el indicador de tendencia para identificar eficazmente los giros cíclicos en el mercado. Con parámetros optimizados y controles de riesgos, puede producir un sistema de negociación cuantitativo robusto. Es ampliamente aplicable a instrumentos que muestran patrones cíclicos, como lo demuestran los buenos resultados de las pruebas de retroceso. En general, la estrategia tiene capacidades predictivas únicas y un amplio potencial de mejora a través de la optimización multidimensional.


/*backtest
start: 2023-08-19 00:00:00
end: 2023-09-18 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

// A Peek Into the Future
// John F. Ehlers
// TASC Aug 2019

// Created by e2e4mfck for tradingview.com
// Modified by © Bitduke

//@version=4
//strategy("Voss Strategy (Filter + IT)", overlay=false, calc_on_every_tick=false,pyramiding=0, default_qty_type=strategy.cash,default_qty_value=1000, currency=currency.USD, initial_capital=1000,commission_type=strategy.commission.percent, commission_value=0.075)

// voss filter

source = input(close, type = input.source)
period = input(20, type = input.integer)
predict = input(4, type = input.integer)
bandwidth = input(0.25, type = input.float)

// it trendline

src = input(hl2, title="Source IT")
a = input(0.07, title="Alpha", step=0.01) 
fr = input(false, title="Fill Trend Region")
ebc = input(false, title="Enable barcolors")
hr = input(false, title="Hide Ribbon")


voss_filter (_period, _predict, _bandwidth, _source) =>
	float _filt = 0, float _sumC = 0, float _voss = 0
	_PI		= 2 * asin(1)
	_order	= 3 * _predict
	_f1		= cos(2 * _PI / _period)
	_g1		= cos(_bandwidth * 2 * _PI / _period)
	_s1		= 1 / _g1 - sqrt(1 / (_g1 * _g1) - 1)
	_s2		= 1 + _s1
	_s3		= 1 - _s1
	_x1		= _source - _source[2]
	_x2		= (3 + _order) / 2

	for _i = 0 to (_order - 1)
		_sumC := _sumC + ((_i + 1) / _order) * _voss[_order - _i]

	if bar_index <= _order
		_filt := 0		
		_voss := 0		
	else			
		_filt := 0.5 * _s3 * _x1 + _f1 * _s2 * _filt[1] - _s1 * _filt[2]
		_voss := _x2 * _filt - _sumC

	[_voss, _filt]


[Voss, Filt] = voss_filter(period, predict, bandwidth, source)


instantaneous_trendline (_src, _a, _freq, _ebc, _hr) =>
    _it = 0.0
    _it := (_a-((_a*_a)/4.0))*_src+0.5*_a*_a*_src[1]-(_a-0.75*_a*_a)*_src[2]+2*(1-_a )*nz(_it[1], ((_src+2*_src[1]+_src[2])/4.0))-(1-_a)*(1-_a)*nz(_it[2], ((_src+2*_src[1]+_src[2])/4.0))
    _lag = 2.0*_it-nz(_it[2])
    
    [_it, _lag]

[it, lag] = instantaneous_trendline(src, a, fr, ebc, hr)

// - - - - -  - - - - - //

plot(Filt, title = "Filter", style = plot.style_line, color = color.red, linewidth = 2)
plot(Voss, title = "Voss", style = plot.style_line, color = color.blue,	linewidth = 2)
hline(0.0, title = "Zero", linestyle = hline.style_dashed, color = color.black,	linewidth = 1)
plot(hr? na:it, title="IT Trend", color= fr? color.gray : color.red, linewidth=1)
plot(hr? na:lag, title="IT Trigger", color=fr? color.gray : color.blue, linewidth=1)


// Strategy Logic
longCondition =  lag < it  and crossover(Voss,Filt) 
shortCondition = it > lag and crossover(Filt,Voss) 

strategy.entry("Voss_Short", strategy.short, when=shortCondition)
strategy.entry("Voss_Long", strategy.long, when=longCondition)


// === Backtesting Dates === thanks to Trost

testPeriodSwitch = input(true, "Custom Backtesting Dates")
testStartYear = input(2019, "Backtest Start Year")
testStartMonth = input(1, "Backtest Start Month")
testStartDay = input(1, "Backtest Start Day")
testStartHour = input(0, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear, testStartMonth, testStartDay, testStartHour, 0)
testStopYear = input(2020, "Backtest Stop Year")
testStopMonth = input(2, "Backtest Stop Month")
testStopDay = input(29, "Backtest Stop Day")
testStopHour = input(0, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear, testStopMonth, testStopDay, testStopHour, 0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
testPeriod_1 = testPeriod()
isPeriod = true
// === /END

if not isPeriod
    strategy.cancel_all()
    strategy.close_all()


Más.