Реализация жизненного цикла рисков в сфере финансовых услуг с помощью Azure и R

Расчеты рисков являются ключевыми на нескольких этапах жизненного цикла ключевых операций с финансовыми услугами. Например, упрощенная форма жизненного цикла управления страховыми продуктами может выглядеть примерно так, как показано на диаграмме ниже. Аспекты вычисления риска отображаются синим цветом.

На схеме показаны факторы вычисления рисков.

Сценарий компании на рынках капитала может выглядеть так:

Схема показывает сценарий вычисления рисков для фирмы на рынках капитала.

В таких процессах существуют распространенные потребности в моделировании рисков, в том числе:

  • Потребность в экспериментах, связанных с нерегламентированными рисками, аналитиками рисков, такими как актуарии в страховой фирме или квантах в фирме рынков капитала. Эти аналитики обычно работают с инструментами кода и моделирования, популярными в их домене: R и Python. Многие учебные программы университета включают обучение в R или Python в математических финансах и МБ A курсы. Оба языка имеют доступ к широкому спектру библиотек открытый код, которые поддерживают популярные вычисления рисков.
  • Наряду с соответствующими инструментами аналитики часто требуют доступа к:
    • Точные данные о ценах на рынок.
    • Данные политики и утверждений.
    • Данные о положении рынка.
    • Другие внешние данные, такие как:
      • Структурированные данные, такие как таблицы смертности и конкурентные данные о ценах.
      • Менее традиционные типы, такие как погода и новости.
    • Вычислительные мощности для быстрого интерактивного исследования данных.
  • В некоторых случаях алгоритмы машинного обучения для ценообразования или определения рыночной стратегии.
  • Возможность визуализировать и представить данные для использования в планировании продуктов, торговой стратегии и аналогичных обсуждениях.
  • Быстрое выполнение определенных моделей, настроенных аналитиками для ценообразования, оценки и риска рынка. Оценки используют комбинацию выделенного моделирования рисков, рыночных инструментов риска и пользовательского кода. Анализ выполняется в пакете с различными ночными, еженедельными, ежемесячными, квартальными и ежегодными вычислениями. Этот анализ создает пики рабочих нагрузок.
  • Интеграция данных с другими корпоративными мерами риска для консолидированной отчетности о рисках. В крупных организациях оценка рисков более низкого уровня может быть передана инструменту для моделирования и отчетности о рисках предприятия.
  • Результаты, сообщаемые в определенном формате в требуемое время для удовлетворения требований инвестора и нормативных требований.

Корпорация Майкрософт помогает удовлетворить эти потребности с помощью сочетания служб Azure и предложений партнеров в Azure Marketplace. В этой статье приведены практические примеры, показывающие, как выполнять нерегламентированные эксперименты с помощью R. Сначала мы объясним, как запустить эксперимент на одном компьютере. Далее мы покажем, как запустить тот же эксперимент на пакетная служба Azure, и мы закрываем, показывая, как воспользоваться преимуществами внешних служб для моделирования. Варианты и рекомендации по выполнению определенных моделей в Azure описаны в этих статьях, ориентированных на банковские и страховые услуги.

Моделирование аналитиков в R

Давайте рассмотрим, как язык R может использоваться аналитиком в упрощенном сценарии представительства рынков капитала. Вы можете создавать это либо путем ссылки на существующую библиотеку R для вычисления, либо путем написания кода с нуля. В нашем примере мы также должны получить внешние данные о ценах. Чтобы привести простой иллюстративный пример, мы рассчитываем потенциальную будущую подверженность (PFE) прямого контракта собственного капитала. Этот пример избегает сложных методов количественного моделирования для таких инструментов, как сложные производные, и фокусируется на одном факторе риска, чтобы сосредоточиться на жизненном цикле риска. Наш пример позволяет выполнить следующие действия:

  • Выберите нужное средство.
  • Используйте в качестве источника цен средства за предыдущий период.
  • Модель акций ценовых действий с помощью простого вычисления Монте-Карло (MC), который использует геометрическое движение Брауниана (GBM):
    • Оцените ожидаемый доход μ (мю) и нестабильность σ (тета).
    • Откалибруйте модель до исторических данных.
  • Визуализируйте различные пути для передачи результатов.
  • График max(0,Stock Value) для демонстрации значения PFE, разница в значении риска (VaR). Чтобы уточнить:

    PFE = Share Price (T) -- Forward Contract Price K

  • Выполните квантиль 0,95, чтобы получить значение PFE при каждом шаге или конце периода моделирования.

Мы вычислим PFE для акций на основе акций Майкрософт (MSFT). Как упоминание ранее, чтобы моделировать цены на акции, исторические цены на акции MSFT необходимы, чтобы мы могли калибровать модель до исторических данных. Существует много способов получения исторических цен акций. В нашем примере мы используем бесплатную версию службы цены акций от поставщика внешней службы Quandl.

Примечание.

В примере используется набор данных по ценам WIKI, который можно использовать для изучения концепций. Для использования на рынке акций в США Quandl рекомендуется использовать однодневный набор данных о курсе американских акций.

Чтобы обработать данные и определить риск, связанный с собственным капиталом, мы должны сделать следующее:

  • Получить данные журнала из собственного капитала.
  • Определить ожидаемый доход μ и нестабильность σ из исторических данных.
  • Моделировать базовые цены акций, используя некоторую симуляцию.
  • Запустите модель.
  • Определите подверженность капитала в будущем.

Мы начнем с получения запасов из сервиса Quandl и построения истории закрытия цен за последние 180 дней.

# Lubridate package must be installed
if (!require(lubridate)) install.packages('lubridate')
library(lubridate)

# Quandl package must be installed
if (!require(Quandl)) install.packages('Quandl')
library(Quandl)

# Get your API key from quandl.com
quandl_api = "enter your key here"

# Add the key to the Quandl keychain
Quandl.api_key(quandl_api)

quandl_get <-
    function(sym, start_date = "2018-01-01") {
        require(devtools)
        require(Quandl)
        # Retrieve the Open, High, Low, Close and Volume Column for a given Symbol
        # Column Indices can be deduced from this sample call
        # data <- Quandl(c("WIKI/MSFT"), rows = 1)

        tryCatch(Quandl(c(
        paste0("WIKI/", sym, ".8"),    # Column 8 : Open
        paste0("WIKI/", sym, ".9"),    # Column 9 : High
        paste0("WIKI/", sym, ".10"),   # Column 10: Low
        paste0("WIKI/", sym, ".11"),   # Column 11: Close
        paste0("WIKI/", sym, ".12")),  # Column 12: Volume
        start_date = start_date,
        type = "raw"
        ))
    }

# Define the Equity Forward
instrument.name <- "MSFT"
instrument.premium <- 100.1
instrument.pfeQuantile <- 0.95

# Get the stock price for the last 180 days
instrument.startDate <- today() - days(180)

# Get the quotes for an equity and transform them to a data frame
df_instrument.timeSeries <- quandl_get(instrument.name,start_date = instrument.startDate)

#Rename the columns
colnames(df_instrument.timeSeries) <- c()
colnames(df_instrument.timeSeries) <- c("Date","Open","High","Low","Close","Volume")

# Plot the closing price history to get a better feel for the data
plot(df_instrument.timeSeries$Date, df_instrument.timeSeries$Close)

Имея данные, мы откалибруем модель GBM.

# Code inspired by the book Computational Finance, An Introductory Course with R by
#    A. Arratia.

# Calculate the daily return in order to estimate sigma and mu in the Wiener Process
df_instrument.dailyReturns <- c(diff(log(df_instrument.timeSeries$Close)), NA)

# Estimate the mean of std deviation of the log returns to estimate the parameters of the Wiener Process

estimateGBM_Parameters <- function(logReturns,dt = 1/252) {

    # Volatility
    sigma_hat = sqrt(var(logReturns)) / sqrt(dt)

    # Drift
    mu_hat = mean(logReturns) / dt + sigma_hat**2 / 2.0

    # Return the parameters
    parameter.list <- list("mu" = mu_hat,"sigma" = sigma_hat)

    return(parameter.list)
}

# Calibrate the model to historic data
GBM_Parameters <- estimateGBM_Parameters(df_instrument.dailyReturns[1:length(df_instrument.dailyReturns) - 1])

Далее мы моделируем базовые цены на акции. Мы можем реализовать дискретный процесс GBM с нуля или использовать один из многих пакетов R, которые предоставляют эту функциональность. Мы используем пакет R sde (моделирование и вывод для вероятностного дифференциальных уравнений), который предоставляет способ решения этой проблемы. Для метода GBM требуется набор параметров, которые либо откалиброваны по историческим данным, либо заданы в качестве параметров моделирования. Мы используем исторические данные, предоставляя μ, σ и цены акций в начале моделирования (P0).

if (!require(sde)) install.packages('sde')
library(sde)

sigma <- GBM_Parameters$sigma
mu <- GBM_Parameters$mu
P0 <- tail(df_instrument.timeSeries$Close, 1)

# Calculate the PFE looking one month into the future
T <- 1 / 12

# Consider nt MC paths
nt=50

# Divide the time interval T into n discrete time steps
n = 2 ^ 8

dt <- T / n
t <- seq(0,T,by=dt)

Теперь мы готовы начать имитацию Монте-Карло, чтобы моделировать потенциальную экспозицию для некоторого количества путей моделирования. Мы ограничим имитацию до 50 путей Монте-Карло и 256 шагов времени. В рамках подготовки к масштабированию моделирования и использования параллелизма в R цикл моделирования Монте-Карло использует оператор foreach.

# Track the start time of the simulation
start_s <- Sys.time()

# Instead of a simple for loop to execute a simulation per MC path, call the
# simulation with the foreach package
# in order to demonstrate the similarity to the AzureBatch way to call the method.

library(foreach)
# Execute the MC simulation for the wiener process by using the GBM method from the sde package
exposure_mc <- foreach (i=1:nt, .combine = rbind ) %do% GBM(x = P0, r = mu, sigma = sigma, T = T, N = n)
rownames(exposure_mc) <- c()

# Track the end time of the simulation
end_s <- Sys.time()

# Duration of the simulation

difftime(end_s, start_s)

Теперь мы имитировали цену базовых акций MSFT. Чтобы рассчитать риск долевого участия, мы вычитаем премию и ограничиваем воздействие только положительными значениями.

# Calculate the total Exposure as V_i(t) - K, put it to zero for negative exposures
pfe_mc <- pmax(exposure_mc - instrument.premium ,0)

ymax <- max(pfe_mc)
ymin <- min(pfe_mc)
plot(t, pfe_mc[1,], t = 'l', ylim = c(ymin, ymax), col = 1, ylab="Credit Exposure in USD", xlab="time t in Years")
for (i in 2:nt) {
    lines(t, pfe_mc[i,], t = 'l', ylim = c(ymin, ymax), col = i)
}

На следующих двух рисунках показан результат моделирования. На первом рисунке показано моделирование Монте-Карло базовой цены акций на 50 путей. Вторая картина иллюстрирует базовую кредитную экспозицию для акций вперед после вычитания премии акций вперед и ограничения воздействия положительных значений.

Рис. 1. 50 путей Монте-Карло

Рис. 1 - 50 путей Монте-Карло

Рис. 2. Размер кредитного риска для форварда на акции

Рис. 2. Кредитная экспозиция для акций вперед

На последнем шаге 1-месячный 0,95 квантиль PFE вычисляется следующим кодом.

# Calculate the PFE at each time step
df_pfe <- cbind(t,apply(pfe_mc,2,quantile,probs = instrument.pfeQuantile ))

resulting in the final PFE plot
plot(df_pfe, t = 'l', ylab = "Potential future exposure in USD", xlab = "time t in Years")
Потенциальная потенциальная уязвимость для MSFT Equity Forward

Рис. 3 Потенциальный будущий риск для акций MSFT вперед

Использование пакетной службы Azure с R

Решение R, описанное выше, может быть подключено к пакетной службе Azure и использовать облако для расчетов риска. Это требует немного дополнительных усилий для похожего параллельного вычисления. Руководство. Параллельное моделирование на R с помощью пакетной службы Azure содержит подробную информацию о подключении R к пакетной службе Azure. Ниже показан код и краткое описание процесса подключения к пакетной службе Azure, и как использовать расширение для облака в упрощенном вычислении PFE.

В этом примере рассматривается одна и та же модель, описанная ранее. Как мы уже видели, это вычисление может выполняться на личном компьютере. Увеличение количества путей Монте-Карло или использование меньших временных шагов приведет к значительному увеличению времени выполнения. Практически весь код R останется неизменным. Мы рассмотрим различия в этом разделе.

Каждый путь моделирования Монте-Карло работает в Azure. Мы можем сделать это, потому что каждый путь не зависит от других, давая нам расчет, который легко параллелизирован.

Чтобы использовать пакетную службу Azure, мы определяем базовый кластер и ссылаемся на него в коде до его использования в вычислениях. Чтобы выполнить расчет, мы используем следующее определение cluster.json:

{
  "name": "myMCPool",
  "vmSize": "Standard_D2_v2",
  "maxTasksPerNode": 4,
  "poolSize": {
    "dedicatedNodes": {
      "min": 1,
      "max": 1
    },
    "lowPriorityNodes": {
      "min": 3,
      "max": 3
    },
    "autoscaleFormula": "QUEUE"
  },
  "containerImage": "rocker/tidyverse:latest",
  "rPackages": {
    "cran": [],
    "github": [],
    "bioconductor": []
  },
  "commandLine": [],
  "subnetId": ""
}

В этом определении кластера используется следующий код R:


# Define the cloud burst environment
library(doAzureParallel)

# set your credentials
setCredentials("credentials.json")

# Create your cluster if not exist
cluster <- makeCluster("cluster.json")

# register your parallel backend
registerDoAzureParallel(cluster)

# check that your workers are up
getDoParWorkers()

Наконец, мы обновляем инструкцию foreach ранее, чтобы использовать пакет doAzureParallel. Происходят небольшие изменения, добавляя ссылку на пакет sde и изменяя %do% на %dopar%.

# Execute the MC simulation for the wiener process using the GBM method from the sde package and extend the computation to the cloud
exposure_mc <- foreach(i = 1:nt, .combine = rbind, .packages = 'sde') %dopar% GBM(x = P0, r = mu, sigma = sigma, T = T, N = n)
rownames(exposure_mc) <- c()

Каждое моделирование Монте-Карло представляется как задача для пакетной службы Azure. Задача выполняется в облаке. Результаты объединяются перед отправкой обратно в рабочее место аналитика. Тяжелая работа и вычисления выполняются в облаке, чтобы воспользоваться всеми преимуществами масштабирования и базовой инфраструктуры, необходимой для запрошенного объема вычислений.

По завершении вычислений дополнительные ресурсы можно легко отключить, вызвав следующую команду:

# Stop the cloud cluster
stopCluster(cluster)

Использование предложения SaaS

В первых двух примерах показано, как использовать локальную и облачную инфраструктуру для разработки адекватной модели оценки. Эта парадигма начала сдвигаться. Так же, как локальная инфраструктура преобразуется в облачные службы IaaS и PaaS, моделирование соответствующих показателей риска преобразуется в сервисно-ориентированный процесс. Современные аналитики сталкиваются с двумя основными проблемами:

  • Нормативные требования используют увеличение вычислительной мощности для добавления требований моделирования. Регулирующие органы требуют более частых и современных показателей риска.
  • Существующая инфраструктура рисков со временем органично выросла и создает проблемы при быстром внедрении новых требований и более сложном моделировании рисков.

Облачные сервисы могут предоставлять требуемые функции и поддерживать анализ рисков. Такой подход имеет два преимущества:

  • Наиболее распространенные расчеты риска, требуемые регулирующим органом, должны выполняться всеми, кто находится под регулированием. Используя службы от специализированного поставщика услуг, аналитик получает преимущества от готовности к использованию, вычисления рисков, совместимых с регулятором. Такие услуги могут включать расчеты рисков рынка, вычисления рисков для коллег, корректировка X-Value (XVA) и даже фундаментальный обзор торговой книги (FR ТБ) при вычислении.
  • Эти сервисы предоставляют свои интерфейсы через веб-службы. Существующая инфраструктура риска может быть повышена с этими службами.

В нашем примере мы хотим вызвать облачную службу для вычисления FRTB. Некоторые из них можно найти на странице AppSource. В этой статье мы выбрали вариант пробной версии от Vector Risk. Мы продолжаем изменять нашу систему. На этот раз мы используем службу, чтобы рассчитать процентную ставку риска. Эта процедура состоит из следующих шагов:

  1. Вызовите соответствующую службу рисков с правильными параметрами.
  2. Подождите, пока служба завершит вычисления.
  3. Получите результаты и включите их в анализ рисков.

Наш преобразованный R-код может быть усилен определением необходимых входных значений из подготовленного шаблона ввода.

Template <- readLines('RequiredInputData.json')
data <- list(
# drilldown setup
  timeSteps = seq(0, n, by = 1),
  paths = as.integer(seq(0, nt, length.out = min(nt, 100))),
# calc setup
  calcDate = instrument.startDate,
  npaths = nt,
  price = P0,
  vol = sigma,
  drift = mu,
  premium = instrument.premium,
  maturityDate = today()
  )
body <- whisker.render(template, data)

Далее нужно вызвать веб-службу. В этом случае мы вызываем метод StartCreditExposure для запуска вычисления. Мы сохраняем конечную точку для API в переменной с именем endpoint.

# make the call
result <- POST( paste(endpoint, "StartCreditExposure", sep = ""),
                authenticate(username, password, type = "basic"),
                content_type("application/json"),
                add_headers(`Ocp-Apim-Subscription-Key` = api_key),
                body = body, encode = "raw"
               )

result <- content(result)

По завершении расчетов мы получаем результаты.

# get back high level results
result <- POST( paste(endpoint, "GetCreditExposureResults", sep = ""),
                authenticate(username, password, type = "basic"),
                content_type("application/json"),
                add_headers(`Ocp-Apim-Subscription-Key` = api_key),
               body = sprintf('{"getCreditExposureResults": {"token":"DataSource=Production;Organisation=Microsoft", "ticket": "%s"}}', ticket), encode = "raw")

result <- content(result)

Полученные результаты позволяют аналитику продолжить действия. Соответствующие показатели риска, представляющие интерес, извлекаются из результатов и фиксируются на графике.

if (!is.null(result$error)) {
    cat(result$error$message)
} else {
    # plot PFE
    result <- result$getCreditExposureResultsResponse$getCreditExposureResultsResult
    df <- do.call(rbind, result$exposures)
    df <- as.data.frame(df)
    df <- subset(df, term <= n)
}

plot(as.numeric(df$term[df$statistic == 'PFE']) / 365, df$result[df$statistic == 'PFE'], type = "p", xlab = ("time t in Years"), ylab = ("Potential future exposure in USD"), ylim = range(c(df$result[df$statistic == 'PFE'], df$result[df$statistic == 'PFE'])), col = "red")

Итоговый графиков будет выглядеть следующим образом:

Рис. 4. Кредитная экспозиция для акций MSFT вперед — вычисляется с помощью облачного механизма риска.

Рис. 4. Кредитная экспозиция для акций MSFT вперед — вычисляется с помощью облачного механизма риска

Рис. 5. Потенциальный будущий риск для акций MSFT вперед — вычисляется с помощью облачного механизма риска

Рис. 5. Потенциальный будущий риск для акций MSFT вперед — вычисляется с помощью облачного механизма риска

Рекомендации

Гибкий доступ к облаку через вычислительную инфраструктуру и службам по анализу рисков на основе SaaS может обеспечить улучшение скорости и гибкости для аналитиков риска, работающих на рынках капитала и страховании. В этой статье мы использовали пример, который иллюстрирует, как использовать Azure и другие службы, используя средства, известные аналитикам риска. Попытайтесь использовать возможности Azure при создании и улучшении моделей риска.

Соавторы

Эта статья поддерживается корпорацией Майкрософт. Первоначально он был написан следующими участник.

Основные авторы:

Следующие шаги