![Desenvolvendo um EA multimoeda (Parte 7): Seleção de grupos considerando o período forward](https://c.mql5.com/2/74/Developing_a_multi-currency_advisor_yPart_7c_600x314.jpg)
Desenvolvendo um EA multimoeda (Parte 7): Seleção de grupos considerando o período forward
Introdução
Nas partes anteriores, sempre realizamos a otimização das estratégias de trading individuais em um único período: de 2018 a 2022. Escolhemos este período por ser suficientemente longo — em cinco anos, diferentes eventos podem afetar a dinâmica dos preços dos instrumentos financeiros — e ao mesmo tempo não tão longo a ponto de prolongar demais o tempo de cada teste, que se mantinha dentro de alguns segundos. Selecionamos esse período para que ainda restasse mais de um ano até o momento atual, o que nos permite verificar o comportamento dos EAs em uma parte do histórico que não foi utilizada na otimização dos parâmetros.
O testador padrão do MetaTrader 5 consegue realizar passes individuais e otimizações considerando a presença do chamado período forward. Quando usamos essa função, o testador divide todo o período de teste em duas partes — o período principal e o período forward. Ao final do período principal, todas as posições são fechadas e o saldo da conta é reiniciado. Em seguida, o EA é executado novamente no período forward, e todas as estatísticas coletadas pelo testador são calculadas separadamente para o período principal e o período forward.
No aprendizado de máquina, os termos In-Sample (IS) e Out-Of-Sample (OOS) são frequentemente usados para descrever os dados de treinamento e de validação dos modelos. No nosso caso, o período principal assume o papel de IS, enquanto o período forward — corresponde ao OOS. No entanto, é importante notar que OOS — é um conceito mais amplo que o período forward: podemos testar um EA sem especificar um período forward no testador, mas se o período de teste estiver fora do período de otimização, isso ainda será um teste OOS.
Como anteriormente quase não utilizamos testes em OOS (exceto no final deste artigo), é um bom momento para verificar se há esperança de manter resultados comparáveis no período forward em relação ao período principal.
Período Forward para EAs Prontos
Vamos analisar os resultados obtidos pelos EAs mencionados no artigo anterior para o grupo de estratégias selecionadas manualmente e para os melhores grupos de estratégias selecionados automaticamente com base no máximo lucro. O período forward que usaremos será o ano de 2023 completo. Deixaremos os três primeiros meses de 2024 como reserva. O resultado desejado seria um lucro no período forward aproximadamente cinco vezes menor que no período principal, já que o forward é cinco vezes mais curto que o período principal. A redução do drawdown (rebaixamento) no forward deveria ser aproximadamente a mesma ou menor do que no período principal.
Comecemos com o grupo de estratégias selecionado manualmente (EA BaselineExpert.mq5). No gráfico, a seção vertical da linha azul separa claramente o F do período forward. Nessa fronteira, o saldo da conta retorna para $10.000. A parte do gráfico referente ao período forward ocupa apenas uma pequena porção de todo o gráfico. Se for necessário examiná-la em mais detalhes, podemos executar um teste separado apenas para o intervalo de tempo correspondente ao período forward.
Período principal
Período forward
Figura 1. Resultados do EA BaselineExpert.mq5 nos períodos principal e forward
No entanto, mesmo sem um teste separado para o período forward, fica claro que os resultados são significativamente piores. Isso não significa necessariamente que a estratégia está quebrada. O drawdown aumentou de 10% para 12%, e o período de recuperação se estendeu por mais de seis meses. Mas isso ainda não indica uma reversão da tendência da curva de saldo. Ou será que já indica? De qualquer forma, os resultados precisam de melhorias.
Agora, vamos analisar o melhor grupo, selecionado sem a clusterização dos conjuntos de parâmetros (EA OptGroupExpert.mq5).
Período principal
Período forward
Figura 2. Resultados do EA OptGroupExpert.mq5 nos períodos principal e forward
Para esse grupo de estratégias, os resultados também são substancialmente piores do que o esperado, apesar de ter havido um pequeno lucro ao final do período forward. O drawdown aumentou quase uma vez e meia. Parece que o melhor grupo no período principal deixa de ser o melhor no período forward.
Vamos também observar os resultados do grupo selecionado com a clusterização dos conjuntos de parâmetros (EA OptGroupClusterExpert.mq5), embora já haja uma forte suspeita de que os resultados serão aproximadamente os mesmos dos dois casos anteriores.
Período principal
Período forward
Figura 3. Resultados do EA OptGroupClusterExpert.mq5 nos períodos principal e forward
Sim, a suspeita se confirmou. Aqui, os resultados são igualmente insatisfatórios, com um drawdown ainda maior. Portanto, não vamos apresentar os resultados para o melhor grupo selecionado a partir do arquivo em que apenas um conjunto de parâmetros foi deixado em cada cluster. Eles são aproximadamente iguais.
Diante disso, surge uma pergunta lógica: temos algum grupo cujos resultados no período forward correspondam às nossas expectativas? Para responder a essa questão, vamos realizar uma nova otimização, mas agora incluindo o período forward, para evitar a necessidade de executar manualmente o EA no testador para o período forward em todos os grupos de conjuntos de parâmetros obtidos na otimização anterior.
Resultados da Otimização com Período Forward
Assim, obtivemos os resultados da otimização com período forward para o EA OptGroupClusterExpert.mq5. O arquivo de conjuntos de parâmetros utilizado continha um conjunto para cada um dos 64 clusters. Para uma análise preliminar dos resultados da otimização, talvez seja suficiente usar o Excel. Vamos exportar os resultados da otimização para o período principal e para o período forward em arquivos XML e salvá-los no formato Excel:
Figura 4. Arquivos brutos com os resultados da otimização no período principal (IS) e no período forward (OOS)
No arquivo do período forward, há uma coluna chamada Back Result, que contém o resultado obtido no período principal com o mesmo conjunto de parâmetros otimizados. Isso é bom, mas gostaríamos de ver também todas as outras características do período principal lado a lado. Portanto, vamos combinar os dados dessas duas tabelas em uma única, usando a coluna-chave Pass. Os valores iguais nesta coluna correspondem às mesmas combinações de parâmetros de entrada no teste.
Após a combinação, vamos aplicar cores diferentes para os dados relacionados ao período principal e ao período forward, ocultar temporariamente algumas colunas e classificar os dados em ordem decrescente de lucro normalizado no período principal:
Figura 5. Resultados combinados do período principal e forward
É evidente que, para os melhores resultados no período principal, os resultados no período forward são, em sua maioria, negativos. Não podemos dizer que esses resultados são muito ruins — uma perda de 3% a 5% do saldo inicial em um ano —, mas também não podemos considerá-los bons.
Relembrando como obtemos os valores nas colunas Forward Result e Back Result: esse é o resultado da função OnTester(), retornado pelo EA após o teste. Chamamos essa medida de lucro normalizado, calculado pela seguinte fórmula:
Result = Profit * (10% / EquityDD),
onde Profit é o lucro obtido durante o período de teste, e EquityDD é o máximo de drawdown relativo ao patrimônio durante o período de teste.
O objetivo dessa medida é estimar o lucro potencial durante o período de teste, assumindo que o tamanho das posições abertas seja ajustado para que o drawdown relativo máximo atinja 10%.
Aqui, vale notar que os resultados desse indicador são comparáveis de forma correta se o mesmo coeficiente de escalonamento de posições coeff = (10% / EquityDD) for usado tanto para o período forward quanto para o principal. Durante o teste forward, seria complicado obter o valor desse coeficiente para o período principal, então vamos fazer esse ajuste agora. A fórmula de recalculação seria:
ForwardResultCorrected = ForwardResult * (coeff_IS / coeff_OOS)
= ForwardResult * (EquityDD_OOS / EquityDD_IS)
Após aplicar o ajuste, os resultados seriam os seguintes:
Figura 6. Tabela de resultados após o recálculo do lucro normalizado no período forward
Percebemos que os resultados do período forward aumentaram em termos absolutos. Isso está correto, por várias razões. Vamos imaginar que pegamos, por exemplo, o segundo conjunto de parâmetros no período principal. Considerando que o drawdown foi de 1,52%, aumentaríamos o tamanho das posições em 10 / 1,52 = 6,58 vezes para atingir o drawdown alvo de 10%. Assim, se ainda não soubéssemos nada sobre o período forward, também aumentaríamos o tamanho das posições em 6,58 vezes nesse período. Mas, nesse caso, se o lucro no período forward foi de -98, o lucro normalizado deveria ser calculado multiplicando o lucro por esse mesmo coeficiente de 6,58. Portanto, obteríamos -635 em vez de -240. O valor de -240 era menor porque o drawdown no período forward foi quase três vezes maior (4,03% em vez de 1,52%), e ao calcular o lucro normalizado, o coeficiente foi 10 / 4,03 = 2,48, ou seja, quase três vezes menor.
Certo, observamos resultados não muito animadores. Vamos agora tentar encontrar algo mais promissor. Primeiro, vejamos se temos algum resultado positivo no período forward. Vamos classificar os dados pela coluna Forward Result Corrected e veremos o seguinte:
Figura 7. Tabela de resultados com classificação pelo resultado do período forward
Ainda existem grupos de conjuntos de parâmetros que apresentam resultados positivos no período forward. Esses grupos correspondem àqueles em que, no período principal, o lucro normalizado atinge cerca de 15.000 a 18.000. Percebemos que, nesses casos, o drawdown não difere muito entre o período principal e o forward, e o lucro normalizado no período forward é aproximadamente um quinto do lucro normalizado no período principal.
Então, é possível escolher bons grupos?
Questão Filosófica
Na verdade, essa é uma questão muito complexa. Ela pode ser formulada de várias maneiras. Por exemplo:
- Temos o direito de usar a seleção considerando o período forward?
- Não estaremos nos enganando ao acreditar que essa escolha permitirá obter resultados semelhantes no futuro?
- Até que ponto podemos confiar nessa seleção?
- Os resultados serão necessariamente melhores em um novo período após o forward se selecionarmos o grupo considerando o forward, em comparação com a seleção sem considerar o forward?
- Para qual período futuro os resultados podem se repetir? Ele é comparável ao tamanho do período forward?
- Se realizarmos esse tipo de seleção, por exemplo, todos os anos, isso significará que sempre teremos um bom grupo para o ano seguinte? E se for a cada 6 meses? E se for a cada semana?
Essas formulações, embora baseadas em um fundamento comum, abordam diferentes aspectos.
Para tentar responder a essas questões, vamos lembrar da abordagem bayesiana. Primeiro, formulamos uma série de hipóteses (ou suposições) e depois avaliamos suas probabilidades antes de obter novos dados. Após realizar o experimento, atualizamos nossas avaliações com base nos novos dados. Ou seja, algumas hipóteses se tornam mais prováveis aos nossos olhos, enquanto outras menos prováveis. Aqui, consideramos a probabilidade como o grau de nossa confiança em um determinado desfecho.
Nossa principal hipótese será a seguinte: a seleção de um grupo considerando o período forward melhora os resultados obtidos no período subsequente ao forward. A hipótese alternativa: a seleção de um grupo considerando o período forward não melhora os resultados.
Um dos possíveis experimentos seria o seguinte: selecionar um certo número de grupos considerando o período forward e outros grupos sem considerar o período forward. Em seguida, testar todos os grupos selecionados no período após o forward.
Se os resultados dos grupos selecionados com consideração do período forward forem melhores do que os grupos selecionados sem o forward, isso será uma evidência fraca a favor da hipótese principal. Nossa confiança na veracidade da hipótese principal aumentará.
Se os resultados dos grupos selecionados sem consideração do período forward forem aproximadamente iguais ou melhores, isso será uma evidência fraca a favor da hipótese alternativa. No entanto, não podemos descartar completamente nenhuma das hipóteses, pois os resultados obtidos por qualquer grupo de estratégias no período após o forward dependem de muitos outros fatores além do método de seleção dos grupos. Pode ser que, no geral, esse período tenha sido desfavorável para as estratégias utilizadas, e, portanto, o método de seleção de estratégias em grupos pode não ter produzido um efeito perceptível.
Provavelmente, não podemos nos permitir ir muito além disso.
Vale destacar que a expressão "com consideração do período forward" pode ser mal interpretada. Se aplicarmos a seleção considerando o período forward, isso significa que o período que anteriormente era o forward (OOS) agora, embora continue sendo chamado de período forward, deixa de ser OOS e se torna IS. Isso significa que, para avaliar os resultados de trading, precisamos utilizar um novo período forward (um forward do forward, perdoe a redundância).
Vamos descrever mais especificamente o experimento que queremos realizar para obter informações adicionais. Suponha que temos dados históricos do período de 2018 a 2023, inclusive. Queremos, com base nesses dados, selecionar um grupo de estratégias que mostre bons resultados em 2024. Podemos proceder de duas maneiras:
- Realizamos a otimização no período de 2018 a 2023 (IS) e, com base nos resultados, selecionamos o melhor grupo.
- Realizamos a otimização no período de 2018 a 2022 (IS), simultaneamente verificando no período forward de 2023 (OOS). Selecionamos o melhor grupo que apresenta bons e aproximadamente iguais resultados em ambos os períodos.
No segundo método, provavelmente não selecionaremos o mesmo grupo que no primeiro método. Os resultados desse grupo podem ser um pouco piores, mas podemos afirmar que ele resistiu a um ano no período OOS, que não participou da otimização. Já no primeiro método, não podemos dizer o mesmo sobre o grupo escolhido, pois ele não foi testado fora do período IS. No entanto, no primeiro método, otimizamos (treinamos) o grupo em um período mais longo, já que no segundo método precisávamos reservar o ano de 2022 para o período forward e não utilizá-lo na otimização.
Qual desses métodos será melhor? Vamos tentar realizar tal experimento, comparando os resultados dos grupos selecionados pelos dois métodos ao operar em 2024.
Seleção pelo Primeiro Método
Para realizar a seleção pelo primeiro método, precisamos primeiro otimizar um único EA no período de 2018 a 2023. Até agora, essa otimização foi realizada até o ano de 2022, sem incluir 2023. Após a otimização, obteremos os conjuntos de parâmetros que dividiremos em clusters, como descrito no artigo anterior. Em seguida, executaremos a otimização para selecionar bons grupos de oito conjuntos de parâmetros. Vamos examinar os resultados dos melhores grupos encontrados para os períodos de 2018-2023 e 2024:
Figura 8. Resultados da otimização OptGroupClusterExpert.mq5 para a seleção do grupo no período principal de 2018 a 2023
Figura 9. Resultados da otimização OptGroupClusterExpert.mq5 para a seleção do grupo no período de três meses de 2024
Observamos que, para os melhores grupos encontrados no período principal de 2018-2023, os resultados no período forward de 2024 são, em geral, positivos, mas variam consideravelmente entre si. Para uma verificação mais detalhada, selecionaremos o grupo no topo da lista, atribuindo a ele um valor de multiplicador de escala scale_ = 10 / 2.04 = 5 e executaremos no testador para o período principal de 2023 e o período forward de 2024.
2023
2024 (3 meses)
Figura 10. Resultados do EA OptGroupClusterExpert.mq5 para o melhor grupo nos anos de 2023 e 2024
Com base nesses resultados, não é possível avaliar com precisão as perspectivas de desempenho futuro do EA com esse grupo de parâmetros de estratégia, mas, pelo menos, não observamos uma tendência clara de queda na curva de saldo em 2024. Vamos registrar esses resultados e voltar a eles posteriormente para compará-los com os resultados obtidos pelo segundo método de seleção.
Seleção pelo Segundo Método
2023
2024 (3 meses)
Figura 11. Resultados do EA OptGroupClusterExpert.mq5 para os anos de 2023 e 2024
Note que o drawdown em 2023 superou o valor estimado para o período principal de teste em quase duas vezes: $1.820 em vez de $1.000.
Para a seleção de grupos considerando 2023 como período forward, aplicaremos o seguinte algoritmo:
- Na tabela combinada de resultados de otimização para os anos de 2018-2022 (período principal) e 2023 (período forward), calcularemos para todos os indicadores a relação entre seus valores no período principal e no período forward. Por exemplo, para o número de trades:
TradesRatio = OOS_Trades / IS_Trades.
Quanto mais próximo de 1 forem essas relações, mais semelhantes são os valores desses indicadores nos dois períodos. Para o indicador de lucro, introduziremos um coeficiente na relação para considerar a diferença de duração dos períodos — em um ano, o lucro deve ser aproximadamente 5 vezes menor do que em cinco anos:
ResultRatio = OOS_ForwardResultCorrected * 5 / IS_BackResult. - Calcularemos para todas essas relações a soma das suas variações em relação a um. Essa medida será nossa métrica de diferença nos resultados de cada grupo entre o período principal e o período forward:
SumDiff = |1 - ResultRatio| + ... + |1 - TradesRatio|. -
Considerando que, no período principal e no período forward, o drawdown pode ter sido diferente para cada execução, selecionaremos o maior drawdown entre os dois períodos e calcularemos o coeficiente de escalonamento do tamanho das posições abertas para alcançar um drawdown normalizado de 10%:
Scale = 10 / MAX(OOS_EquityDD, IS_EquityDD).
-
Agora, é desejável escolher os conjuntos onde SumDiff seja o menor possível e Scale — o maior possível. Para isso, calcularemos o seguinte indicador:
Res = Scale / SumDiff.
-
Vamos ordenar todos os grupos com base na magnitude Res calculada na etapa anterior, em ordem decrescente. Assim, no topo da tabela estarão os grupos cujos resultados no período principal e no período forward foram mais semelhantes, e cujo drawdown em ambos os períodos foi menor.
- Escolheremos como o melhor grupo inicial aquele que estiver no topo. Para selecionar o próximo grupo, filtraremos todos os grupos que contêm os índices dos clusters que compõem o primeiro grupo e, novamente, escolheremos o que estiver no topo. Repetiremos esse processo algumas vezes, filtrando agora todos os índices que entraram nos grupos selecionados anteriormente. Os quatro grupos resultantes serão usados para o novo EA.
Para testar a operação conjunta dos grupos selecionados com base no EA OptGroupClusterExpert.mq5, criaremos um novo EA e faremos pequenas modificações. Como esse EA não será usado para otimização, podemos remover as funções OnTesterInit() e OnTesterDeinit(). Também podemos remover os parâmetros de entrada que definem os índices dos conjuntos de parâmetros para inclusão no grupo, pois estes serão definidos diretamente no código com base no procedimento de seleção realizado.
Na função OnInit(), criaremos dois arrays — — strGroups para os grupos selecionados e scales para os multiplicadores desses grupos. Os elementos do array strGroups serão strings, contendo os índices dos conjuntos de parâmetros, separados por vírgulas.
//+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { // Load strategy parameter sets int totalParams = LoadParams(fileName_, params); // If nothing is loaded, report an error if(totalParams == 0) { PrintFormat(__FUNCTION__" | ERROR: Can't load data from file %s.\n" "Check that it exists in data folder or in common data folder.", fileName_); return(INIT_PARAMETERS_INCORRECT); } // Selected set groups string strGroups[] = {"55,12,3,35,48,54,16,40", "11,54,33,30,62,6,10,23", "50,15,8,34,2,36,4,9", "26,42,25,22,36,51,53,0" }; // Scaling factors for selected set groups double scales[] = {4.16, 3.40, 3.33, 2.76 }; // Set parameters in the money management class CMoney::DepoPart(expectedDrawdown_ / 10.0); CMoney::FixedBalance(fixedBalance_); // Create an EA handling virtual positions expert = new CVirtualAdvisor(magic_, "SimpleVolumes_OptGroupForwardCluster"); CVirtualStrategyGroup *groups[ArraySize(strGroups)]; FOREACH(strGroups, { // Form the string from the parameter set indices separated by commas string strIndexes = strGroups[i]; // Turn the string into the array string indexes[]; StringSplit(strIndexes, ',', indexes); // Create and fill the array of all strategy instances CVirtualStrategy *strategies[]; FOREACH(indexes, { // Remove the cluster number from the parameter set string string param = CSVStringGet(params[StringToInteger(indexes[i])], 0, 11); // Add a strategy with a set of parameters with a given index APPEND(strategies, new CSimpleVolumesStrategy(param)) }); // Add the strategy to the next group of strategies groups[i] = new CVirtualStrategyGroup(strategies, scales[i]); }); // Form and add the group of strategy groups to the EA expert.Add(CVirtualStrategyGroup(groups, scale_)); return(INIT_SUCCEEDED); }
Salvaremos esse código no arquivo OptGroupForwardClusterExpert.mq5 na pasta atual.
Vamos analisar os resultados do teste desse EA. Assim como da última vez, combinaremos dois períodos em uma única execução: o ano de 2023 e os primeiros três meses de 2024.
2023
2024 (3 meses)
Figura 12. Resultados do EA OptGroupClusterForwardExpert.mq5 para os anos de 2023 e 2024
Aqui, os resultados de 2023 são claramente melhores: a tendência de crescimento é observada ao longo de todo o período, embora haja um período de março a julho em que a curva de saldo não apresentou um crescimento significativo. O drawdown nesse período também melhorou e está dentro do limite máximo esperado.
Os resultados de 2024 também são melhores, mas não são particularmente impressionantes. Talvez três meses seja um intervalo muito curto para que os resultados se apresentem tão atraentes quanto em um período mais longo de vários anos.
Comparando esses resultados com os do primeiro método de seleção de bons grupos, não há uma vantagem clara de um método sobre o outro. Os resultados são, em geral, bastante semelhantes, mas o segundo método exigiu mais esforço em comparação com o primeiro. No entanto, como delineamos claramente o algoritmo de seleção no segundo método, ele pode ser automatizado no futuro.
Considerações finais
Como vimos, o experimento realizado não aumentou nossa confiança de que é melhor reservar um período adicional como forward e selecionar grupos considerando o melhor desempenho em ambos os períodos. No entanto, isso não significa que esse método não deva ser utilizado. Não tivemos muita sorte ao utilizar apenas os três primeiros meses de 2024 para a comparação. Esse período é muito curto, já que observamos que a estratégia de trading utilizada pode ter períodos de oscilação do saldo próximo de zero que duram vários meses. Por isso, não está claro se os primeiros três meses de 2024 são o início de um período desse tipo, que depois será seguido por crescimento, ou se o crescimento pode já não acontecer.
Podemos tentar realizar um experimento semelhante, deslocando os períodos em um ano. Nesse caso, o período principal começaria em 2017, a seleção pelo segundo método seria feita no período de 2022, e teríamos todo o ano de 2023 e o início de 2024 para comparar os dois métodos.
Mas preferimos seguir em frente. Nada nos impede de selecionar parte dos grupos pelo primeiro método e outra parte pelo segundo, e combiná-los em um único EA. Mas qual é o número máximo de instâncias de estratégias de trading que podemos combinar em um único EA? Combinar de forma que sua execução não consuma muitos recursos no servidor e não exija uma quantidade de memória RAM maior do que os valores típicos. Tentaremos esclarecer essa questão no próximo artigo ou em um dos próximos.
Obrigado pela atenção, até a próxima.
P.S. Aconteceu que, durante a preparação deste artigo, não fizemos nenhuma alteração nos arquivos criados anteriormente. Apenas adicionamos um novo arquivo, por isso, somente ele está anexado a este artigo. Todos os outros arquivos de código mencionados podem ser encontrados no artigo anterior.
Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/14549
![Algoritmos de otimização populacional: Algoritmo Boids, ou algoritmo de comportamento de enxame (Boids Algorithm, Boids)](https://c.mql5.com/2/74/Population_optimization_algorithms_Boyd_algorithmp_or_flock_algorithm___LOGO.png)
![Uma Formulação Genérica de Otimização (GOF) para Implementar Max Personalizado com Restrições](https://c.mql5.com/2/76/A_Generic_Optimization_Formulation_2GOFt_to_Implement_Custom_Max_with_Constraints____LOGO.png)
![Está chegando o novo MetaTrader 5 e MQL5](https://c.mql5.com/2/0/851_25.jpg)
![Redes neurais de maneira fácil (Parte 83): Transformador espaciotemporal de atenção contínua (Conformer)](https://c.mql5.com/2/74/Neural_networks_are_easy_0Part_83a___LOGO.png)
![MQL5 - Linguagem para estratégias de negociação inseridas no terminal do cliente MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Aplicativos de negociação gratuitos
- 8 000+ sinais para cópia
- Notícias econômicas para análise dos mercados financeiros
Você concorda com a política do site e com os termos de uso