Simulazione storica e Monte Carlo

Gestione quantitativa del rischio in Python

Jamsheed Shorish

Computational Economist

Simulazione storica

  • Nessuna classe di distribuzioni adatta?
  • Simulazione storica: usa il passato per prevedere il futuro
    • Nessuna ipotesi di distribuzione richiesta
    • I dati sulle perdite passate diventano perdite simulate per domani
Gestione quantitativa del rischio in Python

Simulazione storica in Python

  • VaR: parti dai rendimenti in asset_returns
  • Calcola portfolio_returns usando i weights del portafoglio
  • Converte portfolio_returns in losses
  • VaR: calcola np.quantile() per losses con, ad es., confidenza 95%
  • Presuppone che la distribuzione futura delle perdite sia esattamente come quella passata

 

weights = [0.25, 0.25, 0.25, 0.25]

portfolio_returns = asset_returns.dot(weights)
losses = - portfolio_returns
VaR_95 = np.quantile(losses, 0.95)
Gestione quantitativa del rischio in Python

Simulazione Monte Carlo

  • Simulazione Monte Carlo: potente combinazione di stima parametrica e simulazione
    • Assume distribuzioni per la perdita di portafoglio e/o i fattori di rischio
    • Si basa su estrazioni casuali dalle distribuzioni per creare un percorso casuale, detto run
    • Ripeti le estrazioni $\Rightarrow$ ottieni un insieme di run di simulazione
  • Calcola la perdita simulata del portafoglio per ogni run fino al tempo desiderato
  • Trova la VaR come quantile delle perdite simulate
Gestione quantitativa del rischio in Python

Simulazione Monte Carlo in Python

  • Passo uno:
    • Importa la distribuzione Normale norm da scipy.stats
    • Definisci total_steps (1 giorno = 1440 minuti)
    • Definisci il numero di run N
    • Calcola media mu e deviazione standard sigma dei portfolio_losses
from scipy.stats import norm

total_steps = 1440
N = 10000
mu = portfolio_losses.mean() sigma = portfolio_losses.std()
Gestione quantitativa del rischio in Python

Simulazione Monte Carlo in Python

  • Passo due:
    • Inizializza il vettore daily_loss per N run
    • Cicla sui N run
      • Calcola il vettore loss simulato con Monte Carlo
        • Usa norm.rvs() per estrarre ripetutamente dalla Normale standard
        • Le estrazioni riflettono i dati usando mu e sigma scalati di 1/total_steps
daily_loss = np.zeros(N)

for n in range(N):
loss = ( mu * (1/total_steps) + norm.rvs(size=total_steps) * sigma * np.sqrt(1/total_steps) )
Gestione quantitativa del rischio in Python

Simulazione Monte Carlo in Python

  • Passo tre:
    • Genera daily_loss cumulata per ogni run n
    • Usa np.quantile() per trovare la VaR, ad es. al 95% di confidenza, su daily_loss

 

daily_loss = np.zeros(N)
for n in range(N):

loss = mu * (1/total_steps) + ... norm.rvs(size=total_steps) * sigma * np.sqrt(1/total_steps)
daily_loss[n] = sum(loss)
VaR_95 = np.quantile(daily_loss, 0.95)
Gestione quantitativa del rischio in Python

Simulare i rendimenti degli asset

  • Affinamento: genera traiettorie casuali dei rendimenti degli asset in portafoglio
    • Più realismo: i rendimenti possono essere simulati singolarmente
    • I rendimenti possono essere correlati
      • Ricorda: matrice di covarianza efficiente e_cov
      • Usata nel Passo 2 per calcolare i rendimenti degli asset
  • Esercizi: simulazione Monte Carlo con simulazione dei rendimenti degli asset
Gestione quantitativa del rischio in Python

Esercitiamoci!

Gestione quantitativa del rischio in Python

Preparing Video For Download...