Pyne é um sistema para criar programas que trabalham com dados de mercado. Com eles, você pode calcular e exibir valores derivados dos preços ou definir as regras de uma estratégia de trading. Neste livro, vamos percorrer esse trabalho desde a escrita do programa até a conferência dos resultados.

O que chamamos de Pyne code?

Escrevemos os programas em Pyne code. É uma linguagem própria, criada para processar dados de mercado. O código descreve o que o sistema deve calcular, o que deve mostrar e quais condições devem ser atendidas para realizar uma operação.

Um indicador pode, por exemplo, calcular o preço médio dos últimos dez candles e desenhar uma linha no gráfico de preços. O gráfico de preços (chart, em inglês) mostra a variação dos preços ao longo do tempo. Uma estratégia também define regras de entrada e saída: por exemplo, abre uma posição de compra quando uma condição é atendida. Ao executá-la com dados históricos, você pode verificar quais operações essas regras teriam produzido sob as condições de execução definidas. Esse teste é chamado de backtest.

Primeiro, vamos criar indicadores simples. Eles ajudam você a conhecer os dados e a linguagem antes de escrever regras de trading.

Pyne code usa as regras de escrita de Python. Chamamos essas regras de sintaxe: elas determinam, por exemplo, onde ficam os parênteses e como indicamos quais linhas pertencem ao mesmo bloco. Não é necessário estudar Python antes; você conhecerá as regras necessárias por meio dos exemplos do livro.

Por isso, os arquivos usam a extensão .py, comum em Python. Pyne code também pode ser executado em um ambiente Python com o PyneCore instalado. Python fornece o ambiente de execução; o PyneCore fornece o comportamento próprio de Pyne e sua biblioteca de funções.

Como o programa trabalha com os dados?

Nos exemplos, recebemos os dados de mercado como uma sequência de candles. Cada candle resume os dados de um intervalo de tempo, incluindo seus preços de abertura e fechamento. Em dados diários, um candle representa um dia.

O PyneCore executa os cálculos do programa nesses candles, em sequência. Por exemplo, pode recalcular uma média a cada candle com os preços disponíveis até aquele momento. Também gerencia os valores anteriores dos cálculos e os dados que precisam ser preservados entre candles.

Esse comportamento é diferente do de um programa Python comum. A marcação @pyne, no início do arquivo, informa ao PyneCore que ele deve preparar e executar o código dessa maneira. No capítulo que explica o código, veremos a forma exata dessa marcação e o significado de edge, que aparece ao lado dela nos exemplos do livro.

Qual é a diferença em relação ao processamento vetorizado?

Entre os frameworks de trading baseados em Python, há soluções que trabalham candle a candle e soluções vetorizadas. No processamento vetorizado, as operações são feitas sobre sequências inteiras de números: por exemplo, você calcula de uma só vez as médias e os sinais de compra de todos os candles. Nesse caso, os dados costumam ser tratados em tabelas ou arrays.

No PyneCore, você descreve o que deve acontecer no candle atual. O sistema executa essas instruções e avança para o próximo candle. O histórico dos cálculos e o estado a preservar são gerenciados segundo as próprias regras da linguagem Pyne.

Escreva os passos em uma função simples

Em vários frameworks que trabalham candle a candle, você precisa criar uma classe para definir sua estratégia. A classe reúne os dados e as operações relacionados a ela; as funções definidas dentro dela são chamadas de métodos. Nesse modelo, você escreve as configurações e regras de trading nos métodos exigidos pelo framework, e acessa os preços ou a posição por meio dos dados da classe.

Nos exemplos de Pyne code, você escreve em uma função main() o que quer calcular e em quais condições quer agir. As linhas da função são executadas em sequência a cada candle processado: primeiro você calcula um valor, depois verifica uma condição e, por fim, desenha um sinal ou envia uma ordem. O PyneCore cuida de percorrer os candles.

Assim, para começar, você não precisa aprender a criar classes, usar herança ou distribuir seu programa entre os métodos de um framework. Nos exemplos simples, basta conhecer variáveis, chamadas de função e condições, que serão apresentadas nos próximos capítulos.

Acompanhe as regras em ordem cronológica

Isso se aproxima de como você raciocina sobre uma decisão de trading: “Olho o preço atual e o movimento até agora. Se minha condição for atendida, entro. Enquanto houver uma posição aberta, acompanho a condição de saída.” No código, você pode seguir os acontecimentos nessa mesma ordem e usar o depurador para examinar as variáveis em um candle específico.

É mais difícil usar dados futuros por engano

No processamento vetorizado, toda a série de dados pode estar disponível. Um deslocamento na direção errada ou uma média mal definida pode incluir no cálculo um preço que ainda não era conhecido no momento da decisão. Por exemplo, usar a média de preços do ano inteiro para tomar decisões em janeiro também usaria preços dos meses seguintes. O programa pode continuar funcionando e apresentar resultados convincentes; o erro pode ser difícil de perceber. Isso é chamado de viés de antecipação, ou look-ahead bias, em inglês.

As séries temporais de Pyne disponibilizam os valores do candle atual e dos candles já processados. Ao consultar o histórico, você não consegue ler o preço do próximo candle. Isso reduz o risco de usar dados futuros por engano e facilita verificar quais informações deram origem a uma decisão.

Ainda é preciso ter cuidado ao preparar os dados. Se uma fonte externa já contiver uma informação que só ficou disponível depois, a execução candle a candle, por si só, não consegue detectar esse problema.

Pode haver um custo em velocidade

Para alguns programas, a execução candle a candle pode ser mais lenta do que um cálculo vetorizado bem escrito. Isso pode fazer diferença quando você testa muitas estratégias ou combinações de parâmetros sobre um grande conjunto de dados. Sistemas vetorizados costumam acelerar esses cálculos em massa com bibliotecas numéricas otimizadas. A diferença real depende do programa e da quantidade de dados.

Neste livro, você vai aprender a trabalhar candle a candle: formular regras em ordem cronológica e verificar as informações que levaram a cada decisão.

Outras abordagens: processamento vetorizado no VectorBT e estratégias candle a candle no Backtrader (em inglês).

Para que servem o PyneIDE e o PyneCore?

O PyneIDE é uma extensão do editor Visual Studio Code. Nele, você escreve o programa, escolhe os dados e inicia a execução. Também é nele que examina o resultado no gráfico e procura erros.

O PyneCore é o sistema que executa os programas. Ele carrega e prepara o programa, processa os candles e produz os resultados dos cálculos e das operações de trading. O PyneIDE usa o PyneCore nos bastidores e mostra os resultados.

No próximo capítulo, você vai configurar o PyneIDE e criar seu primeiro projeto. Para aprender, usaremos dados de exemplo, permitindo executar o mesmo programa várias vezes e comparar os resultados das suas alterações.