Symulacja historyczna i Monte Carlo

Ilościowe zarządzanie ryzykiem w Pythonie

Jamsheed Shorish

Computational Economist

Symulacja historyczna

  • Brak odpowiedniej klasy rozkładów?
  • Symulacja historyczna: przeszłość jako prognoza przyszłości
    • Nie wymaga założeń rozkładowych
    • Historyczne straty stają się symulowanymi stratami na jutro
Ilościowe zarządzanie ryzykiem w Pythonie

Symulacja historyczna w Pythonie

  • VaR: punkt wyjścia – stopy zwrotu w asset_returns
  • Obliczenie portfolio_returns przy użyciu weights portfela
  • Konwersja portfolio_returns na losses
  • VaR: np.quantile() dla losses na poziomie ufności np. 95%
  • Zakłada, że przyszły rozkład strat jest dokładnie taki jak przeszły

 

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)
Ilościowe zarządzanie ryzykiem w Pythonie

Symulacja Monte Carlo

  • Symulacja Monte Carlo: połączenie estymacji parametrycznej i symulacji
    • Zakłada rozkład(y) strat portfela i/lub czynników ryzyka
    • Opiera się na losowych próbach z rozkładów, tworząc losową ścieżkęprzebieg
    • Wielokrotne losowania $\Rightarrow$ tworzą zbiór przebiegów symulacji
  • Obliczenie symulowanych strat portfela dla każdego przebiegu do wybranego momentu
  • Wyznaczenie VaR jako kwantyla symulowanych strat
Ilościowe zarządzanie ryzykiem w Pythonie

Symulacja Monte Carlo w Pythonie

  • Krok pierwszy:
    • Import rozkładu normalnego norm z scipy.stats
    • Definicja total_steps (1 dzień = 1440 minut)
    • Definicja liczby przebiegów N
    • Obliczenie średniej mu i odchylenia standardowego sigma danych portfolio_losses
from scipy.stats import norm

total_steps = 1440
N = 10000
mu = portfolio_losses.mean() sigma = portfolio_losses.std()
Ilościowe zarządzanie ryzykiem w Pythonie

Symulacja Monte Carlo w Pythonie

  • Krok drugi:
    • Inicjalizacja wektora daily_loss dla N przebiegów
    • Pętla po N przebiegach
      • Obliczenie wektora loss metodą Monte Carlo
        • norm.rvs() losuje z rozkładu normalnego
        • Dopasowanie do danych przez mu i sigma skalowane przez 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) )
Ilościowe zarządzanie ryzykiem w Pythonie

Symulacja Monte Carlo w Pythonie

  • Krok trzeci:
    • Obliczenie skumulowanych strat daily_loss dla każdego przebiegu n
    • Użycie np.quantile() do wyznaczenia VaR na poziomie ufności np. 95% dla 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)
Ilościowe zarządzanie ryzykiem w Pythonie

Symulacja stóp zwrotu aktywów

  • Udoskonalenie: losowe ścieżki stóp zwrotu aktywów w portfelu
    • Większy realizm: stopy zwrotu mogą być symulowane indywidualnie
    • Stopy zwrotu mogą być skorelowane
      • Przypomnienie: efektywna macierz kowariancji e_cov
      • Używana w kroku 2 do obliczenia stóp zwrotu aktywów
  • Ćwiczenia: symulacja Monte Carlo ze symulacją stóp zwrotu aktywów
Ilościowe zarządzanie ryzykiem w Pythonie

Czas na ćwiczenia!

Ilościowe zarządzanie ryzykiem w Pythonie

Preparing Video For Download...