Wednesday, December 21, 2016

C Media Móvil


Sé que esto es alcanzable con el alza como por: Pero yo realmente quisiera evitar el uso del alza. He googled y no he encontrado ningún ejemplo adecuado o legible. Básicamente, quiero seguir el promedio móvil de una corriente en curso de una corriente de números de punto flotante utilizando los números 1000 más recientes como una muestra de datos. Cuál es la manera más fácil de lograr esto experimenté con el uso de una matriz circular, media móvil exponencial y una media móvil más simple y encontró que los resultados de la matriz circular se adapta a mis necesidades mejor. Si sus necesidades son simples, puede intentar usar una media móvil exponencial. Puesto simplemente, usted hace una variable del acumulador, y como su código mira cada muestra, el código actualiza el acumulador con el nuevo valor. Usted escoge un alfa constante que está entre 0 y 1, y calcule esto: Usted apenas necesita encontrar un valor del alfa donde el efecto de una muestra dada dura solamente cerca 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 una ventana bastante larga para un promedio móvil exponencial No estoy seguro de que haya un alpha que se extendería el promedio en los últimos 1000 números, sin subflujo en el cálculo de punto flotante. Pero si usted quisiera un promedio más pequeño, como 30 números o tan, esto es una manera muy fácil y rápida de hacerla. Respondió 12 de junio 12 en 4:44 1 en su puesto. El promedio móvil exponencial puede permitir que el alfa sea variable. Así, esto permite que se utilice para calcular promedios de base de tiempo (por ejemplo, bytes por segundo). Si el tiempo transcurrido desde la última actualización del acumulador es de más de 1 segundo, deje que alfa sea 1.0. De lo contrario, puede permitir que alpha be (usecs desde la última actualización / 1000000). Ndash jxh 12 de junio a las 6:21 Básicamente, quiero seguir el promedio móvil de una corriente en curso de una corriente de números de punto flotante usando los números 1000 más recientes como una muestra de datos. Tenga en cuenta que el siguiente actualiza el total como elementos añadidos / reemplazados, evitando costosos recorridos O (N) para calcular la suma - necesaria para el promedio - a la demanda. Total se hace un parámetro diferente de T a soporte, p. Usando un largo largo cuando totalizan 1000 long s, un int para char s, o un doble a total float s. Esto es un poco defectuoso en que numsamples podría ir más allá de INTMAX - si te importa que podría utilizar un unsigned mucho tiempo. O utilice un miembro de datos de bool extra para grabar cuando el contenedor se rellena primero mientras cicla numsamples alrededor de la matriz (mejor entonces cambia el nombre de algo inocuo como pos). Respondió el 12 de Junio ​​12 a las 5:19 se supone que el operador quotvoid (T sample) quot es realmente operador quotvoid (T sample) quot. Ndash oPless Jun 8 14 at 11:52 oPless ahhh. bien descrito. En realidad quería que fuera para ser operador vacío () (T muestra), pero por supuesto, usted podría utilizar cualquier notación que te gustaba. Se arreglará, gracias. Ndash Tony D Jun 8 14 at 14: 27Quiero desarrollar cálculo para la media móvil de precios de acciones. Pero los cálculos más complejos se han planeado más adelante. Mi primer paso para saber cómo calcular el promedio móvil de manera eficiente. Necesito saber cómo tomar la entrada y devolver la salida de manera eficiente. Fecha y Precio considerados. Fecha, Precio y Media Movente. Si tengo 500 registros y quiero calcular el promedio móvil durante 5 días cuál es la forma effient en lugar de ir y venir en la matriz de fecha y precio de nuevo por favor sugerir cuál es la mejor manera de recibir la entrada (ArrayList, Table, array Etc) y devolver la salida. Nota: MA de hoy de 5 días será promedio de los últimos 5 días, incluyendo el precio de hoy. Ayer MA será la media de los últimos 5 días de ayer. Quiero mantener los días flexibles en lugar de 5 podría ser 9, 14, 20 etc. Jueves, 10 de abril de 2008 3:21 PM Si necesita un cálculo simple sin su esfuerzo que puede utilizar TA-Lib. Pero si desea que su cálculo sea más eficiente que TA-Lib, entonces puede crear su propio indicador técnico. TA-Lib es genial, pero el problema es que esta biblioteca sólo tiene métodos estáticos. Esto significa que cuando se necesita calcular los valores de la matriz SMA basados ​​en 500 barras de precios, se enviará toda la matriz de barras y se devolverá matriz de valores SMA. Pero si recibe un nuevo valor de 501-st entonces debe enviar de nuevo toda la matriz y TA-Lib de nuevo calculará y devolverá la matriz SMA de valores. Ahora imagine que necesita este indicador en el feed de precios reales, y para cada cambio de precio necesita un nuevo valor indicador. Si usted tiene un indicador no es un gran problema, pero si tiene cientos de indicadores de trabajo, podría ser un problema de rendimiento. Yo estaba en una situación así y empezar a desarrollar indicadores en tiempo real que son eficientes y hacer cálculos adicionales para la nueva barra de precios o para cambiar la barra de precios sólo. Desafortunadamente nunca he necesitado indicador SMA para mis sistemas comerciales, pero lo tengo para EMA, WMA, AD y otros. Uno de estos indicadores AD se publica en mi blog y se puede ver desde allí cuál es la estructura básica de mi clase de indicador en tiempo real. Espero que necesite pequeños cambios para implementar el indicador SMA, porque es uno de los más simples. La lógica es simple. Para calcular SMA todo lo que necesita es n valores de precio pasado. Así que la instancia de clase tendrá una colección de precios, que almacenará sólo el último n número de precios según se define SMA (en su caso 5). Así que cuando tengas una barra nueva, eliminarás la más antigua y añadirás una nueva y crearás un cálculo. Jueves, 10 de abril de 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 unos 50 indicadores, creo. Weve lo utilizó en el ambiente de la producción y es muy eficiente y realible. Puede utilizarlo en C, Java, C, etc. Si necesita un cálculo simple sin su esfuerzo, puede utilizar TA-Lib. Pero si desea que su cálculo sea más eficiente que TA-Lib, entonces puede crear su propio indicador técnico. TA-Lib es genial, pero el problema es que esta biblioteca sólo tiene métodos estáticos. Esto significa que cuando se necesita calcular los valores de la matriz SMA basados ​​en 500 barras de precios, se enviará toda la matriz de barras y se devolverá matriz de valores SMA. Pero si recibe un nuevo valor de 501-st entonces debe enviar de nuevo toda la matriz y TA-Lib de nuevo calculará y devolverá la matriz SMA de valores. Ahora imagine que necesita este indicador en el feed de precios reales, y para cada cambio de precio necesita un nuevo valor indicador. Si usted tiene un indicador no es un gran problema, pero si tiene cientos de indicadores de trabajo, podría ser un problema de rendimiento. Yo estaba en una situación así y empezar a desarrollar indicadores en tiempo real que son eficientes y hacer cálculos adicionales para la nueva barra de precios o para cambiar la barra de precios sólo. Desafortunadamente nunca he necesitado indicador SMA para mis sistemas comerciales, pero lo tengo para EMA, WMA, AD y otros. Uno de estos indicadores AD se publica en mi blog y se puede ver desde allí cuál es la estructura básica de mi clase de indicador en tiempo real. Espero que necesite pequeños cambios para implementar el indicador SMA, porque es uno de los más simples. La lógica es simple. Para calcular SMA todo lo que necesita es n valores de precio pasado. Así que la instancia de clase tendrá una colección de precios, que almacenará sólo el último n número de precios según se define SMA (en su caso 5). Así que cuando tengas una barra nueva, eliminarás la más antigua y añadirás una nueva y crearás un cálculo. Thursday, April 10, 2008 4:04 PM 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 a Analysis Services, tiene la capacidad de calcular promedios móviles. Jueves, 10 de abril de 2008 16:05 Sí. TA-LIB es bueno pero puede no ser adecuado para mí. Cuando agrego nuevo valor o valor actualizado para el historial de registros haré el cálculo en una función separada solamente para esa nueva cotización y lo almacenaré en base de datos. Estoy planeando actualizar la cotización cada hora. Necesito hacer alrededor de 25 a 30 indicadores técnicos para 2200 acciones. El tiempo de ejecución de una llamada TA-Lib en una matriz de 10.000 elementos toma unos 15 milisegundos (en un Intel Core Duo 2.13 Ghz). Esta es la media de todas las funciones. Entre los más rápidos, SMA tarda menos de 2,5 milisegundos. El más lento, HTTRENDMODE, toma 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 sobrecarga de realizar la llamada de función es despreciable). En el contexto de su aplicación, TA-Lib es muy poco probable que sea su cuello de botella para el rendimiento de velocidad. También generalmente no recomiendo esta solución nquot quotlast. Lea a continuación para más detalles. Primero, una corrección a la instrucción de Boban. s Todas las funciones en TA-Lib también pueden calcular un solo último valor usando un mínimo de quotlast nquot elementos. Puede tener una matriz de tamaño 10000, tener datos inicializar sólo para los primeros 500 elementos, agregar un elemento y llamar a TA-Lib para calcular el SMA sólo para el elemento nuevo. TA-Lib mirará hacia atrás no más de lo necesario (si SMA de 5, entonces TA-Lib calculará un solo SMA usando los últimos 5 valores). Esto se hace posible con el parámetro startIdx y endIdx. Puede especificar un rango que se va a calcular o un valor único. En este escenario haría startIdx endIdx 500 para calcular el elemento 501st. Por qué esta solución quotlast nquot es potencialmente peligrosa para algunos? Independientemente de la elección de la solución Boban. s o TA-Lib consideran que el uso de un pequeño número finito de datos pasados ​​no funcionará bien con la mayoría de las funciones TA. Con SMA, es obvio que sólo necesita n elemento para calcular un promedio sobre 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. Esto significa que todos los valores pasados ​​influyen en los valores futuros. Si decides quotlimitquot tu algo para usar sólo una pequeña cantidad de pasado n valor, no obtendrás el mismo resultado que alguien que calcula sobre un gran número de valores pasados. La solución es un compromiso entre velocidad y precisión. A menudo he discutido esto en el contexto de TA-Lib (lo llamo el período quotunstable en la documentación y el foro). Para mantenerlo simple, mi recomendación general es si no puedes hacer la diferencia entre un algo con una respuesta de impulso finito (FIR) de un algo con una respuesta de impulso infinita (IIR), serás más seguro para calcular sobre todos los datos que tienes disponible. TA-Lib especifica en el código cuál de sus funciones tiene un período inestable (IIR). Promedio móvil simple Promedios / Promedio móvil simple Se le anima a resolver esta tarea de acuerdo con la descripción de la tarea, usando cualquiera de las siguientes opciones: Idioma que usted conozca. Calculando el promedio móvil simple de una serie de números. Crear una función / clase / instancia con estado que toma un punto y devuelve una rutina que toma un número como argumento y devuelve una media móvil simple de sus argumentos hasta ahora. Un promedio móvil simple es un método para calcular un promedio de una corriente de números haciendo sólo el promedio de los últimos 160 P 160 números de la corriente 160, donde 160 P 160 se conoce como el período. Se puede implementar llamando a una rutina de iniciación con 160 P 160 como su argumento, 160 I (P), 160 que debe devolver una rutina que cuando se llama con miembros individuales sucesivos de un flujo de números, calcula la media de (arriba A), los últimos 160 P 160 de ellos, permite llamar a este 160 SMA (). La palabra 160 estado 160 en la descripción de la tarea se refiere a la necesidad de 160 SMA () 160 para recordar cierta información entre las llamadas a ella: 160 El período, 160 P 160 Un contenedor ordenado de al menos los últimos 160 P 160 números de cada uno de Sus llamadas individuales. El estado 160 también significa que las llamadas sucesivas a 160 I (), 160 el inicializador, 160 deben devolver rutinas separadas que no 160 comparten el estado guardado para que puedan ser utilizadas en dos flujos independientes de datos. El pseudo-código para una implementación de 160 SMA 160 es: Esta versión utiliza una cola persistente para contener los valores p más recientes. Cada función devuelta desde init-moving-average tiene su estado en un átomo que contiene un valor de cola. Esta implementación utiliza una lista circular para almacenar los números dentro de la ventana al principio de cada indicador de iteración se refiere a la celda de lista que contiene el valor que acaba de salir de la ventana y que se reemplazará con el valor simplemente añadido. Uso de un cierre En la actualidad, este sma no puede ser nogc porque asigna un cierre en el montón. Algún análisis de escape podría eliminar la asignación de montón. Uso de una edición de estructura Esta versión evita la asignación de montón del cierre manteniendo los datos en el marco de pila de la función principal. La misma salida: Para evitar que las aproximaciones de punto flotante sigan acumulándose y creciendo, el código podría realizar una suma periódica en toda la matriz de cola circular. Esta implementación produce dos objetos (de función) compartiendo estado. Es idiomático en E separar la entrada de la salida (leer de la escritura) en lugar de combinarlos en un objeto. La estructura es la misma que la implementación de la Desviación EstándarE. El programa de elixir siguiente genera una función anónima con un período incrustado p, que se utiliza como el período de la media móvil simple. La función run lee la entrada numérica y la pasa a la función anónima recién creada, y luego inspecciona el resultado a STDOUT. La salida se muestra a continuación, con el promedio, seguido por la entrada agrupada, formando la base de cada media móvil. Erlang tiene cierres, pero variables inmutables. Una solución entonces es utilizar procesos y un mensaje simple que pasa la API basada. Los lenguajes de matriz tienen rutinas para calcular los avarages de deslizamiento para una secuencia dada de ítems. Es menos eficiente realizar bucle como en los siguientes comandos. Pide continuamente una entrada I. Que se añade al final de una lista L1. L1 se puede encontrar pulsando 2ND / 1, y la media se puede encontrar en List / OPS Pulse ON para terminar el programa. Función que devuelve una lista que contiene los datos promediados del argumento suministrado Programa que devuelve un valor simple en cada invocación: list es la lista que se promedia: p es el período: 5 devuelve la lista promedio: Ejemplo 2: Utilizando el programa movinav2 , 5) - Inicializando el cálculo del promedio móvil, y definir el período de 5 movinav2 (3, x): x - nuevos datos en la lista (valor 3), y el resultado se almacenará en la variable x, y se muestra movinav2 (4, : X - nuevos datos (valor 4), y el nuevo resultado se almacenará en la variable x, y se mostrará (43) / 2. Descripción de la función movinavg: variable r - es el resultado (la lista de promedios) que se devolverá variable i - es la variable de índice, y apunta al final de la sub-lista de la lista de promediar. Variable z - una variable auxiliar La función utiliza la variable i para determinar qué valores de la lista serán considerados en el siguiente cálculo promedio. En cada iteración, la variable i apunta al último valor de la lista que se utilizará en el cálculo promedio. Así que sólo tenemos que averiguar cuál será el primer valor en la lista. Por lo general, hay 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, el cálculo será normalmente negativo, por lo que la siguiente ecuación evitará los índices negativos: max (i-p1,1) o, ordenando la ecuación, max (i-p, 0) 1. Pero el número de elementos en las primeras iteraciones también será menor, el valor correcto será (índice final - comenzar índice 1) o, ordenando la ecuación, (i - (max (ip, 0) 1), y luego , (I - max (ip, 0)). La variable z tiene el valor común (max (ip), 0) así que el beginindex será (z1) y los numberofelements serán (iz) mid (list, z1, iz) devolverá la lista de valor que será la suma promedio .) Los sumará sum (.) / (Iz) ri los medirá y almacenará el resultado en el lugar apropiado en la lista de resultados Usando un cierre y creando una función

No comments:

Post a Comment