Promedio Neto Móvil
Quiero desarrollar cálculo para la media móvil del precio de las 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 para 5 días cuál es la manera effient en vez de ir hacia adelante y hacia atrás en la matriz de fecha y precio otra vez por favor sugest 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á una 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 utilizando 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). No estoy seguro de la solución correcta, ya que la suma del promedio de cada muestra introduciría una buena cantidad de error de redondeo. Hmm. Me pregunto si separar la parte fraccionaria de la parte entera ayudaría. Divida la parte entera de cada número por el recuento. Mantenga tres cantidades corrientes: 1) El promedio de las partes enteras, 2) El resto de cada división, y 3) La parte fraccional de cada número. Cada vez que se divide la parte entera de un número, el resultado de la parte entera se añade a la suma corriente de funcionamiento y el resto se añade a la suma corriente restante. Cuando la suma corriente restante obtiene un valor mayor o igual que el recuento, se divide por el recuento con el resultado de la parte entera añadido a la suma corriente de funcionamiento y el resto se agrega a la suma corriente restante. Además, en cada cálculo, la parte fraccionaria se añade a la suma de ejecución fraccionaria. Cuando se termina el promedio, la suma corriente restante se divide por el recuento y el resultado se añade a la suma corriente de ejecución como un número flotante. Por ejemplo: Ahora qué hacer con la suma de ejecución fraccionaria. El peligro de desbordamiento es mucho menos probable aquí, aunque todavía es posible, así que una manera de manejarlo sería dividir la suma de ejecución fraccional por el recuento al final y agregarlo a nuestro resultado: Una alternativa sería comprobar el funcionamiento fraccionario Suma en cada cálculo para ver si es mayor o igual que count. Cuando eso sucede, haz lo mismo que hacemos con la suma restante. Excelente Jomit Vaghela 6-Mar-07 21:00 Me gustó lo que dijiste que los pequeños trabajos rápidamente se convierten en grandes puestos de trabajo. Pensar en la optimización mientras que la codificación es una buena práctica. Gran esfuerzo y explicación, mi objetivo es obtener un promedio ponderado de una tabla, sobre la base de otras tablas clave principal. Necesito obtener un promedio ponderado basado en la longitud de un segmento y necesito ignorar los valores de -1. Sé cómo hacer esto en SQL, pero mi objetivo es hacer esto en LINQ. Parece algo como esto en SQL: todavía soy bastante nuevo para LINQ, y tener dificultades para averiguar cómo traduciría esto. El promedio ponderado del resultado debería llegar a aproximadamente 55.3. Gracias. Hice esto lo suficiente que he creado un método de extensión para LINQ. Después de que usted consiga su subconjunto de datos la llamada se parece a esto. Esto se ha vuelto extremadamente útil porque puedo obtener un promedio ponderado de cualquier grupo de datos basado en otro campo dentro del mismo registro. Ahora compruebo para dividir por cero y lanzar una excepción más detallada. Tengo otra versión de esto que simplemente devuelve 0 (porque eso es lo que necesita el cliente). En todas mis versiones de esto uso decimal en lugar de doble. Tuve algunos casos extraños donde el doble no era lo suficientemente preciso, desde entonces he utilizado decimal. Si está seguro de que para cada clave extranjera de la Tabla 2 hay un registro correspondiente en la Tabla 1, entonces puede evitar la combinación que acaba de hacer un grupo. En ese caso, la consulta LINQ es así: Así es como puede obtener la wheightedmance para una clave extranjera específica. El método ToList que se llama al buscar los registros es evitar ejecutar la consulta dos veces mientras agrega los registros en las dos operaciones de suma diferentes.
Comments
Post a Comment