Estratégia de caminhada aleatória

Autora:ChaoZhang, Data: 2023-10-09 16:10:24
Tags:

Resumo

A estratégia de caminhada aleatória é uma estratégia de negociação automatizada baseada na geração de números aleatórios.

Estratégia lógica

As principais partes que implementam a negociação aleatória são:

  1. Definir os parâmetros a, c e módulo m para a geração de números aleatórios, bem como a semente inicial.

  2. Defina a função de geração de números aleatórios GetRandom usando o algoritmo de congruência linear para gerar números aleatórios entre 0-m.

  3. Em cada candelabro, se não houver posição, compare o tamanho do número aleatório gerado, vá longo quando for maior que m/2, caso contrário vá curto.

  4. Defina as condições de stop loss e take profit em percentagem.

  5. Definir o período de backtest por período de tempo.

Por meio das etapas acima, a estratégia realiza operações longas / curtas totalmente aleatórias. Quando o número aleatório é maior que m / 2, abre posição longa, caso contrário, abre curta, em seguida, define stop loss e take profit para posições de saída.

Análise das vantagens

  • Uma lógica estratégica simples e clara, fácil de compreender e implementar.

  • A negociação aleatória evita efetivamente impactos emocionais e reduz as falhas subjetivas.

  • Parâmetros de geração de números aleatórios personalizáveis para ajustar a aleatoriedade.

  • Configurações flexíveis de stop loss e take profit para controlar um único lucro/perda.

  • Suporta a otimização de parâmetros através de backtesting de diferentes parâmetros impacto no lucro total.

Análise de riscos

  • A negociação aleatória pode resultar numa tendência a longo prazo indefinida e numa rentabilidade incerta.

  • Incapacidade de ajustar posições com base nas condições do mercado, pode perder oportunidades de tendência.

  • Lucro único limitado, alto risco de utilização.

  • Precisa de um rácio de stop loss/take profit razoável para evitar perdas significativas.

  • As posições abertas/fechadas frequentes devido à aleatoriedade aumentam os custos de negociação.

  • Requer-se um backtesting suficiente para verificar as definições razoáveis dos parâmetros, não utilizar cegamente.

Os riscos poderiam ser reduzidos através da adição de um julgamento da tendência, da otimização do mecanismo de stop loss, do controlo estrito de um único lucro/perda, etc.

Orientações para melhorias

  • Adicione o julgamento da tendência para evitar a negociação contra a tendência.

  • Adicionar o dimensionamento das posições com base na variação do capital.

  • Otimizar o algoritmo de geração de números aleatórios para melhor aleatoriedade.

  • Percentagem dinâmica de stop loss/take profit.

  • Limite a frequência das ordens.

  • Optimização de backtest de múltiplos parâmetros.

Resumo

A estratégia de caminhada aleatória realiza negociação mecânica por meio de longo / curto controlado por números aleatórios. Tem forte aleatoriedade e evita impactos emocionais e má operação subjetiva. Mas as entradas aleatórias também podem perder oportunidades de tendência, lucro único limitado, precisa de mecanismos de controle de risco otimizados.


/*backtest
start: 2022-10-02 00:00:00
end: 2023-10-08 00:00:00
period: 1d
basePeriod: 1h
exchanges: [{"eid":"Futures_Binance","currency":"BTC_USDT"}]
*/

//@version=3
//@author=Tr0sT
strategy(title = "Random strategy", shorttitle = "Random", overlay = true, default_qty_type = strategy.percent_of_equity, default_qty_value = 100)

a = 16
c = 10
m = 1000
GetRandom(prev) =>
    GetRandom = (a * prev + c) % m

seed = input(200, minval = 2, maxval = m)
stopLoss = input(30, title = "Stop loss percentage(0.1%)")
takeProfit = input(30, title = "Take profit percentage(0.1%)")


curRandom = na
curRandom := nz(curRandom[1]) == 0 ? seed : GetRandom(curRandom[1])
if (strategy.position_size == 0)
    if (curRandom >= m / 2)
        strategy.entry("Enter", strategy.long)
    else
        strategy.entry("Enter", strategy.short)
        
    strategy.exit("Exit", "Enter", loss = close * stopLoss / 1000 / syminfo.mintick, profit = close * takeProfit / 1000 / syminfo.mintick)            

// === Backtesting Dates ===
testPeriodSwitch = input(false, "Custom Backtesting Dates")
testStartYear = input(2018, "Backtest Start Year")
testStartMonth = input(3, "Backtest Start Month")
testStartDay = input(6, "Backtest Start Day")
testStartHour = input(08, "Backtest Start Hour")
testPeriodStart = timestamp(testStartYear,testStartMonth,testStartDay,testStartHour,0)
testStopYear = input(2018, "Backtest Stop Year")
testStopMonth = input(12, "Backtest Stop Month")
testStopDay = input(14, "Backtest Stop Day")
testStopHour = input(14, "Backtest Stop Hour")
testPeriodStop = timestamp(testStopYear,testStopMonth,testStopDay,testStopHour,0)
testPeriod() =>
    time >= testPeriodStart and time <= testPeriodStop ? true : false
isPeriod = testPeriodSwitch == true ? testPeriod() : true
// === /END
if not isPeriod
    strategy.cancel_all()
    strategy.close_all()

Mais.