Estrategias multifactoriales


Fecha de creación: 2023-10-31 15:45:39 Última modificación: 2023-10-31 15:45:39
Copiar: 0 Número de Visitas: 709
1
Seguir
1617
Seguidores

Estrategias multifactoriales

Descripción general

Las estrategias multifactoriales combinan tres tipos diferentes de estrategias: las estrategias de tipo seco, las estrategias de seguimiento de tendencias y las estrategias de tipo rompimiento, para obtener mejores resultados estratégicos mediante su uso en combinación.

Principio de estrategia

Las estrategias multifactoriales se basan principalmente en los siguientes aspectos:

  • La parte de la estrategia de oscilación utiliza indicadores aleatorios para determinar el momento de comprar y vender. En concreto, se produce una señal de compra cuando la línea %K del indicador aleatorio atraviesa la línea %D desde la zona de sobreventa; se produce una señal de venta cuando la línea %K atraviesa la línea %D desde la zona de sobreventa.

  • La parte de la estrategia de tendencia utiliza la cruz dorada de la línea media SMA para determinar la dirección de la tendencia. Cuando la línea rápida cruza la línea lenta desde abajo, genera una señal de compra; cuando la línea rápida cruza la línea lenta desde arriba, genera una señal de venta.

  • La parte de la estrategia de ruptura monitorea si el precio ha roto el precio más alto o el precio más bajo en el período especificado. Compra cuando el precio supera el precio más alto; vende cuando el precio es inferior al precio más bajo.

  • La fuerza de la tendencia se determina en combinación con el indicador ADX, y solo se puede participar en el comercio de tendencias cuando la tendencia es lo suficientemente fuerte.

  • Establecer líneas de stop loss y de stop loss, y establecer una proporción razonable de stop loss.

La estrategia multifactorial, que integra estas partes, sigue principalmente la siguiente lógica:

  1. Cuando el ADX es mayor que el umbral fijado, se considera que la tendencia es lo suficientemente fuerte para comenzar a ejecutar la estrategia de tendencia; cuando el ADX es menor que el umbral, se considera que está en equilibrio y se ejecuta solo la estrategia de oscilación.

  2. En una situación de tendencia, se compra una posición abierta cuando el SMA cruza con el oro de la línea rápida y lenta, y una posición cerrada cuando la horquilla muere.

  3. En una situación de crisis, ejecutar una señal de comercio de un indicador aleatorio.

  4. Las estrategias de ruptura se aplican en ambos entornos de mercado para rastrear canales.

  5. Configuración de un límite de pérdidas para optimizar las ganancias.

Análisis de las ventajas

La mayor ventaja de las estrategias multifactoriales reside en la combinación de diferentes tipos de estrategias para obtener mejores resultados en ambos entornos de mercado. En concreto, las estrategias multifactoriales tienen las siguientes ventajas:

  1. La capacidad de adaptarse a las tendencias y obtener un mayor porcentaje de victorias en situaciones de tendencias.

  2. En la actualidad, la mayor parte de las compañías de seguros están en condiciones de mantener sus inversiones en el mercado de valores, pero no están en condiciones de mantener sus inversiones.

  3. El factor de ganancias es alto y la configuración de stop-loss es razonable.

  4. La tendencia es que las empresas de la región tengan que reducir sus pérdidas, teniendo en cuenta la intensidad de las tendencias.

  5. La combinación de varios indicadores puede crear una señal de negociación más fuerte.

  6. Se puede obtener una combinación de parámetros más óptima mediante optimización de parámetros.

Análisis de riesgos

Las estrategias multifactoriales también presentan ciertos riesgos, como:

  1. Una combinación de múltiples factores incorrecta puede causar confusión en las señales de negociación, por lo que es necesario realizar pruebas repetitivas para encontrar la combinación óptima.

  2. Se requiere la optimización de varios parámetros, la optimización es más difícil y requiere suficiente soporte de datos históricos.

  3. Si no se puede cerrar la posición a tiempo cuando la tendencia se invierte, puede haber grandes pérdidas.

  4. El índice ADX está rezagado y podría haber perdido el punto de inflexión de la tendencia.

  5. Las operaciones de ruptura son susceptibles de ser estafadas y requieren una estrategia de stop loss razonable.

En cuanto a los riesgos mencionados, se puede optimizar a partir de los siguientes puntos:

  1. Prueba la estabilidad de los diferentes factores en los datos históricos y selecciona el factor de estabilidad.

  2. La búsqueda de los parámetros óptimos mediante métodos de optimización inteligente, como el uso de algoritmos genéticos.

  3. Establezca un límite de pérdidas razonable para controlar el máximo retiro.

  4. El cambio de tendencia, combinado con indicadores adicionales.

  5. Optimizar las estrategias de stop loss para las operaciones de ruptura y evitar pérdidas excesivas.

Dirección de optimización

Las estrategias multifactoriales también tienen espacio para una mayor optimización:

  1. Prueba más tipos de factores para encontrar la mejor combinación. Se pueden considerar otros factores como la volatilidad, el volumen de transacciones.

  2. Buscar el peso de la estrategia óptima utilizando métodos de aprendizaje automático.

  3. La optimización de parámetros puede utilizar algoritmos inteligentes para buscar rápidamente la optimización.

  4. Se puede probar la rentabilidad de las posiciones durante diferentes períodos de tenencia.

  5. Se puede considerar la posibilidad de ajustar dinámicamente la línea de stop loss.

  6. Se pueden introducir más condiciones de filtración, como un aumento súbito de tráfico, para mejorar la calidad de la señal.

  7. Los indicadores ADX pueden considerarse como parámetros de optimización o sustituirse por indicadores de tendencia más avanzados.

Resumir

La combinación de estrategias multifactoriales tiene en cuenta varias lógicas de negociación, como tendencias, sacudidas y rupturas, y obtiene mejores resultados en ambos entornos de mercado. En comparación con una sola estrategia, las estrategias multifactoriales obtienen mayores ganancias estables y tienen un buen espacio para escalar. Sin embargo, hay que tener en cuenta que la optimización de los parámetros es más difícil y se necesita suficiente datos históricos para respaldar el proceso de optimización.

Código Fuente de la Estrategia
/*backtest
start: 2023-09-30 00:00:00
end: 2023-10-30 00:00:00
period: 1h
basePeriod: 15m
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=4

// strategy("Strategy_1", shorttitle="Strategy1",overlay=true ,pyramiding = 12, initial_capital=25000, currency='EUR', commission_type = strategy.commission.cash_per_order, commission_value = 3, default_qty_type = strategy.percent_of_equity, default_qty_value = 20)
	
// Revision:        1
// Author:          Jonas

// === INPUT ===
    //   > BACKTEST RANGE <
FromMonth = input(defval=1, title="From Month", minval=1, maxval=12)
FromDay = input(defval=1, title="From Day", minval=1, maxval=31)
FromYear = input(defval=2017, title="From Year", minval=2010)
ToMonth = input(defval=1, title="To Month", minval=1, maxval=12)
ToDay = input(defval=1, title="To Day", minval=1, maxval=31)
ToYear = input(defval=9999, title="To Year", minval=2010)

    //   > STRATEGY SETTINGS <
bolOS = input(defval = false, type=input.bool, title="Oscillating Strategy")
bolTS = input(defval = true, type=input.bool, title="Trend Strategy")
bolBO = input(defval = false, type=input.bool, title="Breakout Strategy")

strStrategy = input(defval = "Long", type=input.string, title="Trade Strategy",options = ["Long", "Short","Long & Short"])

flStopLoss = input(defval = 2.0, title="Stop Loss %", type=input.float)/100
flTakeProfit = input(defval = 4.0, title="Take Profit %", type=input.float)/100

    //   > SMA <

fastMA = input(defval=8, type=input.integer, title="FastMA length", minval=1, step=1)
slowMA = input(defval=21, type=input.integer, title="SlowMA length", minval=1, step=1)

    //  > ADX <
adx_len = input(defval=10, type=input.integer, title="ADX length", minval=1, step=1)
adx_trend = input(defval=30, type=input.integer, title="ADX Tr", minval=1, step=1)
adx_choppy = adx_trend
adx_limit = adx_trend

    //  > TRENDSCORE <
ts_fromIndex = input(title="From", type=input.integer, minval=1, defval=10)
ts_toIndex = input(title="To", type=input.integer, minval=1, defval=14)
ts_src = input(title="Source", type=input.source, defval=close)

    // > Oscillator <
stoch_length = 14
stoch_OverBought = 75
stoch_OverSold = 25
stoch_smoothK = 3
stoch_smoothD = 3

// === BACK TEST RANGE FUNCTION ===
window_start = timestamp(FromYear, FromMonth, FromDay, 00, 00)  // backtest start window
window_finish = timestamp(ToYear, ToMonth, ToDay, 23, 59)  // backtest finish window
window() =>  // create function "within window of time"
    time >= window_start and time <= window_finish ? true : false

//plot(stop_level_Long, title="TEST",color=color.red, style=plot.style_linebr, linewidth=2)
//plot(take_level_Long, color=color.green, style=plot.style_linebr, linewidth=2)

// === ADX ===
adx_up = change(high)
adx_down = -change(low)
adx_trur = rma(tr, adx_len)
adx_plus = fixnan(100 * rma(adx_up > adx_down and adx_up > 0 ? adx_up : 0, adx_len) / adx_trur)
adx_minus = fixnan(100 * rma(adx_down > adx_up and adx_down > 0 ? adx_down : 0, adx_len) / adx_trur)
adx_sum = adx_plus + adx_minus

ADX = 100 * rma(abs(adx_plus - adx_minus) / (adx_sum == 0 ? 1 : adx_sum), adx_len)

//=== TRENDSCORE ===
trendscore(ts_src, ts_fromIndex, ts_toIndex) =>
	ts_sum = 0.0
	for i = ts_fromIndex to ts_toIndex
        ts_sum := ts_sum + (ts_src >= nz(ts_src[i]) ? 1 : -1)
    ts_sum

intTS = trendscore(ts_src, ts_fromIndex, ts_toIndex)
// Long if  TrendDirection = 1, Short if TrendDirection = -1; Indifferent if TrendDirection = 0
intTrendDirection = (intTS > (ts_toIndex-ts_fromIndex)) ? 1 : (intTS < (ts_fromIndex-ts_toIndex)) ? -1 : 0

    //  > TREND CONDITION <
adx_growing = ADX > highest(ADX[1],3)
intTrend = ((ADX >= adx_limit) and (ADX[1] >= adx_limit) and adx_growing) ? intTrendDirection : 0

// === ATR ===
ATR = sma(tr,10)
ATR_100 = ATR /abs(high - low)


// === STOCHASTICS ===

stoch_k = sma(stoch(close, high, low, stoch_length), stoch_smoothK)
stoch_d = sma(stoch_k, stoch_smoothD)

// === FILTER & CONDITIONS ===
    //  > STOCHASTICS <
bolFilter_OS1 = close[1] > hl2[1]



bolSigOsc_long_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossover(stoch_d,stoch_OverSold) and stoch_k > stoch_d) ? true:false
bolSigOsc_short_1 = (na(stoch_k) or na(stoch_d)) ? false : (crossunder(stoch_d,stoch_OverBought) and stoch_k < stoch_d) ? true:false

bolLongOpenOS = bolSigOsc_long_1 and bolFilter_OS1
bolLongCloseOS = bolSigOsc_short_1

bolShortOpenOS = bolSigOsc_short_1 and bolFilter_OS1
bolShortCloseOS = bolSigOsc_long_1

    //  > TREND <

bolFilter_TS1 = close[1] > hl2[1] and open[1] < hl2[1]
bolFilter_TS2 = sma(close,50)>sma(close,50)[10]
bolFilter_TS3 = close[1] < hl2[1] and open[1] > hl2[1]

bolSigTrendLO1 = sma(close, fastMA) > sma(close, slowMA)
bolSigTrendLO2 = close > sma(close,fastMA)
bolSigTrendLO3 = bolSigTrendLO1 and bolSigTrendLO2

bolSigTrendLC1 = sma(close, fastMA) < sma(close, slowMA)
bolSigTrendLC2 = close < sma(close, fastMA)
bolSigTrendLC3 = bolSigTrendLC1 and bolSigTrendLC2

bolSigTrendSO1 = bolSigTrendLC3
bolSigTrendSC1 = bolSigTrendLO1

bolLongOpenTS = bolSigTrendLO3 and bolFilter_TS1
bolLongCloseTS = bolSigTrendLC3 and bolFilter_TS3

bolShortOpenTS = bolSigTrendSO1 and bolFilter_TS3
bolShortCloseTS = bolLongOpenTS and bolFilter_TS1

plot(sma(close, fastMA), title='FastMA', color=color.green, linewidth=2, style=plot.style_line)  // plot FastMA
plot(sma(close, slowMA), title='SlowMA', color=color.red, linewidth=2, style=plot.style_line)  // plot SlowMA



    //  > BREAKOUT <
flFilter_BS1 = 0.5 * stdev(close,slowMA)[1]
bolFilter_BS2 = volume > sma(volume,slowMA)*1.25

bolSigBreakoutLO1 = close > (highestbars(high,slowMA)[1] + flFilter_BS1)
bolSigBreakoutLC1 = barssince(bolSigBreakoutLO1)==5

bolSigBreakoutSO1 = close < lowestbars(low,slowMA)[1] - flFilter_BS1
bolSigBreakoutSC1 = barssince(bolSigBreakoutSO1)==5


bolLongOpenBO = bolSigBreakoutLO1 and bolFilter_BS2
bolLongCloseBO = bolSigBreakoutLC1

bolShortOpenBO = bolSigBreakoutSO1 and bolFilter_BS2
bolShortCloseBO = bolSigBreakoutSC1

//=== STRATEGIES ENTRIES & EXITS ===
    //  > STOPS & LIMITS <
stop_level_Long = strategy.position_avg_price * (1 - flStopLoss)
take_level_Long = strategy.position_avg_price * (1 + flTakeProfit)
stop_level_Short = strategy.position_avg_price * (1 + flStopLoss)
take_level_Short = strategy.position_avg_price * (1 - flTakeProfit)

    //  > ENTRIES / CLOSES / EXITS <
if window() //only in backtest-window
    if (bolOS == true)
        if (intTrend == 0)
            if(strStrategy == "Long" or strStrategy == "Long & Short")
                strategy.entry("Lng Osc", strategy.long, when=bolLongOpenOS)  // buy long when "within window of time" AND crossover
            if(strStrategy == "Short" or strStrategy == "Long & Short")
                strategy.entry("Short Osc", strategy.short, when=bolShortOpenOS)
        strategy.close("Lng Osc", when=(bolLongCloseOS))
        //strategy.exit("Exit L OS/STD", "Lng Osc", stop = strategy.position_avg_price - 2*stdev(close,10))
        strategy.exit("Exit L OS/%", "Lng Osc", stop=stop_level_Long)
        strategy.close("Short Osc", when=(bolShortCloseOS))
        //strategy.exit("Exit S OS/STD", "Short Osc", stop = strategy.position_avg_price + 2*stdev(strategy.position_avg_price,10))
        strategy.exit("Exit S OS/%", "Short Osc", stop=stop_level_Short)
    if (bolTS == true)
        if (not(intTrend == 0))
            if((strStrategy == "Long") or (strStrategy == "Long & Short"))
                strategy.entry("Lng TD", strategy.long, when=bolLongOpenTS)  // buy long when "within window of time" AND crossover
            if((strStrategy == "Short") or (strStrategy == "Long & Short"))
                strategy.entry("Short TD", strategy.short, when=(bolShortOpenTS and bolTS))  // buy long when "within window of time" AND crossover
        strategy.exit("Exit L TD", "Lng TD", stop=stop_level_Long)
        strategy.close("Lng TD", when=bolLongCloseTS)
        strategy.exit("Exit S TD", "Short TD", stop=stop_level_Short)
        strategy.close("Short TD", when=bolShortCloseTS)
    if (bolBO == true)
        if((strStrategy == "Long") or (strStrategy == "Long & Short"))
            strategy.entry("Lng BO", strategy.long, when=bolLongOpenBO)  // buy long when "within window of time" AND crossover
            strategy.close("Lng BO", when=bolLongCloseBO)
            //strategy.exit("Exit L BO/STD", "Lng BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
            strategy.exit("Exit L BO/2.5%", "Lng BO", stop=stop_level_Long)
        if((strStrategy == "Short") or (strStrategy == "Long & Short"))
            strategy.entry("Short BO", strategy.short, when=bolShortOpenBO)  // buy long when "within window of time" AND crossover
            strategy.close("Short BO", when=bolShortCloseBO)
            //strategy.exit("Exit S BO/STD", "Short BO", stop = strategy.position_avg_price - 2*stdev(strategy.position_avg_price,10))
            strategy.exit("Exit S BO/%", "Short BO", stop=stop_level_Short)