Friday 27 October 2017

Moving Average Pandas Dataframe


Operaciones de la columna Pandas (operaciones matemáticas básicas y promedios móviles) En este video tutorial de Pandas con Python con código de ejemplo, cubrimos algunas de las operaciones rápidas y básicas que podemos realizar en nuestros datos. Digamos que tiene un conjunto de datos al que desea agregar un promedio móvil, o tal vez desee hacer algunos cálculos matemáticos basados ​​en unos pocos bits de datos en otras columnas, agregando el resultado a una nueva columna. Vamos a ver cómo podemos hacer eso: Todo lo anterior debe entenderse, ya que ha sido cubierto ya hasta este punto. Ahora, vamos a hacer una nueva columna, llamándola H-L, donde los datos en la columna es el resultado del precio alto menos el precio bajo. Aquí, al igual que lo haría con un diccionario, definimos un nuevo objeto en nuestros datos de Pandas, llamándolo H-L. A partir de ahí, decimos que el valor de este objeto H-L es (df. High-df. Low). Todavía no se ha planteado, pero en realidad es bastante interesante que podamos hacer esto, pero también puede ser confuso. También podríamos decir dfH-L dfHigh-dfLow, pero, puesto que Pandas está tan fuertemente basado en objetos, pudieron también referenciarlo puramente como un objeto Su hasta usted cómo usted desea hacerlo. Prefiero tratarlo como un objeto, ya que eso es lo que es. Después de que hemos hecho esto, podemos ver imprimiendo head (), que weve consiguió una nueva columna agradable que contiene nuestros nuevos datos Thats aseado, pero qué acerca de hacer referencia a datos anteriores en otras columnas ¿Podemos hacerlo? Quiero hacer una media móvil Sure podemos. Los promedios móviles se construyen realmente en Pandas, llamado rollingmean. Arriba, hemos definido otra columna, al igual que podemos hacer un diccionario, y dijo que la columna es igual a df. rollingmean () del precio de cierre. Nuestro segundo parámetro aquí es el marco de tiempo para este promedio móvil. Luego, sólo imprimimos una porción de los datos, desde el elemento número 200 hasta el número 210. Realmente no podemos hacer df. head () aquí. Podríamos, pero los datos para el 100MA wouldnt ser calculado hasta que teníamos 100 piezas de datos para calcular. Otra interesante función incorporada con Pandas es diff (): Con la función diff (), fueron capaces de calcular la diferencia, o cambiar desde el valor anterior, para una columna. Por lo tanto, hay algunas operaciones básicas y una introducción inicial a algunos datos de manipulación y análisis con Pandas. Por lo tanto, la distribución diaria de retorno está lejos de lo normal y muestra una inclinación tan ligeramente positiva y una alta curtosis (la inclinación nb de la distribución normal es 0 , Y la curtosis de la distribución normal es 3). I8217m va a proceder en este punto para cavar un poco más profundo y producir algunos indicadores clave de rendimiento (KPIs) que comúnmente encontraría junto con el análisis de cualquier estrategia de comercio devuelve. Estos aren8217t pretenden ser exhaustivos pero I8217ll tratar de golpear en la mayoría de las principales áreas. Planeo producir lo siguiente: 1) Rentabilidad anualizada 2) Rentabilidad de los últimos 12 meses 3) Volatilidad 4) Ratio de Sharpe 5) Drawdown máximo 6) Calmar Ratio (Retorno anualizado / Drawdown máximo) 7) Volatilidad / Drawdown máximo 8) 9) Rendimiento Promedio Mensual 12) Promedio de Ganancias Mensuales 13) Promedio de Ganancias Mensuales / Promedio de Pérdidas Mensuales Antes de continuar Voy a construir rápidamente otro DataFrame fresco que llevará a cabo nuestros datos de la vuelta de la estrategia sobre una base mensual en vez de una base diaria 8211 esto hará ciertos cálculos más fáciles más adelante y nos permitirá producir una tabla mensual de las vueltas esto puede ser producida por 8220re - Sampling8221 la columna DataFrame original de la estrategia diaria regresa y se acumula desde allí. Ganancia Promedio Mensual 3.56 Pérdida Mensual Media -3.33 Ganancia Promedio Mensual / Pérdida Mensual Media 1.0683 Y finalmente8230 solo para acabar y usar un poco más de funcionalidad de Pandas DataFrame voy a crear una tabla de rendimientos mensuales. El primer paso es crear una tabla dinámica y volverla a muestrear para crear lo que se conoce como un objeto 8220pandas. tseries. resample. DatetimeIndexResampler8221. Para poder manipularlo un poco más fácilmente, voy a convertir este objeto de nuevo en un 8220DataFrame8221 utilizando la función 8220.aggregate () 8221. Podemos ahora poner los toques finales convirtiendo las fechas del índice para demostrar apenas el año algo que la fecha completa, y también substituimos también las cabeceras del mes de la columna (actualmente en formato numérico) con el formato apropiado 8220MMM8221. En primer lugar, tenemos que eliminar rápidamente uno de los niveles de índice de columna de tabla que es actualmente la palabra 8220Strategy8221 8211 esto nos dejará con una tabla con sólo un índice de columna de un solo nivel que corresponde a las representaciones de mes enteros. Visualmente la tabla cambiará de: Ahora sólo tenemos que cambiar el índice de fecha para mostrar en un formato anual (AAAA) y los encabezados de columna restantes para mostrar el formato mensual (MMM). Ahora nos quedamos con una tabla mensual de retornos que se parece a esto: Brillante Bueno, creo que 8282s suficiente por ahora como este puesto está empezando a obtener un poco largo. Tengo que pensar en los próximos días acerca de un posible tema para mi próximo post y llegar a trabajar en eso. 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 entorno de backtesting basado en la investigación orientado a objetos y lo probamos Sobre una estrategia de pronóstico aleatoria. 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 Media Crossover móvil 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 períodos 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 para mantener este tutorial autónomo: Ahora que las clases MovingAverageCrossStrategy y MarketOnClosePortfolio se han definido, una función principal se llamará para vincular todas las funciones. 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 cuantitativo para herramientas de hedge fundsputational Análogamente, DataFrame tiene un método cov para calcular Covariancias de pares entre las series en el DataFrame, también excluyendo NA / valores nulos. Suponiendo que los datos faltantes faltan al azar, esto resulta en una estimación para la matriz de covarianza que es imparcial. Sin embargo, para muchas aplicaciones esta estimación puede no ser aceptable porque no se garantiza que la matriz de covarianza estimada sea positiva semi-definida. Esto podría conducir a correlaciones estimadas que tienen valores absolutos que son mayores que uno, y / o una matriz de covarianza no invertible. Ver Estimación de matrices de covarianza para más detalles. DataFrame. cov también admite una palabra clave opcional minperiods que especifica el número mínimo requerido de observaciones para cada par de columnas para tener un resultado válido. Los pesos utilizados en la ventana se especifican mediante la palabra clave wintype. La lista de tipos reconocidos son: boxcar triang blackman hamming bartlett parzen bohman blackmanharris nuttall barthann kaiser (necesidades beta) gaussian (necesita std) generalgaussian (necesita poder, ancho) slepian (necesita ancho). Tenga en cuenta que la ventana del vagón es equivalente a mean (). Para algunas funciones de ventana, se deben especificar parámetros adicionales: Para. sum () con un wintype. No hay normalización hecha a los pesos para la ventana. Pasar pesos personalizados de 1, 1, 1 dará un resultado diferente que pasar pesos de 2, 2, 2. por ejemplo. Al pasar un wintype en lugar de especificar explícitamente los pesos, los pesos ya están normalizados para que el mayor peso sea 1. En contraste, la naturaleza del cálculo. mean () es tal que los pesos se normalizan uno con respecto al otro. Los pesos de 1, 1, 1 y 2, 2, 2 dan el mismo resultado. Rolling nuevo tiempo en la versión 0.19.0. Nuevos en la versión 0.19.0 son la capacidad de pasar un offset (o convertible) a un método. rolling () y hacer que produzca ventanas de tamaño variable basadas en la ventana de tiempo pasada. Para cada punto de tiempo, esto incluye todos los valores anteriores que ocurren dentro del delta de tiempo indicado. Esto puede ser particularmente útil para un índice de frecuencia de tiempo no regular. Este es un índice de frecuencia regular. El uso de un parámetro de ventana entero funciona para rodar a lo largo de la frecuencia de la ventana. Especificar un desplazamiento permite una especificación más intuitiva de la frecuencia de rodadura. Utilizando un índice no regular, pero aún monótono, rodar con una ventana entera no imparte ningún cálculo especial. El uso de la especificación de tiempo genera ventanas variables para estos datos escasos. Además, ahora permitimos que un parámetro opcional en el parámetro especifique una columna (en lugar del valor predeterminado del índice) en un DataFrame. Conocimiento del tiempo Rolling vs. Resampling El uso de. rolling () con un índice basado en el tiempo es muy similar al remuestreo. Ambos operan y realizan operaciones reductivas en objetos pandas indexados en el tiempo. Cuando se utiliza. rolling () con un desplazamiento. El desplazamiento es un tiempo-delta. Tome una ventana de búsqueda hacia atrás en el tiempo, y agregue todos los valores en esa ventana (incluyendo el punto final, pero no el punto de inicio). Este es el nuevo valor en ese punto en el resultado. Se trata de ventanas de tamaño variable en el espacio de tiempo para cada punto de la entrada. Obtendrá un resultado del mismo tamaño que la entrada. Cuando se utiliza. resample () con un desplazamiento. Construir un nuevo índice que es la frecuencia del desplazamiento. Para cada contenedor de frecuencia, el agregado apunta desde la entrada dentro de una ventana que mira hacia atrás en el tiempo que cae en ese contenedor. El resultado de esta agregación es la salida para ese punto de frecuencia. Las ventanas tienen un tamaño de tamaño fijo en el espacio de frecuencia. Su resultado tendrá la forma de una frecuencia regular entre el mínimo y el máximo del objeto de entrada original. Para resumir. Rolling () es una operación de ventana basada en el tiempo, mientras que. resample () es una operación de ventana basada en la frecuencia. Centrar las ventanas De forma predeterminada, las etiquetas se ajustan al borde derecho de la ventana, pero una palabra clave central está disponible para que las etiquetas se puedan establecer en el centro. Funciones de ventana binaria cov () y corr () pueden calcular las estadísticas de las ventanas en movimiento sobre dos Series o cualquier combinación de DataFrame / Series o DataFrame / DataFrame. Aquí está el comportamiento en cada caso: dos Series. Calcular la estadística para el emparejamiento. DataFrame / Series. Calcular las estadísticas para cada columna del DataFrame con la serie pasada, devolviendo así un DataFrame. DataFrame / DataFrame. Por defecto calcula la estadística para los nombres de columna coincidentes, devolviendo un DataFrame. Si se pasa el argumento de palabra clave pairwiseTrue, entonces calcula la estadística para cada par de columnas, devolviendo un Panel cuyos elementos son las fechas en cuestión (consulte la siguiente sección). Computación de covarianzas y correlaciones en pares En el análisis de datos financieros y otros campos es común calcular las matrices de covarianza y correlación para una colección de series de tiempo. A menudo uno también está interesado en la movilidad-ventana covarianza y matrices de correlación. Esto se puede hacer pasando el argumento de palabra clave pairwise, que en el caso de las entradas de DataFrame producirá un Panel cuyos elementos son las fechas en cuestión. En el caso de un solo argumento de DataFrame, el argumento pairwise puede incluso omitirse: Los valores faltantes se ignoran y cada entrada se calcula usando las observaciones completas pairwise. Consulte la sección de covarianza para las advertencias asociadas con este método de cálculo de covarianza y matrices de correlación. Aparte de no tener un parámetro de ventana, estas funciones tienen las mismas interfaces que sus contrapartes de desplazamiento. Como arriba, los parámetros que aceptan son: minperiodos. El umbral de puntos de datos no nulos que se requieren. El valor predeterminado es el mínimo necesario para calcular la estadística. No se emitirán NaNs una vez que se hayan observado puntos de datos no nulos de los minperiodos. centrar. Boolean, si se deben establecer las etiquetas en el centro (por defecto es False) La salida de los métodos. rolling y. expanding no devuelve un NaN si hay al menos valores no nulos de minperiodos en la ventana actual. Esto difiere de cumsum. Cumprod. Cummax Y cummin. Que devuelven NaN en la salida dondequiera que se encuentre un NaN en la entrada. Una estadística de ventana en expansión será más estable (y menos sensible) que su contrapartida de ventana de balanceo a medida que el tamaño creciente de la ventana disminuye el impacto relativo de un punto de datos individual. A modo de ejemplo, aquí está la salida media () para el conjunto de datos de series temporales anteriores: Ventas Exponencialmente Ponderadas Un conjunto relacionado de funciones son versiones ponderadas exponencialmente de varias de las estadísticas anteriores. Se accede a una interfaz similar a. rolling y. expanding a través del método. ewm para recibir un objeto EWM. Se proporcionan una serie de métodos EW en expansión (exponencialmente ponderados): Tengo una serie de tiempo que contiene datos de precios de acciones. Me gustaría calcular el índice de flujo de dinero (IMF) para cada fila. Dado que la IMF, utiliza el anterior aprox. 14 líneas para calcular la IMF actual, cuál sería el mejor enfoque para hacer esto. A continuación se calcula la IMF actual (www. investopedia / terms / m / mfi. asp) para un DataFrame dado, pero me gustaría implementar esto para cada Fila en el marco de datos que logré trabajar esto utilizando la función aplicar, pero esta función sólo permite un argumento, mientras que tendría que pasar más de un argumento para calcular lo anterior. Preguntó 22 de agosto a las 19:11

No comments:

Post a Comment