usadas simple promedio ponderado ponderada móvil mt4 moviles movil medias mas exponencial cómo como calcular calcula math signal-processing average digital-filter

math - simple - medias moviles mas usadas



Promedio móvil exponencial muestreado en diferentes tiempos (8)

Tengo un valor continuo para el cual me gustaría calcular un promedio móvil exponencial . Normalmente solo usaría la fórmula estándar para esto:

  • S n = αY + (1-α) S n-1

donde S n es el nuevo promedio, α es el alfa, Y es la muestra, y S n-1 es el promedio anterior.

Lamentablemente, debido a varios problemas, no tengo un tiempo de muestreo constante. Puedo saber que puedo tomar muestras como máximo, por ejemplo, una vez por milisegundo, pero debido a factores fuera de mi control, es posible que no pueda tomar una muestra durante varios milisegundos a la vez. Un caso probablemente más común, sin embargo, es que simplemente muestreo un poco temprano o tarde: en lugar de muestrear a 0, 1 y 2 ms. Muestro en 0, 0.9 y 2.1 ms. Anticipo que, independientemente de los retrasos, mi frecuencia de muestreo estará muy, muy por encima del límite de Nyquist, y por lo tanto no necesito preocuparme por el aliasing.

Creo que puedo lidiar con esto de una manera más o menos razonable variando el alfa apropiadamente, basado en el tiempo transcurrido desde la última muestra.

Parte de mi razonamiento de que esto funcionará es que la EMA "se interpola linealmente" entre el punto de datos anterior y el actual. Si consideramos calcular una EMA de la siguiente lista de muestras a intervalos t: [0,1,2,3,4]. Deberíamos obtener el mismo resultado si usamos el intervalo 2t, donde las entradas se vuelven [0,2,4], ¿verdad? Si la EMA hubiera asumido que, en t 2 el valor hubiera sido 2 desde t 0 , eso sería lo mismo que el cálculo del intervalo t calculado en [0,2,2,4,4], lo que no está haciendo. ¿O eso tiene sentido?

¿Puede alguien decirme cómo variar el alfa de forma apropiada? "Por favor muestra tu trabajo". Es decir, muéstrame las matemáticas que prueban que tu método realmente está haciendo lo correcto.


Al usar un α ligeramente diferente que es igual a (1-α el de la pregunta ), la fórmula básica para agregar un nuevo valor Y a un promedio existente de S 0 se ve así:

S (Y, S 0 ) =

(1-α) Y + αS 0 =

Y - αY + αS 0 =

Y + α (S 0 -Y)

Si ahora agregamos la longitud del intervalo de tiempo t y suponemos que solo α depende de esa t, esa fórmula se ve así:

S (Y, t, S 0 ) = Y + α t (S 0 -Y)

Ahora supongamos que t = t 1 + t 2 . Si el promedio se crea agregando dos valores de Y para los intervalos de tiempo t 1 yt 2 , el promedio resultante se ve así:

S (Y, t 2 , S (Y, t 1 , S 0 )) =

Y + α t 2 (S (Y, t 1 , S 0 ) - Y) =

Y + α t 2 ((Y + α t 1 (S 0 -Y)) - Y) =

Y + α t 2 α t 1 (S 0 -Y)

Si este promedio fuera el mismo que si se hubiera agregado todo el intervalo t de una vez, se sigue que α t = α t 1 α t 2 . Una definición de α que cumple este requisito sería:

αx: = A x (para alguna constante A)

Porque:

α t = A t = A t 1 + t 2 = A t 1 A t 2 = α t 1 α t 2

Esto da como resultado la siguiente función de promediado:

S (Y, t, S 0 ) = Y + A t (S 0 -Y)

Realmente no he probado esto, pero si las suposiciones que hice se ajustan a su escenario, esto parece una función de promedio que puede manejar las variaciones en los intervalos de muestreo bastante bien.


Cualquier respuesta a esta pregunta, o cualquier prueba de corrección de dicha respuesta, depende en gran medida de los datos que está midiendo.

Si sus muestras fueron tomadas en t 0 = 0ms, t 1 = 0.9ms y t 2 = 2.1ms, pero su elección de α se basa en intervalos de 1 ms, y por lo tanto desea una αn ajustada localmente, la prueba de la corrección de la elección significa conocer los valores de la muestra en t = 1ms yt = 2ms.

Esto lleva a la pregunta: ¿Puede interpolar sus datos de forma resonable para tener una buena suposición de lo que podrían haber sido los valores intermedios? ¿O puedes incluso interpolar el promedio en sí mismo?

Si ninguno de estos es posible, entonces, hasta donde yo lo veo, la elección lógica de un valor intermedio Y (t) es el promedio calculado más recientemente , es decir, Y (t) ≈ S n donde n es maxmial tal que t n <t.

Esta elección tiene una simple consecuencia: dejar α solo, sin importar la diferencia de tiempo.

Si, por otro lado, es posible interpolar sus valores, esto le dará muestras promediables de intervalos constantes. Por último, si incluso es posible interpolar el promedio en sí mismo, eso dejaría sin sentido la pregunta.


Dejaría solo el valor alpha y completaría los datos faltantes.

Como no sabe qué sucede durante el tiempo en que no puede muestrear, puede llenar esas muestras con 0 o mantener el valor anterior estable y usar esos valores para la EMA. O alguna interpolación hacia atrás una vez que tiene una nueva muestra, complete los valores que faltan y vuelva a calcular la EMA.

Lo que trato de decir es que tienes una entrada x[n] que tiene agujeros. No hay forma de evitar el hecho de que le faltan datos. De modo que puede usar una retención de orden cero, o establecerla en cero, o algún tipo de interpolación entre x[n] x[n+M] , donde M es el número de muestras faltantes y n el comienzo de la brecha. Posiblemente incluso usando valores antes que n .


Digamos que nos gustaría hacer un promedio decreciente exponencial en una función continua. Sin embargo, no tenemos todos los valores de esa función, solo unas pocas muestras. Esta fórmula haría un promedio ponderado de las muestras que tenemos con los pesos que tendrían en el promedio continuo.

Multiplicador n = Tiempo alfa n -Tiempo n-1

Sum n = Val n + Sum n-1 * Multiplicador n

Recuento n = 1 + Recuento n-1 * Multiplicador n

Prom n = Sum n / Count n


Eche un vistazo aquí: http://www.eckner.com/research.html

Mire el segundo enlace: "Algoritmos para series temporales espaciadas irregularmente: promedios móviles y otros operadores rotativos"

El documento describe exactamente los algoritmos de programación que necesita, creo.


Esta no es una respuesta completa, pero puede ser el comienzo de una. Llegué con esto en una hora más o menos tocando; Lo estoy publicando como un ejemplo de lo que estoy buscando, y tal vez una inspiración para otros que trabajan en el problema.

Comienzo con S 0 , que es el promedio resultante del promedio anterior S -1 y la muestra Y 0 tomada en t 0 . (t 1 - t 0 ) es mi intervalo de muestra y α se establece en lo que sea apropiado para ese intervalo de muestra y el período durante el cual deseo promediar.

Consideré lo que sucede si pierdo la muestra en t 1 y en su lugar tengo que conformarme con la muestra Y 2 tomada en t 2 ? Bueno, podemos comenzar expandiendo la ecuación para ver qué habría pasado si hubiéramos tenido Y 1 :

  • S 2 = αY 2 + (1-α) S 1 , donde S 1 = αY 1 + (1-α) S 0

Sustituyendo:

  • S 2 = αY 2 + (1-α) (αY 1 + (1-α) S 0 )
  • S 2 = αY 2 + (1-α) αY 1 + (1-α) (1-α) S 0
  • S 2 = αY 2 + (1-α) αY 1 + (1-α) 2 S 0

Observo que la serie parece extenderse infinitamente de esta manera, porque podemos sustituir el S n en el lado derecho indefinidamente:

  • S 2 = αY 2 + (1-α) αY 1 + (1-α) 2 (αY 0 + (1-α) S -1 )
  • S 2 = αY 2 + (1-α) αY 1 + (1-α) 2 αY 0 + (1-α) 3 S -1
  • etc.

Ok, entonces no es realmente un polinomio (tonto), pero si multiplicamos el término inicial por uno, entonces vemos un patrón:

  • S 2 = (1-α) 0 αY 2 + (1-α) αY 1 + (1-α) 2 αY 0 + (1-α) 3 S -1

Hm: es una serie exponencial. Quelle sorpresa! ¡Imagine que sale de la ecuación para una media móvil exponencial!

Así que de todos modos, tengo este x 0 + x 1 + x 2 + x 3 + ... cosa que sucede, y estoy seguro de que estoy oliendo e o un logaritmo natural dando vueltas por aquí, pero no recuerdo dónde se dirigía al siguiente antes de que me quedara sin tiempo.


Esta respuesta basada en mi buen entendimiento de los filtros de paso bajo ("promedio móvil exponencial" es realmente solo un filtro de paso bajo de un solo polo), pero mi comprensión nebulosa de lo que estás buscando. Creo que lo siguiente es lo que quieres:

Primero, puedes simplificar tu ecuación un poco (se ve más complicado pero es más fácil en el código). Voy a usar "Y" para la salida y "X" para la entrada (en lugar de S para la salida e Y para la entrada, como lo has hecho).

Y n = αX + (1-α) Y n-1 → Y n = Y n-1 + α (X - Y n-1 )

que codifica a:

Y += alpha * (X-Y);

Segundo, el valor de α aquí es "igual" a 1-e -Δt / τ donde Δt es el tiempo entre muestras, y τ es la constante de tiempo del filtro de paso bajo. Digo "igual" entre comillas porque funciona bien cuando Δt / τ es pequeño en comparación con 1, y α = 1-e -Δt / τ ≈ Δt / τ. (Pero no demasiado pequeño: te encontrarás con problemas de cuantificación, y a menos que recurras a algunas técnicas exóticas usualmente necesitas una resolución de N bits adicional en tu variable de estado S, donde N = -log 2 (α).) Para mayor valores de Δt / τ el efecto de filtrado comienza a desaparecer, hasta llegar al punto donde α está cerca de 1 y básicamente está asignando la entrada a la salida.

Esto debería funcionar correctamente con valores variables de Δt (la variación de Δt no es muy importante siempre que alfa sea pequeña, de lo contrario se encontrará con algunos problemas / alias de Nyquist bastante extraños / etc.), y si está trabajando en un procesador donde la multiplicación es más barata que la división, o los problemas de punto fijo son importantes, precalcula ω = 1 / τ, y considera intentar aproximar la fórmula para α.

Si realmente quieres saber cómo derivar la fórmula

α = 1-e -Δt / τ

luego considere su fuente de ecuación diferencial:

Y + τ dY / dt = X

que, cuando X es una función de paso unitario, tiene la solución Y = 1 - e -t / τ . Para valores pequeños de Δt, la derivada puede aproximarse por ΔY / Δt, produciendo

Y + τ ΔY / Δt = X

ΔY / Δt = (XY) / τ

ΔY = (XY) (Δt / τ) = α (XY)

y la "extrapolación" de α = 1-e -Δt / τ proviene de intentar hacer coincidir el comportamiento con el caso de la función de paso unitario.


Esto es similar a un problema abierto en mi lista de tareas pendientes. Tengo un esquema funcionado hasta cierto punto, pero no tengo el trabajo matemático para respaldar esta sugerencia todavía.

Actualización y resumen: me gustaría mantener el factor de suavizado (alfa) independiente del factor de compensación (al que me refiero como beta). La excelente respuesta de Jason ya aceptada aquí funciona muy bien para mí.

Primer paso.

  • Si también puede medir el tiempo transcurrido desde que se tomó la última muestra (en múltiplos redondeados de su tiempo de muestreo constante, es decir, 7,8 ms ya que la última muestra sería de 8 unidades), podría utilizarse para aplicar el suavizado varias veces. Aplica la fórmula 8 veces en este caso. Efectivamente ha hecho un suavizado más sesgado hacia el valor actual.

Segundo paso.

  • Para obtener un mejor suavizado, debemos ajustar el alfa mientras aplicamos la fórmula 8 veces en el caso anterior.

¿Qué se perderá esta aproximación suavizante?

  • Ya se perdió 7 muestras en el ejemplo anterior
  • Esto se aproximó en el paso 1 con una reaplicación aplanada del valor actual 7 veces adicionales
  • Si definimos un factor de aproximación beta que se aplicará junto con alfa (como alfa * beta en lugar de solo alfa), asumiremos que las 7 muestras perdidas cambiaron sin problemas entre los valores de muestra anteriores y actuales.