Историческое и метод Монте-Карло моделирование

Количественное управление рисками на 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...