Relatório provisório sobre desenvolvimento de IA e otimização do desempenho do código

Imagem do título da história

O robô de póquer está morto, viva o BitSurfer! - Não a sério, o que aconteceu?

O PokerBot e o Poker Advisor foram dois projetos muito interessantes, e aprendi muito com ambos! O PokerAdvisor recolhe as cartas do ecrã, insere-as automaticamente numa IA e prevê o resultado da mão. Enquanto o Pokerbot foi planeado para jogar sozinho - tudo foi preparado, mas o poker online foi praticamente banido na Suíça.

Então estava na hora de seguir em frente. Mas qual poderia ter sido o próximo grande desafio?

Gráfico de preços do Bitcoin

Tropecei na Coinbase, uma corretora de criptografia, onde eu estava mais interessado no Bitcoin.

Eles têm uma API através da qual você pode conectar seu software favorito de negociação como Metatrader ou similares. Mas não.

O plano, é claro, não é fazer interface com o nosso software de negociação favorito. Ao invés disso, foi minha idéia construir minha própria interface a partir do zero com minhas necessidades em mente. Foi incrivelmente difícil e uma curva de aprendizagem muito íngreme, mas certamente valeu a pena o esforço.

A primeira versão alfa está pronta. A interface é muito feia, mas a forma segue a função. A minha ideia de software bem desenhado não é principalmente uma interface de utilizador extravagante. Em vez disso, quero que o meu software simplesmente faça a sua coisa. Absolutamente. No fundo. Nada para instalar, nada para sentar na frente do ecrã e dizer ao software o que fazer a seguir. Basta correr e assistir com fascínio.

A interface consiste essencialmente numa visualização dos dados de mercado, bem como dos dados de entrada normalizados para a IA.

O que é que eu aprendi? Primeiro, tive de me ligar à Coinbase. Eu aprendi muito sobre APIs e felizmente com os pacotes disponíveis foi bastante fácil.

Introdução ao aspecto de desempenho da programação

Eu tive que aprender muito sobre estruturação de dados para IA, e isso basicamente envolveu muito conhecimento sobre performance de código. Ao ponto de ficar completamente louco. Foi sobretudo por eu ainda trabalhar na minha máquina de 7 anos que voltei do meu treino. Está a envelhecer bem, mas pode realmente sentir a idade.... A partir do meu próximo computador iminente, posso esperar cerca de 10x o desempenho para os meus casos de uso! Só o processador é cerca de 400% mais rápido se consumir muitos fios (o que eu faço).

Eu me encontrei na seguinte situação:

Meu código leva cerca de uma semana para processar 8 anos de dados (cada ponto de dados é de 2s ~ 126.000.000 pontos de preço). Entretanto, a próxima geração de processadores e placas gráficas está apenas a alguns meses de distância e é muito promissora.

A quantidade de dados a serem processados é imensa, e por isso entrei na otimização da performance do código. Eu já tinha alguma experiência com trabalhadores multi-tarefa para lidar com várias tarefas simultaneamente. Como resultado, eu já tinha um pouco menos de 3,5x de desempenho desde que a minha CPU tem 4 núcleos. Estava agora a levar dois dias para processar dados no valor de 8 anos. Isso ainda foi demais. Quando eu fizer os testes, quero ver os resultados. E eu quero-os depressa.

Eu tive que olhar mais para a otimização de desempenho e desenvolver minha própria abstração de trabalhadores com base na tarefa em C#. Basicamente, ele implementa um método de fabricação que aprendi no meu estágio no INA Lahr. É como ter uma máquina (ou um trabalhador) com uma fila de entrada e uma fila de saída. A fila age como um buffer e pode ajudar cada núcleo da cpu a distribuir o trabalho uniformemente. É como uma tubulação modular e escalável de trabalhadores onde os trabalhadores podem pegar itens de uma fila ou saco e processá-los.

Isto também deu um grande impulso ao desempenho. Agora consegui processar todos os dados em cerca de uma noite, mas decidi replicá-los ainda mais só para ver até onde poderia ir. Eu assinei uma extensão do Visual Studio "dotTrace" que funciona muito bem para encontrar gargalos dentro do código. É possível gravar um rastreamento e depois ver função por função quanto tempo leva para ser executado. Encontrei uma característica que não estava nada à espera - o construtor de cordas de saída asfixiou todo o gasoduto. Você pode ler mais sobre isso noquestão do extravasamento da pilha

Em suma, o processo é bastante simples:

  1. Identificar a maior carga de energia
  2. Eliminá-lo
  3. Continue a fazer isto até ter um desempenho razoável.

No exemplo acima, este seria o processo do trabalhador CLR com o ID 10584. Isto parece um pouco confuso neste ponto, mas a JetBrains tem a árvore de chamadas à direita onde podemos ver qual função está sendo usada:

Conclusões e tomadas de posição

Eu sei que haveria mais poder nesta área, mas por enquanto estou muito feliz com o resultado.

Neste momento, 2 anos voam em menos de 4 minutos, e eu mudei de velocidade se quisermos que as acções sejam observadas mais de perto.

captura de ecrã do retrovisor

A linha do patrimônio líquido, bem como as estatísticas, também são salvas. É possível simular/executar quantas contas e estratégias você quiser, com apenas uma pequena queda no desempenho.

Eu já tentei estratégias diferentes com indicadores e assim por diante. Sem resultados promissores. Afinal, eu encontrei uma estratégia vencedora que não faz nada disso. Não segue a tendência nem aposta contra ela. Não tenta prever nada. Nem o ponto de entrada perfeito nem a saída perfeita. É bastante simples, mas não vou entrar nos detalhes da estratégia. Pense fora da caixa e talvez encontre alguma coisa.

linha de equidade a subir

Isso é um retorno anual de 20%. Para ser justo, eu teria arranjado mais espaço com a estratégia de comprar e segurar, mas por outro lado, não estou a prever nada, não temos estes picos (e tombos) insanos.

Isso é algo que eu posso construir e ver o que é possível e o que não é. Uma simulação completa do mercado na caixa de areia. Um ambiente de teste com possibilidades quase ilimitadas.

É tudo por hoje, e espero que tenham gostado do vislumbre de alguns dos meus projectos em curso.