Volatilità storica


La volatilità storica (o realizzata) quantifica la dispersione dei rendimenti passati di un asset finanziario attraverso la deviazione standard annualizzata dei rendimenti, logaritmici o semplici, del prezzo dell'asset. \[ \sigma_{\text{storica}} = \sqrt{252} \times \sqrt{\frac{1}{n-1} \sum_{i=1}^{n} (r_i - \bar{r})^2} \] dove:

Possiamo determinare la volatilità storica di diversi asset e visualizzarli. Il metodo .rolling() consente di associare a ogni dato del DataFrame l'insieme dei dati che lo precedono per un numero totale pari alla dimensione del parametro windows. Nell'ambito di ognuna di queste finestre viene quindi determinata la volatilià.

import numpy as np import pandas as pd import yfinance as yf from datetime import datetime, timedelta def historical_volatility(symb_lst, start_date, end_date=None, window=30, log_returns=True): volatility_df = pd.DataFrame() for symb in symb_lst: prices = yf.download(symb, start_date, end_date).Close # Calcola i rendimenti if log_returns: returns = np.log(prices / prices.shift(1)) else: returns = prices.pct_change() # Calcola la deviazione standard rolling rolling_std = returns.rolling(window=window).std() # Annualizza e converti in percentuale volatility_df[symb] = rolling_std * np.sqrt(252) * 100 symb_lst = ['AAPL', 'MSFT', 'GOOGL', 'AMZN', 'META'] start_date = '2019-01-01' df = historical_volatility(symb_lst=symb_lst, start_date=start_date) df.plot(figsize=(14,7))
Possiamo anche sintetizzare la volatilità storica.
stats = {} for symb in symb_lst: stats[symb] = { 'media': df[symb].mean(), 'std': df[symb].std(), 'min': df[symb].min(), 'max': df[symb].max(), 'p25': df[symb].quantile(0.25), 'p75': df[symb].quantile(0.75) } pd.DataFrame(stats).T.round(2)
media std min max p25 p75
AAPL 27.81 12.60 10.29 95.65 19.91 30.57
MSFT 26.08 12.15 8.95 99.96 18.89 30.76
GOOGL 29.67 10.28 11.56 80.61 22.64 34.83
AMZN 31.91 11.68 12.29 70.56 23.33 38.22
META 38.40 17.48 14.03 104.16 26.24 43.38

Riferimenti sito/bibliografici