Historisk och Monte Carlo-simulering

Kvantitativ riskhantering i Python

Jamsheed Shorish

Computational Economist

Historisk simulering

  • Ingen lämplig fördelningsklass?
  • Historisk simulering: använd det förflutna för att förutsäga framtiden
    • Ingen fördelningsantagelse krävs
    • Data om tidigare förluster blir simulerade förluster för morgondagen
Kvantitativ riskhantering i Python

Historisk simulering i Python

  • VaR: utgå från avkastningar i asset_returns
  • Beräkna portfolio_returns med portföljens weights
  • Konvertera portfolio_returns till losses
  • VaR: beräkna np.quantile() för losses vid t.ex. 95% konfidensnivå
  • Antar att framtidens fördelning av förluster är exakt densamma som historikens

 

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)
Kvantitativ riskhantering i Python

Monte Carlo-simulering

  • Monte Carlo-simulering: kraftfull kombination av parametrisk skattning och simulering
    • Antar fördelning(ar) för portföljförlust och/eller riskfaktorer
    • Bygger på slumpmässiga dragningar från fördelning(ar) för att skapa en slumpmässig bana, kallad ett körning
    • Upprepa dragningarna $\Rightarrow$ skapar en mängd simulerade körningar
  • Beräkna simulerad portföljförlust för varje körning upp till önskad tid
  • Hitta VaR-skattningen som en kvantil av de simulerade förlusterna
Kvantitativ riskhantering i Python

Monte Carlo-simulering i Python

  • Steg ett:
    • Importera normalfördelningen norm från scipy.stats
    • Definiera total_steps (1 dag = 1 440 minuter)
    • Definiera antal körningar N
    • Beräkna medelvärde mu och standardavvikelse sigma för portfolio_losses
from scipy.stats import norm

total_steps = 1440
N = 10000
mu = portfolio_losses.mean() sigma = portfolio_losses.std()
Kvantitativ riskhantering i Python

Monte Carlo-simulering i Python

  • Steg två:
    • Initialisera vektorn daily_loss för N körningar
    • Loopa över N körningar
      • Beräkna Monte Carlo-simulerad loss-vektor
        • Använder norm.rvs() för att dra upprepade gånger från en standard normalfördelning
        • Dragningarna matchas mot data via mu och sigma skalade med 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) )
Kvantitativ riskhantering i Python

Monte Carlo-simulering i Python

  • Steg tre:
    • Generera kumulativ daily_loss för varje körning n
    • Använd np.quantile() för att beräkna VaR vid t.ex. 95% konfidensnivå över 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)
Kvantitativ riskhantering i Python

Simulering av tillgångsavkastningar

  • Förfining: generera slumpmässiga stickprovsbanor för tillgångsavkastningar i portföljen
    • Ger mer realism: tillgångsavkastningar kan simuleras individuellt
    • Tillgångsavkastningar kan vara korrelerade
      • Kom ihåg: effektiv kovariansmatris e_cov
      • Används i steg 2 för att beräkna tillgångsavkastningar
  • Övningar: Monte Carlo-simulering med simulering av tillgångsavkastningar
Kvantitativ riskhantering i Python

Nu kör vi en övning!

Kvantitativ riskhantering i Python

Preparing Video For Download...