Povolení životního cyklu rizika finančních služeb pomocí Azure a R

Výpočty rizik jsou v několika fázích životního cyklu klíčových operací finančních služeb pivotální. Zjednodušená forma životního cyklu řízení pojistného produktu může například vypadat podobně jako v následujícím diagramu. Aspekty výpočtu rizika se zobrazují v modrém textu.

Diagram znázorňuje rizikové výpočetní faktory.

Scénář ve firmě s kapitálovými trhy by mohl vypadat takto:

Diagram znázorňuje scénář výpočtu rizika pro podnik kapitálových trhů.

V takových procesech existují běžné potřeby modelování rizik, mezi které patří:

  • Potřeba experimentování souvisejících s riziky ad hoc rizikovými analytiky, jako jsou například aktáři v pojišťovací firmě nebo quanty ve firmě s kapitálovými trhy. Tito analytici obvykle pracují s nástroji pro kódování a modelování, které jsou oblíbené ve své doméně: R a Python. Mnoho studijních plánů univerzity zahrnuje školení v R nebo Pythonu v matematických financích a kurzech MBA. Oba jazyky mají přístup k široké škále opensourcových knihoven, které podporují oblíbené výpočty rizik.
  • Spolu s vhodnými nástroji analytici často vyžadují přístup k:
    • Přesná data o cenách trhu
    • Data zásad a deklarací identity.
    • Údaje o pozici na trhu.
    • Další externí data, například:
      • Strukturovaná data, jako jsou tabulky úmrtnosti a konkurenční údaje o cenách.
      • Méně tradiční typy, jako je počasí a zprávy.
    • Výpočetní kapacita pro rychlá interaktivní zkoumání dat
  • V některých případech algoritmy ad hoc strojového učení pro ceny nebo určení strategie trhu.
  • Schopnost vizualizovat a prezentovat data pro použití při plánování produktů, obchodní strategii a podobných diskuzích.
  • Rychlé provádění definovaných modelů nakonfigurovaných analytiky pro ceny, ocenění a tržní riziko. Ocenění používají kombinaci vyhrazeného modelování rizik, nástrojů pro tržní rizika a vlastního kódu. Analýza se provádí v dávce s různými nočními, týdenními, měsíčními, čtvrtletními a ročními výpočty. Tato analýza generuje špičky v úlohách.
  • Integrace dat s jinými podnikovými rizikovými opatřeními pro konsolidované hlášení rizik. Ve větších organizacích je možné odhady rizik nižší úrovně přenést do nástroje pro modelování a vytváření sestav podnikových rizik.
  • Výsledky hlášené v definovaném formátu v požadovaných časech pro splnění požadavků investora a právních předpisů.

Microsoft pomáhá splňovat tyto potřeby prostřednictvím kombinace služeb Azure a partnerských nabídek na Azure Marketplace. V tomto článku jsou praktické příklady, které ukazují, jak provádět ad hoc experimentování pomocí jazyka R. Začneme tím, že vysvětlíme, jak experiment spustit na jednom počítači. Dále vám ukážeme, jak spustit stejný experiment ve službě Azure Batch, a my vás zavřeme tím, že vám ukážeme, jak využít výhod externích služeb pro modelování. Možnosti a aspekty provádění definovaných modelů v Azure jsou popsány v těchto článcích, které se zaměřují na bankovnictví a pojištění.

Modelování analytiků v R

Začněme tím, že se podíváme na to, jak může analytik ve zjednodušeném, reprezentativním scénáři kapitálových trhů používat R. Můžete ho sestavit buď odkazem na existující knihovnu jazyka R pro výpočet, nebo napsáním kódu úplně od začátku. V našem příkladu musíme také načíst externí data o cenách. Abychom zachovali příklad jednoduchý, ale ilustrativní, vypočítáme potenciální budoucí expozici (PFE) akciového cenného papíru. Tento příklad zabraňuje složitým kvantitativním metodám modelování pro nástroje, jako jsou komplexní deriváty, a zaměřuje se na jediný rizikový faktor, který se soustředí na životní cyklus rizika. Náš příklad vám umožní provést následující akce:

  • Vyberte nástroj, který je zajímavý.
  • Zdrojové historické ceny nástroje.
  • Model akci vlastní ceny pomocí jednoduchého výpočtu Monte Carlo (MC), který používá Geometrický Brownian Motion (GBM):
    • Odhad očekávaného výnosu μ (mu) a nestálosti σ (theta).
    • Kalibrujte model na historická data.
  • Vizualizujte různé cesty ke sdělení výsledků.
  • Vykreslujte max(0;Stock Value) k předvedení významu PFE, rozdílu k hodnotě v riziku (VaR). Vysvětlení:

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

  • Vezměte quantile 0,95, abyste získali hodnotu PFE při každém kroku nebo konci období simulace.

Na základě akcií Microsoftu (MSFT) vypočítáme PFE pro vlastní kapitál. Jak jsme už zmínili dříve, k modelování cen akcií se vyžadují historické ceny akcií MSFT, abychom mohli model kalibrovat na historická data. Existuje mnoho způsobů, jak získat historické ceny akcií. V našem příkladu používáme bezplatnou verzi služby cen akcií od externího poskytovatele služeb Quandl.

Poznámka:

V tomto příkladu se používá datová sada cen wikiwebu, která se dá použít pro koncepty výuky. Pro produkční využití akcií založených na USA doporučuje společnost Quandl použít datovou sadu End of Day US Stock Prices.

Abychom mohli zpracovávat data a definovat riziko spojené s vlastním kapitálem, musíme provést následující věci:

  • Načtěte data historie z vlastního kapitálu.
  • Určete očekávanou návratnost μ a nestálost σ z historických dat.
  • Modelujte základní ceny akcií pomocí určité simulace.
  • Spusťte model.
  • Určete expozici vlastního kapitálu v budoucnu.

Začneme načtením akcií ze služby Quandl a vykreslením závěrečné historie cen za posledních 180 dnů.

# 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)

S daty v ruce kalibrujeme model 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])

Dále modelujeme základní ceny akcií. Můžeme buď implementovat samostatný proces GBM od začátku, nebo použít jeden z mnoha balíčků R, které tuto funkci poskytují. Používáme sde balíčku R (Simulation and Inference for Stochastic Differential Equations), který poskytuje metodu řešení tohoto problému. Metoda GBM vyžaduje sadu parametrů, které se kalibrují na historická data nebo jsou uvedeny jako parametry simulace. Používáme historická data, která poskytují μ, σ a ceny akcií na začátku simulace (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)

Teď jsme připraveni zahájit simulaci Monte Carlo a modelovat potenciální expozici pro určitý počet simulací cest. Simulaci omezíme na 50 cest Monte Carlo a 256 časových kroků. Při přípravě na horizontální navýšení kapacity simulace a využití paralelizace v R používá smyčka simulace Monte Carlo příkaz 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)

Teď jsme simulovat cenu podkladové akcie MSFT. Abychom vypočítali expozici cenného kapitálu dopředu, odečteme premium a omezíme expozici pouze na kladné hodnoty.

# 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)
}

Následující dva obrázky znázorňují výsledek simulace. První obrázek ukazuje simulaci Monte Carlo základní ceny akcií za 50 cest. Druhý obrázek znázorňuje podkladovou úvěrovou expozici cenného kapitálu po odečtení pojistného cenného kapitálu a omezení expozice na kladné hodnoty.

Obrázek 1 – 50 Cest Monte Carlo

Obrázek 1 – 50 cest Monte Carlo

Obrázek 2 – úvěrová expozice pro akciový forward

Obrázek 2 – Úvěrová expozice pro akciový podíl dopředu

V posledním kroku se quantile PFE 1 měsíc 0,95 vypočítá následujícím kódem.

# 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")
Potenciální budoucí expozice pro MSFT Equity Forward

Obrázek 3 Potenciální budoucí expozice pro kapitál MSFT dopředu

Použití služby Azure Batch s R

Výše popsané řešení R je možné připojit ke službě Azure Batch a využít cloud pro výpočty rizik. Při paralelním výpočtu, jako je náš, to vyžaduje trochu další úsilí. Kurz Spuštění paralelní simulace jazyka R se službou Azure Batch poskytuje podrobné informace o připojení R ke službě Azure Batch. Níže si ukážeme kód a souhrn procesu pro připojení ke službě Azure Batch a informace o tom, jak využít rozšíření do cloudu ve zjednodušeném výpočtu PFE.

Tento příklad řeší stejný model, který jsme popsali dříve. Jak jsme viděli dříve, tento výpočet může běžet na našem osobním počítači. Zvýšení počtu cest Monte Carlo nebo použití menších časových kroků způsobí mnohem delší dobu provádění. Téměř všechny kódy R zůstanou beze změny. Zvýrazníme rozdíly v této části.

Každá cesta simulace Monte Carlo běží v Azure. Můžeme to udělat, protože každá cesta je nezávislá na ostatních a poskytuje nám výpočet, který je snadno paralelizován.

Pokud chcete použít Službu Azure Batch, definujeme podkladový cluster a odkazujeme na ho v kódu, než bude možné cluster použít ve výpočtech. Ke spuštění výpočtů použijeme následující definici 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": ""
}

S touto definicí clusteru využívá následující kód R clusteru:


# 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()

Nakonec aktualizujeme příkaz foreach z dřívější verze tak, aby používal balíček doAzureParallel. Jedná se o menší změnu, přidání odkazu na balíček sde a změnu %do% na %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()

Každá simulace Monte Carlo se odešle jako úkol do služby Azure Batch. Úloha se spustí v cloudu. Výsledky se sloučí před odesláním zpět do aplikace analytik workbench. Náročné úlohy a výpočty se spouštějí v cloudu, aby plně využily výhod škálování a základní infrastruktury vyžadované požadovanými výpočty.

Po dokončení výpočtů je možné další prostředky snadno vypnout vyvoláním jedné instrukce:

# Stop the cloud cluster
stopCluster(cluster)

Použití nabídky SaaS

První dva příklady ukazují, jak používat místní a cloudovou infrastrukturu k vývoji odpovídajícího modelu ocenění. Toto paradigma se začalo přesouvat. Stejně jako místní infrastruktura se transformovala na cloudové služby IaaS a PaaS, modelování relevantních rizikových hodnot se transformuje na proces orientovaný na služby. Dnešní analytici čelí dvěma hlavním výzvám:

  • Zákonné požadavky využívají zvýšení výpočetní kapacity k přidání požadavků na modelování. Regulační orgány požadují častější a aktuální údaje o rizicích.
  • Stávající riziková infrastruktura se ekologicky rozrůstala časem a vytváří výzvy při implementaci nových požadavků a pokročilejšího modelování rizik agilním způsobem.

Cloudové služby můžou poskytovat požadované funkce a podporovat analýzu rizik. Tento přístup má několik výhod:

  • Nejběžnější výpočty rizik vyžadované regulačním orgánem musí být prováděny všemi podle nařízení. Díky použití služeb od specializovaného poskytovatele služeb má analytik výhody z připravených k použití, výpočtů rizik kompatibilních s regulátory. Tyto služby mohou zahrnovat výpočty rizik trhu, výpočty rizik protistrany, úpravy X-hodnota (XVA) a dokonce i základní revize obchodního knihy (FRTB).
  • Tyto služby zpřístupňují svá rozhraní prostřednictvím webových služeb. Stávající riziková infrastruktura může být vylepšena těmito dalšími službami.

V našem příkladu chceme vyvolat cloudovou službu pro výpočty FRTB. Několik z nich najdete na AppSource. Pro tento článek jsme zvolili zkušební možnost z vektorového rizika. Budeme dál upravovat náš systém. Tentokrát používáme službu k výpočtu rizikového faktoru zájmu. Tento proces se skládá z následujících kroků:

  1. Volejte příslušnou službu rizik se správnými parametry.
  2. Počkejte, až služba dokončí výpočet.
  3. Načtení a začlenění výsledků do analýzy rizik

Přeložený do kódu jazyka R může být náš kód jazyka R rozšířen definicí požadovaných vstupních hodnot z připravené vstupní šablony.

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)

Dále musíme webovou službu volat. V tomto případě zavoláme metodu StartCreditExposure, která aktivuje výpočet. Koncový bod pro rozhraní API ukládáme do proměnné s názvem koncový bod.

# 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)

Po dokončení výpočtů načteme výsledky.

# 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)

Analytik tak bude pokračovat s přijatými výsledky. Relevantní údaje o riziku jsou extrahovány z výsledků a vykreslovány.

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")

Výsledné grafy vypadají takto:

Obrázek 4 – Úvěrová expozice pro cenné papíry MSFT vpřed – vypočítána s cloudovým rizikovým modulem.

Obrázek 4 – Úvěrová expozice pro dopředu vlastního kapitálu MSFT – vypočtená s cloudovým rizikovým modulem

Obrázek 5 – Potenciální budoucí expozice pro budoucí akciový kapitál MSFT – vypočítaný s cloudovým rizikovým modulem

Obrázek 5 – Potenciální budoucí expozice pro budoucí akciový kapitál MSFT – vypočítaný s cloudovým rizikovým modulem

Důležité informace

Flexibilní přístup ke cloudu prostřednictvím výpočetní infrastruktury a analytických služeb založených na saaS může poskytovat vylepšení rychlosti a flexibility pro rizikové analytiky pracující na kapitálových trzích a pojištění. V tomto článku jsme si prošli příklad, který ukazuje, jak používat Azure a další služby pomocí analyticů rizik nástrojů. Při vytváření a vylepšování rizikových modelů zkuste využít výhod možností Azure.

Přispěvatelé

Tento článek spravuje Microsoft. Původně byla napsána následujícími přispěvateli.

Hlavní autoři:

Další kroky