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:
- \( r_i = \ln\left(\frac{P_i}{P_{i-1}}\right) \) rendimento logaritmico giornaliero,
- \( \bar{r} \) media dei rendimenti nel periodo,
- \( n \) numero di osservazioni ovvero ampiezza della finestra temporale, aumentando la quale la volatilità è più "smussata",
- \( \sqrt{252} \) fattore di annualizzazione, ovvero i giorni di trading in un anno.
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
- Historical Volatility Tutorials and Reference, on macroption