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