Історичне моделювання та Монте-Карло

Кількісне управління ризиками в Python

Jamsheed Shorish

Computational Economist

Історичне моделювання

  • Немає відповідного класу розподілів?
  • Історичне моделювання: використовуйте минуле, щоб оцінити майбутнє
    • Припущення про розподіл не потрібні
    • Дані про минулі збитки стають змодельованими збитками на завтра
Кількісне управління ризиками в Python

Історичне моделювання в Python

  • VaR: почніть з доходностей у asset_returns
  • Обчисліть portfolio_returns за портфельними weights
  • Перетворіть portfolio_returns на losses
  • VaR: обчисліть np.quantile() для losses, напр., на рівні довіри 95%
  • Припущення: майбутній розподіл збитків точно як у минулому

 

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)
Кількісне управління ризиками в Python

Моделювання Монте-Карло

  • Моделювання Монте-Карло: потужне поєднання параметричного оцінювання та симуляції
    • Припускає розподіл(и) для збитку портфеля та/або ризик-факторів
    • Спирається на випадкові вибірки з розподілу(ів), щоб створювати випадкову траєкторіюпрогон
    • Повторюйте вибірки $\Rightarrow$ отримуєте набір прогонів симуляції
  • Обчисліть змодельований збиток портфеля для кожного прогона до потрібного часу
  • Знайдіть оцінку VaR як квантиль змодельованих збитків
Кількісне управління ризиками в Python

Моделювання Монте-Карло в Python

  • Крок перший:
    • Імпортуйте нормальний розподіл norm з scipy.stats
    • Задайте total_steps (1 день = 1440 хвилин)
    • Задайте кількість прогонів N
    • Обчисліть середнє mu та стандартне відхилення sigma для portfolio_losses
from scipy.stats import norm

total_steps = 1440
N = 10000
mu = portfolio_losses.mean() sigma = portfolio_losses.std()
Кількісне управління ризиками в Python

Моделювання Монте-Карло в Python

  • Крок другий:
    • Ініціалізуйте вектор daily_loss для N прогонів
    • Запустіть цикл на N прогонів
      • Обчисліть змодельований Монте-Карло вектор loss
        • Використовуйте norm.rvs() для багаторазових вибірок зі стандартного нормального розподілу
        • Вибірки узгоджені з даними: mu і sigma, масштабовані 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) )
Кількісне управління ризиками в Python

Моделювання Монте-Карло в Python

  • Крок третій:
    • Згенеруйте кумулятивний daily_loss для кожного прогона n
    • Використайте np.quantile(), щоб знайти VaR, напр., на рівні 95% для 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)
Кількісне управління ризиками в Python

Моделювання доходностей активів

  • Удосконалення: генеруйте випадкові траєкторії доходностей активів у портфелі
    • Більше реалізму: доходності активів моделюються окремо
    • Доходності активів можуть бути корельовані
      • Нагадаємо: ефективна матриця коваріації e_cov
      • Використовується на Кроці 2 для обчислення доходностей активів
  • Вправи: Монте-Карло з моделюванням доходностей активів
Кількісне управління ризиками в Python

Давайте потренуємось!

Кількісне управління ризиками в Python

Preparing Video For Download...