Historická a Monte Carlo simulace

Kvantitativní řízení rizik v Pythonu

Jamsheed Shorish

Computational Economist

Historická simulace

  • Žádné vhodné rozdělení pravděpodobnosti?
  • Historická simulace: minulost předpovídá budoucnost
    • Nevyžaduje předpoklad o rozdělení
    • Historické ztráty se stávají simulovanými ztrátami pro zítřek
Kvantitativní řízení rizik v Pythonu

Historická simulace v Pythonu

  • VaR: výchozí bod jsou výnosy v asset_returns
  • Výpočet portfolio_returns pomocí vah portfolia weights
  • Převod portfolio_returns na losses
  • VaR: výpočet np.quantile() pro losses na hladině spolehlivosti 95 %
  • Předpokládá, že budoucí rozdělení ztrát je totožné s minulým

 

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)
Kvantitativní řízení rizik v Pythonu

Simulace Monte Carlo

  • Simulace Monte Carlo: kombinace parametrické odhadování a simulace
    • Předpokládá rozdělení pro ztráty portfolia nebo rizikové faktory
    • Využívá náhodné vzorkování z rozdělení pro vytvoření náhodné cesty (tzv. běhu)
    • Opakované vzorkování $\Rightarrow$ vytváří sadu simulačních běhů
  • Výpočet simulované ztráty portfolia pro každý běh až do požadovaného času
  • Odhad VaR jako kvantil simulovaných ztrát
Kvantitativní řízení rizik v Pythonu

Simulace Monte Carlo v Pythonu

  • Krok jedna:
    • Import normálního rozdělení norm z scipy.stats
    • Definice total_steps (1 den = 1440 minut)
    • Definice počtu běhů N
    • Výpočet střední hodnoty mu a směrodatné odchylky sigma z dat portfolio_losses
from scipy.stats import norm

total_steps = 1440
N = 10000
mu = portfolio_losses.mean() sigma = portfolio_losses.std()
Kvantitativní řízení rizik v Pythonu

Simulace Monte Carlo v Pythonu

  • Krok dva:
    • Inicializace vektoru daily_loss pro N běhů
    • Cyklus přes N běhů
      • Výpočet simulovaného vektoru loss metodou Monte Carlo
        • norm.rvs() opakovaně vzorkuje ze standardního normálního rozdělení
        • Vzorky odpovídají datům pomocí mu a sigma škálovaných 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) )
Kvantitativní řízení rizik v Pythonu

Simulace Monte Carlo v Pythonu

  • Krok tři:
    • Výpočet kumulativního daily_loss pro každý běh n
    • Použití np.quantile() pro výpočet VaR na hladině spolehlivosti 95 % z 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)
Kvantitativní řízení rizik v Pythonu

Simulace výnosů aktiv

  • Upřesnění: generování náhodných cest výnosů aktiv v portfoliu
    • Větší realismus: výnosy aktiv lze simulovat individuálně
    • Výnosy aktiv mohou být korelovány
      • Připomenutí: efektivní kovarianční matice e_cov
      • Použita v kroku 2 pro výpočet výnosů aktiv
  • Cvičení: simulace Monte Carlo se simulací výnosů aktiv
Kvantitativní řízení rizik v Pythonu

Pojďme procvičovat!

Kvantitativní řízení rizik v Pythonu

Preparing Video For Download...