Moving Average Implementation
Tengo esencialmente una matriz de valores como este: La matriz anterior es simplificada, estoy coleccionando 1 valor por milisegundo en mi código real y necesito procesar la salida en un algoritmo que escribí para encontrar el pico más cercano antes de un punto en el tiempo. Mi lógica falla porque en mi ejemplo anterior, 0.36 es el pico real, pero mi algoritmo miraría hacia atrás y vería el último número 0.25 como el pico, pues hay una disminución a 0.24 antes de él. El objetivo es tomar estos valores y aplicarles un algoritmo que los suavice un poco para que tenga valores más lineales. (Es decir: la identificación como mis resultados para ser curvy, no jaggedy) se me ha dicho que aplique un filtro de media móvil exponencial a mis valores. ¿Cómo puedo hacer esto? Es muy difícil para mí para leer las ecuaciones matemáticas, trato mucho mejor con el código. ¿Cómo proceso los valores en mi matriz, aplicando un cálculo de promedio móvil exponencial para igualarlos? Preguntó Feb 8 12 at 20:27 Para calcular una media móvil exponencial. Usted necesita mantener un poco de estado alrededor y usted necesita un parámetro de ajuste. Esto requiere una pequeña clase (asumiendo que está usando Java 5 o posterior): Instantiate con el parámetro decayendo que desea (puede tomar la afinación debe estar entre 0 y 1) y luego use average () para filtrar. Al leer una página sobre alguna recurrencia matemática, todo lo que realmente necesita saber al convertirlo en código es que a los matemáticos les gusta escribir índices en matrices y secuencias con subíndices. Sin embargo, la EMA es bastante simple, ya que sólo es necesario recordar un valor antiguo que no requiere arrays de estado complicado. Respondió 8 Feb a las 20:42 TKKocheran: Bastante. No es bueno cuando las cosas pueden ser simples (si comienza con una nueva secuencia, obtenga un nuevo averager). Observe que los primeros términos de la secuencia promedio saltarán alrededor de un bit debido a efectos de límite, pero obtendrá aquellos con otras medias móviles también. Sin embargo, una buena ventaja es que usted puede envolver la lógica del promedio móvil en el averager y experimentar sin molestar el resto de su programa demasiado. Ndash Donal Fellows Feb 9 12 en 0:06 Estoy teniendo un rato difícil entender sus preguntas, pero intentaré contestar de todos modos. 1) Si su algoritmo encontró 0.25 en lugar de 0.36, entonces es incorrecto. Está mal porque asume un aumento o una disminución monotónica (que siempre sube o baja siempre). A menos que usted promedio TODOS sus datos, sus puntos de datos --- como usted los presenta --- son no lineales. Si realmente desea encontrar el valor máximo entre dos puntos en el tiempo, corte su matriz de tmin a tmax y busque el máximo de ese subarray. 2) Ahora, el concepto de promedios móviles es muy simple: imagina que tengo la siguiente lista: 1.4, 1.5, 1.4, 1.5, 1.5. Puedo suavizarlo tomando el promedio de dos números: 1.45, 1.45, 1.45, 1.5. Observe que el primer número es el promedio de 1,5 y 1,4 (segundo y primeros números), la segunda (nueva lista) es el promedio de 1,4 y 1,5 (tercera y segunda lista antigua) la tercera (nueva lista) el promedio de 1,5 y 1,4 (Cuarto y tercero), y así sucesivamente. Podría haberlo hecho el período tres o cuatro, o n. Observe cómo los datos son mucho más suaves. Una buena manera de ver los promedios móviles en el trabajo es ir a Google Finance, seleccionar una acción (probar Tesla Motors bastante volátil (TSLA)) y hacer clic en technicals en la parte inferior de la tabla. Seleccione Promedio móvil con un período determinado y Promedio móvil exponencial para comparar sus diferencias. La media móvil exponencial es sólo otra elaboración de esto, pero los pesos de los datos más antiguos menos de los nuevos datos de esta es una manera de sesgar el alisamiento hacia la parte posterior. Por favor, lea la entrada de Wikipedia. Por lo tanto, esto es más un comentario que una respuesta, pero el pequeño cuadro de comentarios era sólo a pequeño. Buena suerte. Si usted está teniendo apuro con la matemáticas, usted podría ir con una media móvil simple en vez de exponencial. Así que la salida que obtendrías serían los últimos x términos divididos por x. Pseudocódigo no comprobado: Tenga en cuenta que tendrá que manejar las partes inicial y final de los datos, ya que claramente no puede medirse los últimos 5 términos cuando está en su segundo punto de datos. Además, hay maneras más eficientes de calcular este promedio móvil (suma suma - más reciente más reciente), pero esto es para obtener el concepto de lo que está sucediendo a través de. Respondió 8 de febrero a las 20:41 En las estadísticas un promedio móvil simple es un algoritmo que calcula la media no ponderada de las últimas n muestras. El parámetro n se llama a menudo el tamaño de la ventana, porque el algoritmo puede ser pensado como una ventana que se desliza sobre los puntos de datos. Mediante el uso de una formulación recursiva del algoritmo, el número de operaciones requeridas por muestra se reduce a una adición, una resta y una división. Dado que la formulación es independiente del tamaño de la ventana n. La complejidad de ejecución es O (1). Es decir constante. La fórmula recursiva de la media móvil no ponderada es, donde avg es la media móvil y x representa un punto de datos. Por lo tanto, cada vez que la ventana se desliza hacia la derecha, un punto de datos, la cola, sale y un punto de datos, la cabeza, se mueve pulg Implementación Una implementación de la media móvil simple tiene que tener en cuenta lo siguiente Inicialización del algoritmo Mientras La ventana no se llena completamente con valores, la fórmula recursiva falla. Almacenamiento Se requiere acceso al elemento de cola, que dependiendo de la implementación requiere un almacenamiento de n elementos. Mi implementación utiliza la fórmula presentada cuando la ventana está totalmente poblada con valores y, de lo contrario, cambia a la fórmula, que actualiza la media recalculando la suma de los elementos anteriores. Tenga en cuenta que esto puede dar lugar a inestabilidades numéricas debido a la aritmética de punto flotante. En cuanto al consumo de memoria, la implementación utiliza iteradores para realizar un seguimiento de los elementos de cabeza y cola. Esto conduce a una implementación con requisitos de memoria constante independientemente del tamaño de la ventana. Aquí está el procedimiento de actualización que desliza la ventana a la derecha. En la mayoría de las colecciones invalidan sus enumeradores cuando se modifica la colección subyacente. La implementación, sin embargo, se basa en enumeradores válidos. Especialmente en aplicaciones basadas en streaming, las necesidades de colección subyacentes se modifican cuando llega un nuevo elemento. Una forma de tratar con eso es crear una colección de tamaño fijo circular simple de tamaño n1 que nunca invalida sus iteradores y, alternativamente, agregar un elemento y llamar a Shift. Ojalá pudiera averiguar cómo implementar realmente esto, como la función de prueba es muy confuso para me8230 ¿Necesito convertir los datos a la matriz, a continuación, ejecutar SMA sma nuevo SMA (20, matriz) durante un período de 20 SMA ¿Cómo puedo manejar Shift () Es necesario implementar constructores. (perdon por la confusion). Ningún don8217t necesidad de convertir sus datos en una matriz, siempre y cuando sus datos implementa IEnumerable1 y el tipo enumerado es doble. En lo que respecta a su mensajería privada se trata de convertir el DataRow a algo que es enumerable de valores dobles. Su enfoque funciona. Mayús, desliza la ventana una posición a la izquierda. Para un conjunto de datos de, por ejemplo, 40 valores y un período de 20 SMA usted tiene 21 posiciones de la ventana se ajusta (40 8211 20 1). Cada vez que se llama a Shift () la ventana se mueve a la izquierda por una posición y Average () devuelve el SMA para la posición actual de la ventana. Es decir, el promedio no ponderado de todos los valores dentro de la ventana. Además, mi implementación permite calcular el SMA incluso si la ventana no está completamente llena al principio. Así que en esencia Espero que esto ayude. Cualquier otra pregunta NOTIFICACIÓN DE COPYRIGHT Christoph Heindl y cheind. wordpress, 2009-2012. El uso no autorizado y / o la duplicación de este material sin el permiso expreso y por escrito de este autor de blogs y / o propietario está estrictamente prohibido. Pueden utilizarse extractos y enlaces, siempre que se otorgue un crédito completo y claro a Christoph Heindl y cheind. wordpress con dirección apropiada y específica al contenido original. Recent Posts Archivos La media móvil como filtro La media móvil se utiliza a menudo para suavizar los datos en presencia de ruido. La media móvil simple no siempre se reconoce como el filtro de respuesta de impulso finito (FIR) que es, mientras que en realidad es uno de los filtros más comunes en el procesamiento de señales. Tratarlo como un filtro permite compararlo con, por ejemplo, filtros de sinc de ventana (véanse los artículos sobre filtros de paso bajo, paso alto, paso de banda y rechazo de banda para ejemplos de los mismos). La diferencia principal con estos filtros es que el promedio móvil es adecuado para señales para las que la información útil está contenida en el dominio del tiempo. De las cuales las mediciones de suavizado por promediado son un excelente ejemplo. Sin embargo, los filtros windowed-sinc son fuertes en el dominio de la frecuencia. Con la ecualización en el procesamiento de audio como un ejemplo típico. Hay una comparación más detallada de ambos tipos de filtros en el dominio del tiempo frente al rendimiento de los dominios de frecuencia de los filtros. Si tiene datos para los que tanto el tiempo como el dominio de frecuencia son importantes, entonces puede que desee echar un vistazo a Variaciones en el promedio móvil. Que presenta una serie de versiones ponderadas de la media móvil que son mejores en eso. El promedio móvil de longitud (N) puede definirse como escrito tal como se implementa típicamente, con la muestra de salida actual como el promedio de las muestras (N) anteriores. Visto como un filtro, el promedio móvil realiza una convolución de la secuencia de entrada (xn) con un pulso rectangular de longitud (N) y altura (1 / N) (para hacer el área del pulso y, por tanto, la ganancia de El filtro, uno). En la práctica, es mejor tomar (N) impar. Aunque un promedio móvil también puede calcularse usando un número par de muestras, usar un valor impar para (N) tiene la ventaja de que el retardo del filtro será un número entero de muestras, ya que el retardo de un filtro con (N) Muestras es exactamente ((N-1) / 2). El promedio móvil puede entonces alinearse exactamente con los datos originales desplazándolo por un número entero de muestras. Dominio de tiempo Dado que el promedio móvil es una convolución con un pulso rectangular, su respuesta de frecuencia es una función sinc. Esto hace que sea algo así como el dual del filtro windowed-sinc, ya que es una convolución con un pulso sinc que da como resultado una respuesta de frecuencia rectangular. Es esta respuesta de frecuencia de sinc que hace que el promedio móvil sea un pobre intérprete en el dominio de la frecuencia. Sin embargo, funciona muy bien en el dominio del tiempo. Por lo tanto, es perfecto para suavizar los datos para eliminar el ruido, mientras que al mismo tiempo sigue manteniendo una respuesta de paso rápido (Figura 1). Para el ruido gaussiano blanco aditivo típico (AWGN) que se asume a menudo, las muestras del promedio (N) tienen el efecto de aumentar el SNR por un factor de (sqrt N). Dado que el ruido para las muestras individuales no está correlacionado, no hay razón para tratar cada muestra de manera diferente. Por lo tanto, el promedio móvil, que da a cada muestra el mismo peso, eliminará la cantidad máxima de ruido para una nitidez de respuesta dada. Implementación Debido a que es un filtro FIR, el promedio móvil puede implementarse a través de la convolución. Entonces tendrá la misma eficiencia (o falta de ella) como cualquier otro filtro FIR. Sin embargo, también se puede implementar recursivamente, de una manera muy eficiente. Se deduce directamente de la definición que esta fórmula es el resultado de las expresiones para (yn) y (yn1), es decir, donde observamos que el cambio entre (yn1) y (yn) es que un término extra (xn1 / N) Aparece al final, mientras que el término (xn-N1 / N) se elimina desde el principio. En aplicaciones prácticas, a menudo es posible omitir la división por (N) para cada término, compensando la ganancia resultante de (N) en otro lugar. Esta implementación recursiva será mucho más rápida que la convolución. Cada nuevo valor de (y) se puede calcular con sólo dos adiciones, en lugar de las (N) adiciones que serían necesarias para una implementación directa de la definición. Una cosa a tener en cuenta con una implementación recursiva es que se acumularán errores de redondeo. Esto puede o no ser un problema para su aplicación, pero también implica que esta implementación recursiva funcionará mejor con una implementación entera que con números de coma flotante. Esto es bastante inusual, ya que una implementación en coma flotante suele ser más simple. La conclusión de todo esto debe ser que usted nunca debe subestimar la utilidad del filtro de media móvil simple en aplicaciones de procesamiento de señales. Herramienta de diseño de filtros Este artículo se complementa con una herramienta de diseño de filtros. Experimente con diferentes valores para (N) y visualice los filtros resultantes. Intentelo ahoraSimple Moving Average - SMA ¿Qué es un promedio móvil simple? SMA Un promedio móvil simple (SMA) es un promedio móvil aritmético calculado sumando el precio de cierre del valor por un número de períodos de tiempo y luego dividiendo este total por el número De los períodos de tiempo. Como se muestra en la tabla anterior, muchos comerciantes observan los promedios a corto plazo para cruzar por encima de los promedios a más largo plazo para señalar el comienzo de una tendencia alcista. Los promedios a corto plazo pueden actuar como niveles de apoyo cuando el precio experimenta un retroceso. VIDEO Carga del reproductor. BLOQUEANDO BAJO Promedio móvil simple - SMA Un promedio móvil simple es personalizable ya que se puede calcular para un número diferente de períodos de tiempo, simplemente agregando el precio de cierre de la garantía durante varios períodos de tiempo y luego dividiendo este total por el número De los períodos de tiempo, lo que da el precio medio de la garantía durante el período de tiempo. Un simple promedio móvil suaviza la volatilidad y facilita la visualización de la tendencia de precios de un valor. Si la media móvil simple apunta hacia arriba, esto significa que el precio de los valores está aumentando. Si está apuntando hacia abajo significa que el precio de los valores está disminuyendo. Cuanto más largo sea el plazo para el promedio móvil, más suave será la media móvil simple. Un promedio móvil a más corto plazo es más volátil, pero su lectura está más cerca de los datos de origen. Significado analítico Los promedios móviles son una herramienta analítica importante utilizada para identificar las tendencias de precios actuales y la posibilidad de un cambio en una tendencia establecida. La forma más simple de usar una media móvil simple en el análisis es utilizarlo para identificar rápidamente si una seguridad está en una tendencia alcista o tendencia descendente. Otra herramienta analítica popular, aunque un poco más compleja, es comparar un par de promedios móviles simples con cada uno cubriendo diferentes marcos temporales. Si una media móvil simple a corto plazo está por encima de un promedio a más largo plazo, se espera una tendencia alcista. Por otro lado, un promedio a largo plazo por encima de un promedio a más corto plazo indica un movimiento descendente en la tendencia. Patrones de comercio populares Dos patrones populares de comercio que utilizan simples promedios móviles incluyen la cruz de la muerte y una cruz de oro. Una cruz de la muerte ocurre cuando el promedio móvil simple de 50 días cruza debajo de la media móvil de 200 días. Esto se considera una señal bajista, que las pérdidas adicionales están en la tienda. La cruz de oro se produce cuando una media móvil a corto plazo se rompe por encima de una media móvil a largo plazo. Reforzado por altos volúmenes de negociación, esto puede señalar mayores ganancias en la tienda. El científico y los ingenieros Guía para el procesamiento de señales digitales Por Steven W. Smith, Ph. D. Una tremenda ventaja del filtro de media móvil es que se puede implementar con un algoritmo que es muy rápido. Para entender este algoritmo, imagine pasar una señal de entrada, x, a través de un filtro de media móvil de siete puntos para formar una señal de salida, y. Ahora veamos cómo se calculan dos puntos de salida adyacentes, y 50 e y 51: Estos son casi los mismos puntos de cálculo x 48 a x 53 para y 50, y de nuevo para y 51. Si y 50 ya ha sido calculado , La forma más eficiente de calcular y 51 es: Una vez que se ha encontrado y 51 utilizando y 50, entonces y 52 se puede calcular a partir de la muestra y 51, y así sucesivamente. Después de que el primer punto se calcula en y, todos los otros puntos se pueden encontrar con sólo una sola suma y resta por punto. Esto se puede expresar en la ecuación: Observe que esta ecuación utiliza dos fuentes de datos para calcular cada punto en la salida: puntos de la entrada y puntos previamente calculados de la salida. Esto se llama una ecuación recursiva, lo que significa que el resultado de un cálculo se utiliza en los cálculos futuros. (El término recursivo también tiene otros significados, especialmente en informática). En el capítulo 19 se analizan más detalladamente diversos filtros recursivos. Tenga en cuenta que el filtro recursivo de media móvil es muy diferente de los filtros recursivos típicos. En particular, la mayoría de los filtros recursivos tienen una respuesta de impulso infinitamente larga (IIR), compuesta de sinusoides y exponenciales. La respuesta de impulso de la media móvil es un pulso rectangular (respuesta de impulso finito, o FIR). Este algoritmo es más rápido que otros filtros digitales por varias razones. En primer lugar, sólo hay dos cálculos por punto, independientemente de la longitud del núcleo del filtro. En segundo lugar, la suma y la resta son las únicas operaciones matemáticas necesarias, mientras que la mayoría de los filtros digitales requieren una multiplicación que consume tiempo. En tercer lugar, el esquema de indexación es muy simple. Cada índice de la ecuación 15-3 se encuentra añadiendo o restando constantes enteras que se pueden calcular antes de que comience el filtrado (es decir, p y q). Por último, todo el algoritmo puede realizarse con representación entera. Dependiendo del hardware utilizado, los enteros pueden ser más de un orden de magnitud más rápido que el punto flotante. Sorprendentemente, la representación entera funciona mejor que el punto flotante con este algoritmo, además de ser más rápido. El error de redondeo de aritmética de punto flotante puede producir resultados inesperados si no tiene cuidado. Por ejemplo, imagine una señal de muestra de 10.000 que se filtra con este método. La última muestra en la señal filtrada contiene el error acumulado de 10.000 adiciones y 10.000 sustracciones. Esto aparece en la señal de salida como un desplazamiento a la deriva. Los enteros no tienen este problema porque no hay error de redondeo en la aritmética. Si debe utilizar el punto flotante con este algoritmo, el programa de la Tabla 15-2 muestra cómo usar un acumulador de doble precisión para eliminar esta deriva.
Comments
Post a Comment