Ir para o conteúdo

Funções de aptidão personalizadas para otimização

A otimização de cBots é o processo de determinar os melhores valores possíveis para os parâmetros de um cBot antes de o implementar para negociação em tempo real. No cTrader, pode otimizar cBots com base numa vasta gama de critérios integrados, como maximizar os lucros ou minimizar a redução do capital. No entanto, também pode escrever as suas próprias funções de aptidão para otimização, o que pode ser útil se pretender aplicar critérios de desempenho personalizados a um cBot. Neste artigo e no vídeo correspondente, discutimos como funcionam as funções de aptidão personalizadas.

Note que este artigo não aborda o processo de otimização de cBots utilizando critérios integrados.

Definir funções de aptidão personalizadas

Uma função de aptidão personalizada é apenas uma substituição do método GetFitness().

1
2
3
4
protected override double GetFitness(GetFitnessArgs args)
{

}

A substituição deve aceitar um único argumento do tipo GetFitness args para ser considerada uma função de aptidão personalizada.

Escrever uma função de aptidão personalizada

Uma vez que o método GetFitness() deve devolver um double, o corpo do método deve conter um cálculo que resulte num valor deste tipo.

Por exemplo, podemos escrever uma função de aptidão personalizada simples que eleva ao quadrado o número total de transações com ganhos efetuadas por um cBot e, em seguida, divide este valor pelo valor total das transações com perdas. Desta forma, atribuímos mais peso às transações com ganhos e, de certa forma, permitimos que o cBot otimizado faça algumas jogadas arriscadas.

Eis o aspeto da nossa função de aptidão.

1
2
3
4
protected override double GetFitness(GetFitnessArgs args)
{
    return Math.Pow(args.WinningTrades, 2) / args.LosingTrades;
}

Neste momento, podemos adicionar a substituição a qualquer cBot que quisermos e, em seguida, guardá-lo e construí-lo.

Utilizar uma função de fitness personalizada na otimização

Depois de adicionar a nossa função, precisamos de adicionar uma instância do nosso cBot escolhido e, em seguida, mudar para o separador Testes de verificação. Para realizar a otimização utilizando a nossa função personalizada, tudo o que temos de fazer é abrir a secção Critérios de otimização e selecionar a opção Personalizado. Depois disso, podemos executar a otimização como habitualmente.

Durante a otimização, serão atribuídas pontuações de fitness mais elevadas às passagens durante as quais o cBot maximizou o rácio entre o número de transações com ganhos ao quadrado e o número de transações com perdas.

Modificar a função de fitness personalizada

Também podemos voltar à nossa função personalizada e modificá-la da seguinte forma.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
protected override double GetFitness(GetFitnessArgs args)
{
    if (args.TotalTrades > 20)
    {
        return Math.Pow(args.WinningTrades, 2) / args.LosingTrades;
    }
    else
    {
        return double.MinValue;
    }
}

Esta função ainda segue o algoritmo anterior, mas só aplica o cálculo personalizado se tiverem sido realizadas mais de 20 transações por um cBot. Em qualquer outro caso, a função devolve o double mais baixo possível. Em teoria, isto deverá melhorar os resultados ao reduzir a possibilidade de enviesamento estatístico.

Se reconstruirmos o bot e executarmos a otimização novamente, deveremos ver várias passagens a obter uma pontuação de fitness muito baixa devido ao baixo número total de transações realizadas pelo cBot.

Por último, queremos minimizar o decréscimo do capital, continuando a incentivar a negociação ativa.

1
2
3
4
5
6
7
8
if (args.TotalTrades > 20 && args.MaxEquityDrawdownPercentages < 50)
{
    return Math.Pow(args.WinningTrades, 2) / args.LosingTrades;
}
else
{
    return double.MinValue;
}

Se executarmos a otimização novamente, deveremos ver as melhores passagens possíveis, dada a nossa estratégia de negociação.

As funções de fitness personalizadas proporcionam uma excelente ferramenta para determinar os melhores valores de parâmetros possíveis, adequados à sua abordagem única de negociação.