¿Es posible implementar un promedio móvil en C sin la necesidad de una ventana de muestras que he descubierto que puedo optimizar un poco, por la elección de un tamaño de ventana Eso es una potencia de dos para permitir el desplazamiento de bits en lugar de dividir, pero no necesitar una memoria intermedia sería bueno. ¿Hay una manera de expresar un nuevo resultado promedio móvil sólo como una función de la edad de resultados y la nueva muestra Definir un ejemplo de media móvil, a través de una ventana de 4 muestras a ser: Añadir nueva muestra de correo: Una media móvil se puede implementar de forma recursiva , pero para un cálculo exacto de la media móvil que tiene que recordar la muestra de entrada más antigua en la suma (es decir, la una en su ejemplo). Para un promedio móvil de longitud N a calcular: donde yn es la señal de salida y xn es la señal de entrada. Eq. (1) puede escribirse de forma recursiva como lo que siempre es necesario recordar que la muestra xn-N con el fin de calcular (2). Como ha señalado Conrad Turner, puede utilizar una línea (infinitamente largo) ventana exponencial en cambio, lo que permite calcular la salida sólo del pasado de salida y la entrada de corriente: pero esto no es un estándar (no ponderado) de media móvil, sino una forma exponencial media móvil ponderada, donde las muestras adicionales en el pasado conseguir un menor peso, pero (al menos en teoría) que nunca se olvida nada (los pesos acaba de obtener más y más pequeña para las muestras lejos en el pasado). inicializar total de 0, count0 (cada vez viendo un nuevo valor A continuación, una entrada (scanf), uno añadir totalnewValue, un incremento (recuento), un promedio de brecha (total / conteo) Este sería un medio móvil en todas las entradas para calcular el promedio sobre sólo los últimos 4 entradas, requeriría 4 inputvariables, quizás copiando cada entrada a una anterior inputvariable, entonces el cálculo de la nueva media móvil. como suma de los 4 inputvariables, dividido por 4 (desplazamiento a la derecha 2 sería bueno que todos los insumos eran positivo para hacer la media calculationI sabe esto se consigue con impulso de acuerdo con:.. Pero realmente me gustaría evitar el uso de impulso he buscado en Google y que no se encuentra ningún ejemplos adecuados o legibles Básicamente quiero hacer un seguimiento de la media móvil de un flujo continuo de una corriente de números de punto utilizando los más recientes 1000 números como una muestra de datos flotante. ¿Cuál es la forma más fácil de lograr esto he experimentado con el uso de un conjunto circular, media móvil exponencial y una mayor media móvil simple y encontró que los resultados de la circular matriz satisfizo mis necesidades. preguntó Jun 12 12 de la 04:38 Si sus necesidades son simples, que sólo podría tratar de usar un promedio móvil exponencial. En pocas palabras, se hace una variable acumulador, y por ejemplo el código mira a cada muestra, el código actualiza el acumulador con el nuevo valor. Usted escoge un alfa constante que oscila entre 0 y 1, y calcular esto: Usted sólo tiene que encontrar un valor de alfa en el que el efecto de una muestra dada sólo dura alrededor de 1000 muestras. Hmm, no estoy realmente seguro de que esto es adecuado para usted, ahora que he puesto aquí. El problema es que 1000 es un tiempo bastante largo para una ventana móvil exponencial Im medio no seguro de que es un alfa que se extendería la media de los últimos números de 1000, sin desbordamiento en el cálculo de coma flotante. Pero si querías un medio más pequeño, como 30 números más o menos, esta es una manera muy fácil y rápida de hacerlo. contestado 12 12 Jun a las 04:44 1 en su puesto. La media móvil exponencial puede permitir que el alfa para ser variable. Así que esto permite que se utiliza para calcular los promedios de base de tiempo (por ejemplo, bytes por segundo). Si el tiempo transcurrido desde la última actualización del acumulador es más de 1 segundo, deja que sea la alfa 1,0. De lo contrario, puede dejar alfa (usecs ser desde la última actualización / 1000000). ndash JXH 12 Jun 12 de la 6:21 Básicamente quiero realizar un seguimiento de la media móvil de un flujo continuo de una corriente de números de punto utilizando los más recientes números de 1000 como una muestra de datos flotante. Tenga en cuenta que el siguiente actualiza el total de como elementos como sustituido, evitando O costoso recorrido añadido / (N) para calcular la suma - necesaria para la media - bajo demanda. Total se hace un parámetro diferente de T para soportar, por ejemplo, usando un largo tiempo en el total del 1000 s largas, un int char s, o un doble de flotación total s. Esto es un poco deficiente en ese numsamples podría ir más allá de INTMAX - si la atención que podría utilizar un tiempo largo sin signo. o utilizar un miembro de datos bool extra para grabar cuando el contenedor está lleno, mientras que numsamples primera bicicleta por la matriz (mejor entonces a llamarse algo inocuo como POS). 12 Jun contestado las 12 de la 05:19 se supone que el operador quotvoid (muestra T) es en realidad quot operatorltlt quotvoid (muestra T) quot. ndash oPless Jun 8 14 a las 11:52 oPless ahhh. bien descrito. en realidad quería decir para que sea operador void () (muestra T), pero por supuesto que podía usar cualquier notación te gustó. Fijará, gracias. ndash Tony D Jun 8 14 a las 14: 27I quieren desarrollar cálculo de precio de las acciones de media móvil. Pero cálculo complejo tanto se han planificado más tarde. Mi primer paso para saber cómo calcular la media móvil de manera eficiente. Necesito saber cómo tomar la entrada y salida de regreso de manera eficiente. Considerado Fecha de entrada y precio. Fecha de salida consudered, Precio y media móvil. Si tengo 500 registros y quiero calcular la media móvil por 5 días cuál es la forma Prasugrel en lugar de ir hacia atrás y adelante en la matriz de Fecha y Precio nuevo, por favor sugest ¿cuál es la mejor manera de recibir la entrada (ArrayList, tabla, matriz etc) y devolver una salida. Nota: MA de hoy de 5 días será la media de los últimos 5 días, incluyendo el precio actual. Ayer MA será la media de los últimos 5 días a partir de ayer. Quiero mantener los días para ser flexible en lugar de 5 podría ser 9, 14, 20, etc. Jueves, 10 de abril de, 2008 15:21 Si necesita cálculo simple sin su esfuerzo que se puede usar TA-Lib. Pero si usted quiere que su cálculo sea más eficiente que el TA-Lib, entonces usted puede crear su propio indicador técnico. TA-Lib es grande, pero es un problema que esta biblioteca tiene sólo métodos estáticos. Esto significa que cuando es necesario calcular los valores de la matriz de SMA basado en 500 barras de precios, entonces se va a enviar toda la gama de bares y volverá matriz de valores de SMA. Sin embargo, si recibe un nuevo valor 501-st, entonces debe volver a enviar toda la matriz y TA-Lib nuevo calculará y volver SMA matriz de valores. Ahora imagina que necesita dicho indicador de alimentación precio real, y por cada cambio en el precio que necesita nuevo valor del indicador. Si usted tiene un indicador no es un gran problema, pero si usted tiene cientos de indicadores de trabajo, que podría ser un problema de rendimiento. Yo estaba en una situación de este tipo y comenzar a desarrollar indicadores en tiempo real que son eficientes y hacer cálculos adicionales para la nueva barra de precios o de único bar precio cambiado. Desafortunadamente nunca necesaria indicador de SMA para mis sistemas de comercio, pero tengo este tipo para EMA, WMA, AD, y otros. Un indicador tal AD es publicado en mi blog y se puede ver a partir de ahí lo que es la estructura básica de mi clase de indicador de tiempo real. Espero que se necesita para implementar pequeños cambios indicador de SMA, ya que es una de la más simple. La lógica es simple. Para el cálculo de SMA todo lo que necesita es n últimos valores de precios. Así instancia de clase tendrá colección de los precios, que almacenará solamente mantener último número n de los precios como se define SMA (en su caso 5). Así que cuando tiene un nuevo bar, se quitará más antiguo y añadir uno nuevo y crear cálculo. Jueves, 10 de abril 2008 16:04 Todas las respuestas Hay una biblioteca llamada TA-Lib que hace todo eso para usted y es de código abierto. Tiene cerca de 50 indicadores, creo. Hemos utilizado en entornos de producción y es muy eficiente y realible. Se puede utilizar en C, Java, C, etc. Si necesita cálculo simple sin su esfuerzo que se puede usar TA-Lib. Pero si usted quiere que su cálculo sea más eficiente que el TA-Lib, entonces usted puede crear su propio indicador técnico. TA-Lib es grande, pero es un problema que esta biblioteca tiene sólo métodos estáticos. Esto significa que cuando es necesario calcular los valores de la matriz de SMA basado en 500 barras de precios, entonces se va a enviar toda la gama de bares y volverá matriz de valores de SMA. Sin embargo, si recibe un nuevo valor 501-st, entonces debe volver a enviar toda la matriz y TA-Lib nuevo calculará y volver SMA matriz de valores. Ahora imagina que necesita dicho indicador de alimentación precio real, y por cada cambio en el precio que necesita nuevo valor del indicador. Si usted tiene un indicador no es un gran problema, pero si usted tiene cientos de indicadores de trabajo, que podría ser un problema de rendimiento. Yo estaba en una situación de este tipo y comenzar a desarrollar indicadores en tiempo real que son eficientes y hacer cálculos adicionales para la nueva barra de precios o de único bar precio cambiado. Desafortunadamente nunca necesaria indicador de SMA para mis sistemas de comercio, pero tengo este tipo para EMA, WMA, AD, y otros. Un indicador tal AD es publicado en mi blog y se puede ver a partir de ahí lo que es la estructura básica de mi clase de indicador de tiempo real. Espero que se necesita para implementar pequeños cambios indicador de SMA, ya que es una de la más simple. La lógica es simple. Para el cálculo de SMA todo lo que necesita es n últimos valores de precios. Así instancia de clase tendrá colección de los precios, que almacenará solamente mantener último número n de los precios como se define SMA (en su caso 5). Así que cuando tiene un nuevo bar, se quitará más antiguo y añadir uno nuevo y crear cálculo. Jueves, 10 de abril 2008 16:04 Yo calcularía el promedio móvil en la base de datos a través de un procedimiento almacenado o en un cubo. ¿Has mirado en Analysis Services, que tiene la capacidad de calcular las medias móviles. Jueves, 10 de abril 2008 16:05 Sí. TA-LIB es bueno, pero puede no ser adecuado para mí. Al agregar un nuevo valor o el valor actualizado de la historia de los registros que voy a hacer el cálculo en una función separada sólo para que la nueva cotización y almacenarlo en la base de datos. Tengo la intención de actualizar la cita cada hora. Necesito hacer unos 25 a 30 indicadores técnicos para el 2200 las existencias. Jueves, 10 de abril 2008 17:51 El tiempo de ejecución de una llamada TA-Lib en una serie de elementos de 10000 tarda unos 15 milisegundos (en un procesador Intel Core Duo 2,13 GHz). Este es el promedio de todas las funciones. Entre los más rápidos, SMA tarda menos de 2,5 milisegundos. El más lento, HTTRENDMODE, tarda 450 milisegundos. Con menos elementos es más rápido. SMA toma alrededor de 0,22 milisegundos para 1000 elementos de entrada. La ganancia de velocidad es casi lineal (la carga de realizar la llamada de función es insignificante). En el contexto de su aplicación, TA-Lib es muy poco probable que sea el cuello de botella para el rendimiento de la velocidad. También por lo general no recomiendo esta solución nquot quotlast. Lea a continuación para más detalles. En primer lugar, una corrección a la declaración Boban. s Todas las funciones de TA-Lib también puede calcular un valor único última mediante el uso de un mínimo de elementos nquot quotlast. Usted puede tener una matriz de tamaño 10000, tienen datos inicializar sólo para los primeros 500 elementos, añadir un elemento y llamar a TA-Lib para el cálculo de la media móvil sólo para el nuevo elemento. TA-Lib mirará hacia atrás no más de lo necesario (si SMA de 5, a continuación, TA-Lib calculará una sola SMA utilizando los últimos 5 valores). Esto es posible con el parámetro startIdx y endIdx. Se puede especificar un rango que se calcula, o un único valor. En este escenario, cabe hacer startIdx endIdx 500 para calcular el elemento 501a. ¿Por qué es tal solución quotlast nquot potencialmente peligroso para algunos Independientemente de la selección de la solución Boban. s o TA-Lib consideran que el uso de un pequeño número finito de datos del pasado no funcionará bien con la mayoría de las funciones de asistencia técnica. Con SMA, es obvio que sólo tiene n elementos para calcular un promedio en el elemento n. No es tan simple con EMA (y muchas otras funciones TA). El algo a menudo depende del valor anterior para calcular el nuevo valor. La función es recursiva. Eso significa que todos los anteriores valores tienen una influencia en los valores futuros. Si decide que su quotlimitquot algo para utilizar sólo una pequeña cantidad de valor n pasado, no se obtendrá el mismo resultado que una persona que calcula sobre un gran número de valores pasados. La solución es un compromiso entre velocidad y precisión. A menudo he discutir esto en el contexto de TA-Lib (Yo lo llamo el periodquot quotunstable en la documentación y foro). Para hacerlo simple, mi recomendación general es que si usted no puede hacer la diferencia entre un algo con una respuesta de impulso finito (FIR) de un algo con una respuesta al impulso infinita (IIR), usted será más seguro para calcular sobre todos los datos que tiene disponible. TA-Lib especifica en el código de cuál de sus funciones tienen un periodo inestable (IIR). Editado por mfortier Viernes, 15 de agosto 2008 a las 4:25 frase correcta Inglés Viernes, 15 de agosto 2008 04:20 AMC: media móvil simple Cálculo de la media móvil simple de una serie de números. Crear una función de estado / clase / instancia que toma un período y devuelve una rutina que lleva un número como argumento y devuelve una media móvil simple de sus argumentos hasta ahora. Descripción Una media móvil simple es un método para el cálculo de un promedio de una serie de números en sólo un promedio de los últimos números de la corriente P, donde P es conocido como el período. Se puede implementar llamando una rutina iniciales con P como su argumento, I (P), que luego debe devolver una rutina que cuando se le llama con miembros individuales, sucesivas de una serie de números, calcula la media de (hasta), la P última de ellas, permite llamar a este SMA (). La palabra de estado en la descripción de la tarea se refiere a la necesidad de SMA () para recordar cierta información entre llamadas a la misma: el periodo, P Una ordenó recipiente de al menos los últimos números P de cada una de sus llamadas individuales. Con estado también significa que las llamadas sucesivas a I (), el inicializador, deben volver rutinas independientes que no comparten el estado guardado para que pudieran ser utilizados en dos flujos de datos independientes. Pseudocódigo para una implementación de SMA es: Promedios / simples promedios móviles promedio / media móvil simple le anima a resolver esta tarea de acuerdo con la descripción de la tarea, utilizando cualquier lenguaje puede saber. El cálculo de la media móvil simple de una serie de números. Crear una función de estado / clase / instancia que toma un período y devuelve una rutina que lleva un número como argumento y devuelve una media móvil simple de sus argumentos hasta ahora. Una media móvil simple es un método para el cálculo de un promedio de una serie de números en sólo un promedio de los últimos 160 P 160 números de la secuencia, donde 160 160 P 160 se conoce como el período. Se puede implementar llamando a una rutina de sus iniciales con 160 P 160 como su argumento, 160 I (P), 160 que a su vez debe devolver una rutina que cuando se le llama con los miembros individuales, sucesivas de una secuencia de números, calcula la media de (hasta a), el último 160 P 160 de ellos, vamos a llamar a este 160 SMA (). La palabra 160 de estado 160 en la descripción de la tarea se refiere a la necesidad de 160 SMA () 160 recuerde cierta información entre llamadas a la misma: 160 El período, 160 P 160 Una ordenó recipiente de al menos los últimos 160 P 160 números de cada una de sus llamadas individuales. Con estado 160 también significa que las llamadas sucesivas a 160 I (), el inicializador 160, 160 deben volver rutinas separados que 160 no 160 cuota de estado guardado para que pudieran ser utilizados en dos flujos de datos independientes. Pseudo-código para una aplicación de 160 SMA 160 es: Esta versión utiliza una cola persistente para mantener los valores de p más recientes. Cada función de regresar de init-media móvil tiene su estado en un átomo que contiene un valor de colas. Esta aplicación utiliza una lista circular para almacenar los números dentro de la ventana al comienzo de cada iteración puntero hace referencia a la celda de lista que mantiene el valor justo saliendo de la ventana y que será reemplazada por el valor justo añadido. El uso de un cierre de edición Actualmente esta media móvil simple no puede ser nogc porque asigna un cierre en el montón. Algunos análisis escaparse puede quitar la asignación del montón. El uso de un editar Struct Esta versión evita la asignación de montón del cierre de mantenimiento de los datos en el marco de la pila de la función principal. Misma salida: Para evitar las aproximaciones de punto flotante se siguen acumulando y creciendo, el código podría realizar una suma periódica en toda la gama cola circular. Esta aplicación produce dos objetos (función) que comparten estado. Es idiomática en E para separar el aporte de salida (leída de escritura) en lugar de la combinación de ellos en un solo objeto. La estructura es la misma que la aplicación de la norma DeviationE. El programa de elixir a continuación genera una función anónima con un período de p incorporado, que se utiliza como el período de la media móvil simple. La función de ejecución lee la entrada numérica y lo pasa a la función anónima de nueva creación, y luego inspecciona el resultado en STDOUT. La salida se muestra a continuación, con la media, seguido de la entrada agrupados, formando la base de cada media móvil. Erlang tiene cierres, pero las variables inmutables. A continuación, la solución es el uso de procesos y un mensaje simple que pasa API basada. idiomas matriz tienen rutinas para calcular los avarages deslizamiento para una determinada secuencia de elementos. Es menos eficaz para bucle como en los siguientes comandos. Continuamente ayudas memoria para una entrada I. que se añade al final de una lista L1. L1 se puede encontrar pulsando 2 ° / 1, y la media se puede encontrar en la lista / OPS Presione ON para terminar el programa. Función que devuelve una lista que contiene los datos promediados del Programa argumento proporcionado que devuelve un valor sencillo en cada invocación: lista es la lista que se está promediado: p es el periodo: 5 devuelve la lista promediado: Ejemplo 2: Utilizando el programa movinav2 (i , 5) - Inicialización en movimiento cálculo de la media, y el período de 5 movinav2 (3 definir, x): x - nuevos datos en la lista (valor 3), y el resultado se almacena en la variable x, y se muestra movinav2 (4, x) : x - nuevos datos (valor 4), y el nuevo resultado se almacenarán en la variable x, y se muestran (43) / 2. Descripción de la función movinavg: variable r - es el resultado (la lista promediado) que será devuelto variable i - es la variable de índice, y se encuentra al final de la sub-lista de la lista que se promedió. la variable z - una variable auxiliar La función utiliza la variable i para determinar qué valores de la lista será considerado en la próxima cálculo del promedio. En cada iteración, la variable i puntos en el último valor de la lista que se utiliza en el cálculo del promedio. Así que sólo tenemos que averiguar cuál será el primer valor de la lista. Por lo general bien tiene que tener en cuenta los elementos p, por lo que el primer elemento será el indexado por (i-p1). Sin embargo, en las primeras iteraciones de cálculo que suele ser negativa, por lo que la siguiente ecuación evitará índices negativos: max (i-P1,1) o, la organización de la ecuación, max (i-p, 0) 1. Pero el número de elementos en las primeras iteraciones también será más pequeño, el valor correcto será (índice final - comenzar índice 1) o, la organización de la ecuación, (i - (max (ip, 0) 1) 1), y luego , (i-max (ip, 0)). z variable contiene el valor común (máx (ip), 0) por lo que el beginIndex será (z1) y los NumberOfElements será (iz) MID (lista, z1, iz) devolverá la lista de valor que será un promedio de suma ( .) les suma suma (.) / (iz) ri tendrá un promedio de ellos y almacenar el resultado en el lugar apropiado en la lista de resultados el uso de un cierre y la creación de una función
No comments:
Post a Comment