Wednesday 25 October 2017

Numpy Moving Average Example


Hmmm, parece que este citar a implementar la función es realmente muy fácil de equivocarse y ha fomentado una buena discusión sobre la eficiencia de la memoria. Me alegro de tener hinchazón si significa saber que algo se ha hecho bien. Ndash Richard Sep 20 14 at 19:23 NumPys carencia de una función específica de dominio específico es quizás debido a la disciplina de los Equipos Core y la fidelidad a NumPys principal directiva: proporcionar un tipo de matriz N-dimensional. Así como funciones para crear e indexar esas matrices. Como muchos objetivos fundacionales, este no es pequeño, y NumPy lo hace brillantemente. La SciPy (mucho) más grande contiene una colección mucho mayor de bibliotecas específicas de dominio (llamadas subpaquetes por SciPy devs), por ejemplo, optimización numérica (optimizar), procesamiento de señal (señal) y cálculo integral (integrar). Mi conjetura es que la función que está después está en por lo menos uno de los subpaquetes de SciPy (scipy. signal quizás) sin embargo, miraría primero en la colección de SciPy scikits. Identificar el (los) científico (s) relevante (s) y buscar la función de interés allí. Scikits son desarrollados independientemente paquetes basados ​​en NumPy / SciPy y dirigidos a una disciplina técnica particular (por ejemplo, scikits-image, scikits-learn, etc.) Varios de estos fueron (en particular, el impresionante OpenOpt para la optimización numérica) Proyectos mucho antes de elegir para residir bajo la rúbrica relativamente nueva de scikits. La página web de Scikits gustaba de listar alrededor de 30 tal scikits. Aunque al menos varios de ellos ya no están en desarrollo activo. Siguiendo este consejo te llevaría a scikits-timeseries sin embargo, ese paquete ya no está en desarrollo activo. En efecto, Pandas se ha convertido, AFAIK, la biblioteca de series de tiempo basada en NumPy. Pandas tiene varias funciones que se pueden utilizar para calcular un promedio móvil, el más simple de estos es probablemente rollingmean. Que se utiliza de la siguiente manera: Ahora, sólo tiene que llamar a la función rollingmean pasando en el objeto Series y un tamaño de ventana. Que en mi ejemplo a continuación es de 10 días. Verificar que funcionó - por ejemplo. Los valores comparados 10-15 en la serie original versus la nueva serie suavizado con la media de balanceo La función rollingmean, junto con una docena de otras funciones se agrupan informalmente en la documentación Pandas bajo la rubrica de funciones de ventana móvil un segundo grupo relacionado de funciones En Pandas se denomina funciones exponencialmente ponderadas (por ejemplo, ewma., Que calcula el promedio ponderado que se mueve exponencialmente). El hecho de que este segundo grupo no está incluido en la primera (mover las funciones de la ventana) es quizás porque las transformaciones ponderadas exponencialmente no se basan en una ventana de longitud fija. En mi última frase estaba tratando de indicar por qué ayuda a error de punto flotante. Si dos valores son aproximadamente el mismo orden de magnitud, a continuación, agregarlos pierde menos precisión que si agregó un número muy grande a uno muy pequeño. El código combina valores quotadjacentquot de una manera que incluso las sumas intermedias siempre deben estar razonablemente cerca en magnitud, para minimizar el error de punto flotante. Nada es infalible, pero este método ha salvado un par de proyectos muy mal implementados en la producción. Ndash Mayur Patel dic 15 14 at 17:22 Alleo: En lugar de hacer una adición por valor, you39ll estar haciendo dos. La prueba es la misma que el problema de desplazamiento de bits. Sin embargo, el punto de esta respuesta no es necesariamente rendimiento, sino precisión. El uso de la memoria para calcular el promedio de valores de 64 bits no excedería de 64 elementos en la memoria caché, por lo que también es amigable en el uso de memoria. Ndash Mayur Patel Dic 29 14 at 17:04 UPD: Alleo y jasaarim han propuesto soluciones más eficientes. Puede utilizar np. convolve para eso: El argumento mode especifica cómo manejar los bordes. He elegido el modo válido aquí, porque creo que es cómo la mayoría de la gente espera correr significa trabajar, pero usted puede tener otras prioridades. Aquí hay un gráfico que ilustra la diferencia entre los modos: Puedes calcular una media de ejecución con: Afortunadamente, numpy incluye una función de convolución que podemos utilizar para acelerar las cosas. La media de ejecución es equivalente a convertir x con un vector que es N largo, con todos los miembros iguales a 1 / N. La implementación numpy de convolve incluye el transitorio inicial, por lo que tienes que eliminar los primeros N-1 puntos: En mi máquina, la versión rápida es 20-30 veces más rápida, dependiendo de la longitud del vector de entrada y el tamaño de la ventana de promedio . Tenga en cuenta que convolve no incluye un mismo modo que parece que debe abordar el problema transitorio de inicio, pero se divide entre el principio y el final. Elimina el transitorio del final, y el principio no tiene uno. Bueno, supongo que es una cuestión de prioridades, no necesito el mismo número de resultados a expensas de conseguir una pendiente hacia cero que no está ahí en los datos. BTW, aquí está un comando para mostrar la diferencia entre los modos: modos (39full39, 39same39, 39valid39) trama (convolve (unos 200,)), unos (50,)) (-10, 251, -.1, 1.1) leyenda (modos, loc39lower center39) (con pyplot y numpy importados). Ndash lapis Mar 24 14 at 13:56 I39m siempre molestos por la función de procesamiento de señales que devuelven señales de salida de diferente forma que las señales de entrada cuando ambas entradas y salidas son de la misma naturaleza (por ejemplo ambas señales temporales). Rompe la correspondencia con variables independientes relacionadas (por ejemplo, tiempo, frecuencia) haciendo que el trazado o la comparación no sea una cuestión directa. De todos modos, si compartes la sensación, podrías querer cambiar las últimas líneas de la función propuesta como ynp. convolve (w / w. sum (), s, mode39same39) return ywindowlen-1 :-( windowlen-1) ndash Christian O39Reilly Aug 25 15 at 19:56 lapis sí, pero permite decir que utiliza el método cumsum en la primera marca y guardar su matriz promedio móvil para la siguiente marca. Cada garrapata a partir de entonces sólo tiene que añadir el último valor de la media móvil a su matriz rodante en el almacenamiento. Usando este método no se vuelven a calcular las cosas que ya se han calculado: En la primera marca que cumsum a continuación, sólo se añade el quotmean de los últimos elementos del período que es 2 veces más rápido para todas las garrapatas subsiguientes. Ndash litepresence Jun 10 at 12: 29numpy. average Eje a lo largo del cual a. Si No. El promediado se realiza sobre la matriz aplanada. Pesos Arraylike, optional Una matriz de pesos asociados con los valores en a. Cada valor en a contribuye al promedio según su peso asociado. La matriz de pesos puede ser 1-D (en cuyo caso su longitud debe ser del tamaño de a a lo largo del eje dado) o de la misma forma que a. Si pesaNo. Entonces se supone que todos los datos en a tienen un peso igual a uno. Devuelto Bool, opcional El valor predeterminado es False. Si es verdad . Se devuelve la tupla (promedio de sumo - pesos), de lo contrario sólo se devuelve el promedio. Si pesaNo. Sumofweights es equivalente al número de elementos sobre los cuales se toma la media. Promedio, sumofweights. Arraytype o double Devuelve el promedio a lo largo del eje especificado. Cuando se devuelve True. Devuelve una tupla con el promedio como el primer elemento y la suma de los pesos como el segundo elemento. El tipo de retorno es Float si a es de tipo entero, de lo contrario es del mismo tipo que a. Sumofweights es del mismo tipo que el promedio. Prueba de una media móvil Crossover en Python con pandas Por Michael Halls-Moore el 21 de enero de 2017 En el artículo anterior sobre Investigación Backtesting Entornos En Python Con Pandas creamos un objeto orientado a la investigación basada en backtesting Y probarlo en una estrategia de pronóstico aleatorio. En este artículo vamos a hacer uso de la maquinaria que introdujimos para llevar a cabo una investigación sobre una estrategia real, a saber, el promedio móvil Crossover en AAPL. Estrategia de crossover de media móvil La técnica de crossover de media móvil es una estrategia de impulso simplista extremadamente conocida. A menudo se considera el ejemplo de Hello World para el comercio cuantitativo. La estrategia descrita aquí es larga solamente. Se crean dos filtros sencillos simples de media móvil, con periodos de retroceso variables, de una serie de tiempo particular. Las señales para comprar el activo ocurren cuando la media móvil de retroceso más corto excede la media móvil de retroceso más larga. Si el promedio más largo excede posteriormente el promedio más corto, el activo se vende de nuevo. La estrategia funciona bien cuando una serie de tiempo entra en un período de fuerte tendencia y luego invierte lentamente la tendencia. Para este ejemplo, he elegido Apple, Inc. (AAPL) como la serie de tiempo, con un breve lookback de 100 días y un largo lookback de 400 días. Este es el ejemplo proporcionado por la biblioteca de comercio algorítmico zipline. Por lo tanto, si queremos implementar nuestro propio backtester debemos asegurarnos de que coincide con los resultados en zipline, como un medio básico de validación. Implementación Asegúrese de seguir el tutorial anterior aquí. Que describe cómo se construye la jerarquía de objetos inicial para el backtester, de lo contrario el código siguiente no funcionará. Para esta implementación en particular he utilizado las siguientes bibliotecas: La implementación de macross. py requiere backtest. py del tutorial anterior. El primer paso es importar los módulos y objetos necesarios: Como en el tutorial anterior, vamos a subclase la clase base abstracta de la estrategia para producir MovingAverageCrossStrategy. Que contiene todos los detalles sobre cómo generar las señales cuando los promedios móviles de AAPL se cruzan entre sí. El objeto requiere una ventana corta y una ventana larga sobre la cual operar. Los valores se han fijado a valores predeterminados de 100 días y 400 días respectivamente, que son los mismos parámetros utilizados en el ejemplo principal de tirolesa. Los promedios móviles se crean mediante el uso de la función rollingmean de los pandas en las barrasCerrar el precio de cierre de la acción AAPL. Una vez que se han construido los promedios móviles individuales, la serie de señales se genera ajustando la colum igual a 1,0 cuando el promedio móvil corto es mayor que el promedio móvil largo, o 0,0 de lo contrario. A partir de esto, los pedidos de posiciones se pueden generar para representar señales comerciales. El MarketOnClosePortfolio está subclasificado de Portfolio. Que se encuentra en backtest. py. Es casi idéntica a la implementación descrita en el tutorial anterior, con la excepción de que las operaciones se llevan a cabo ahora en una base Close-to-Close, en lugar de una base Open-to-Open. Para obtener más información sobre cómo se define el objeto Portfolio, consulte el tutorial anterior. He dejado el código en la integridad y mantener este tutorial autónomo: Ahora que se han definido las clases MovingAverageCrossStrategy y MarketOnClosePortfolio, se llamará a una función principal para vincular toda la funcionalidad. Además, el desempeño de la estrategia será examinado a través de un gráfico de la curva de equidad. El objeto de DataReader de pandas descarga los precios de OHLCV de las acciones de AAPL para el período del 1 de enero de 1990 al 1 de enero de 2002, momento en el que las señales DataFrame se crean para generar las señales de sólo larga duración. Posteriormente, la cartera se genera con una base de capital inicial de 100.000 USD y los rendimientos se calculan sobre la curva de patrimonio. El paso final es utilizar matplotlib para trazar un gráfico de dos cifras de los precios de AAPL, superpuestos con las medias móviles y las señales de compra / venta, así como la curva de equidad con las mismas señales de compra / venta. El código de trazado se toma (y se modifica) a partir del ejemplo de implementación de tirolesa. La salida gráfica del código es la siguiente. Hice uso del comando IPython paste para ponerlo directamente en la consola IPython mientras estaba en Ubuntu, de modo que la salida gráfica permaneció en la vista. Las barras de color rosa representan la compra de la acción, mientras que los downticks negros representan la venta de nuevo: Como se puede ver la estrategia pierde dinero durante el período, con cinco operaciones de ida y vuelta. Esto no es sorprendente teniendo en cuenta el comportamiento de AAPL en el período, que estaba en una ligera tendencia a la baja, seguido por un aumento significativo a partir de 1998. El período de retroceso de las señales de media móvil es bastante grande y esto afectó el beneficio del comercio final , Que de otro modo podría haber hecho rentable la estrategia. En los artículos siguientes crearemos un medio más sofisticado de analizar el rendimiento, así como describir cómo optimizar los períodos de retroceso de las señales individuales de media móvil. Michael Halls-Moore Mike es el fundador de QuantStart y ha estado involucrado en la industria de finanzas cuantitativas durante los últimos cinco años, principalmente como desarrollador de Quant y más tarde como consultor de comerciante de Quant para hedge funds. Advanced Matplotlib Series ) Una vez que tenga una comprensión básica de cómo funciona Matplotlib, es posible que tenga un interés en tomar su conocimiento un poco más. Algunas de las necesidades gráficas más complejas vienen en forma de análisis de acciones y gráficos, o Forex. En esta serie de tutoriales, iban a cubrir dónde y cómo agarrar, ordenar y organizar automáticamente algunos datos de precios de acciones y forex. A continuación, se va a gráfico con algunos de los indicadores más populares como un ejemplo. Aquí, bien hacer MACD (Moving Average Convergence Divergence) y el RSI (Relative Strength Index). Para ayudarnos a calcular éstos, usaremos NumPy, pero de otra manera los calcularemos todos por nuestra cuenta. Para adquirir los datos, iban a utilizar el Yahoo finanzas API. Esta API devuelve datos de precios históricos para el símbolo de ticker que especificamos y para la longitud de tiempo que pedimos. Cuanto mayor sea el tiempo, menor será la resolución de los datos obtenidos. Por lo tanto, si usted pide un período de tiempo de 1 día para AAPL, obtendrá 3-minutos OHLC (abrir alto cierre bajo) los datos. Si usted pide 10 años vale la pena, obtendrá datos diarios, o incluso tres marcos de tiempo de día. Tenga esto en mente y elija un marco de tiempo que se ajuste a sus objetivos. Además, si elige un marco de tiempo lo suficientemente bajo y obtiene suficiente granularidad, la API devolverá el tiempo en un sello de tiempo unix, en comparación con un sello de fecha. Una vez que tengamos los datos, queremos graficarlo. Para empezar, bien trazar las líneas, pero la mayoría de la gente querrá trazar un candelero en su lugar. Utilizaremos la función de candelabro de Matplotlibs y haremos una edición sencilla para mejorarla ligeramente. En este mismo gráfico, también superponen algunos cálculos de promedio móvil. Después de esto, se va a crear una subtrama, y ​​graficar el volumen. No podemos trazar el volumen en la misma subtrama inmediatamente, porque la escala es diferente. Para empezar, vamos a trazar el volumen por debajo en otra parcela secundaria, pero finalmente bien en realidad el volumen de superposición en la misma figura y lo hacen algo transparente. Luego, iban a agregar 2 subparcelas y trazar un indicador RSI en la parte superior y el indicador MACD en la parte inferior. Para todos estos, iban a compartir el eje X, por lo que podemos acercar y alejar en 1 parcela y todos coincidirán con el mismo marco de tiempo. Vamos a trazar en formato de fecha para el eje X, y personalizar casi todas las cosas que podemos para la estética. Esto incluye el cambio de los colores de las etiquetas, colores de borde / columna, colores de línea, colores de candelabro de OHLC, aprender a crear un gráfico relleno (para el volumen), histogramas, dibujar líneas específicas (hline para RSI) y mucho más. Heres el resultado final (tengo una versión de Python 3 y una de Python 2. Python 3 primero, luego Python 2. Asegúrate de usar el que coincida con tu versión de Python): Eso es todo por ahora. Quiere más tutoriales Vaya a la página principal Matplotlib Crash Course

No comments:

Post a Comment