9 votos

Explicación del Exponente de Hurst Generalizado del Método Estándar

Disculpas si esta pregunta es vaga, la he repasado varias veces en mi cabeza tratando de expresarla de la mejor manera posible, pero no estoy seguro de que se aclare cada vez.

He estado mirando este artículo del sitio web https://www.quantstart.com/articles/Basics-of-Statistical-Mean-Reversion-Testing y he estado investigando el código para el exponente de Hurst en Python. El artículo proporciona un fragmento de código en Python como sigue (para calcular el Hurst):

def hurst(ts):
    """Devuelve el Exponente de Hurst del vector de series temporales ts"""
    # Crear el rango de valores de retardo
    lags = range(2, 100)

    # Calcular la matriz de las varianzas de las diferencias desfasadas
    tau = [sqrt(std(subtract(ts[lag:], ts[:-lag]))) for lag in lags]

    # Utilizar un ajuste lineal para estimar el Exponente de Hurst
    poly = polyfit(log(lags), log(tau), 1)

    # Devolver el exponente de Hurst desde la salida del polyfit
    return poly[0]*2.0

Que funciona muy bien, pero debido a mi personalidad molesta donde necesito entender algo antes de usarlo, he estado volviéndome loco durante un día y medio tratando de entender cómo se desarrolló/determinó este código (especialmente la parte de sqrt(std)). El artículo en sí tiene algunos pasos breves, pero no puedo seguirlos. Puede ser que no entienda del todo lo que significa la notación <| ..... |> y cómo puede relacionarse con la desviación estándar. Adjunto aquí:

Ecuaciones Hurst

¿Alguien puede proporcionar un enlace a un artículo, sitio web o documento que muestre desde qué principios podría haber sido derivado este cálculo? A partir del documento de Racine, tengo entendido que el método original de Hurst fue el método RS, pero creo que el método utilizado en el código es del exponente de Hurst generalizado o el método estándar.

Mi nivel de matemáticas no es de nivel de doctorado, pero tengo un título en Ingeniería, por lo que tampoco es totalmente inútil. Lo que me cuesta entender enormemente es por qué el código utiliza la raíz cuadrada de la desviación estándar, así que si alguien pudiera arrojar algo de luz sobre eso, se lo agradecería enormemente.

Gracias por tu tiempo, nuevamente disculpas si esto no es totalmente claro.

0 votos

¿El paso para calcular el vector tau sigue siendo claro?

0 votos

Entiendo la parte: (restar(ts[lag:], ts[:-lag])) ya que esto solo resta la serie rezagada de la serie de tiempo original. Lo que no entiendo es por qué tomamos la desviación estándar de eso y luego la raíz cuadrada de eso, ya que no veo nada en las ecuaciones dadas en el artículo (desearía poder reproducirlas aquí, pero no puedo averiguar cómo reproducir fórmulas aquí) que indique por qué debería estar usando std y luego sqrt.

0 votos

Puede ser que el signo <| |> en esas ecuaciones me esté confundiendo, ya que podrían tener algún significado matemático avanzado del que no estoy al tanto.

3voto

Todd Price Puntos 703

@vanguard2k No he podido exactamente estar satisfecho con la derivación del código original, pero he logrado hacer lo siguiente. He revisado la fuente del código, que es QuantStart que acredita al Dr. Tom Starke, que utiliza un código ligeramente diferente y también acredita al Dr. Ernie Chan. Luego fui al blog del Dr. Chan y usé sus principios para crear mi propio código. Utiliza varianza en lugar de desviación estándar, elimina la raíz cuadrada y utiliza un divisor de 2.0 en lugar de un multiplicador de 2.0 (que es el 1/4 que mencionas). Y los resultados que da son los mismos que el código original. La diferencia es que entiendo (creo) los principios que están detrás del código a continuación y la respuesta final es la misma. Muchas gracias por toda tu ayuda solucionando problemas conmigo, al final tenías bastante razón, todos los elementos que no parecían tener sentido se cancelaron entre sí al final (supongo).

http://epchan.blogspot.fr/2016/04/mean-reversion-momentum-and-volatility.html

  1. El Dr. Chan afirma que si z es el precio del log, entonces la volatilidad, muestreada a intervalos de , es volatility()=(Var(z(t)-z(t-))). Para mí otra forma de describir la volatilidad es la desviación estándar, entonces std()=(Var(z(t)-z(t-)))

  2. la desviación estándar es simplemente la raíz de la varianza así que var()=(Var(z(t)-z(t-)))

  3. Luego el Dr. Chan afirma: En general, podemos escribir Var() ^(2H) donde H es el exponente de Hurst

  4. Por lo tanto (Var(z(t)-z(t-))) ^(2H)

  5. Tomando el logaritmo de cada lado obtenemos log (Var(z(t)-z(t-))) 2H log

  6. [ log (Var(z(t)-z(t-))) / log ] / 2 H (da como resultado el exponente de Hurst) donde sabemos que el término entre corchetes a la extrema izquierda es la pendiente de un gráfico log-log de tau y un conjunto correspondiente de varianzas.

lags = range(2,100)

def hurst_ernie_chan(p):

variancetau = []; tau = []

for lag in lags: 

    # Escribir los diferentes rezagos en un vector para calcular un conjunto de tau o rezagos
    tau.append(lag)

    # Calcular los logaritmos de todos los días, luego calcular la varianza en la diferencia en los logaritmos
    # llamar a esto pp o la diferencia de precio
    pp = subtract(p[lag:], p[:-lag])
    variancetau.append(var(pp))

# ahora tenemos un conjunto de tau o rezagos y un conjunto correspondiente de varianzas.
#print tau
#print variancetau

# trazar el logaritmo de esas varianzas contra el logaritmo de tau y obtener la pendiente
m = polyfit(log10(tau),log10(variancetau),1)

hurst = m[0] / 2

return hurst

2voto

Wim Coenen Puntos 225

No estoy al tanto de la notación en este caso, pero aún estoy tratando de entenderlo. (quizás alguien pueda corregirlo?) Esto es lo que tengo:

Existe la noción de variación cuadrática que podría aplicarse aquí. También puedes pensarlo como un producto escalar (que es lo mismo). Puedes ver que la notación aquí es bastante descuidada, porque $\text{log}(t)$ denota el proceso de precios logarítmicos en el tiempo $t$. Para puntos discretos en el tiempo, puedes interpretarlo como el vector de precios logarítmicos en los tiempos $t_i$ y tratar el corchete como un producto escalar (ahora denotando $\log(t+\tau)$ y $\log(t)$ como un vector): $$ \langle (\text{log}(t+\tau)-\text{log}(t))^2\rangle \approx \langle \text{log}(t+\tau)-\text{log}(t),\text{log}(t+\tau)-\text{log}(t)\rangle $$

Ahora, intento cambiar a una notación más precisa.

Sea $t_i, i = 1,\ldots,T$ los instantes de tiempo discretos y $P_i$ el precio en $t_i$. Entonces el término anterior significa lo siguiente:

$$ \left(\sum_{i=1}^{T-\tau} (\log(P_{i+\tau})-\log(P_i))^2\right)^{1/2}. $$

Ahora, para determinar el exponente de Hurst $H$, decimos que esto es aproximadamente $\tau^{2H}$:

$$ \left(\sum_{i=1}^{T-\tau} (\log(P_{i+\tau})-\log(P_i))^2\right)^{1/2} \approx \tau^{2H}$$

tomando el logaritmo en ambos lados da como resultado: $$ \log(\ldots) \approx 2H \log(\tau)$$

Entonces lo que hace el algoritmo es tomar 99 valores para $\tau$ y calcular la variación cuadrática de las diferencias rezagadas. Luego regresiona esos valores sobre $\tau$ para obtener una aproximación de $2H$.

Ahora, si volvemos al código: No sé qué hace la función polyfit, pero asumo que realiza una regresión polinómica con el grado como parámetro. Lo que no entiendo es la última línea donde el resultado se multiplica por dos, pero deberías poder verificar esto si aclaras la salida de la función (qué se regresa sobre qué, qué coeficientes se guardan dónde).

1 votos

Gracias muchísimas por todo el esfuerzo que pusiste en esta respuesta. He pasado mucho tiempo revisando tu respuesta y temo tener 2 preguntas de seguimiento. Estoy extremadamente agradecido por el tiempo que ya has invertido en esta respuesta. 1. Si la primera ecuación es el producto escalar, ¿no daría eso tu segunda ecuación, sin el ^(1/2) o raíz cuadrada? Mi entendimiento es que un producto escalar de 2 vectores (o el mismo vector en este caso) es simplemente cada término multiplicado por sí mismo añadido juntos (sin la raíz cuadrada). ¿De dónde viene el 1/2?

0 votos

2. Aparte del problema mencionado anteriormente, entiendo la progresión de todas tus ecuaciones. Lo que no estoy seguro es cómo esto se relaciona con el término std en el código de Python, ya que no veo nada en tus ecuaciones que se relacione con una desviación estándar. Si no es mucho pedir, ¿podrías aclarar rápidamente la relación?

2 votos

@Wei Por supuesto, solo estaba tratando de ofrecer mis pensamientos aquí. :) Por supuesto, tienes razón con respecto a la raíz cuadrada. Eso es un error de mi parte. Bueno, la cosa es que después de tomar el logaritmo, esto será solo un multiplicador. Ahora, si llegamos a la última línea del código, multiplica el resultado por dos. No estoy seguro de si los términos en los papers son 100% correctos. La desviación estándar es la raíz cuadrada de la suma de cuadrados. Luego, el código toma la raíz cuadrada nuevamente por lo que tienes una potencia de 1/4. Después de tomar el logaritmo, esto será nuevamente una constante... Sé que aún no estamos ahí, pero...

2voto

Matthew Elvey Puntos 121

Creo que el fragmento de código de Python dado está compuesto de acuerdo a los siguientes pasos:

\begin{equation} var(\tau) = \left< |z(t+\tau)-z(t)|^2 \right> \thicksim \tau^{2H} \end{equation}

\begin{equation} \Rightarrow var(...)\thicksim \tau^{2H} \end{equation}

\begin{equation} \Rightarrow std(...) \thicksim \tau^{H} \end{equation}

\begin{equation} \Rightarrow sqrt(std(...)) \thicksim \tau^{\frac H 2} \end{equation}

\begin{equation} \Rightarrow log(sqrt(std(...)) \thicksim \frac H 2 log(\tau) \end{equation}

así, después de aplicar ployfit(), obtenemos el resultado H que es poly[0]*2.0

1voto

Jake Stevenson Puntos 1113

No logro entender cómo funciona este código también.

En el pasado, he utilizado esta implementación de Matlab para el cálculo del exponente de Hurst generalizado y fue bastante fiable.

Recientemente alguien ha traducido esto a Python, pero aún no lo he probado.

Espero que eso ayude.

0 votos

Gracias por la respuesta. Desafortunadamente, no es tanto el código con el que tengo un problema, sino el entender cómo el autor ha derivado el código a partir de las ecuaciones que he publicado. Creo que gran parte de mi confusión se debe a los símbolos <| |> ¿sabes qué representan? Gracias.

0 votos

Como se menciona en este documento: [link]arxiv.org/pdf/1109.0465.pdf 'representa el promedio de la muestra en la ventana de tiempo'

0 votos

Gracias por el enlace al código de Python y al artículo, me ha dado qué pensar y necesitaré digerirlo en los próximos días. Saludos de nuevo.

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