Cómo realizar la media móvil en Python

Mejor respuesta

He escrito un artículo en Medium que presenta los diferentes tipos de medias móviles y codificando sus funciones en Python (Full enlace para el código ya que el formato es difícil: Cómo codificar diferentes tipos de promedios móviles en Python. ). Aquí está el artículo:

Los softwares de trading vienen con diferentes tipos de promedios móviles ya preinstalados y listos para graficar. Pero puede ser interesante entender cómo calcular estos promedios móviles para poder usarlos cuando esté probando estrategias potenciales.

Si desea un método de hágalo usted mismo, entonces lo siguiente seguramente te interesará. Todo lo que se necesita es un intérprete de Python como SPYDER. Los diferentes tipos «conocidos» de medias móviles son:

  • Media móvil simple.
  • Media móvil exponencial.
  • Media móvil suavizada.
  • Media móvil ponderada lineal.

Nosotros revisará cada uno, lo definirá, lo codificará y lo trazará.

GBPUSD Gráfico diario. En negro, MA de 200 días, en carmesí, EMA de 200 días, en amarillo MA suavizado de 200 días y en rosa, MA de 200 días ponderado lineal.

Media móvil simple

Como sugiere el nombre, este es su promedio simple y simple que se usa en todas partes en las estadísticas y básicamente en cualquier otra parte de nuestras vidas. Es simplemente el valor total de las observaciones dividido por el número de observaciones.

Hablando matemáticamente, se puede escribir como:

En Python, podemos definir una función que calcula los promedios móviles de la siguiente manera:

[El código Python va aquí, por favor consulte el enlace del artículo original anterior, ya que pegar el código requiere mucho tiempo]

La función toma su estructura de datos representada por Data variable, el período de promedio móvil (20, 60, 200, etc.) representado por la variable período , en qué desea aplicarlo ( en estructuras de datos OHLC, elija 3 para precios de cierre porque la indexación de Python comienza en cero) representada por la variable sobre qué y la donde variable es dónde desea que aparezca la columna de promedio móvil. Tenga en cuenta que debe tener una matriz de más de 4 columnas para que esto funcione, porque no crea automáticamente una nueva columna, sino que simplemente la completa.

EURUSD Horizonte de tiempo diario con media móvil simple de 200 días.

Media móvil exponencial

A diferencia de la media móvil simple que da igual peso a todas las observaciones, la media móvil exponencial le da más peso a las observaciones más recientes. Reacciona más que la media móvil simple con respecto a los movimientos recientes.

Hablando matemáticamente, se puede escribir como:

El factor de suavizado suele ser 2. Tenga en cuenta que si aumentamos el factor de suavizado (también conocido como alfa), las observaciones más recientes tendrán más peso.

En lenguaje Python , podemos definir una función que calcule la EMA de la siguiente manera:

[El código Python va aquí, consulte el enlace del artículo original anterior para pegar el código consume mucho tiempo]

La función se explica por sí misma, ya que simplemente reproduce la función EMA presentada anteriormente.

EURUSD Horizonte de tiempo diario con media móvil exponencial de 200 días.

Media móvil suavizada

Esta media móvil tiene en cuenta el panorama general y se ve menos afectada por los movimientos recientes. Es mi indicador de seguimiento de tendencias favorito. Matemáticamente hablando, se puede encontrar simplemente multiplicando la variable Días en la función EMA por 2 y restando 1. Esto significa que para transformar una media móvil exponencial en una suavizada, seguimos esta ecuación en lenguaje Python, que transforma la media móvil exponencial promedio en uno suavizado:

smoothed = (exponential * 2) - 1 # From exponential to smoothed

EURUSD Horizonte de tiempo diario con media móvil suavizada de 200 días.

Media móvil ponderada lineal

Es una media móvil simple que otorga más peso a los datos recientes. La observación más reciente tiene el mayor peso y cada una de las anteriores tiene un peso que disminuye progresivamente.Intuitivamente, tiene menos retraso que los otros promedios móviles, pero también es el menos utilizado y, por lo tanto, lo que gana en la reducción del retraso, lo pierde en popularidad.

Hablando matemáticamente, se puede escribir como:

En lenguaje Python, podemos definir una función que calcula promedios móviles de la siguiente manera:

[El código Python va aquí, consulte el enlace del artículo original anterior ya que pegar el código lleva mucho tiempo]

EURUSD Horizonte de tiempo diario con promedio móvil ponderado de 200 días.

Básicamente, si tenemos un conjunto de datos compuesto por dos números [1, 2] y queremos calcular un promedio ponderado lineal, luego haremos lo siguiente:

  • (2 x 2) + (1 x 1) = 5
  • 5/3 = 1.66

Esto supone una serie de tiempo con el número 2 como la observación más reciente.

Conclusión

Entonces, ¿cuál elegir? Esa pregunta se deja al perfil de riesgo del comerciante y su familiaridad con la media móvil. Algunos prefieren promedios móviles simples, mientras que otros intentan profundizar utilizando combinaciones de promedios móviles exponenciales y suavizados. Todo depende de ti para encontrar tu favorito. ¿Mi consejo? Considere promedios móviles a más largo plazo.

Respuesta

¿Por qué nadie mencionó a Pandas todavía? Biblioteca de análisis de datos de Python

import pandas as pd, numpy as np

np.random.seed(1)

random\_walk = pd.Series(

np.random.randn(100)

).cumsum() # dummy data

random\_walk.ewm(span=10).mean() # ema

random\_walk.rolling(20).mean() # simple moving average

random\_walk.expanding().mean() # expanding average

index = pd.bdate\_range("2012","2013",freq="1h") # time series

series = pd.Series(

np.random.randn(index.shape[0]),index

)

series.rolling("100h").mean() # 100 hours, time based window

series.rolling(pd.Timedelta(hours=30)).mean() # You may use any offset compatible with index

series.rolling(10, win\_type="triang").mean() # triangle weights

series.rolling(10,center=True).mean() # value in the middle of window

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *