Suavizar uma série ruidosa e achar seu ritmo
Um filtro transforma uma série em outra misturando cada valor com seus vizinhos. Uma média móvel de dias é o filtro mais simples: cada saída é a média das últimas entradas, então o ruído diminui, mas a saída também atrasa. Uma média móvel exponencial (MME) dá mais peso aos dias recentes: , em que é o peso de suavização. signal.lfilter(b, a, x) roda um filtro assim sobre uma série, usando só valores passados e presentes. O atraso médio de uma MME é dias, e o de uma média móvel de dias é dias, então uma média de 19 dias e uma MME com atrasam ambas cerca de 9 dias.
A segunda tarefa é achar ciclos. signal.periodogram(x) reparte a variância de uma série por frequências, medidas em ciclos por dia. Um pico na frequência indica um padrão repetido de período dias. Com uma observação por dia só se veem frequências até ciclo por dia, o limite de Nyquist, porque um ciclo mais rápido não se distingue de um mais lento. Um aviso importa muitíssimo em trading. signal.filtfilt passa o filtro para a frente e depois para trás, o que elimina o atraso, mas então cada saída usa valores futuros. Um sinal construído com filtfilt parece perfeito num backtest e não pode ser negociado, porque os dados de amanhã não estão disponíveis hoje. Use só filtros causais como lfilter para tudo que pretende negociar.
- Suavizar custa atraso: uma janela maior ou um menor remove mais ruído e atrasa mais o sinal.
- Períodos a partir de picos: um pico do periodograma na frequência significa um ciclo de dias, até o limite de 0,5 ciclo por dia.
- Só filtros causais para negociar:
filtfiltusa o futuro, então serve para análise, nunca para um sinal real.
Lab: o que é avaliado
- Um passo de MME10 pts
- Uma média móvel10 pts
- O peso para uma janela10 pts
- Um período a partir de uma frequência10 pts
- O atraso de uma MME10 pts
- O que cada rotina faz15 pts
- Por que filtfilt não pode ser negociado35 pts