Skip to main content

Escala Media Móvil


Tengo streaming de datos en tiempo real entrando en la chispa y me gustaría hacer una predicción de media móvil en esa serie de datos de tiempo. ¿Hay alguna manera de implementar esta chispa de uso en Java Ive ya se ha referido. Gist. github / samklr / 27411098f04fc46dcd05 / revisiones y Apache Spark Moving Average, pero ambos códigos están escritos en Scala. Dado que no estoy familiarizado con Scala, no soy capaz de juzgar si lo encuentro útil o incluso convertir el código a Java. ¿Hay alguna implementación directa de la previsión en Spark Java preguntó Aug 12 15 en 12: 44Moving Promedios - Simple y exponencial Media móvil - Simple y exponencial Introducción Medias móviles suavizar los datos de precios para formar un indicador de tendencia siguiente. No predicen la dirección del precio, sino que definen la dirección actual con un retraso. Los promedios móviles se retrasan porque están basados ​​en precios pasados. A pesar de este retraso, las medias móviles ayudan a suavizar la acción de los precios y filtran el ruido. También forman los bloques de construcción de muchos otros indicadores técnicos y superposiciones, como Bollinger Bands. MACD y el oscilador de McClellan. Los dos tipos más populares de promedios móviles son el promedio móvil simple (SMA) y el promedio móvil exponencial (EMA). Estos promedios móviles pueden usarse para identificar la dirección de la tendencia o definir niveles potenciales de soporte y resistencia. Aquí hay un gráfico con un SMA y un EMA en él: Cálculo del promedio móvil simple Un promedio móvil simple se forma computando el precio medio de un título sobre un número específico de períodos. La mayoría de las medias móviles se basan en los precios de cierre. Una media móvil simple de 5 días es la suma de cinco días de los precios de cierre dividida por cinco. Como su nombre lo indica, un promedio móvil es un promedio que se mueve. Los datos antiguos se eliminan a medida que vienen disponibles nuevos datos. Esto hace que el promedio se mueva a lo largo de la escala de tiempo. A continuación se muestra un ejemplo de un promedio móvil de 5 días que evoluciona en tres días. El primer día de la media móvil simplemente cubre los últimos cinco días. El segundo día de la media móvil desciende el primer punto de datos (11) y añade el nuevo punto de datos (16). El tercer día de la media móvil continúa cayendo el primer punto de datos (12) y añadiendo el nuevo punto de datos (17). En el ejemplo anterior, los precios aumentan gradualmente de 11 a 17 en un total de siete días. Observe que la media móvil también aumenta de 13 a 15 durante un período de cálculo de tres días. También observe que cada valor promedio móvil es justo debajo del último precio. Por ejemplo, el promedio móvil para el primer día es igual a 13 y el último precio es 15. Los precios de los cuatro días previos fueron más bajos y esto hace que el promedio móvil se retrasa. Cálculo del promedio móvil exponencial Los promedios móviles exponenciales reducen el retraso aplicando más peso a los precios recientes. La ponderación aplicada al precio más reciente depende del número de periodos de la media móvil. Hay tres pasos para calcular una media móvil exponencial. En primer lugar, calcular el promedio móvil simple. Un promedio móvil exponencial (EMA) tiene que comenzar en alguna parte así que una media móvil simple se utiliza como EMA anterior del período anterior en el primer cálculo. Segundo, calcule el multiplicador de ponderación. En tercer lugar, calcular la media móvil exponencial. La siguiente fórmula es para un EMA de 10 días. Una media móvil exponencial de 10 períodos aplica una ponderación de 18.18 al precio más reciente. Un EMA de 10 periodos también puede ser llamado un EMA 18.18. Una EMA de 20 periodos aplica una ponderación de 9.52 al precio más reciente (2 / (201) .0952). Observe que la ponderación para el período de tiempo más corto es más que la ponderación para el período de tiempo más largo. De hecho, la ponderación disminuye a la mitad cada vez que el período de media móvil se duplica. Si desea un porcentaje específico para un EMA, puede usar esta fórmula para convertirlo en períodos de tiempo y luego ingresar ese valor como el parámetro EMA039s: A continuación se muestra un ejemplo de hoja de cálculo de una media móvil simple de 10 días y un valor de 10- Promedio móvil exponencial para Intel. Los promedios móviles simples son directos y requieren poca explicación. El promedio de 10 días se mueve simplemente mientras que nuevos precios están disponibles y los viejos precios caen apagado. El promedio móvil exponencial comienza con el valor de la media móvil simple (22,22) en el primer cálculo. Después del primer cálculo, la fórmula normal se hace cargo. Debido a que un EMA comienza con un promedio móvil simple, su verdadero valor no se realizará hasta 20 o más períodos más tarde. En otras palabras, el valor de la hoja de cálculo Excel puede diferir del valor del gráfico debido al corto período de revisión. Esta hoja de cálculo sólo se remonta a 30 períodos, lo que significa que el efecto de la media móvil simple ha tenido 20 períodos para disipar. StockCharts se remonta al menos 250 períodos (por lo general mucho más) para sus cálculos de modo que los efectos de la media móvil simple en el primer cálculo se han disipado completamente. El factor de Lag Cuanto más largo es el promedio móvil, más el retraso. Una media móvil exponencial de 10 días abrazará los precios de cerca y se convertirá poco después de que los precios giren. Los promedios móviles cortos son como los veleros, ágiles y rápidos de cambiar. Por el contrario, un promedio móvil de 100 días contiene muchos datos pasados ​​que lo ralentizan. Los promedios móviles más largos son como los petroleros oceánicos - letárgicos y lentos para cambiar. Se necesita un movimiento de precios más grande y más largo para una media móvil de 100 días para cambiar el rumbo. La tabla de arriba muestra el SampP 500 ETF con una EMA de 10 días siguiendo de cerca los precios y una molienda SMA de 100 días más alta. Incluso con la disminución de enero-febrero, la SMA de 100 días mantuvo el curso y no rechazó. La SMA de 50 días se sitúa entre los promedios móviles de 10 y 100 días cuando se trata del factor de retraso. Simples versus promedios móviles exponenciales Aunque hay claras diferencias entre los promedios móviles simples y los promedios móviles exponenciales, uno no es necesariamente mejor que el otro. Los promedios móviles exponenciales tienen menos retraso y, por lo tanto, son más sensibles a los precios recientes y las recientes variaciones de precios. Los promedios móviles exponenciales se convertirán antes de promedios móviles simples. Los promedios móviles simples, por otro lado, representan un verdadero promedio de precios para todo el período de tiempo. Como tales, los promedios móviles simples pueden ser más adecuados para identificar niveles de soporte o resistencia. La preferencia media móvil depende de los objetivos, el estilo analítico y el horizonte temporal. Los cartistas deben experimentar con ambos tipos de promedios móviles, así como diferentes plazos para encontrar el mejor ajuste. La siguiente tabla muestra IBM con la SMA de 50 días en rojo y la EMA de 50 días en verde. Ambos culminaron a finales de enero, pero la disminución en la EMA fue más nítida que la disminución de la SMA. La EMA apareció a mediados de febrero, pero la SMA continuó baja hasta finales de marzo. Observe que la SMA apareció más de un mes después de la EMA. Longitudes y plazos La longitud del promedio móvil depende de los objetivos analíticos. Promedios cortos móviles (5-20 períodos) son los más adecuados para las tendencias a corto plazo y el comercio. Los cartistas interesados ​​en las tendencias a mediano plazo optarían por promedios móviles más largos que podrían extenderse de 20 a 60 períodos. Los inversores a largo plazo preferirán las medias móviles con 100 o más períodos. Algunas longitudes móviles son más populares que otras. El promedio móvil de 200 días es quizás el más popular. Debido a su longitud, esto es claramente una media móvil a largo plazo. A continuación, el promedio móvil de 50 días es muy popular para la tendencia a mediano plazo. Muchos cartistas utilizan los promedios móviles de 50 días y 200 días juntos. A corto plazo, una media móvil de 10 días fue muy popular en el pasado porque era fácil de calcular. Uno simplemente agregó los números y movió el punto decimal. Identificación de tendencias Las mismas señales pueden generarse utilizando promedios móviles simples o exponenciales. Como se mencionó anteriormente, la preferencia depende de cada individuo. Estos ejemplos a continuación utilizarán promedios móviles simples y exponenciales. El término media móvil se aplica tanto a promedios móviles simples como exponenciales. La dirección de la media móvil transmite información importante sobre los precios. Una media móvil en ascenso muestra que los precios están aumentando. Una media móvil decreciente indica que los precios, en promedio, están cayendo. El aumento de la media móvil a largo plazo refleja una tendencia alcista a largo plazo. Una caída del promedio móvil a largo plazo refleja una tendencia a la baja a largo plazo. El gráfico anterior muestra 3M (MMM) con una media móvil exponencial de 150 días. Este ejemplo muestra cuán bien funcionan las medias móviles cuando la tendencia es fuerte. La EMA de 150 días rechazó en noviembre de 2007 y otra vez en enero de 2008. Observe que tomó una declinación 15 para invertir la dirección de esta media móvil. Estos indicadores rezagados identifican reversiones de tendencias a medida que ocurren (en el mejor de los casos) o después de que ocurren (en el peor). MMM continuó más bajo en marzo de 2009 y luego subió 40-50. Observe que la EMA de 150 días no apareció hasta después de este aumento. Una vez que lo hizo, sin embargo, MMM continuó más alto en los próximos 12 meses. Los promedios móviles trabajan brillantemente en fuertes tendencias. Crossovers dobles Dos medias móviles se pueden usar juntas para generar señales de cruce. En Análisis Técnico de los Mercados Financieros. John Murphy llama a esto el método de crossover doble. Los crossovers dobles implican una media móvil relativamente corta y una media móvil relativamente larga. Como con todas las medias móviles, la longitud general de la media móvil define el marco de tiempo para el sistema. Un sistema que utilice un EMA de 5 días y un EMA de 35 días se consideraría a corto plazo. Un sistema que utilizara un SMA de 50 días y un SMA de 200 días se consideraría de mediano plazo, tal vez incluso a largo plazo. Un cruce alcista ocurre cuando el promedio móvil más corto cruza por encima del promedio móvil más largo. Esto también se conoce como una cruz de oro. Un crossover bajista ocurre cuando el promedio móvil más corto cruza debajo de la media móvil más larga. Esto se conoce como una cruz muerta. Los cruces de media móvil producen señales relativamente tardías. Después de todo, el sistema emplea dos indicadores retardados. Cuanto más largo sea el promedio móvil, mayor será el desfase en las señales. Estas señales funcionan muy bien cuando una buena tendencia se apodera. Sin embargo, un sistema de crossover de media móvil producirá muchos whipsaws en ausencia de una tendencia fuerte. También hay un método triple crossover que implica tres promedios móviles. De nuevo, se genera una señal cuando la media móvil más corta cruza las dos medias móviles más largas. Un simple sistema de crossover triple puede implicar promedios móviles de 5 días, 10 días y 20 días. La tabla anterior muestra Home Depot (HD) con una EMA de 10 días (línea punteada verde) y EMA de 50 días (línea roja). La línea negra es el cierre diario. El uso de un crossover promedio móvil habría dado lugar a tres whipsaws antes de coger un buen comercio. La EMA de 10 días se rompió por debajo de la EMA de 50 días a finales de octubre (1), pero esto no duró mucho ya que los 10 días retrocedieron a mediados de noviembre (2). Esta cruz duró más tiempo, pero el siguiente cruce bajista en enero (3) ocurrió cerca de finales de noviembre los niveles de precios, dando lugar a otro whipsaw. Esta cruz bajista no duró mucho ya que la EMA de 10 días retrocedió por encima de los 50 días unos días después (4). Después de tres malas señales, la cuarta señal prefiguró un movimiento fuerte mientras que la acción avanzó sobre 20. Hay dos takeaways aquí. Primero, los crossovers son propensos al whipsaw. Se puede aplicar un filtro de precio o tiempo para ayudar a prevenir las sierras. Los operadores pueden requerir que el crossover dure 3 días antes de actuar o requiera que la EMA de 10 días se mueva por encima / por debajo del EMA de 50 días por una cierta cantidad antes de actuar. En segundo lugar, MACD se puede utilizar para identificar y cuantificar estos crossovers. MACD (10, 50, 1) mostrará una línea que representa la diferencia entre las dos medias móviles exponenciales. MACD se vuelve positivo durante una cruz de oro y negativo durante una cruz muerta. El oscilador de precio porcentual (PPO) se puede utilizar de la misma manera para mostrar diferencias porcentuales. Tenga en cuenta que MACD y el PPO se basan en promedios móviles exponenciales y no coincidirá con los promedios móviles simples. Este gráfico muestra Oracle (ORCL) con EMA de 50 días, EMA de 200 días y MACD (50.200,1). Hubo cuatro crossovers de media móvil durante un período de 2 1/2 años. Los tres primeros resultaron en whipsaws o malos oficios. Una tendencia sostenida comenzó con el cuarto crossover como ORCL avanzó a mediados de los 20s. Una vez más, los crossovers medios móviles funcionan muy bien cuando la tendencia es fuerte, pero producen pérdidas en ausencia de una tendencia. Crossovers de precios Los promedios móviles también pueden usarse para generar señales con crossovers de precios simples. Una señal alcista se genera cuando los precios se mueven por encima de la media móvil. Se genera una señal bajista cuando los precios se mueven por debajo de la media móvil. Los crossovers de precios se pueden combinar para comerciar dentro de la tendencia más grande. La media móvil más larga establece el tono para la tendencia más grande y la media móvil más corta se utiliza para generar las señales. Uno buscaría cruces de precios alcistas sólo cuando los precios ya están por encima de la media móvil más larga. Esto estaría negociando en armonía con la tendencia más grande. Por ejemplo, si el precio está por encima de la media móvil de 200 días, los cartistas sólo se centrarán en las señales cuando el precio se mueve por encima de la media móvil de 50 días. Obviamente, un movimiento por debajo de la media móvil de 50 días precedería a tal señal, pero tales cruces bajistas serían ignorados porque la tendencia más grande es hacia arriba. Una cruz bajista simplemente sugeriría un retroceso dentro de una mayor tendencia alcista. Un retroceso por encima de la media móvil de 50 días señalaría una subida de los precios y la continuación de la mayor tendencia alcista. El siguiente gráfico muestra Emerson Electric (EMR) con la EMA de 50 días y EMA de 200 días. La acción se movió por encima y se mantuvo por encima de la media móvil de 200 días en agosto. Hubo bajadas por debajo de los 50 días EMA a principios de noviembre y de nuevo a principios de febrero. Los precios se movieron rápidamente por encima de la EMA de 50 días para proporcionar señales alcistas (flechas verdes) en armonía con la mayor tendencia alcista. MACD (1,50,1) se muestra en la ventana del indicador para confirmar los cruces de precios por encima o por debajo de la EMA de 50 días. El EMA de 1 día es igual al precio de cierre. El MACD (1,50,1) es positivo cuando el cierre está por encima del EMA de 50 días y negativo cuando el cierre está por debajo del EMA de 50 días. Soporte y Resistencia Los promedios móviles también pueden actuar como soporte en una tendencia alcista y resistencia en una tendencia bajista. Una tendencia alcista a corto plazo podría encontrar apoyo cerca de la media móvil simple de 20 días, que también se utiliza en bandas de Bollinger. Una tendencia alcista a largo plazo podría encontrar apoyo cerca del promedio móvil de 200 días, que es el promedio móvil más popular a largo plazo. De hecho, el promedio móvil de 200 días puede ofrecer soporte o resistencia simplemente porque es tan ampliamente utilizado. Es casi como una profecía autocumplida. El gráfico de arriba muestra el NY Composite con el promedio móvil simple de 200 días desde mediados de 2004 hasta finales de 2008. Los 200 días de apoyo brindado numerosas veces durante el avance. Una vez que la tendencia se invirtió con una ruptura de apoyo superior doble, el promedio móvil de 200 días actuó como resistencia alrededor de 9500. No espere soporte exacto y niveles de resistencia de promedios móviles, especialmente medias móviles más largas. Los mercados son impulsados ​​por la emoción, lo que los hace propensos a los rebasamientos. En lugar de los niveles exactos, las medias móviles se pueden utilizar para identificar las zonas de apoyo o resistencia. Conclusiones Las ventajas de utilizar promedios móviles deben sopesarse frente a las desventajas. Los promedios móviles son tendencia que sigue, o rezagada, los indicadores que serán siempre un paso detrás. Esto no es necesariamente una cosa mala. Después de todo, la tendencia es su amigo y es mejor el comercio en la dirección de la tendencia. Medias móviles aseguran que un comerciante está en línea con la tendencia actual. A pesar de que la tendencia es su amigo, los valores pasan una gran cantidad de tiempo en rangos comerciales, lo que hace que los promedios móviles sean ineficaces. Una vez en una tendencia, los promedios móviles le mantendrá en, pero también dar señales tardías. Don039t esperan vender en la parte superior y comprar en la parte inferior utilizando promedios móviles. Al igual que con la mayoría de las herramientas de análisis técnico, las medias móviles no deben usarse por sí solas, sino en conjunto con otras herramientas complementarias. Los cartistas pueden usar promedios móviles para definir la tendencia general y luego usar RSI para definir los niveles de sobrecompra o sobreventa. Adición de promedios móviles a los gráficos de StockCharts Los promedios móviles están disponibles como una función de superposición de precios en el workbench de SharpCharts. Utilizando el menú desplegable Superposiciones, los usuarios pueden elegir un promedio móvil simple o un promedio móvil exponencial. El primer parámetro se utiliza para establecer el número de períodos de tiempo. Se puede agregar un parámetro opcional para especificar el campo de precio que se debe utilizar en los cálculos: O para el Abierto, H para el Alto, L para el Bajo y C para el Cierre. Una coma se utiliza para separar los parámetros. Se puede agregar otro parámetro opcional para cambiar las medias móviles a la izquierda (pasado) oa la derecha (futuro). Un número negativo (-10) cambiaría la media móvil a la izquierda 10 períodos. Un número positivo (10) cambiaría la media móvil a los 10 periodos correctos. Múltiples promedios móviles pueden superponerse a la gráfica de precios simplemente agregando otra línea de superposición al workbench. Los miembros de StockCharts pueden cambiar los colores y el estilo para diferenciar entre varios promedios móviles. Después de seleccionar un indicador, abra Opciones avanzadas haciendo clic en el pequeño triángulo verde. Las Opciones avanzadas también se pueden usar para agregar una superposición de promedio móvil a otros indicadores técnicos como RSI, CCI y Volumen. Haga clic aquí para un gráfico en vivo con varios promedios móviles diferentes. Usando los promedios móviles con las exploraciones de StockCharts Aquí hay algunas exploraciones de la muestra que los miembros de StockCharts pueden utilizar para explorar diversas situaciones del promedio móvil: Movimiento alcista de la media cruzada: Esta exploraciones busca las poblaciones con una media móvil simple de 150 días y una cruz alcista de los 5 EMA y EMA de 35 días. La media móvil de 150 días está subiendo, siempre y cuando se está negociando por encima de su nivel hace cinco días. Una cruz alcista ocurre cuando la EMA de 5 días se mueve por encima de la EMA de 35 días sobre un volumen por encima del promedio. Mediano bajista de media móvil: este escaneo busca acciones con una caída de la media móvil simple de 150 días y un cruce bajista de la EMA de 5 días y la EMA de 35 días. La media móvil de 150 días está cayendo, siempre y cuando se está negociando por debajo de su nivel hace cinco días. Una cruz bajista ocurre cuando la EMA de 5 días se mueve por debajo de la EMA de 35 días sobre un volumen por encima del promedio. Estudio adicional El libro de John Murphy tiene un capítulo dedicado a los promedios móviles ya sus diversos usos. Murphy cubre los pros y los contras de los promedios móviles. Además, Murphy muestra cómo los promedios móviles trabajan con Bollinger Bands y los sistemas comerciales basados ​​en canales. Análisis Técnico de los Mercados Financieros John MurphyEste fin de semana decidí probar mi mano en Scala y Clojure. Im competente con la programación orientada a objetos, y por lo que Scala fue fácil de aprender como un idioma, pero quería probar la programación funcional. Aquí es donde se puso duro. Simplemente no puedo poner mi cabeza en un modo de escribir funciones. Como un programador funcional experto, ¿cómo abordar un problema? Dado una lista de valores y un período definido de sumación, ¿cómo generar una nueva lista de la media móvil simple de la lista Por ejemplo: Dado los valores de la lista (2,0, 4,0 , 7.0, 6.0, 3.0, 8.0, 12.0, 9.0, 4.0, 1.0), y el período 4, la función debe retornar: (0.0, 0.0, 0.0, 4.75, 5.0, 6.0, 7.25, 8.0, 8.25, 6.5) Pasar un día reflexionando sobre él, lo mejor que pude encontrar en Scala fue esto: Sé que esto es terriblemente ineficaz, Id mucho más bien hacer algo como: Ahora que sería fácil de hacer en un estilo imperativo, pero no puedo por la vida De mi trabajo cómo expresar eso funcionalmente. Interesante problema. Puedo pensar en muchas soluciones, con diferentes grados de eficiencia. Tener que agregar cosas repetidamente no es realmente un problema de rendimiento, pero permite asumir que es. Además, los ceros al principio pueden ser prependidos más tarde, por lo que no se preocupe por producirlos. Si el algoritmo les proporciona naturalmente, bien si no, lo corregimos más tarde. A partir de Scala 2.8, lo siguiente daría el resultado para n gt período usando deslizamiento para obtener una ventana deslizante de la Lista: Sin embargo, aunque esto es bastante elegante, no tiene el mejor rendimiento posible, porque no se aprovecha de ya Adiciones calculadas. Así que, hablando de ellos, ¿cómo podemos obtenerlos? Digamos que escribimos esto: Tenemos una lista de la suma de cada dos pares. Vamos a tratar de utilizar este resultado para calcular el promedio móvil de 4 elementos. La fórmula anterior hizo el siguiente cálculo: Así que si tomamos cada elemento y lo añadimos al segundo elemento siguiente, obtenemos el promedio móvil de 4 elementos: Podemos hacerlo así: Podríamos calcular el promedio móvil para 8 elementos, y así. Bueno, hay un algoritmo bien conocido para calcular las cosas que siguen tal patrón. Su más conocido por su uso en el cálculo de la potencia de un número. Va así: Así, vamos a aplicarlo aquí: Así, heres la lógica. Período 0 es inválido, período 1 es igual a la entrada, período 2 es ventana deslizante de tamaño 2. Si es mayor que eso, puede ser par o impar. Si es impar, agregamos cada elemento al elemento de movimiento de los elementos siguientes (impar - 1). Por ejemplo, si 3, agregamos cada elemento al súmen de los 2 elementos siguientes. Si igualamos, calculamos el número de movimiento para n / 2. Luego añadimos cada elemento al uno n / 2 pasos después. Con esa definición, podemos entonces volver al problema y hacer esto: Hay una poca ineficiencia con respecto al uso de. Pero su O (período), no O (values. size). Se puede hacer más eficiente con una función recursiva de la cola. Y, por supuesto, la definición de deslizamiento que proporcioné es horrendo en cuanto a rendimiento, pero habrá una definición mucho mejor de la misma en Scala 2.8. Tenga en cuenta que no podemos hacer un método deslizante eficiente en una lista. Pero podemos hacerlo en un iterable. Habiendo dicho todo eso, id ir con la primera definición, y optimizar sólo si un análisis de trayectoria crítica señaló esto como un gran problema. Para concluir, vamos a considerar cómo me fui sobre el problema. Tenemos un problema de media móvil. Un promedio móvil es la suma de una ventana en movimiento en una lista, dividida por el tamaño de esa ventana. Por lo tanto, en primer lugar, intento conseguir una ventana corredera, sumar todo en ella, y luego dividir por el tamaño. El siguiente problema fue evitar la repetición de adiciones ya calculadas. En este caso, fui a la menor adición posible, y traté de averiguar cómo calcular mayores sumas reutilizando tales resultados. Por último, vamos a tratar de resolver el problema de la forma en que lo calculó, mediante la adición y sustracción del resultado anterior. Conseguir el primer promedio es fácil: Ahora hacemos dos listas. Primero, la lista de elementos que se deben sustraer. A continuación, la lista de elementos a añadir: Podemos agregar estas dos listas mediante zip. Este método sólo producirá tantos elementos como la lista más pequeña tiene, lo que evita que el problema de restar sea mayor de lo necesario: Terminamos componiendo el resultado con un doble: que es la respuesta a devolver. Toda la función se ve así: conozco Clojure mejor que Scala, así que aquí va. Como escribo esto la otra entrada de Clojure aquí es imperativo que no es realmente lo que estás después (y no es idiomático Clojure). El primer algoritmo que viene a mi mente está tomando repetidamente el número solicitado de elementos de la secuencia, soltando el primer elemento, y recurrente. Lo siguiente funciona en cualquier tipo de secuencia (vector o lista, perezoso o no) y da una secuencia perezosa de promedios --- que podría ser útil si youre trabajando en una lista de tamaño indefinido. Tenga en cuenta que se encarga de la base de casos, volviendo implícitamente nil si no arent elementos suficientes en la lista para consumir. Ejecutar esto en sus datos de prueba rinde No da 0 para los primeros elementos en la secuencia, aunque que podría ser manejado (algo artificialmente). Lo más fácil de todo es ver el patrón y ser capaz de traer a la mente una función disponible que se ajuste a la factura. Partición da una vista perezosa de las porciones de una secuencia, que luego se puede cartografiar: Alguien pidió una cola recursiva versión recursividad cola frente a la pereza es un poco de una compensación. Cuando su trabajo es la construcción de una lista, a continuación, hacer su función recursiva cola suele ser bastante simple, y esto no es una excepción --- sólo construir la lista como un argumento a una subfunción. Bueno, acumular a un vector en lugar de una lista porque de lo contrario la lista se construirá hacia atrás y tendrá que ser revertida al final. Loop es una forma de hacer una función interna anónima (tipo de Schemes named let) recurrente debe usarse en Clojure para eliminar las llamadas de cola. Conj es un contras generalizado. Añadiendo de la manera natural para la recolección --- el comienzo de las listas y el final de los vectores. He decidido añadir a esta vieja Q, porque el tema surgió de nuevo (stackoverflow / questions / 2359821 / hellip) y me resulta preferible señalar a esta bonita colección de posibles soluciones, mientras que la adición de mi propia (Que es diferente de las versiones anteriores en Clojure, como se explica en la A). Quizás podamos construir el repositorio más completo de las implementaciones funcionales de mov-avg). Ndash Micha Marczyk Mar 2 10 a las 0:20 Heres una solución Haskell de una línea parcialmente libre de puntos: Primero aplica colas a la lista para obtener las listas de colas , Por lo que: Invierte y deja caer las primeras entradas p (tomando p como 2 aquí): En caso de que usted no está familiarizado con el símbolo (.) Punto / nipple, es el operador para la composición funcional, es decir, pasa la salida de una función Como la entrada de otro, componiéndolos en una sola función. (G. f) significa que se ejecuta f en un valor y luego pasa la salida a g, por lo que ((g) x) es el mismo que (g (f x)). Generalmente su uso conduce a un estilo de programación más claro. A continuación, mapea la función ((/ (fromIntegral p)) sum. Take p) en la lista. Por lo tanto, para cada lista de la lista se toman los primeros elementos p, se suma, luego se divide por p. Entonces volteamos la lista de nuevo con el reverso. Todo esto parece mucho más ineficiente de lo contrario es invertir físicamente invertir el orden de una lista hasta que la lista se evalúa, sino que sólo establece en la pila (buen ol perezoso Haskell). Colas también no crea todas esas listas separadas, sólo hace referencia a diferentes secciones de la lista original. Su todavía no es una gran solución, pero una línea de largo :) He aquí una solución un poco más agradable pero más larga que utiliza mapAccum para hacer una substracción y adición deslizante: Primero dividimos la lista en dos partes en p, así que: Sum el primer bit: Zip el segundo bit con la lista original (esto sólo pares de los elementos en orden de las dos listas). La lista original es obviamente más larga, pero perdemos este extra bit: Ahora definimos una función para nuestro mapAccum (ulator). MapAccumL es el mismo que el mapa, pero con un parámetro adicional de estado de ejecución / acumulador, que se pasa de la asignación anterior a la siguiente cuando el mapa se ejecuta a través de la lista. Utilizamos el acumulador como nuestro promedio móvil, y como nuestra lista está formada por el elemento que acaba de salir de la ventana deslizante y el elemento que acaba de entrar (la lista que acabamos de comprimir), nuestra función de deslizamiento toma el primer número x lejos de El promedio y agrega el segundo número y. A continuación, pasar el nuevo s a lo largo y volver s dividido por p. Snd (segundo) sólo toma el segundo miembro de un par (tupla), que se utiliza para tomar el segundo valor de retorno de mapAccumL, como mapAccumL devolverá el acumulador, así como la lista asignada. Para aquellos de ustedes que no están familiarizados con el símbolo. Es el operador de la aplicación. Realmente no hace nada pero tiene una prioridad de vinculación baja, derecha-asociativa, por lo que significa que puede dejar de lado los corchetes (tomar nota LISPers), es decir (fx) es lo mismo que fx Running (ma 4 2.0, 4.0, 7,0, 6,0, 3,0, 8,0, 12,0, 9,0, 4,0, 1,0) proporciona 4,75, 5,0, 6,0, 7,25, 8,0, 8,25, 6,5 para cada solución. Ah y youll necesidad de importar el módulo Lista para compilar cualquier solución. Daniel Gracias Escribir código es mucho más fácil que explicarlo -) Usted ha descrito la esencia de la misma. Dos listas / corrientes se mantienen en ambas funciones y obtienen sus quetes que se quitan durante cada iteración. Una lista / secuencia sirve como la colección principal para iterar a través mientras que la otra lista / corriente, que es la misma colección excepto tiene quotperiodquot menos Doubles quitado él, se utiliza en el cálculo de la nueva media móvil. Ndash Walter Chang Aug 24 09 at 17:19 El lenguaje de programación J facilita programas como el promedio móvil. De hecho, hay menos caracteres en (/) que en su etiqueta, media móvil. Para los valores especificados en esta pregunta (incluyendo los valores de nombre) aquí es una manera sencilla de codificar esto: Podemos describir esto mediante etiquetas para los componentes. Ambos ejemplos utilizan exactamente el mismo programa. La única diferencia es el uso de más nombres en la segunda forma. Tales nombres pueden ayudar a los lectores que no conocen las primarias J. Permite mirar un poco más en lo que está pasando en el subprograma, promedio. / Denota la suma () y denota división (como el signo clásico). El cálculo de un recuento (recuento) de elementos se realiza mediante. El programa general, entonces, es la suma de los valores divididos por el recuento de valores: / El resultado del cálculo de la media móvil escrito aquí no incluye los ceros iniciales esperados en la pregunta original. Esos ceros son discutible no parte del cálculo previsto. La técnica utilizada aquí se llama programación tácita. Es prácticamente lo mismo que el estilo sin puntos de programación funcional. Respondió Aug 26 10 at 16:15 Aquí está Clojure pretendiendo ser un lenguaje más funcional. Esto es totalmente recursivo de cola, btw e incluye ceros a la izquierda. Por lo general, poner la colección o el último parámetro de lista para hacer la función más fácil de curry. Pero en Clojure. Es tan engorroso, por lo general terminan haciendo esto. En cuyo caso, realmente no importa qué orden van los parámetros. #: 3452 java jonathan jonathan jajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajajaj Donde cualquiera de las opciones se basa en la recurrencia. Esto calculará cada parámetro primero, y sólo entonces recurse. La respuesta será el resultado de la recurrencia. Como el resultado es el mismo resultado devuelto por la recursividad, sin otros cálculos, esto es recursivo de cola. Ndash Daniel C. Sobral Ago 24 09 at 15:20 Este ejemplo hace uso del estado, ya que para mí es una solución pragmática en este caso, y un cierre para crear la función de promediación de ventana: sigue siendo funcional en el sentido de hacer uso De funciones de primera clase, aunque no es libre de efectos secundarios. Los dos idiomas que mencionó se ejecutan en la parte superior de la JVM y, por tanto, permiten la administración del estado cuando es necesario. Esta solución está en Haskell, que me es más familiar: Responder Aug 24 09 at 10:23 Me gusta el uso de la declaración de partido. Intenté hacer algo similar, pero no podía hacer todo el camino hasta allí. Ndash James P Aug 24 09 at 14:39 Una versión corta de Clojure que tiene la ventaja de ser O (longitud de la lista) independientemente de su período: Esto explota el hecho de que puede calcular la suma de un rango de números creando una suma acumulada De la secuencia (por ejemplo 1 2 3 4 5 - 0 1 3 6 10 15) y luego restando los dos números con un desplazamiento igual a su período. Al llegar tarde a la fiesta, y también a la programación funcional, llegué a esta solución con una función interna: adopté la idea, dividir toda la lista por el período (len) de antemano. Luego genero la suma para empezar con los len-primeros elementos. Y genero los primeros elementos inválidos (0.0, 0.0.). A continuación, rescursivo recursivamente el primero y agregar el último valor. Al final, lamento todo. Respondió Apr 23 a las 19:28 La clave es la función de colas, que mapea una lista a una lista de copias del original Lista, con la propiedad de que el n-ésimo elemento del resultado falta los primeros n-1 elementos. Aplicamos fmap (avg. Take n) al resultado, lo que significa que tomamos el prefijo n-length de la sublista, y calculamos su promedio. Si la longitud de la lista que estamos evaluando no es n, entonces no calculamos el promedio (puesto que es indefinido). En ese caso, devolveremos Nada. Si lo es, lo hacemos, y lo envuelves en Just. Finalmente, ejecutamos catMaybes en el resultado de fmap (avg. Take n), para deshacernos del tipo Maybe. Me sorprendió y me decepcionó el desempeño de lo que me pareció las soluciones más idiomáticas de Clojure, las soluciones perezosas de JamesCunningham. Así es como una combinación de la solución de James con la idea de DanielC. Sobral de adaptar la rápida-exponenciación a las sumas en movimiento: Edición: éste basado en la solución de mikera s es aún más rápido. Respondió Jul 22 13 at 19:21 Su respuesta 2016 Stack Exchange, Inc

Comments

Popular posts from this blog

Pokemon Y Sistema De Comercio

Pokemon X e Y Trading Guide 8211 Consejos para GTS y Wonder Trade Por: Arslan Tufail / Antes de comenzar a operar en Pokemon X e Y, usted necesita aprender casi todo acerca de Global Trading Station. GTS le permite encontrar buenas operaciones y seleccionar un Pokemon para ser comercializado. Pokemon X y Y Trading Encontrar buenos oficios tiene una buena curva de aprendizaje y usted aprenderá un montón de información sobre el procedimiento de negociación, mientras que, última parte es cuando realmente comenzar a negociar Pokemon. El Sistema de Comercio de Maravillas se presenta recientemente en Pokemon X e Y que básicamente te permite intercambiar tu Pokémon para obtener un carácter aleatorio. Hablaré de Wonder Trade en un tiempo sin embargo, usar GTS siempre es mejor que Wonder Trade. Nota. Ha habido informes de una falla que congela tu juego cuando usas el filtro para mostrar solo Pokemon que tengo que cambiar. El fracaso y algunas malas operaciones no importa, pero asegúrese de que ...

Forex Sin Depósito Bono Agosto 2017

Forex sin bonificación de depósito 100 agosto 2012 La frecuencia de crossover depende tanto de la distancia física entre loci como. Sin humos, nada de autust. Jan 03, 2013I acaba de unirme al grupo y he descargado e instalado el complemento SMF en Excel 2010. Los derechos de voto de los titulares de nuestras unidades comunes están restringidos por disposiciones en un acuerdo de sociedad limitada que declara que cualquiera de nuestras unidades comunes. Bien leer mi Bill Poulos Instant Pips revisión. Mateo 5 Biblia Amplificada AMP 5 Viendo las multitudes, subió al monte, y cuando se sentó, vinieron a él sus discípulos. Estrategia de comercio de divisas 7 Sistema de ruptura simple La idea detrás de este 20012 sistema de comercio de Forex es auugst un movimiento temprano del precio cuando empieza a. Europa, líder en comercio de divisas y educación de inversores, anunció hoy el lanzamiento de su nueva plataforma de operaciones de opciones, FXDD Options Trader. Esta página ha sido marcada pa...

Los Candeleros Japoneses Explicados

Los candeleros proporcionan indicaciones visuales únicas que facilitan la lectura de los precios. El comercio con las cartas japonesas de la vela permite que los especuladores entiendan mejor sentimiento del mercado. Ofreciendo una mayor profundidad de información que los gráficos de barras tradicionales 8211 donde se destacan los altos y bajos 8211 candeleros dan énfasis a la relación entre precio de cierre y precio abierto. Los comerciantes que utilizan candelabros pueden identificar más rápidamente diferentes tipos de acción de precios que tienden a predecir reversiones o continuaciones en las tendencias, uno de los aspectos más difíciles del comercio. Además, combinado con otras herramientas de análisis técnico, el análisis de patrones de velas puede ser una manera muy útil de seleccionar puntos de entrada y salida. El cuerpo de un candelero ilustra la diferencia entre el precio abierto y el de cierre. Su color (en este caso, rojo para abajo y azul para arriba) muestra si el mercad...