9 votos

Calculando la vida media de una serie de reversión a la media con Python

Actualmente estoy intentando calcular la semivida de una serie de reversiones a la media utilizando el lenguaje de programación Python y la teoría del proceso de Ornstein–Uhlenbeck.

Tengo una serie que cuando se grafica se ve así:

Serie de reversiones a la media

Que obviamente parece ser de reversiones a la media. Estoy realizando lo siguiente utilizando código en Python para encontrar la semivida (por cierto, la serie mostrada arriba se encuentra en la variable (z_array)):

import numpy as np
import statsmodels.api as sm

# configurar la serie rezagada de z_array y devolver la serie de z_array
z_lag = np.roll(z_array,1)
z_lag[0] = 0
z_ret = z - z_lag
z_ret[0] = 0

# ejecutar regresión OLS para encontrar el coeficiente de regresión a utilizar como "theta"
modelo = sm.OLS(z_ret,z_lag)
res = modelo.fit()

# calcular semivida
semivida = -log(2) / res.params[0]
print  'Semivida = ',semivida

El código se ejecuta bien, sin embargo, para esta serie estoy obteniendo una semivida de 680.5 días - puedo ver en el gráfico que esto parece muy incorrecto. Las reversiones completas están ocurriendo dentro de una fracción de ese período de tiempo.

¿Alguien podría por favor aconsejarme dónde estoy cometiendo un error con esto?

¡Cualquier ayuda será muy apreciada!

0 votos

Es difícil decir qué valor "se ve bien" al mirar el gráfico, debería trazar el diagrama de dispersión y ver si la línea de regresión a través de él "se ve bien".

0 votos

Descubrí cuál era el problema: tuve que usar el método add_constant para añadir un término de intercepción a la regresión, luego usar res.params[1]. ¡Gracias por tu respuesta de todos modos, la aprecio mucho!

14voto

Jritchie Puntos 11

¡Descubrí qué estaba haciendo mal: la función OLS estaba regresando sin un valor de intercepción, por lo que tuve que usar el método "add_constant" para agregar un término de intercepción a la serie X (z_lag) de la siguiente manera:

z_lag = np.roll(z_array,1)
z_lag[0] = 0
z_ret = z_array - z_lag
z_ret[0] = 0

#añade términos de intercepción a la variable X para la regresión
z_lag2 = sm.add_constant(z_lag)

modelo = sm.OLS(z_ret,z_lag2)
res = modelo.fit()

halflife = -log(2) / res.params[1]

¡Ahora obtengo un halflife más razonable de 15 días!

0 votos

Hola, según este enlace, la estimación de la vida media de un proceso AR(1) debería ser log(0.5)/log(numpy.abs(res.params[1])). Esta derivación es típica de los métodos ARMA. Para el proceso OU, se tiene el resultado de $\log{2}$ / $\alpha$ donde $\alpha > 0$ es la velocidad de reversión media. mathtopics.wordpress.com/2013/01/10/…

0 votos

Segundo enlace para el proceso de semivida OU: mathtopics.wordpress.com/2013/01/07/ornstein-uhlenbeck-proce‌​ss

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X