Discussão do artigo "Otimização paralela pelo método de enxame de partículas (Particle Swarm Optimization)"

 

Novo artigo Otimização paralela pelo método de enxame de partículas (Particle Swarm Optimization) foi publicado:

Este artigo descreve uma forma de otimização rápida por meio do método de enxame de partículas e apresenta uma implementação em MQL pronta para ser utilizada tanto no modo thread único dentro do EA quanto no modo multi-thread paralelo com complemento que executado nos agentes locais do testador.

A nível algorítmico, o método PSO é relativamente simples. A ideia principal é gerar um conjunto de partículas virtuais no espaço dos parâmetros de entrada do Expert Advisor. Em seguida, as partículas se movem e mudam sua velocidade dependendo dos indicadores de negociação do EA nos pontos correspondentes no espaço. O processo é repetido várias vezes até que o desempenho pare de melhorar. O pseudocódigo do algoritmo é mostrado abaixo:

Particle Swarm Optimization Pseudo-Code

Particle Swarm Optimization Pseudo-Code

Segundo esta abordagem, cada partícula tem uma posição atual, velocidade e memória do seu "melhor" ponto no passado. Por "melhor" queremos dizer o ponto (conjunto de parâmetros de entrada do EA) onde é alcançado o maior valor da função objetivo para dada partícula. Vamos descrever isso numa classe.

  class Particle
  {
    public:
      double position[];    // current point
      double best[];        // best point known to the particle
      double velocity[];    // current speed
      
      double positionValue; // EA performance in current point
      double bestValue;     // EA performance in the best point
      int    group;
      
      Particle(const int params)
      {
        ArrayResize(position, params);
        ArrayResize(best, params);
        ArrayResize(velocity, params);
        bestValue = -DBL_MAX;
        group = -1;
      }
  };

O tamanho total das matrizes é igual à dimensão do espaço de otimização, ou seja, ao número de parâmetros do Expert Advisor a serem otimizados (passados para o construtor). Visto que a otimização padrão assume que quanto maior o valor da função objetivo, melhor será, inicializamos o campo bestValue com o número mínimo possível, DBL_MAX. Geralmente como critério de avaliação do EA é usado um dos indicadores de trading: lucro, rentabilidade, índice de Sharpe, etc. Se for necessária uma otimização da magnitude que fica melhor quando ocorre a diminuição, por exemplo, do rebaixamento, é fácil dar conversões equivalentes para maximizar as magnitudes inversas.

Matrizes e variáveis são tornadas públicas para facilitar o acesso e seu código de recálculo. A adesão estrita aos princípios da POO exigiria ocultá-los usando o modificador private e descrevendo métodos de leitura e modificação.

Autor: Stanislav Korotky

 
Таким образом, мы убедились, что алгоритм PSO стал доступен в своей параллельной модификации в тестере в режиме оптимизации.
Terminei de ler essa frase. Muito legal! Um trabalho enorme e original sobre como trazer cálculos paralelos por meio de arquivos para um estado de funcionamento.
 

A verificação de exclusividade e o armazenamento da base de parâmetros são justificados? O algoritmo foi avaliado quanto à degradação da velocidade?

Considerando o fato de que, como regra, um enorme espaço de pesquisa é usado durante a otimização e a probabilidade de variantes repetidas é extremamente pequena e, no caso de espaços de pesquisa pequenos, é mais racional fazer uma pesquisa completa.

ZЫ Agradeço ao autor pela base para reflexão.

ZZY Não entendi muito bem como a questão do carregamento "suave" de agentes em um tamanho fixo da colônia (ou população) sem tempo de inatividade é resolvida, mas estou relendo o artigo.

 

O artigo mostra alguns momentos não trabalhados do lado do MT5. Por exemplo, a obtenção de valores de parâmetros não otimizados no OnTesterInit sem DLL. E a mesma comissão.

Seria ótimo adicionar ao código-fonte a possibilidade de ativar (via macro) a leitura de todos os parâmetros do testador via DLL. Existem soluções prontas.


Outro desejo é a geração do arquivo de opções a partir das passagens do PSO.


Será necessário comparar essa solução e o GA padrão em termos de desempenho e qualidade. Isso não deve ser difícil para qualquer TC que não seja um indicador (com base nas fontes do artigo, já que é um estilo universal).


O artigo é excelente! Mas não para iniciantes.

 

Leitura concluída.

Há código demais para a tarefa de substituir o otimizador padrão, muitas inclusões, quem entenderá? - Infelizmente, para a grande maioria dos leitores, o artigo permanecerá incompreensível.

Como você pode pegar qualquer Expert Advisor e adicionar uma biblioteca PSO a ele com o mínimo de esforço?

Idealmente, o algoritmo de otimização deveria ser uma entidade completamente separada, de modo que não fosse necessário entrar nele toda vez que fosse necessário escrever um novo Expert Advisor (qualquer algoritmo a ser otimizado).

Além disso, quais configurações de algoritmo são aceitáveis na maioria dos casos práticos? - O autor não respondeu a essa pergunta. E, se a mente curiosa do leitor quiser otimizar os parâmetros do algoritmo usando o mesmo algoritmo, não será possível fazer isso imediatamente, pois o código não está isolado.

Não me leve a mal, mas não existe uma ferramenta pronta para uso sem código desnecessário para tarefas específicas.

 
Andrey Dik:

Terminei.

Há código demais para a tarefa de substituir o otimizador padrão, muitas inclusões, quem o entenderá? - Infelizmente, para a grande maioria dos leitores, o artigo permanecerá além da compreensão.

Como você pode pegar qualquer Consultor Especializado e adicionar uma biblioteca PSO a ele com o mínimo de esforço?

O ideal é que o algoritmo de otimização seja uma entidade completamente separada, para que não seja necessário entrar nele toda vez que for necessário escrever um novo Expert Advisor (qualquer algoritmo a ser otimizado).

Além disso, quais configurações de algoritmo são aceitáveis na maioria dos casos práticos? - O autor não respondeu a essa pergunta. E se a mente curiosa do leitor quiser otimizar os parâmetros do algoritmo com o mesmo algoritmo, não será possível fazer isso imediatamente, pois o código não está isolado.

Por favor, não considere isso uma grosseria, mas não existe ferramenta pronta para uso sem código desnecessário para tarefas específicas.

É claro que não se pode abraçar o imenso. A segunda iteração da ferramenta de código aberto foi apresentada (a primeira, não paralelizada, foi publicada anteriormente no blog). Ela está pronta no sentido de que eles já descobriram para você onde colocar o código e como ele funcionará. Concordo que ainda não há um produto em uma caixa. Mas ele estaria à venda no mercado. O que é apresentado aqui é um kit "faça você mesmo" com instruções prontas.

Quanto aos itens inclusos, eles foram adicionados não por uma questão de boa vida, mas porque não há maneiras internas semelhantes de fazer tudo da mesma forma (e necessário). E é muito bom que todas essas coisas rotineiras já estejam prontas na forma de includniks, que só precisam ser conectados (o que agradece muito ao fxsaber-u). É estranho reclamar em um site de comércio de algo sobre a principal maneira de evitar a duplicação de trabalho. Se esses incluidores não estivessem lá, teríamos que fazer todo o projeto do zero. E é melhor ter includniks do que batniks. Em geral, não há dependências de programas e DLLs de terceiros. E não há (nenhuma) alternativa ao método de otimização incorporado que possa ser implementado por um código pequeno.

Quanto ao ajuste dos parâmetros do PSO, esse é um problema em aberto para qualquer método de otimização. Em particular, no caso do GA integrado, há algumas configurações fixas que os usuários não podem alterar, e é por isso que muitas pessoas reclamam desse ponto e precisam solicitar soluções personalizadas baseadas no GA. Portanto, a ausência de configurações é ruim, e quando elas estão lá, também é ruim, porque você as deu para nós e agora não sabemos o que fazer com elas. E aqui está o que fazer com elas: pesquisar para cada tarefa específica. Pedir configurações prontas para alguma caixa preta desconhecida, que é o especialista de alguém, é como pedir parâmetros ideais para esse especialista (sem otimização). E por que precisamos da otimização em si? Porque não é tão simples assim - nem procurar os parâmetros de um especialista, nem procurar meta-parâmetros de um algoritmo de otimização específico. O que você está pedindo é como pedir uma configuração de rede neural pronta para dados que ninguém viu ainda. Não há configurações ideais para a maioria dos especialistas == casos práticos.

Como ponto de partida, podemos usar o paralelo com os AGs feito no artigo: se o usuário executou o AG 1.000 vezes, que ele defina a contagem de grupos como 1.000, se houve 100 gerações no AG - que sejam 100 ciclos de PSO, e se houve 100 indivíduos na população, que o tamanho do enxame também seja 100.

 
Stanislav Korotky:

Quanto aos includnics, eles são adicionados não por causa de uma vida boa, mas porque não há maneiras padrão semelhantes de fazer todas as mesmas coisas (e necessárias). E é muito bom que todas essas coisas rotineiras já estejam disponíveis prontas na forma de includniks, que só precisam ser conectados (graças ao fxsaber por isso). É estranho reclamar em um site de comércio de algo sobre a principal maneira de evitar a duplicação de trabalho. Se esses incluidores não estivessem lá, teríamos que fazer todo o projeto do zero. E é melhor ter includniks do que batniks. Em geral, não há dependências de programas e DLLs de terceiros. E nenhuma (qualquer) alternativa ao método de otimização incorporado pode ser implementada por código pequeno.

Não faz sentido duplicar a funcionalidade do testador padrão na forma de funções de negociação virtuais (pelo menos eu não vejo sentido, esse trabalho já foi feito para nós por caras inteligentes e bem pagos da MQ), mas fazer uma adição, uma extensão da funcionalidade - sim.

negrito - talvez, de fato.

Quanto ao ajuste dos parâmetros do PSO, esse é um problema em aberto para qualquer método de otimização. Em particular, no caso do GA integrado, há algumas configurações fixas que os usuários não podem alterar, e é por isso que muitas pessoas reclamam exatamente desse ponto e precisam solicitar soluções personalizadas baseadas no GA. Então, acontece que a ausência de configurações é ruim e, quando elas estão lá, também é ruim, porque você as deu para nós e agora não sabemos o que fazer com elas. E o que fazer com elas é o seguinte: pesquisar para cada tarefa específica. Pedir configurações prontas para alguma caixa preta desconhecida, que é o especialista de alguém, é como pedir parâmetros ideais para esse especialista (sem otimização). E por que precisamos da otimização em si? Porque não é tão simples assim - nem procurar os parâmetros de um especialista, nem procurar meta-parâmetros de um algoritmo de otimização específico. O que você está pedindo é como pedir uma configuração de rede neural pronta para dados que ninguém viu ainda. Não há configurações ideais para a maioria dos especialistas == casos práticos.

Como ponto de partida, podemos usar o paralelo com os AGs feito no artigo: se o usuário executou o AG 1.000 vezes, que ele defina a contagem de grupos como 1.000, se houve 100 gerações no AG - que sejam 100 ciclos de PSO, e se houve 100 indivíduos na população, que o tamanho do enxame também seja 100.

A rede neural pronta e o algoritmo de otimização não são a mesma coisa, a rede neural requer treinamento em dados específicos e depende da pureza, integridade e relevância dos dados, mas o algoritmo de otimização não deve depender desses fatores de forma alguma, ele não deve se preocupar em treinar a rede neural (otimizar) ou em encontrar os parâmetros ideais para si mesmo em um conjunto de problemas de teste.

Mas, de qualquer forma, meus comentários sobre o artigo são puramente práticos, mas não baseados em princípios. Qualquer ponto de vista sobre o problema da otimização tem o direito de existir. Você vê as coisas dessa forma, eu vejo de forma um pouco diferente, o que é bom.

No mundo moderno, ninguém precisa de designers do tipo "construa você mesmo", todo mundo precisa de soluções prontas, Mercedes e outros Audis são comprados não para serem finalizados, mas para serem desfrutados... ou, pelo menos, deve ser apresentada uma maneira de aparafusar a solução aos projetos existentes do cliente.

;)

 

artigo interessante

Não gostei da implementação, que vincula a negociação virtual ao testador,

talvez funcione como pretendido, mas, na minha opinião, a implementação para otimização deve ser feita completamente com a ajuda da negociação virtual ( Virtual.mqh ) - então será uma otimização automática on-line,

ou a implementação usando as possibilidades do testador de estratégia do terminal (OnTesterInit()). - obteríamos um GA alternativo para o testador; na implementação atual, é difícil supor como o testador de estratégia funciona.


obrigado pelo material interessante e pela implementação do software, que pode ser útil

 

Responderei na ordem.

A lembrança dos hashes das combinações calculadas é opcional - ela pode ser excluída da fonte, se desejado. A presença dessa verificação não deve tornar o processo muito mais lento em comparação com a velocidade de cálculo da própria negociação.

A enumeração completa de parâmetros faz sentido apenas para espaços realmente pequenos, mas entre eles e milhões de combinações há toda uma camada de casos de uso. Por exemplo, você precisa executar a otimização em 10.000 combinações, uma pesquisa completa levará 1 hora, mas você quer ver uma estimativa aproximada em alguns minutos. Nesse caso, você obviamente precisa de uma forma rápida de otimização, e é muito provável que haja combinações duplicadas. E, ao detectá-las, podemos acelerar o processamento.

O carregamento de agentes é deixado para o testador. Os passes comerciais são distribuídos uniformemente em média (o número é igual e a complexidade é calculada em média devido à randomização).

Eu gostaria de adicionar arquivos de opção, mas não consigo fazer tudo de uma vez. Se você inserir todas as opções, o resultado nunca verá a luz do dia.

Eu não gostaria de usar DLLs e programas externos, por assim dizer, por design.

O uso de funções de negociação virtuais faz muito sentido - elas são muito mais rápidas do que as incorporadas. Em primeiro lugar, isso é verdade. Em segundo lugar, elas permitem que você altere os parâmetros várias vezes em um loop dentro de uma passagem (dentro de um grupo de PSO). Se não fosse por isso, cada passagem separada teria que ser sincronizada com o grupo(que se tornou uma entidade externa em relação ao programa ) - e isso ainda é possível, novamente, por meio de programas externos ou de arquivos compartilhados. E haveria novos superfreios. Mas, em terceiro e último lugar, e esse é o aspecto mais importante: ao usar passagens de testador regulares sem virtualização, é impossível parafusar seu próprio algoritmo de otimização para viver dentro da MQL. Tente pensar em como você faria isso. Isso só é possível com a ajuda de programas e/ou redes de batalha externos. O fxsaber tem até mesmo "automatizadores" adequados, mas isso significa controle externo sobre a execução de processos e a montagem de seus resultados. Isso é um freio ao quadrado, além de ser totalmente inconveniente de usar. Lidar com esses controladores externos requer muito mais habilidade.

Quanto à afirmação sobre código pequeno para implementar uma substituição do otimizador padrão, eu discordaria. Até onde eu sei, os trabalhos alternativos também não são pequenos e exigem a adaptação de código especializado. Se houver uma demonstração concreta de um algoritmo de otimização autônomo com código pequeno e conexão muito simples ao EA, compartilhe-a com o público ;-).

Com relação à indiferença do algoritmo de otimização, como se ele devesse ser capaz de lidar com qualquer tarefa sem ajustes, não concordo. Isso seria algum tipo de mágica, uma "bala de prata".

Não vejo nenhuma diferença fundamental entre o algoritmo de otimização e o algoritmo NS. Ambos têm meta-parâmetros.

E sim - "nenhum trabalho foi feito para investigar a capacidade de pesquisa do algoritmo ", porque não é possível cobrir muito terreno - já havia muito trabalho a ser feito. O objetivo da publicação é torná-la publicamente disponível para aqueles que desejam fazer pesquisas e compartilhar suas descobertas.

Há otimização automática on-line (foi publicada no blog), mas ela está em apenas um segmento, e o objetivo do artigo era paralelizar o algoritmo. Usar o testador como um iterador de trabalhos e distribuí-los aos agentes para contagem virtual em grupo - esse é o maior truque de todo o projeto. Sinergia.

 
Anexei um arquivo de cabeçalho ligeiramente modificado e um exemplo de um Expert Advisor de teste. A classe Settings, os funcionais auxiliares e os manipuladores de eventos de modelo estão incluídos no arquivo ParticleSwarmEmbed.mqh. Presume-se que o usuário esteja satisfeito com sua implementação padrão. Então, o código do Expert Advisor ExprBotPSOEmbed.mq5 é significativamente simplificado. Basta descrever seu cálculo de negociação e lançar manipuladores na classe PPSO_EventHandlers. Além disso, os coeficientes de configuração da dinâmica do PSO (inércia, etc.), bem como a desativação dos arquivos de índice, são colocados nas variáveis de entrada.
Arquivos anexados:
 
Pequena correção de bug nas classes do analisador de expressões. O bug não afeta o trabalho do exemplo do artigo, mas pode afetar outros.
Arquivos anexados: