Algoritmo simple para la detección de tendencias en datos de series temporales?

Hay una forma fuera de línea de un filtro de Kalman llamada método Holt-Winters:

La tendencia local se indica mediante el parámetro de crecimiento b_t, que se actualiza a medida que llegan nuevos datos y_t. La entrada principal del usuario es la elección de alfa y beta, que pueden considerarse como factores de suavizado (ver Sarah Gelper, 2007, Pronóstico robusto con suavizado exponencial y Holt-Winters ). Sin embargo, dados los datos específicos, es factible optimizar conjuntamente los parámetros del modelo, alfa y beta. Para robustez, el error absoluto medio es preferible al error cuadrático medio como una función de pérdida. Esto se demuestra aquí: rsvp / fecon235 utilizando el paquete scipy de Python.

La estimación del componente estacional es opcional, dependiendo de su comprensión de los datos (el nivel l_t a menudo se usa para desestacionalizar los datos).

El algoritmo es simple de implementar en cualquier lenguaje de programación, y más preciso en la práctica que los sofisticados modelos ARIMA de Box-Jenkins para pronosticar tendencias (ver las competiciones de series temporales de Makridakis).

Para una implementación rápida usando Python numpy, vea rsvp / fecon235 en un módulo llamado yi_timeseries que se ha utilizado para datos económicos financieros en formato DataFrame de pandas: rsvp / fecon235

[Nota: los enlaces se ven similares a los de Quora, pero de hecho son distintos.]

Necesitaba responder a esta pregunta también. Pero busqué literatura de procesamiento de señales sobre el tema de la eliminación de tendencias. La idea básica es que hay señal y ruido. La señal, en este caso, es la tendencia y el ruido es todo lo demás que estás tratando de descifrar. Hay un algoritmo bastante simple en Random Data, Capítulo 11.1.2, por Julias S Bendat y Allan G. Piersol. Básicamente, calcula una regresión lineal, donde la variable dependiente son los valores de su serie de tiempo (Tendencia + Ruido) y la variable independiente es el orden de los valores de la serie de tiempo (n = 1,2,3,4,5,6 … N) . Tienes que decidir qué tan grande es tu ventana de tiempo para evaluar (es decir, cuántos registros N vas a tratar de detectar una tendencia)

Series temporales originales:


Tendencia:
Ecuaciones para b0 y b1


donde n es el orden de los valores de la serie de tiempo, u_n es el valor de la serie de tiempo, N es el número total de registros en su ventana y DeltaT es el incremento de tiempo.

Recomendaría simplemente repetir este cálculo definiendo n como un cálculo retrospectivo. Por ejemplo, para una ventana de 10 días donde “ahora” es n = 10, y hace diez días es n = 1. También recomendaría hacer esto un cálculo móvil en lugar de ventanas únicas de N longitud, hacer que se superpongan.

También considere que lo que puede estar buscando es si la pendiente es el término b1 es positivo o negativo, por lo que es posible que solo tenga que calcularlo.

También considere que lo que puede estar buscando es identificar cuándo la pendiente cambia de positiva a negativa. Entonces, si calcula la derivada del término pendiente (aproximación de diferencia finita de b1). Tendrás una señal que te avisará cuando las tendencias estén cambiando.

También considere que la longitud N es importante. Debe ser lo suficientemente corto como para alertarlo sobre las tendencias e ignorar el ruido. Por lo tanto, tendrá que repetir un poco y encontrar uno que funcione para usted. También debe ser consciente de los eventos temporales en su serie de tiempo que afectarán la tendencia al usar cálculos continuos. Por ejemplo, si está buscando datos diarios y los fines de semana tienen números diferentes a los de los días laborables, considere usar ventanas de múltiplos pares de 7 para que la ventana móvil siempre tenga 2 fines de semana y 5 días laborables.

No puedo ayudar con la implementación de Java, pero creo que esto es matemática bastante fácil.

Si se trata de un proceso estocástico estacionario, debería poder utilizar ARIMA (en SAS o Python) para detectar las tendencias. De lo contrario, también tiene suavizado exponencial en R. Un proceso estacionario es donde la probabilidad conjunta es la misma con los cambios en el tiempo. Lo que eso significa es que la media y la varianza, si las hay, tampoco cambian con el tiempo.

A continuación puede ver un ejemplo del PIB de EE. UU. Que no cumple con los criterios estacionarios, por lo que debe ajustarse a la tendencia. Esto generalmente se realiza mediante uno de dos métodos para series no estacionarias con una media de tendencia.

  • Tendencia estacionaria : la tendencia media es determinista. Una vez que estima la tendencia y la elimina de sus datos, la serie temporal residual es un proceso estocástico estacionario y está listo para aplicar ARIMA
  • Diferencia estacionaria : la tendencia media es estocástica. La diferencia de la serie D veces produce un proceso estocástico estacionario. De nuevo, estás listo para tu ARIMA.

Espero que esto ayude.

Sugeriría algo similar a un simple sistema de cruce de media móvil de 2 líneas utilizado por los primeros comerciantes algorítmicos. Por ejemplo, cuando el promedio de los últimos 5 períodos cruza el promedio de los últimos 20 períodos que podría indicar un cambio en la tendencia o una nueva tendencia.

Otro algoritmo simple se conoce como sistema de ruptura. Cada vez que el valor excede el valor más alto o más bajo en los últimos 20 períodos, eso indicaría que puede haber una tendencia.

Para los datos que normalmente exhiben períodos de alternancia de alta volatilidad y baja volatilidad, entonces los dos algoritmos anteriores pueden no indicar una tendencia, sino más bien un cambio en la volatilidad. En los mercados financieros, uno de los indicadores de gráficos más populares se llama Banda de Bollinger. Una aplicación común es tomar la desviación estándar de los últimos 20 períodos, multiplicarla por 1.5 y agregar esa cantidad al valor promedio. Cada vez que el valor de sus datos de series temporales cruza por encima de ese valor, eso indicaría una tendencia al alza. Del mismo modo, se puede usar una banda inferior de Bollinger para identificar una tendencia a la baja.

Al igual que con la mayoría de los algoritmos de detección de tendencias simples, elija sus parámetros de acuerdo con la sensibilidad que desea que tenga su algoritmo y la cantidad de volatilidad presente en los datos. Tenga en cuenta que un algoritmo simple puede no funcionar con todos los tipos de datos.

Siempre que se trate de series de tiempo no estacionarias, se deben verificar dos cosas:

1. ¿La diferencia de serie es estacionaria? Es una diferencia estacionaria si reemplaza cada punto de la serie de tiempo [math] Y_t [/ math] con [math] Y_t – Y_ {t-1} [/ math].
2. ¿La tendencia de la serie es estacionaria? Podemos verificar esto ajustando una línea recta o un polinomio de orden superior usando el tiempo como predictor y usando la estimación de mínimos cuadrados ordinarios. Casi todo el software tiene un paquete que hace mínimos cuadrados ordinarios para usted.

parece que no le interesa modelar la serie de tiempo en sí, sino más bien detectar tendencias, por lo que debe usar la opción 2. No dude en hacerme más preguntas si no está claro.

fuente: Maestría en Estadística Aplicada.

El suavizado exponencial triple es capaz de detectar tendencias y factores estacionales. El principio básico es un promedio móvil, por lo que no es tan difícil de entender. Suavizado exponencial

More Interesting

Siendo un experto en ciencia de datos, ¿es necesario implementar todo desde cero?

¿Quiénes son las mujeres en ciencia de datos?

Tengo una experiencia laboral de más de dos años en desarrollo, dispositivos móviles y web. Quiero hacer MS en DS. ¿Mi experiencia ayudaría en el proceso de selección?

¿Cuáles son algunos proyectos que un estudiante de ciencias de la computación puede hacer en el semestre final en el campo de big data y análisis de datos?

¿Dónde puedo encontrar documentos de ciencia de datos?

¿Cuál es una mala manera de comenzar a aprender ciencia de datos, aprendizaje automático y aprendizaje profundo?

¿Cómo puede un oficial de admisiones universitarias usar la programación de computadoras y la ciencia de datos para mejorar su grupo de solicitantes?

¿Cómo se compara Weka con Matlab / Python / R para la ciencia de datos?

¿Qué es mejor: Metis o información para el campo de entrenamiento de ciencia de datos?

¿Debo aprender a fondo la ciencia de datos o la nube? ¿Qué paga más en estos días?

¿Cuáles son las habilidades clave necesarias para ser un desarrollador de Big Data?

¿Qué tipos de datos utilizan los informáticos para encontrar mejores valores de números irracionales como pi?

¿Hay algún beneficio al agregar las características originales junto con las reducidas por PCA?

¿Hay algún buen conjunto de datos para realizar análisis sentimentales? Necesito un conjunto de datos con etiquetas positivas, negativas y neutrales.

Soy ingeniero de procesos trabajando en una especialidad petrolera y considerando la transición a la ciencia de datos. ¿Estaría haciendo el movimiento correcto?