English Русский 中文 Español Deutsch 日本語
Como não cair em armadilhas de otimização?

Como não cair em armadilhas de otimização?

MetaTrader 4Testador | 18 fevereiro 2016, 15:03
956 0
Shashev Sergei
Shashev Sergei


Seria bom poder desenvolver sistemas de negociação sem ter que se preocupar com a otimização.
Realisticamente, contudo, o desenvolvimento de uma estratégia de negociação lucrativa
é uma atividade de tentativa e erro, que sempre envolve alguma forma de otimização.
Sempre há um otimizador em algum lugar: se ele não estiver visível, está se espreitando pelas sombras.

J. Katz, D. Mccormick. A enciclopédia de estratégias de negociação.


O que é otimização em um sistema de negociação?


A criação de um sistema de negociação, em primeiro lugar, consiste na formulação de regras para a abertura e fechamento de uma posição longa ou curta. Geralmente essas regras contêm alguns indicadores e parâmetros. Caso eles sejam alterados, a lucratividade do sistema de negociação também irá mudar. Esta pergunta surge frequentemente: É necessário otimizar sistemas de negociação ou basta adequar o sistema aos dados históricos?

Além disso, pessoas diferentes chamam procedimentos completamente diferentes de "otimização de um sistema de negociação". Então vamos primeiro definir o que é otimização.
Em primeiro lugar, nós podemos interpretar "otimização" como a seleção ou criação de um sistema de negociação capaz de resolver os nossos problemas melhor do que outros sistemas. Por exemplo, estamos buscando um sistema capaz de produzir o maior lucro possível em relação a iene/dólar norte-americano no momento. Para isso, escolhemos um sistema com alguns parâmetros fixos a partir de uma determinada variedade de sistemas. Esta escolha pode ser feita, por exemplo, entre sistemas baseados em indicadores diferentes. Vamos chamar isso de "otimização do primeiro tipo".

Em segundo lugar, nós podemos interpretar "otimização" como a descoberta dos parâmetros que nos permitiriam obter os melhores resultados no sistema de negociação selecionado. Eles podem ser a seleção do período para o cálculo da média ou o período para calcular estruturas estocásticas. Vamos chamar isso de "otimização do segundo tipo".

Todos devem entender que, ao criar uma estratégia, traders tentam, explícita ou implicitamente, usar ambos tipos de otimização. De fato, a partir do momento em que nós selecionamos o sistema de negociação com o qual vamos trabalhar, nós presumimos que ele será o melhor sistema de negociação que possuímos. ou seja, nós usamos a otimização do primeiro tipo. Contudo, como qualquer sistema possui alguns parâmetros, nós tentamos encontrar os valores para estes parâmetros que irão nos trazer os melhores resultados. Isso é, obviamente, a otimização do segundo tipo. Além disso, é impossível separar esses dois tipos de otimização ao criar um sistema de negociação. É por isso que a nossa resposta à pergunta "a otimização deve ser usada na criação de um sistema de negociação" é clara: A otimização deve ser usada. Uma outra questão é como fazer isso. Há vários estágios na criação de um sistema de negociação:
  • início da ideia do que seria a base do sistema de negociação;
  • seleção dos critérios ou regras de tomada de decisões;
  • definição dos parâmetros do sistema;
  • teste do sistema; e
  • retorno às clausulas anteriores caso seja necessário fazer alterações no sistema.

Problemas da otimização do segundo tipo

Ao criar um sistema de negociação automatizado, todos os desenvolvedores usam tanto a otimização do primeiro tipo quanto a do segundo tipo. A busca por critérios ou regras de tomada de decisões é uma tarefa para sistemas heurísticos como redes neurais, algoritmos genéticos, e, é claro, o cérebro humano, o mais poderoso sistema que existe no momento. Este é o primeiro tipo de otimização, então toda a responsabilidade por esta otimização está na mão dos traders.

O segundo tipo de otimização é a busca pelos melhores parâmetros. É aqui que o problema ocorre, pois é muito fácil adequar os dados ao histórico e obter "lucros enormes". Infelizmente, este processo só é eficiente no histórico. É difícil evitar uma "otimização excessiva" do tipo, então alguns traders começam a enxergá-la negativamente. Por quê?

A razão é simples. Novatos encontram parâmetros que produzem o lucro máximo, sem dar atenção às áreas vizinhas, nas quais o lucro cai acentuadamente quando mudanças insignificantes são feitas aos melhores períodos dos indicadores. Isso resulta na instabilidade do sistema de negociação. Então eles começam a usar este sistema em uma conta demonstrativa. Isso é muito bom se eles forem pacientes o bastante para trabalhar no sistema por pelo menos dois meses, assegurando-se de que ele é inoperável. Do contrário, seria terrível executar um sistema do tipo em uma conta real: você poderia dizer adeus ao seu depósito, e olá ao desemprego!

Como o problema da otimização excessiva pode ser resolvido?

O que devemos fazer? Nós não podemos negligenciar a otimização, ou então nós iríamos ignorar a melhor solução ou uma estratégia potencialmente lucrativa por termos encontrado os parâmetros errados. Contudo, a otimização excessiva também pode resultar em sérios problemas. É preciso encontrar o ponto de equilíbrio.

Vamos abordar a otimização matematicamente. Em geral, quando há muitos parâmetros a serem otimizados, nós procuramos um hiperplano no qual o lucro é estável e muda de forma mais ou menos igual quando os parâmetros são levemente modificados. Durante a otimização, nós tentamos encontrar uma solução do tipo, na qual os lucros são os mais altos possíveis e desvios insignificantes em relação à solução ideal não resultam em alterações bruscas no lucro.

O problema é que nós podemos entrar na área local máxima, a área de um ponto no qual os lucros são máximos, mas mudanças insignificantes dos parâmetros resultam em perdas. Portanto, tais parâmetros provavelmente resultariam na perda do depósito quando qualquer mudança insignificante ocorresse no mercado. Bem, o Forex é conhecido por passar por mudanças do tipo com grande frequência. O sistema deve evitar todos os extremos locais.

Infelizmente ainda não há um algoritmo integrado ao MetaTrader capaz de procurar por soluções ideais por si só. Um dos algoritmos mais poderosos em relação à resolução destes problemas é o KRAB. Ele é descrito no livro "Métodos aplicados de análise de dados e conhecimento", de N. Zagoruyko. Novosibirsk: Editora do instituto de matemática, 1999 (em russo). Seria ótimo se ele fosse incluído nas próximas versões... Mas nem tudo está perdido"

O MetaTrader é capaz de construir um diagrama de otimização para otimizar um ou dois parâmetros. Isso significa que, ao projetar os resultados da otimização em um plano, nós podemos, em teoria, encontrar uma solução ideal. Em outras palavras, ao otimizar dois parâmetros por dois, nós encontramos a região da melhor solução.

Em relação a três parâmetros, teremos que repetir este procedimento

vezes.

Já em relação a cinco parâmetros, isso será feito

e assim em diante. Bem, é melhor não exagerar na quantidade de parâmetros.

Ao otimizar dois parâmetros, nós obtemos um diagrama de otimização como o abaixo:

As áreas escuras são áreas com grandes lucros. Esse diagrama de otimização é muito bom, pois não há máximos locais e o lucro diminui de maneira uniforme a partir do canto superior direito do gráfico. Seria ótimo se você encontrasse uma situação como essa na sua otimização.

O diagrama abaixo não é tão claro: Nós podemos ver duas áreas contendo máximos neste diagrama. Qual nós devemos escolher?


Um olhar experiente é capaz de enxergar a região de solução no canto inferior direito, pois a área dos quadrados vizinhos mostra uma queda de lucro totalmente menor do que aquela no início do gráfico. Então eu lhe recomendaria analisar os diagramas com atenção de modo a proteger o seu depósito.

Vamos começar a estudar um expert advisor simples, analisar três parâmetros e encontrar uma região de solução ideal. O nome do EA é SP. Ele trabalha nas áreas de mercados de compra excessiva/venda excessiva analisando o momentum.

//+------------------------------------------------------------------+
//|                                                           SP.mq4 |
//|                      Copyright © 2006, MetaQuotes Software Corp. |
//|                                        https://www.metaquotes.net |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2006, MetaQuotes Software Corp."
#property link      "https://www.metaquotes.net"
 
//---- input parameters
extern int       TakeProfit=50;
extern int       StopLoss=30;
extern int       RsiLen=4;
extern int       KLen=8;
extern int       Momlength=10;
extern int       Lots=1;
extern int       rsi_oversold=39;
extern int       stoc_oversold=29;
extern int       rsi_overbought=60;
extern int       stoc_overbought=70;
extern int       Mom_Sell=-2;
extern int       Mom_Buy=2;
 
int expertBars;
double RSIlevel;
double Stoclevel;
double MomLevel;
double DLen=3;
 
//+------------------------------------------------------------------+
//| returns true if a new bar has come, otherwise returns false      |
//+------------------------------------------------------------------+
bool isNewBar()
  {
//----
   bool res=false; 
   if (expertBars!=Bars) 
      {
      expertBars=Bars;
      res=true;
      } 
//----
   return(res);
  }
//+------------------------------------------------------------------+
//| expert initialization function                                   |
//+------------------------------------------------------------------+
int init()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert deinitialization function                                 |
//+------------------------------------------------------------------+
int deinit()
  {
//----
   
//----
   return(0);
  }
//+------------------------------------------------------------------+
//| expert start function                                            |
//+------------------------------------------------------------------+
int start()
  {
  double price;
  double stop;
  double profit;
//----
   if ((isNewBar())&& (OrdersTotal()==0)&& (AccountBalance()>5000))
   {
      RSIlevel=iRSI(NULL,0,RsiLen,PRICE_CLOSE,0);
      Stoclevel=iStochastic(NULL,0,KLen,DLen,3,MODE_SMA,0,MODE_MAIN,0);
      MomLevel=100 - iMomentum(NULL,0,Momlength,PRICE_CLOSE,0);
      /*if (AccountBalance()>50000)
         {Lots=NormalizeDouble( AccountBalance()/10000,0)-4;}
      else 
         Lots=1;*/
      if ((RSIlevelrsi_oversold)&&(Stoclevelstoc_oversold)&&(MomLevel>Mom_Sell))
      {
         price=Ask;
         stop=NormalizeDouble(price-StopLoss*Point,Digits);
         profit=NormalizeDouble(price+TakeProfit*Point,Digits);
         OrderSend(Symbol(),OP_BUY,Lots,price,3,stop,profit,NULL,0,0,Green); 
         //Print(AccountBalance());          
      }
      if ((RSIlevel>rsi_overbought)&&(Stoclevel>stoc_overbought)&&(MomLevelMom_Buy))
      {
         price=Bid;
         stop=NormalizeDouble(price+StopLoss*Point,Digits);
         profit=NormalizeDouble(price-TakeProfit*Point,Digits);
         OrderSend(Symbol(),OP_SELL,Lots,price,3,stop,profit,NULL,0,0,Green); 
         //Print(AccountBalance());            
      }      
   } 
    
//----
   return(0);
  }
//+------------------------------------------------------------------+

Nós otimizaremos três parâmetros: estocástico e períodos RSI, e o nível de StopLoss.

Após termos otimizado os parâmetros, obteremos três diagramas:


Dependência de lucros do estocástico e dos períodos RSI


Dependência de lucros do RSI e do StopLoss


Dependência de lucros do estocástico e do StopLoss

As melhores regiões são:

  • Diagrama 1 – (4;5)&(3;6);
  • Diagrama 2 – (80;90)&(3;6);
  • Diagrama 3 – (80;90)&(4;5).

Combinando-os obteremos a melhor solução – (5,4,80).

Deve-se notar que o StopLoss possui um passo maior, dez, na otimização. Caso necessário, a solução obtida também pode ser analisada com um passo menor.

Conclusão

É muito bom, claro, que a saturação de cor verde da célula nos permita julgar quão lucrativa é a região. Contudo, será ainda melhor caso as regiões de perda forem, de forma semelhante, coloridas em vermelho. Isso nos ajudará a estimar a estratégia em um nível completamente diferente. De fato, nós seremos capazes de obter uma imagem completa e tridimensional da otimização!

Finalmente, algumas recomendações em relação à otimização:

  • A amostra de dados para a otimização deve ser representativa. Ela deve exceder 3 anos em relação ao cronograma diário.
  • Teste a sua estratégia fora da amostra de otimização. Isso irá lhe permitir estimar os parâmetros selecionados.
  • Não otimize muitos parâmetros ao mesmo tempo: a probabilidade de você adequá-los ao histórico seria grande demais.
  • Aumente o posso para reduzir o tempo de otimização. A melhor região não será negligenciada. O agrupamento obtido pode ser analisado em maiores detalhes mais tarde (técnica de peneiramento).
  • Não perca horas na otimização: é melhor modernizar o algoritmo do expert advisor.
Espero que este artigo lhe ajude a evitar "otimizações prejudiciais".


Traduzido do russo pela MetaQuotes Ltd.
Artigo original: https://www.mql5.com/ru/articles/1434

Arquivos anexados |
SP.mq4 (3.23 KB)
Envio de sinais de negociação em um expert advisor universal Envio de sinais de negociação em um expert advisor universal
O artigo descreve formas de envio de sinais a partir de uma unidade de programa de sinal de um expert advisor universal para a unidade de controle de posições e pedidos. Ele trata de interfaces seriais e paralelas.
Execução do terminal do cliente MetaTrader 4 em Linux-Desktop Execução do terminal do cliente MetaTrader 4 em Linux-Desktop
Descrição de uma configuração passo a passo em desktop Linux usando um wine não emulador para executar o terminal do cliente MetaTrader4.
Psicologia individual de um trader Psicologia individual de um trader
Um retrato do comportamento de um trader no mercado financeiro. O menu do próprio autor, do livro "Как играть и выигрывать на бирже" ("Como especular e lucrar na bolsa de valores"), de A. Elder.
Arquivo log alternativo com o uso de HTML e CSS Arquivo log alternativo com o uso de HTML e CSS
Neste artigo nós vamos descrever o processo de escrita de uma biblioteca simples mas muito poderosa para criar arquivos html, vamos aprender a ajustar a sua exibição e vamos ver como eles podem ser facilmente implementados e utilizados em seu expert ou script.