Estrategia de negociación cuantitativa de múltiples factores

El autor:¿ Qué pasa?, Fecha: 2024-01-31 13:55:37
Las etiquetas:

img

Resumen general

Esta es una estrategia de negociación cuantitativa que incorpora múltiples indicadores técnicos. Combina promedios móviles, MACD, bandas de Bollinger, RSI y otros indicadores para implementar un modelo de negociación automatizada impulsado por múltiples factores.

Estrategia lógica

Las señales comerciales de esta estrategia provienen de las siguientes partes:

  1. Cruz de oro y cruz de muerte de medias móviles dobles
  2. Cruce de la línea cero del MACD
  3. Las bandas de Bollinger reversiones superiores e inferiores de los carriles
  4. Reversión del índice de variabilidad de las cifras de mercado

Cuando los indicadores anteriores emiten simultáneamente señales de compra o venta, la estrategia tomará las decisiones largas o cortas correspondientes.

Específicamente, cuando el promedio móvil rápido cruza el lento, los histogramas MACD comienzan a aumentar, el RSI rebota desde la zona de sobreventa y el precio se acerca al tren inferior de las bandas de Bollinger, se considera como una señal de inversión de tendencia para la entrada larga.

Y cuando el MA rápido cruza por debajo del MA lento, los histogramas MACD comienzan a disminuir, el RSI cae desde el área de sobrecompra y el precio alcanza las bandas superiores de Bollinger, se considera una reversión superior a corto plazo para la entrada corta.

Al combinar señales de múltiples indicadores, se pueden filtrar de manera efectiva las señales falsas y mejorar la estabilidad de la estrategia.

Análisis de ventajas

La mayor ventaja de esta estrategia es que adopta un modelo multifactorial para la negociación, lo que mejora la fiabilidad de las señales, la estabilidad y la rentabilidad de la estrategia.

  1. El modelo multifactor puede verificar las señales comerciales entre sí y reducir eficazmente las interferencias de las señales falsas.

  2. Los indicadores de diferentes categorías pueden capturar características más completas de los movimientos del mercado y hacer juicios más precisos.

  3. La combinación de múltiples indicadores puede suavizar las fluctuaciones de los indicadores individuales y garantizar rendimientos más constantes.

  4. Los indicadores y sus ponderaciones en la combinación pueden ajustarse de forma flexible para adaptar la estrategia a las diferentes condiciones del mercado.

Análisis de riesgos

Algunos de los riesgos de esta estrategia deben ser:

  1. La compleja combinación de múltiples indicadores requiere un ajuste y ensayo precisos de los parámetros, de lo contrario puede producir señales no válidas.

  2. El rendimiento de un solo producto puede no ser lo suficientemente estable, por lo que debe construirse una cartera de productos adecuados para diversificar los riesgos.

  3. El tamaño de las posiciones y los mecanismos de detención de pérdidas deben controlarse estrictamente para limitar las pérdidas en condiciones extremas de mercado.

Direcciones de optimización

Algunas direcciones de esta estrategia se puede optimizar:

  1. Prueba de combinaciones de más indicadores para determinar los parámetros óptimos, como la volatilidad implícita, el volumen, etc.

  2. Utilice métodos de aprendizaje automático para generar automáticamente combinaciones óptimas de indicadores y conjuntos de parámetros.

  3. Hacer más pruebas y optimización en marcos de tiempo más largos, ajustar los pesos en consecuencia para las diferentes etapas del mercado.

  4. Incorporar herramientas de gestión de riesgos para controlar estrictamente las pérdidas en operaciones individuales y posiciones globales.

Conclusión

Esta estrategia aprovecha al máximo las ventajas de los diferentes indicadores técnicos y forma un modelo multifactorial, que mejora efectivamente la precisión de las señales.


/*backtest
start: 2023-12-31 00:00:00
end: 2024-01-30 00:00:00
period: 4h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=5
strategy("Математическая Торговая Система с Ишимоку, TP/SL, ADX, RSI, OBV", shorttitle="МТС Ишимоку TP/SL ADX RSI OBV", overlay=true)

is_short_enable = input(0, title="Короткие сделки")
is_long_enable = input(1, title="Длинные сделки")

// Входные параметры для скользящих средних
fast_length = input(21, title="Быстрый период")
slow_length = input(26, title="Медленный период")

// Входные параметры для Ишимоку
tenkan_length = input(9, title="Тенкан-сен")
kijun_length = input(26, title="Киджун-сен")
senkou_length = input(52, title="Сенкоу-спан B")

// Входные параметры для ADX
adx_length = input(14, title="ADX период")
adx_level = input(30, title="ADX уровень")

// Входные параметры для RSI
rsi_length = input(14, title="RSI период")
rsi_overbought = input(70, title="RSI перекупленность")
rsi_oversold = input(30, title="RSI перепроданность")

// Входные параметры для OBV
obv_length = input(14, title="OBV период")

// Вычисление скользящих средних
fast_ma = ta.sma(close, fast_length)
slow_ma = ta.sma(close, slow_length)

// Вычисление Ишимоку
tenkan_sen = ta.sma(high + low, tenkan_length) / 2
kijun_sen = ta.sma(high + low, kijun_length) / 2
senkou_span_a = (tenkan_sen + kijun_sen) / 2
senkou_span_b = ta.sma(close, senkou_length)

// Вычисление ADX
[diplus, diminus, adx_value] = ta.dmi(14, adx_length)

// Вычисление RSI
rsi_value = ta.rsi(close, rsi_length)

// Вычисление OBV
f_obv() => ta.cum(math.sign(ta.change(close)) * volume)
f_obv_1() => ta.cum(math.sign(ta.change(close[1])) * volume[1])
f_obv_2() => ta.cum(math.sign(ta.change(close[2])) * volume[2])
f_obv_3() => ta.cum(math.sign(ta.change(close[3])) * volume[3])
obv_value = f_obv()

price_is_up = close[1] > close[3] 
price_crossover_fast_ma = close > fast_ma
fast_ma_is_up = ta.sma(close[1], fast_length) > ta.sma(close[3], fast_length)
rsi_is_trand_up = ta.rsi(close[1], rsi_length) > ta.rsi(close[3], rsi_length)
rsi_is_upper_50 = rsi_value > 50
obv_is_trand_up = f_obv_1() > f_obv_3() and obv_value > ta.sma(obv_value, obv_length)
is_up = price_is_up and price_crossover_fast_ma and fast_ma_is_up and rsi_is_trand_up and rsi_is_upper_50 and obv_is_trand_up

fast_ma_is_down = close < fast_ma
rsi_is_trend_down =  ta.rsi(close[1], rsi_length) < ta.rsi(close[2], rsi_length)
rsi_is_crossover_sma = rsi_value < ta.sma(rsi_value, rsi_length)
obv_is_trend_down =  f_obv_1() < f_obv_2()
obv_is_crossover_sma = obv_value < ta.sma(obv_value, obv_length)
is_down = fast_ma_is_down and rsi_is_trend_down and rsi_is_crossover_sma and obv_is_trend_down and obv_is_crossover_sma

//----------//
// MOMENTUM //
//----------//
ema8 = ta.ema(close, 8)
ema13 = ta.ema(close, 13)
ema21 = ta.ema(close, 21)
ema34 = ta.ema(close, 34)
ema55 = ta.ema(close, 55)

longEmaCondition = ema8 > ema13 and ema13 > ema21 and ema21 > ema34 and ema34 > ema55
exitLongEmaCondition = ema13 < ema55

shortEmaCondition = ema8 < ema13 and ema13 < ema21 and ema21 < ema34 and ema34 < ema55
exitShortEmaCondition = ema13 > ema55

// ----------  //
// OSCILLATORS //
// ----------- //
rsi = ta.rsi(close, 14)
longRsiCondition = rsi < 70 and rsi > 40
exitLongRsiCondition = rsi > 70

shortRsiCondition = rsi > 30 and rsi < 60
exitShortRsiCondition = rsi < 30

// Stochastic
length = 14, smoothK = 3, smoothD = 3
kFast = ta.stoch(close, high, low, 14)
dSlow = ta.sma(kFast, smoothD)

longStochasticCondition = kFast < 80
exitLongStochasticCondition = kFast > 95

shortStochasticCondition = kFast > 20
exitShortStochasticCondition = kFast < 5

// Логика входа и выхода
longCondition = longEmaCondition and longRsiCondition and longStochasticCondition and strategy.position_size == 0
exitLongCondition = (exitLongEmaCondition or exitLongRsiCondition or exitLongStochasticCondition) and strategy.position_size > 0

shortCondition = shortEmaCondition and shortRsiCondition and shortStochasticCondition and strategy.position_size == 0
exitShortCondition = (exitShortEmaCondition or exitShortRsiCondition or exitShortStochasticCondition) and strategy.position_size < 0

enter_long = (ta.crossover(close, senkou_span_a) or is_up) and longCondition
enter_short = (ta.crossunder(close, senkou_span_a) or is_down) and shortCondition

exit_long = ((ta.crossunder(fast_ma, slow_ma) or ta.crossunder(close, senkou_span_b) or enter_short) or exitLongCondition) 
exit_short = ((ta.crossover(fast_ma, slow_ma) or ta.crossover(close, senkou_span_b) or enter_long) or exitShortCondition)

// Выполнение сделок
if is_long_enable == 1
    strategy.entry("Long", strategy.long, when=enter_long)
    strategy.close("Long", when=exit_long)

if is_short_enable == 1
    strategy.entry("Short", strategy.short, when=enter_short)
    strategy.close("Short", when=exit_short)


Más.