Desenvolvimento

31 out, 2012

Análise e previsão de séries temporais. Abordagem de programação – pensamentos

Publicidade

“Certas coisas são impossíveis… Até aparecer um ignorante que não está ciente disso”.

Séries temporais – uma sequência de pontos de dados, tipicamente medidos em instantes de tempo sucessivos espaçados em intervalos de tempo uniformes.

Existem várias coisas que podem se enquadrar nessa definição. Por exemplo, as mudanças de temperatura ao longo do dia (digamos, medidas de hora em hora), a distância da Terra até a Lua (que muda um pouco ao longo do mês lunar). Até mesmo que partido político detém a cadeira presidencial após as eleições (que depende da “história” do presidente anterior etc.). Podemos continuar com a lista de exemplos, até que o armazenamento do servidor fique cheio. Como você pode ver, os exemplos acima têm natureza cíclica, mas tudo também é (ou pelo menos tudo) em séries temporais (claro, dentro de certos divergências).

É da natureza humana querer prever o futuro (embora, às vezes, é melhor não saber). Estão sendo feitas tentativas de prever, ou vamos usar um termo mais politicamente correto – previsão, onde determinadas séries continuarão no futuro. O melhor exemplo podem ser xamãs prevendo a chuva ou a seca. Atualmente, existem algoritmos complexos (e não tão complexos) para prever séries temporais (por exemplo, redução de ruído em processamento de sinal digital). Mas o argumento mais escandaloso e barulhento está rolando sobre a análise do mercado de ações e previsões. Muitos de vocês podem ter ouvido falar sobre William Gann – alguns dizem que ele é um gênio, outros dizem que ele não passa de um charlatão. Eu, pessoalmente, tendo a tomar o primeiro lado, embora podem haver fatos dos quais eu não esteja ciente.

Mr. Gann morreu há quase 60 anos. Imagine agora quantas técnicas de séries temporais de previsão (leia previsão do mercado de ações) já surgiram e desapareceram. Desde a teoria do caos, mais e mais pessoas tendem a dizer que “a previsão do mercado de ações é impossível devido à sua natureza fractal”. Isso faz sentido se você olhar para o problema pela perspectiva da teoria do caos. Entretanto, não se esqueça de que essa teoria é aceita como aquela que melhor se encaixa à situação,  não como aquela que a explica completamente. Na minha percepção, essa pequena diferença deixa um pequeno espaço para esperança.

Bem, já falei muito sobre ciência. Vamos à prática. Vou tentar simplificar as coisas o máximo possível para demonstrar uma abordagem mais simples, mas efetiva, do ponto de vista de um desenvolvedor.

Software

Da perspectiva do software, não há muita necessidade de previsões bem sucedidas – um sistema expert. Pessoas inteligentes usam diferentes pacotes de software e linguagem de programação voltadas para o desenvolvimento de sistemas expert, mas sendo um ignorante (como eu decidi ser neste artigo), decidi usar o que tenho e o que sei – linguagem C, GCC e editor de texto Geany como uma IDE.

Dados

Existem várias maneiras (gráficas) de representar o mercado de ações/câmbio. O mais conhecido é o candlesticks. Uma sequência de dados gráficos simples, dos quais cada um deles representa a variação do preço para um determinado período de tempo (aberto, alto, baixo e valores próximos). Nós, no entanto, não vamos levar nenhum deles em consideração. Simplesmente porque não precisamos deles. Em vez disso, vamos nos concentrar na linha crua de números por um período determinado (digamos que um ano) medido de hora em hora, o que nos dá uma sequência de mais de 8 mil itens (só estamos prestando atenção a um valor – ou aberto, de alta, baixa ou perto).

Se você tentar traçar essa sequência (por exemplo, no Excell), você vai obter uma linha curvilínea. Dê outra olhada e vai notar que existem segmentos semelhantes (dentro de certos desvios, é claro). Apenas como um conjunto de imagens semelhantes, o que criaria uma das melhores abordagens para reconhecimento de imagem – Redes Neurais Artificiais (especialmente perceptrons), embora não exista nada de novo no uso de RNA para análise de mercado ações/câmbio. Existem toneladas de produtos comerciais de software que proporcionam ao usuário final diferentes indicadores dizendo a ele/ela se comprar, vender, manter a posição atual, eu, pessoalmente, não tenho visto um monte de tentativas para realmente fazer previsões em longo prazo (por exemplo, 24 horas para uma sequência medida de hora em hora). Há também uma grande incerteza sobre quais dados devem ser usados como entrada de RNA e quantos dados devem ser alimentados de cada vez. Infelizmente, ninguém tem a resposta exata para esta pergunsa. É apenas a sua tentativa e erro. O mesmo se aplica à quantidade de neurônios escondidos no RNA.

Outra grande pergunta é como os dados devem ser pré-processados – preparados para a RNA. Alguns usam algoritmos complexos (baseados no Fourier, por exemplo), outros tendem a usar os mais simplistas. A ideia é que os dados devem estar no intervalo entre 0.0-1.0 e deveriam ser tão variados quanto possível. Mas lembre-se – se você alimentar a RNA com lixo, você terá lixo em resposta. O que significa que você tem de escolher cuidadosamente o seu algoritmo de pré-processamento de dados (normalização). Eu costumo usar um algoritmo de normalização personalizado, que é bastante simples. Desculpe desapontá-lo, mas eu não vou fornecê-lo aqui por enquanto, já que ele ainda não está completamente definido (embora ele já dê bons resultados).

O ponto principal para este parágrafo é que pré-processamento de dados não é muito importante, é o MAIS importante.

Instrumentos

Minhas soluções de programação para esse problema são bem simples: um programa de console que lê a entrada (toda a sequência de valores de preços para o período especificado), treina uma rede neural artificial (no meu caso, a topologia foi 8x24x1 – 8 entradas, 24 neurônios ocultos e um neurônio de saída) e, em seguida, produz uma previsão de longo prazo (pelo menos 7 entradas no futuro), enquanto cada passo da previsão é feito usando os valores que foram gerados anteriormente.

A RNA é um perceptron simples multicamadas com 8 entradas, 24 neurônios ocultos e um neurônio de saída. Basicamente falando: não realizamos muitos cálculos nós mesmos. A RNA é uma implementação perfeita de um paradigma de aprendizagem, capaz de encontrar dependências e regras escondidas. Portanto, se você me perguntar, não existe solução melhor do que utilizar RNAs para a previsão de séries temporais.

Teste

Então, eu implementei uma RNA (em C desta vez, não em Assembly) e obtive o conjunto de dados (os valores EUR/USD de preço para cada hora do ano passado). O próximo passo foi fazer uma tentativa e testar em tempo de execução. Eu decidi fazer isso durante o fim de semana, já que eu não tinha certeza de quanto tempo seria necessário para treinar a rede. Surpreendentemente, tive um erro bom após apenas cerca de 30 mil epochs (alguns minutos). A imagem a seguir mostra o que eu consegui:

 previsão EUR / USD

Conjunto de teste – dados não incluídos no processo de treinamento da RNA. Utilizado como um padrão para o cálculo de erro.

Previsão de teste – previsão em dados do passado, que não foram incluídos no conjunto de treinamento.

Previsão real – previsão dos valores futuros. Isso foi feito no sábado pelo menos 24 horas antes da abertura do pregão seguinte.

Dados reais – valores reais obtidos na segunda-feira de manhã cedo após o novo pregão começar.

Como você pode notar, um sistema tão simples foi capaz de prever o espaço entre as duas sessões.

P.S. Embora, este artigo não contenha o código-fonte, nenhuma descrição de qualquer técnica de programação interessante ou o que quer que seja,  ele mostra que cada problema tem uma solução (não necessariamente complicada). Na maioria das vezes, a coisa mais importante é dar uma olhada em um problema com outros olhos.

***

Texto original disponível em http://syprog.blogspot.com.br/2012/09/time-series-analysis-and-forecasting.html