Solución:
Parece que estas buscando Series.rolling
. Puede aplicar el std
cálculos al objeto resultante:
roller = Ser.rolling(w)
volList = roller.std(ddof=0)
Si no planea usar el objeto de ventana rodante nuevamente, puede escribir una sola línea:
volList = Ser.rolling(w).std(ddof=0)
Manten eso en mente ddof=0
es necesario en este caso porque la normalización de la desviación estándar es por len(Ser)-ddof
, y eso ddof
predeterminado a 1
en pandas.
Típicamente, [finance-type] la gente cotiza la volatilidad en términos anualizados de cambios porcentuales en el precio.
Suponiendo que tiene precios diarios en un marco de datos df
y hay 252 días de negociación en un año, probablemente lo que desee sea algo como lo siguiente:
df.pct_change().rolling(window_size).std()*(252**0.5)
La “volatilidad” es ambigua incluso en un sentido financiero. El tipo de volatilidad más comúnmente referenciado es volatilidad realizada que es la raíz cuadrada de la varianza realizada. Las principales diferencias con la desviación estándar de los rendimientos son:
- Se utilizan devoluciones de registros (no devoluciones simples)
- La cifra está anualizada (generalmente asumiendo entre 252 y 260 días hábiles al año)
- En el caso de Swaps de varianza, los retornos de registros no se degradan
Hay una variedad de métodos para calcular la volatilidad realizada; sin embargo, he implementado los dos más comunes a continuación:
import numpy as np
window = 21 # trading days in rolling window
dpy = 252 # trading days per year
ann_factor = days_per_year / window
df['log_rtn'] = np.log(df['price']).diff()
# Var Swap (returns are not demeaned)
df['real_var'] = np.square(df['log_rtn']).rolling(window).sum() * ann_factor
df['real_vol'] = np.sqrt(df['real_var'])
# Classical (returns are demeaned, dof=1)
df['real_var'] = df['log_rtn'].rolling(window).var() * ann_factor
df['real_vol'] = np.sqrt(df['real_var'])