7 votos

Volatilidad histórica a partir de los precios de cierre (Haug pg 166)

He implementado una función para calcular la volatilidad histórica utilizando el método close the close tal y como lo describe Haug en la página 166.

Cuando apliqué la fórmula dada por Haug, resultó en algunos valores negativos para la varianza. Los datos que utilizo no son sospechosos, así que el fallo debe de estar en cualquiera de los dos:

  • mi aplicación o
  • la propia fórmula.

He aquí un esbozo de mi función de aplicación (en Python)

# close_prices is a time sorted list of pricedata objects
# returns a list of calculated volatilities
def calc_volatility(close_prices, period):
    startpos, stoppos, raw_vols = (0, period, [])
    while True:
        subset = close_prices[startpos:stoppos+1]
        period_returns      = [ subset[i].close_price/subset[i-1].close_price for i in range(1,len(subset)) ]
        log_returns         = [ math.log(x) for x in period_returns ]
        log_squared_returns = [ math.log(pow(x,2)) for x in period_returns ]

        sum_squares_1 = sum( log_squared_returns ) / (period-1)
        sum_squares_2 = pow( sum( log_returns ), 2) / (period * (period -1))

        variance = sum_squares_1 - sum_squares_2
        print "ss1: {0} - ss2: {1}. Variance: {2}".format(sum_squares_1, sum_squares_2, variance)

        volatility = math.sqrt(variance)

        raw_vols.append (volatility)

        startpos += period
        stoppos  += period

        if stoppos >= len(close_prices):
            break

    return raw_vols

¿Hay algún error en mi aplicación o la fórmula que utilizo es incorrecta?

0 votos

4.17.7 ¿Opción de barrera blanda?

3 votos

Parece que tiene logaritmos de rendimientos de ratio al cuadrado ( log_squared_returns ) en lugar de los cuadrados de los rendimientos logarítmicos: sum_squares_1 puede ser negativo.

2 votos

Para una mayor eficacia, puede escribir log_squared_returns = [ pow(x,2) for x in log_returns ] y eso habría evitado el error mencionado por @VincentZoonekynd

4voto

DanGar Puntos 83

Tengo una solución diferente, que calcula el vol para una lista de precios.

import math

#workout volatility
def perc_change(price_list):
 return [(v / price_list[abs(i-1)])-1 for i, v in enumerate(price_list)]

def variance(price_list):
 perc = perc_change(price_list)
 avg = average(perc)
 return [(x - avg)**2 for x in perc]

def average(x):
 return sum(x)/len(x)

var = variance(list_of_prices)

volatility = math.sqrt(average(var))

0 votos

Hola mike, ¡bienvenido a quant.SE! Este es el método estándar para calcular la varianza. Sin embargo, no es el método de Haug. ¿Estás diciendo que ese método no funciona en absoluto, u otra cosa?

0 votos

Sólo he añadido ingenuamente mi método "estándar". Lo siento si esto causó alguna confusión

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