Suavizar una serie ruidosa y hallar su ritmo
Un filtro convierte una serie en otra mezclando cada valor con sus vecinos. Una media móvil de días es el filtro más simple: cada salida es el promedio de las últimas entradas, así que el ruido disminuye pero la salida también se retrasa. Una media móvil exponencial (MME) da más peso a los días recientes: , donde es el peso de suavizado. signal.lfilter(b, a, x) ejecuta un filtro así sobre una serie, usando solo valores pasados y presentes. El retraso medio de una MME es días, y el de una media móvil de días es días, así que una media de 19 días y una MME con se retrasan ambas unos 9 días.
La segunda tarea es hallar ciclos. signal.periodogram(x) reparte la varianza de una serie por frecuencias, medidas en ciclos por día. Un pico en la frecuencia indica un patrón repetido de periodo días. Con una observación por día solo se ven frecuencias hasta ciclos por día, el límite de Nyquist, porque un ciclo más rápido no se distingue de uno más lento. Una advertencia importa muchísimo al operar. signal.filtfilt pasa el filtro hacia delante y luego hacia atrás, lo que elimina el retraso, pero entonces cada salida usa valores futuros. Una señal construida con filtfilt parece perfecta en un backtest y no se puede operar, porque los datos de mañana no están disponibles hoy. Use solo filtros causales como lfilter para todo lo que piense operar.
- Suavizar cuesta retraso: una ventana más larga o un menor quita más ruido y retrasa más la señal.
- Periodos a partir de picos: un pico del periodograma en la frecuencia significa un ciclo de días, hasta un límite de 0,5 ciclos por día.
- Solo filtros causales para operar:
filtfiltusa el futuro, así que sirve para análisis, nunca para una señal real.
Lab: qué se califica
- Un paso de MME10 pts
- Una media móvil10 pts
- El peso para una ventana10 pts
- Un periodo a partir de una frecuencia10 pts
- El retraso de una MME10 pts
- Qué hace cada rutina15 pts
- Por qué filtfilt no se puede operar35 pts