A pénzügyi szolgáltatások kockázati életciklusának engedélyezése az Azure-ral és az R-vel

A kockázatszámítások kulcsfontosságú pénzügyi szolgáltatási műveletek életciklusának több szakaszában is kulcsfontosságúak. A biztosítási termékkezelési életciklus egyszerűsített formája például az alábbi ábrához hasonlóan nézhet ki. A kockázatszámítás szempontjai kék szövegben jelennek meg.

Az ábrán a kockázatszámítási tényezők láthatók.

Egy tőkepiaci vállalat forgatókönyve így nézhet ki:

Az ábrán egy tőkepiaci vállalat kockázatszámítási forgatókönyve látható.

Az ilyen folyamatokban gyakori kockázatmodellezési igények merülnek fel, például:

  • A kockázatelemzők, például a biztosítótársaságok aktuáriusai vagy a tőkepiaci vállalatok kvantitációi által végzett ad hoc kockázattal kapcsolatos kísérletezés szükségessége. Ezek az elemzők általában olyan kód- és modellezési eszközökkel dolgoznak, amelyek népszerűek a tartományukban: R és Python. Számos egyetemi tanterv tartalmaz R- vagy Python-képzést matematikai pénzügyi és MBA-kurzusokon. Mindkét nyelv számos olyan nyílt forráskód kódtárhoz fér hozzá, amelyek támogatják a népszerű kockázatszámításokat.
  • A megfelelő eszközhasználat mellett az elemzőknek gyakran szükségük van a következőhöz való hozzáférésre:
    • Pontos piaci díjszabási adatok.
    • Szabályzat- és jogcímadatok.
    • Piaci pozíció adatai.
    • Egyéb külső adatok, például:
      • Strukturált adatok, például halálozási táblák és versenyképes díjszabási adatok.
      • Kevésbé hagyományos típusok, például időjárás és hírek.
    • Számítási kapacitás gyors interaktív adatvizsgálatokhoz.
  • Bizonyos esetekben ad-hoc gépi tanulási algoritmusok a díjszabáshoz vagy a piaci stratégia meghatározásához.
  • A terméktervezésben, a kereskedési stratégiában és a hasonló megbeszélésekben való használatra szánt adatok vizualizációjának és bemutatásának lehetősége.
  • A meghatározott modellek gyors végrehajtása, amelyet az elemzők konfigurálnak a díjszabásra, az értékelésekre és a piaci kockázatokra. Az értékelések a dedikált kockázatmodellezés, a piaci kockázati eszközök és az egyéni kód kombinációját használják. Az elemzés egy kötegben történik, amely eltérő éjszakai, heti, havi, negyedéves és éves számításokat végez. Ez az elemzés kiugróan magas számítási feladatokat eredményez.
  • Az adatok integrálása más vállalati szintű kockázati intézkedésekkel az összevont kockázatjelentéshez. A nagyobb szervezetekben az alacsonyabb szintű kockázatbecslések átadhatók egy vállalati kockázatmodellezési és jelentéskészítési eszközre.
  • A befektetői és szabályozási követelményeknek való megfelelés érdekében meghatározott formátumban jelentett eredmények.

A Microsoft az Azure Marketplace-en elérhető Azure-szolgáltatások és partnerajánlatok kombinációjával segít kielégíteni ezeket az igényeket. Ebben a cikkben gyakorlati példák szemléltetik az ad-hoc kísérletezés R használatával történő végrehajtását. Először elmagyarázzuk, hogyan futtatható a kísérlet egyetlen gépen. Ezután bemutatjuk, hogyan futtathatja ugyanazt a kísérletet az Azure Batch-en, és a közelben bemutatjuk, hogyan használhatja ki a külső szolgáltatásokat a modellezéshez. A definiált modellek Azure-beli végrehajtásának lehetőségeit és szempontjait ezekben a cikkekben ismertetjük, amelyek a bankolásra és a biztosításra összpontosítanak.

Elemzői modellezés az R-ben

Kezdjük azzal, hogyan használhatja az R-t egy elemző egy egyszerűsített, reprezentatív tőkepiaci forgatókönyvben. Ezt úgy hozhatja létre, hogy hivatkozik egy meglévő R-kódtárra a számításhoz, vagy a kód nulláról történő megírásával. A példánkban külső díjszabási adatokat is le kell hívnunk. A példa egyszerű, de szemléltető jellegű megőrzése érdekében kiszámítjuk egy részvénytőzsdei határidős szerződés lehetséges jövőbeli kitettségét (PFE). Ez a példa elkerüli az olyan eszközök összetett mennyiségi modellezési technikáit, mint az összetett származékok, és egyetlen kockázati tényezőre összpontosít a kockázati életciklusra való összpontosítás érdekében. A példánkban a következőket teheti:

  • Válasszon egy fontos eszközt.
  • Forrás történelmi árak a műszer.
  • Modell tőkeár-művelet egyszerű Monte Carlo (MC) számítással, amely geometriai Brownian Motion (GBM):
    • Becsült várható megtérülési μ (mu) és volatilitási σ (theta).
    • A modell kalibrálása korábbi adatokra.
  • Vizualizálja az eredményeket kommunikáló különböző útvonalakat.
  • Ábrázolja a max(0,Stock Value) értéket a PFE jelentésének, a kockázatnak kitett érték különbségének (VaR) bemutatásához. Tisztázandó:

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

  • Használja a 0,95 Quantile értéket a PFE-érték lekéréséhez a szimulációs időszak minden egyes lépésénél/végén.

A Microsoft (MSFT) részvényei alapján kiszámítjuk a tőketőkére vonatkozó PFE-t. Ahogy korábban említettük, a részvényárak modellezéséhez az MSFT-részvények múltbeli áraira van szükség, hogy a modellt előzményadatokra tudjuk kalibrálni. Számos módon szerezhető be a történelmi részvényárak. A példánkban egy külső szolgáltatótól , a Quandltől származó tőzsdei árszolgáltatás ingyenes verzióját használjuk.

Feljegyzés

A példa a WIKI Prices adatkészletet használja, amely használható a tanulási fogalmakhoz. Az usa-beli részvények éles használatához a Quandl azt javasolja, hogy használja a nap végén az USA részvényárfolyamainak adatkészletét.

Az adatok feldolgozásához és a saját tőke kockázatának meghatározásához a következő lépéseket kell tennünk:

  • Előzményadatok lekérése a saját tőkéből.
  • Határozza meg az előzményadatokból származó várható μ és volatilitási σ.
  • Modellezheti a mögöttes részvényárakat egy szimuláció használatával.
  • Futtassa a modellt.
  • A tőke jövőbeli kitettségének meghatározása.

Először lekértük az állományt a Quandl szolgáltatásból, és ábrázoljuk az elmúlt 180 nap záró árelőzményeit.

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

A kéznél lévő adatokkal kalibráljuk a GBM-modellt.

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

Ezután modellezzük az alapul szolgáló részvényárakat. A különálló GBM-folyamatot az alapoktól implementálhatjuk, vagy használhatjuk a funkciót biztosító számos R-csomag egyikét. Az R-csomag sde (Sztochasztikus differenciálegyenletek szimulációja és következtetése) használatával oldjuk meg ezt a problémát. A GBM-metódushoz olyan paraméterekre van szükség, amelyek vagy előzményadatokra vannak kalibrálva, vagy szimulációs paraméterekként vannak megadva. A korábbi adatokat használjuk fel, amelyek a szimuláció elején μ, σ és tőzsdei árfolyamokat (P0) szolgáltatnak.

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)

Most már készen állunk egy Monte Carlo-szimuláció elindítására, amely néhány szimulációs útvonal lehetséges expozícióját modellezheti. A szimulációt 50 Monte Carlo-útvonalra és 256 időlépésre korlátozzuk. A szimuláció horizontális felskálázásának előkészítése és a párhuzamosítás R-ben való kihasználása során a Monte Carlo szimulációs ciklus egy foreach utasítást használ.

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

Most szimuláltuk a mögöttes MSFT-részvény árát. A határidős tőkeexpozíció kiszámításához kivonjuk a prémiumot, és csak pozitív értékekre korlátozzuk a kitettséget.

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

A következő két képen a szimuláció eredménye látható. Az első képen a Monte Carlo-szimuláció látható, amely az alapul szolgáló részvényárfolyamot mutatja 50 útvonalon. A második kép a tőketőkére vonatkozó mögöttes hitelkitettséget mutatja be a határidős tőke prémiumának kivonása és a pozitív értékeknek való kitettség korlátozása után.

1. ábra – 50 Monte Carlo-útvonalak

1. ábra – 50 Monte Carlo-útvonal

2. ábra – A határidős tőkebefektetések hitelkockázata

2. ábra – A határidős tőke hitelkockázata

Az utolsó lépésben az 1 hónapos 0,95 kvantilis PFE kiszámítása a következő kóddal történik.

# 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")
Az MSFT Equity Forward potenciális jövőbeli kitettsége

3. ábra Az MSFT határidős tőke jövőbeli kitettsége

Az Azure Batch használata R-vel

A fent leírt R-megoldás csatlakoztatható az Azure Batchhez, és kihasználhatja a felhőt a kockázatszámításokhoz. Ez kevés extra erőfeszítést igényel egy olyan párhuzamos számításhoz, mint a miénk. A párhuzamos R-szimuláció futtatása az Azure Batchtel című oktatóanyag részletes információkat nyújt az R és az Azure Batch közötti kapcsolatról. Az alábbiakban bemutatjuk az Azure Batchhez való csatlakozás folyamatának kódját és összegzését, valamint azt, hogy hogyan használhatja ki a felhőbeli bővítmény előnyeit egy egyszerűsített PFE-számítással.

Ez a példa a korábban ismertetett modellel foglalkozik. Ahogy korábban láttuk, ez a számítás a személyes számítógépen is futtatható. A Monte Carlo-útvonalak számának növelése vagy a kisebb időlépések használata sokkal hosszabb végrehajtási időt eredményez. Szinte az összes R-kód változatlan marad. Ebben a szakaszban kiemeljük a különbségeket.

A Monte Carlo-szimuláció minden útvonala az Azure-ban fut. Ezt azért tehetjük meg, mert minden elérési út független a többiekétől, így könnyen párhuzamos számítást végezhetünk.

Az Azure Batch használatához definiáljuk a mögöttes fürtöt, és hivatkozunk rá a kódban, mielőtt a fürt használható lenne a számításokban. A számítások futtatásához a következő cluster.json definíciót használjuk:

{
  "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": ""
}

Ezzel a fürtdefinícióval a következő R-kód használja a fürtöt:


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

Végül frissítjük a foreach utasítást a korábbiakból a doAzureParallel csomag használatára. Ez egy kisebb módosítás, amely az sde-csomagra mutató hivatkozást ad hozzá, és a %do% értékét %dopar%-ra módosítja:

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

Minden Monte Carlo-szimuláció feladatként lesz elküldve az Azure Batchnek. A feladat a felhőben fut. Az eredmények egyesítve lesznek, mielőtt visszaküldené őket az elemzői workbenchnek. A felhőben végrehajtott nehéz emelések és számítások teljes mértékben kihasználják a skálázást és a kért számításokhoz szükséges mögöttes infrastruktúrát.

A számítások befejezése után a további erőforrások egyszerűen leállíthatók a következő utasítás meghívásával:

# Stop the cloud cluster
stopCluster(cluster)

SaaS-ajánlat használata

Az első két példa bemutatja, hogyan használható a helyi és a felhőinfrastruktúra a megfelelő értékelési modell kialakításához. Ez a paradigma elkezdett megváltozni. Ugyanúgy, ahogyan a helyszíni infrastruktúra felhőalapú IaaS- és PaaS-szolgáltatásokká alakult át, a releváns kockázati adatok modellezése szolgáltatásorientált folyamattá alakul. A mai elemzők két fő kihívással szembesülnek:

  • A szabályozási követelmények a számítási kapacitás növelésével növelik a modellezési követelményeket. A szabályozók gyakoribb és naprakészebb kockázati adatokat kérnek.
  • A meglévő kockázati infrastruktúra idővel organikusan növekedett, és kihívást jelent az új követelmények és a fejlettebb kockázatmodellezés agilis megvalósítása során.

A felhőalapú szolgáltatások biztosítják a szükséges funkciókat, és támogatják a kockázatelemzést. Ennek a megközelítésnek van néhány előnye:

  • A szabályozó által megkövetelt leggyakoribb kockázatszámításokat a rendelet értelmében mindenkinek végre kell hajtania. Egy speciális szolgáltató szolgáltatásainak használatával az elemző a használatra kész, szabályozónak megfelelő kockázatszámítások előnyeit élvezheti. Az ilyen szolgáltatások közé tartozhatnak a piaci kockázatszámítások, a partnerkockázati számítások, az X-Value Adjustment (XVA) és még a kereskedési könyv alapvető áttekintése (FRTB) kakulációk.
  • Ezek a szolgáltatások webes szolgáltatásokon keresztül teszik elérhetővé felületeiket. A meglévő kockázati infrastruktúra továbbfejleszthető ezekkel a más szolgáltatásokkal.

Példánkban egy felhőalapú szolgáltatást szeretnénk meghívni az FRTB-számításokhoz. Ezek közül több megtalálható az AppSource-on. Ebben a cikkben a Vector Risk próbaverziós lehetőségét választottuk. Továbbra is módosítjuk a rendszert. Ezúttal egy szolgáltatással számítjuk ki a kamatkockázati számot. Ez a folyamat a következő lépésekből áll:

  1. Hívja meg a megfelelő kockázati szolgáltatást a megfelelő paraméterekkel.
  2. Várjon, amíg a szolgáltatás befejezi a számítást.
  3. Az eredmények lekérése és beépítése a kockázatelemzésbe.

R-kódra lefordítva az R-kód továbbfejleszthető egy előkészített bemeneti sablon szükséges bemeneti értékeinek meghatározásával.

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)

Ezután meg kell hívnunk a webszolgáltatást. Ebben az esetben a StartCreditExposure metódust hívjuk meg a számítás elindításához. Az API végpontja egy elnevezett végpontban van tárolva.

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

A számítások befejezése után lekérjük az eredményeket.

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

Így az elemző folytathatja a kapott eredményeket. A releváns kockázati adatokat az eredményekből nyerik ki, és ábrázolják.

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

Az eredményként kapott diagramok a következőképpen néznek ki:

4. ábra – Az MSFT-részvénytőkére vonatkozó hitelkitettség – Felhőalapú kockázati motorral számítva.

4. ábra – Az MSFT-beli tőkebefektetések hitelkockázati kitettsége – Felhőalapú kockázati motorral kiszámítva

5. ábra – Az MSFT-részvények jövőbeli jövőbeli kitettsége – Felhőalapú kockázati motorral kiszámítva

5. ábra – Az MSFT-részvények jövőbeli jövőbeli kitettsége – Felhőalapú kockázati motorral kiszámítva

Megfontolások

A felhőhöz való rugalmas hozzáférés a számítási infrastruktúrán és az SaaS-alapú kockázatelemzési szolgáltatásokon keresztül a tőkepiacokon és a biztosításban dolgozó kockázatelemzők számára a sebesség és a rugalmasság terén is javítható. Ebben a cikkben egy olyan példán dolgoztunk, amely bemutatja, hogyan használhatja az Azure-t és más szolgáltatásokat olyan eszközök használatával, amelyeket a kockázatelemzők ismernek. Próbálja kihasználni az Azure képességeit a kockázati modellek létrehozásakor és továbbfejlesztésekor.

Közreműködők

Ezt a cikket a Microsoft tartja karban. Eredetileg a következő közreműködők írták.

Fő szerzők:

  • Dr. Darko Mocelj | HPC Global Blackbelt &AI Sr. Technology Specialist
  • Rupert Nicolay | Pénzügyi szolgáltatások – iparági megoldások – vezető

Következő lépések