跳轉到主要內容
工程的博客

現代化風險管理第2部分:聚合,val規模和引入替代數據

2020年6月5日 工程的博客

分享這篇文章

理解和減輕風險是任何金融服務機構的最前沿。然而,正如前麵討論的這個分兩部分的係列的第一個博客,今天銀行仍在努力跟上新興業務麵臨的風險和威脅。受到本地基礎設施和傳統技術的局限性,銀行直到最近還沒有工具來有效地構建一個現代風險管理實踐。幸運的是,存在一個更好的選擇今天基於開源技術由原生雲基礎設施。這現代風險管理框架允許盤中視圖、聚合規模需求和未來的能力證明/風險管理。在這個由兩部分組成的係列博文,我們將演示如何通過使用現代化傳統風險價值計算三角洲湖,Apache火花TMMLflow為了使更敏捷的和前瞻性的風險管理方法。

現代投資組合風險管理方法需要使用的技術像三角洲湖,Apache SparkTM和MLflow為了規模風險價值計算,val模型和探索替代數據

第一個演示解決相關技術難題現代化的風險管理實踐與數據和先進的分析方法,涉及風險的概念模型和蒙特卡羅模擬使用MLflow和Apache火花TM本文著重於風險分析師的角色和他們的需求有效地分割成風險模擬(按需)為了更好地理解投資組合風險新的威脅出現,在真正的時間。我們將討論以下主題:

  • 使用三角洲湖和SQL聚合風險價值的需求
  • 使用Apache火花TM和MLflow val模型和向監管機構報告違反
  • 探索利用替代數據更好地評估你的風險敞口

切割與三角洲湖風險價值

第一部分這個兩部分的係列博文,我們推出了一個現代風險管理平台是什麼樣子,FSIs需要轉變的鏡片數據查看:不是成本,而是作為一種資產。Beplay体育安卓版本我們顯示的多功能性質數據,以及如何將蒙特卡羅數據存儲在最細粒度的形式將使多個用例以及為分析師提供的靈活性來運行特別分析,導致一種更健壯的和敏捷的銀行麵臨的風險。

現代投資組合風險管理平台利用三角洲湖和SQL日均總需求。Beplay体育安卓版本

在這個博客和演示中,我們發現不同的風險投資拉美股票投資組合由40多個行業工具。為此,我們利用大量的數據能夠生成通過蒙特卡羅模擬(40儀器模擬x 50000 x 52周= 1億條記錄),白天分區和豐富我們的投資組合分類如下。

樣本拉美股票投資組合用於現代風險價值計算。

風險價值

風險價值是模擬隨機漫步的過程,涉及可能的結果以及最壞情況(n)場景。風險價值95% (t)天是最好的情況最差的5%試驗。

作為我們的試驗是分區的,分析師可以很容易地訪問一個天的模擬試驗Id和組個人返回的數據(即種子用於生成金融市場條件)為了訪問我們的投資回報的每日分布及其各自的風險價值。我們的第一個方法是使用SQL聚合引發我們的模擬返回給定天(50000條記錄)和使用內存中的計算5%分位數通過一個簡單的python numpy操作。

返回=火花\.read \(monte_carlo_table) \過濾器(F.col (“run_date”)==“2020-01-01”)\.groupBy (“種子”)\.agg (F。總和(“審判”).alias (“返回”))\選擇(“返回”)\.toPandas () (“返回”]value_at_risk=np.quantile (返回,5/One hundred.)

提供了最初的10000美元投資在我們所有的拉丁美洲的權益工具,風險價值的95%——在特定的時間點,將是3000美元。這是我們的業務將會準備好輸了多少,(至少)在最差的5%的所有可能的事件。

樣本數據可視化描述風險價值95%使用火花產生的SQL聚合模擬返回給定的一天。

這種方法的缺點是,我們首先需要收集所有日常試驗在內存中以計算5%分位數。雖然可以輕鬆地執行這個過程使用價值1天的數據時,它迅速成為瓶頸時聚合風險價值在更長一段時間。

一個務實和可伸縮的方法來解決問題

從大型數據集提取百分比是眾所周知的挑戰任何分布式計算環境。共同的(盡管低效)實踐是1)你所有的數據和2)櫻桃挑選一個特定行通過approxQuantile使用takeOrdered或找到一個近似方法。我們麵臨的挑戰是略有不同,因為我們的數據並不構成一個數據集,但跨越多個日子,行業和國家,每個桶可能太大而不能有效地收集和處理在內存中。

在實踐中,我們利用風險價值的本質和隻關注最糟糕的n (n小)事件。鑒於50000模擬儀表和99%的VaR,我們感興趣的是找到最好的最嚴重的500年的實驗。為此,我們創建一個用戶定義的聚合函數(UDAF)隻返回最佳n最嚴重的事件。這種方法將大大減少內存占用和網絡約束時可能出現的大規模計算VaR聚合。

ValueAtRisk(n:Int)擴展UserDefinedAggregateFunction{/ /這是聚合函數的輸入字段。覆蓋def inputSchema: org.apache.spark.sql.types。StructType = {StructType (StructField (“價值”,倍增式)::Nil)}/ /這是內部字段你保持計算聚合。覆蓋def bufferSchema: StructType = StructType (數組(StructField (“壞的”ArrayType(倍增式)))/ /這是你的聚合函數的輸出類型。覆蓋def數據類型:數據類型=倍增式/ /訂單我們處理dataframe無關緊要/ /最壞的永遠是最壞的打算覆蓋def確定性:布爾=真正的/ /這是緩衝模式的初始值。覆蓋def初始化(緩衝:MutableAggregationBuffer):單位= {緩衝(0)= >。(]}/ /這是如何更新給定一個輸入緩衝模式。覆蓋def更新(緩衝:MutableAggregationBuffer,輸入:行):單位= {緩衝(0)= buffer.getAs [Seq []](0):+ input.getAs [)(0)}/ /這是如何與bufferSchema合並兩個對象類型。/ /我們隻保留最N事件覆蓋def合並(緩衝:MutableAggregationBuffer,行:行):單位= {緩衝(0)= (buffer.getAs [Seq []](0)+ + row.getAs [Seq []](0)).sorted.take (n)}/ /這是你輸出最終的價值/ /我們的風險價值是最好最嚴重的n覆蓋def評估(緩衝:行):任何= {返回buffer.getAs [Seq []](0).sorted.last}
              }/ /風險價值95% N是最好的最嚴重的事件val n = (One hundred.- - - - - -95年)* numSimulations /One hundred./ /注冊UADFsspark.udf.register (“VALUE_AT_RISK”,ValueAtRisk (n))

我們通過spark.udf UADF通過注冊。注冊方法,我們讓這些功能我們所有的用戶,民主化風險分析對每個人都沒有一個先進的知識scala / python /火花。隻是一個group by審判Id(即種子)為了運用以上並提取相關的風險價值使用普通SQL功能在所有數據。

選擇t.run_date作為一天,VALUE_AT_RISK (t.return)作為value_at_risk(選擇m.run_date,m.seed,總和(m.trial)作為返回monte_carlo米集團通過m.run_date,m.seed)t集團通過t.run_date訂單通過t.run_dateASC

我們可以很容易發現COVID-19在我們的市場風險計算的影響。90天時間內經濟波動導致更低的風險價值,因此更高的風險敞口2020年3月初以來整體。

樣本計算風險價值為使用火花Covid-19條件生成SQL

我們的風險敞口的整體視圖

在大多數情況下,理解整體風險價值是不夠的。分析師需要了解風險不同的書籍、資產類別,不同行業或不同國家的操作。除了三角洲湖功能如時間旅行和ACID事務前麵所討論的,三角洲湖和Apache火花TM磚上高度優化的運行時提供快速聚合在閱讀。高的性能可以通過使用我們的本地分區邏輯(按日期)和z順序索引應用於國家和行業。這些額外的索引將充分利用在選擇一個特定的塊數據在一個國家或行業水平,大大減少了需要讀取的數據量之前你的VaR聚合。

優化monte_carlo ZORDER(國家、行業)

我們可以很容易地適應上麵的SQL代碼通過使用國家和行業作為我們的分組參數VALUE_AT_RISK方法為了有更細粒度的和描述性的觀點我們的風險敞口。由此產生的數據集可以使用磚把“原樣”設想為筆記本,可以進一步細化了解這些國家的具體貢獻每個我們的整體風險。

樣本數據可視化描述風險價值的國家所產生的火花SQL聚合。

在這個例子中,秘魯似乎我們的整體風險敞口最大的貢獻。看著相同的SQL代碼在一個行業水平在秘魯,我們可以探討在行業風險的貢獻。

樣本數據可視化描述國內投資組合風險價值由工業所產生的火花SQL聚合。

的貢獻接近60%在2020年3月,秘魯的主要風險似乎與礦業有關。在應對日益嚴重的封鎖COVID病毒一直在秘魯,影響采礦項目中心的銅、金和銀生產()。

延伸了本文的討論範圍,我們可能想知道如果我們能早點發現這一趨勢使用替代數據和具體事件的全球數據庫,位置和語氣(GDELT)。我們報告在下麵圖在秘魯礦業的媒體報道,顏色編碼正麵和負麵趨勢通過一個簡單的移動平均線。

樣本數據可視化描述金融投資組合風險由於Covid-19條件,展示現代化風險價值計算使用的重要性增強曆史數據與外部因素來自替代數據。

這清楚地展示一個積極的趨勢在二月初,也就是15天前觀察股票的波動,這可能是一個早期的跡象越來越多的風險。這種分析強調現代化風險價值計算的重要性,增強曆史數據與外部因素來自替代數據。

模型,val

在應對2008年金融危機中,一個附加的措施是由巴塞爾銀行監管委員會。99天VaR結果對日常損益表進行比較。val季度執行使用最近250天的數據。基於的數量超過數點經驗在那段時期,VaR度量是歸類為陷入三種顏色的區域。

水平 閾值 結果
綠色 4超過數點 沒有特別的擔憂
黃色的 到9超過數點 監測要求
紅色的 超過10超過數點 VaR方法得到改善

的風險價值

鑒於我們之前定義的聚合函數,我們可以提取每日在我們整個投資組合的風險價值。作為我們的聚合風險值數據集很小(包含2年的曆史,即365 x 2數據點),我們的策略是收集每日VaR和廣播我們大組為了避免不必要的打亂。更多細節可以在早期發現的功能博客民主化金融時間序列分析

情況下VarHistory(時間:長,valueAtRisk:字符串)瓦爾historicalVars=sql(年代”“”選擇t.run_date VALUE_AT_RISK valueAtRisk (t.return)(選擇m.run_date, m。年代eed, sum(m.trial) AS return從蒙特卡羅組由m.run_date m.seed)t集團t.run_date”“”)withColumn(“時間”convertDate (坳(“run_date”)))orderBy(asc (“時間”))選擇(“時間”,“valueAtRisk”)作為(VarHistory]收集()sortBy(_.time)反向瓦爾historicalVarsB=火花sparkContext廣播(historicalVars)

我們檢索最近的風險價值實際返回通過一個簡單的用戶定義函數和執行一個250天的滑動窗口提取連續每日違反。

val asOfVar=udf ((s: java.sql.Date)=>{val historicalVars=historicalVarsB.value如果(s。取得時間s.getTime).headOption.map (_.valueAtRisk)}})val windowSpec=Window.orderBy(“時間”).rangeBetween (-3600年*24*250年,0)val countBreaches=udf (asOfVar:,返回:Seq [])=>{的回報。(_我們可以觀察到一個連續級數17違反2月開始,需要報告法規依據《巴塞爾協議III》(Basel III)框架。同樣可以報告到一個圖,時間。
免費試著磚
看到所有工程的博客的帖子
Baidu
map