Historische en Monte Carlo-simulatie

Kwantitatief risicobeheer in Python

Jamsheed Shorish

Computational Economist

Historische simulatie

  • Geen passende klasse verdelingen?
  • Historische simulatie: gebruik verleden om de toekomst te voorspellen
    • Geen aanname over verdeling nodig
    • Data over eerdere verliezen worden gesimuleerde verliezen voor morgen
Kwantitatief risicobeheer in Python

Historische simulatie in Python

  • VaR: begin met rendementen in asset_returns
  • Bereken portfolio_returns met portefeuille-weights
  • Zet portfolio_returns om naar losses
  • VaR: bereken np.quantile() voor losses op bijv. 95% betrouwbaarheidsniveau
  • Veronderstelt dat de toekomstige verliesverdeling exact gelijk is aan het verleden

 

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)
Kwantitatief risicobeheer in Python

Monte Carlo-simulatie

  • Monte Carlo-simulatie: krachtige mix van parametrische schatting en simulatie
    • Neemt verdeling(en) aan voor portefeuilleverlies en/of risicofactoren
    • Gebruikt willekeurige trekkingen uit verdeling(en) om een willekeurig pad te maken, een run
    • Herhaal trekkingen ⇒ vormt een set simulatieruns
  • Bereken gesimuleerd portefeuilleverlies over elke run tot de gewenste tijd
  • Vind VaR als het kwantiel van gesimuleerde verliezen
Kwantitatief risicobeheer in Python

Monte Carlo-simulatie in Python

  • Stap één:
    • Importeer normale verdeling norm uit scipy.stats
    • Definieer total_steps (1 dag = 1440 minuten)
    • Definieer aantal runs N
    • Bereken gemiddelde mu en standaardafwijking sigma van portfolio_losses
from scipy.stats import norm

total_steps = 1440
N = 10000
mu = portfolio_losses.mean() sigma = portfolio_losses.std()
Kwantitatief risicobeheer in Python

Monte Carlo-simulatie in Python

  • Stap twee:
    • Initialiseer daily_loss-vector voor N runs
    • Loop over N runs
      • Bereken Monte Carlo-gesimuleerde loss-vector
        • Gebruikt norm.rvs() om herhaald te trekken uit de standaardnormaalverdeling
        • Trekkingen matchen data met mu en sigma geschaald door 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) )
Kwantitatief risicobeheer in Python

Monte Carlo-simulatie in Python

  • Stap drie:
    • Genereer cumulatieve daily_loss voor elke run n
    • Gebruik np.quantile() om de VaR te vinden op bijv. 95% betrouwbaarheidsniveau over 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)
Kwantitatief risicobeheer in Python

Assetrendementen simuleren

  • Verfijning: genereer willekeurige paden van assetrendementen in de portefeuille
    • Geeft meer realisme: rendementen per asset kun je apart simuleren
    • Assetrendementen kunnen gecorreleerd zijn
      • Herinner: efficiënte covariantiematrix e_cov
      • Gebruikt in stap 2 om assetrendementen te berekenen
  • Oefeningen: Monte Carlo met simulatie van assetrendementen
Kwantitatief risicobeheer in Python

Laten we oefenen!

Kwantitatief risicobeheer in Python

Preparing Video For Download...