Estratégias multifatoriais


Data de criação: 2023-10-31 15:45:39 última modificação: 2023-10-31 15:45:39
cópia: 4 Cliques: 801
1
focar em
1708
Seguidores

Estratégias multifatoriais

Visão geral

A estratégia multifatorial combina três tipos diferentes de estratégias: estratégias de choque, estratégias de acompanhamento de tendências e estratégias de ruptura, para obter melhores efeitos estratégicos através da combinação de uso.

Princípio da estratégia

A estratégia multifatorial é modelada de acordo com:

  • A parte da estratégia de choque usa indicadores aleatórios para determinar o momento de compra e venda. Concretamente, um sinal de compra é gerado quando o indicador aleatório %K atravessa a linha %D da zona de superaquecimento e um sinal de venda é gerado quando a linha %K atravessa a linha %D da zona de superaquecimento.

  • A estratégia de tendência parte do uso de um cruzamento dourado da linha média SMA para determinar a direção da tendência. Quando a linha rápida atravessa a linha lenta de baixo, gera um sinal de compra. Quando a linha rápida atravessa a linha lenta de cima para baixo, gera um sinal de venda.

  • A parte da estratégia de ruptura monitora se o preço quebra o preço mais alto ou mais baixo no período especificado. Compra quando o preço supera o preço mais alto; venda quando o preço é inferior ao preço mais baixo.

  • Para avaliar a força da tendência em combinação com o indicador ADX, só é possível negociar com a tendência quando ela é forte o suficiente.

  • Estabeleça uma linha de stop loss e uma linha de stop loss, definindo uma proporção razoável de stop loss.

A estratégia multifatorial, que integra essas partes, segue principalmente a seguinte lógica:

  1. Quando o ADX é maior do que o limiar definido, a tendência é considerada forte o suficiente para executar a estratégia de tendência; quando o ADX é menor do que o limiar, é considerado em equilíbrio e apenas executa a estratégia de choque.

  2. Em uma situação de tendência, quando o SMA cruza a linha de câmbio rápido e lento, o ouro compra a posição aberta, e quando a forquilha morre, a posição baixa.

  3. Em situações de turbulência, executa sinais de negociação de indicadores aleatórios.

  4. As estratégias de ruptura são utilizadas em ambos os cenários de mercado para rastrear canais.

  5. Configure o Stop Loss Stop Line para otimizar o lucro.

Análise de vantagens

A maior vantagem da estratégia multifatorial é a combinação de diferentes tipos de estratégias, que podem obter melhores efeitos estratégicos em ambos os ambientes de mercado. Concretamente, a estratégia multifatorial tem as seguintes vantagens:

  1. A capacidade de se adaptar a tendências e obter uma maior taxa de vitória em situações de tendências.

  2. Os investidores devem ser capazes de lucrar em situações de turbulência e não ficarem presos em posições.

  3. Com um fator de ganho mais alto, a configuração de stop-loss é razoável.

  4. A partir daí, a tendência é de reduzir os prejuízos.

  5. A combinação de vários indicadores pode formar um sinal de negociação mais forte.

  6. A melhor combinação de parâmetros pode ser obtida através da otimização de parâmetros.

Análise de Riscos

A estratégia multifactor também apresenta alguns riscos, incluindo:

  1. A combinação inadequada de múltiplos fatores pode causar confusão nos sinais de negociação e requer testes repetidos para encontrar a combinação ideal de fatores.

  2. Otimizar vários parâmetros é muito difícil e requer suporte de dados históricos suficientes.

  3. Quando a tendência se inverte, a impossibilidade de fechar a posição a tempo pode levar a grandes perdas.

  4. O indicador ADX está atrasado e pode ter perdido o ponto de viragem da tendência.

  5. A ruptura de uma transação pode ser facilmente manipulada e requer uma estratégia de stop loss razoável.

Para os riscos acima mencionados, pode-se otimizar a partir dos seguintes pontos:

  1. Teste a estabilidade de diferentes fatores nos dados históricos, selecionando o fator de estabilidade.

  2. A busca de parâmetros ótimos através de métodos de otimização inteligente, como algoritmos genéticos.

  3. Estabeleça um limite razoável de stop loss para controlar a retirada máxima.

  4. A inversão da tendência, combinada com indicadores adicionais.

  5. Optimizar a estratégia de parada de perdas para a ruptura de negócios, evitando grandes perdas.

Direção de otimização

A estratégia multifatorial também tem espaço para uma maior otimização:

  1. Teste mais tipos de fatores para encontrar uma combinação melhor. Outros fatores podem ser considerados, como taxa de flutuação, volume de transação.

  2. Buscar o melhor peso estratégico usando um método de aprendizagem de máquina.

  3. A otimização de parâmetros pode ser feita por meio de algoritmos inteligentes que buscam otimização rápida.

  4. Pode-se testar o rendimento em diferentes períodos de posse.

  5. Considere-se a possibilidade de ajustar dinamicamente a linha de suspensão.

  6. Pode-se introduzir mais condições de filtragem, como aumento de tráfego, para melhorar a qualidade do sinal.

  7. Os indicadores ADX podem ser considerados como parâmetros de otimização ou substituídos por indicadores de tendência mais avançados.

Resumir

A estratégia de múltiplos fatores compreende vários tipos de lógica de negociação, como tendências, tremores e rupturas, e pode obter melhores resultados em ambos os ambientes de mercado. Em comparação com a estratégia única, a estratégia de múltiplos fatores pode obter maiores ganhos estáveis e um bom espaço de escalabilidade.

Código-fonte da estratégia
/*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)