現代化風險管理第1部分:流數據攝取,快速模型開發和大規模蒙特卡羅模擬
加速器的第二部分在這裏.
管理金融服務內部的風險在過去幾年中,尤其是在銀行業內部,其複雜性有所增加。首先,引入了新的框架(如FRTB),這些框架可能需要強大的計算能力和分析多年曆史數據的能力。與此同時,監管機構要求他們監管的銀行提高透明度和解釋性。最後,新技術和商業模式的引入意味著對健全風險治理的需求空前高漲。然而,銀行業有效滿足這些需求的能力並不是一件容易的事情。依靠內部基礎設施的傳統銀行已無法有效管理風險。銀行必須放棄傳統技術計算效率低下的做法,建立靈活的現代風險管理實踐,能夠通過使用數據和高級分析快速響應市場和經濟波動。最近的經驗表明,隨著新威脅的出現,曆史數據和彙總風險模型很快就失去了預測價值。風險分析師必須使用替代數據集來增強傳統數據,以便探索識別和量化其業務麵臨的大規模和實時風險的新方法。
在這篇博客中,我們將演示如何通過使用Databricks統一數據分析平台的各種組件(Delta Lake、Apache SparkTM和MLflow)來使傳統的風險價值(VaR)計算現代化,從而實現更靈活和前瞻性的風險管理方法。Beplay体育安卓版本
這第一個係列的筆記本將涵蓋多個數據工程和數據科學的挑戰,必須解決有效的現代化風險管理實踐:
- 使用Delta Lake對您的市場數據有一個統一的視圖
- 利用MLflow作為模型開發和部署的交付工具
- 使用Apache Spark大規模分發蒙特卡羅模擬
第二篇博客文章將介紹如何有效地分割蒙特卡洛模擬,以獲得更靈活和更有前瞻性的風險管理方法,主要側重於風險分析師角色。
借助Delta Lake實現現代化數據管理
隨著大數據和雲技術的興起,IT領域在過去十年發生了翻天覆地的變化。然而,大多數金融服務機構仍然依賴大型機和非分布式數據庫來進行核心風險操作,如VaR計算,並且隻將部分下遊流程轉移到現代數據湖和雲基礎設施。其結果是,銀行正在落後於技術曲線,它們目前的風險管理實踐已不能滿足現代經濟的需要。現代化的風險管理始於數據。具體來說,通過改變數據被查看的鏡頭:不是作為成本,而是作為資產。
舊方法:當數據被視為成本時在美國,金融服務機構限製了風險分析師探索“如果”情景的能力,並限製了他們的彙總數據倉僅滿足預定義的風險策略。隨著時間的推移,維護筒倉的剛性導致工程師在已經脆弱的工作流的基礎上分支新的流程並創建新的聚合視圖,以適應不斷變化的需求。矛盾的是,不斷努力將數據作為低成本商品保存在本地,導致了一個更脆弱的生態係統,因此整體維護成本更高。為了保證數據的及時性和可靠性,失敗的流程(下麵注釋為X符號)有太多的下遊影響。因此,考慮到下圖所示的所有移動組件和相互依賴性,對市場風險進行日內(和可靠的)觀察變得越來越複雜,實現成本也越來越高。
現代方法:將數據視為資產,組織接受數據的多功能性質,服務於多種用例(如風險價值和預期不足),並支持各種臨時分析(如了解特定國家的風險暴露)。風險分析師不再局限於狹隘的風險觀點,可以采用更靈活的方法進行風險管理。通過統一流和批處理ETL,確保ACID遵從性和模式強製,三角洲湖為您的數據湖帶來性能和可靠性,通過其青銅、銀和金層逐步提高數據的質量和相關性,並彌合操作流程和分析數據之間的差距。
在這個演示中,我們評估了由多個行業的40種工具組成的拉丁美洲股票投資組合的各種投資的風險水平,將所有收益存儲在一個集中的Delta Lake表中,該表將驅動我們所有的風險價值計算(在我們的第2部分演示中介紹)。
為了這個演示的目的,我們使用python yfinance庫從雅虎金融訪問每日收盤價。在現實生活中,人們可以直接從源係統獲取市場數據(例如從大型機捕獲的變更數據)到Delta Lake表,實時地將原始信息存儲在Bronze表上,並將管理/驗證的數據存儲在Silver表上。
利用Delta Lake的核心數據,我們應用了一個簡單的窗口函數來計算每日日誌收益,並將結果輸出到一個金表中,以便進行風險建模和分析。
@udf(“雙重”)def compute_return (第一個,關閉):返回浮動(np。日誌(關閉/第一個))窗口=Window.partitionBy (“股票”) .orderBy (“日期”) .rowsBetween (-1,0)
火花\.read \.表格(stock_data_silver) \.withColumn(“第一次”,F.first (“關閉”).在(窗口)) \.withColumn(“返回”,compute_return (“第一”,“關閉”)) \.選擇(“日期”,“股票”,“返回”).write \.format \(“δ”).mode \(“覆蓋”).saveAsTable (stock_data_gold)
在下麵的例子中,我們展示了我們在哥倫比亞經營的金融服務公司AVAL (Grupo AVAL Acciones y Valores s.a.)的投資數據的特定部分。鑒於其股價在2020年3月後的預期下跌,我們可以評估其對我們整體風險投資組合的影響。
使用MLFlow簡化模型開發
盡管定量分析並不是一個新概念,但最近數據科學的興起和數據量的爆炸式增長,揭示了銀行運營模型的主要低效之處。在沒有任何行業標準的情況下,數據科學家通常會盡最大努力工作。這通常意味著針對單個節點上的數據樣本訓練模型,並在整個開發過程中手動跟蹤模型,從而導致較長的發布周期(可能需要6到12個月才能將模型交付到生產)。較長的模型開發周期阻礙了他們快速適應新出現的威脅和動態減輕相關風險的能力。金融服務機構在這種模式中麵臨的主要挑戰是縮短模型開發到生產的時間,而不以犧牲治理和法規為代價,或者為更脆弱的數據科學生態係統做出貢獻。
MLflow是通過為模型開發帶來不變性和透明性來管理機器學習生命周期的事實上的標準,但並不局限於AI。銀行對模型的定義通常相當廣泛,包括從Excel宏到基於規則的係統或最先進的機器學習的任何金融模型,所有這些模型都可以從Databricks統一數據分析平台中MLflow提供的中央模型注冊表中受益。Beplay体育安卓版本
複製模型開發
在這個例子中,我們想訓練一個新模型,在給定市場指標(如標準普爾500、原油和國債)的情況下預測股票回報。我們可以檢索“AS OF”數據,以確保完整的模型再現性和審計遵從性。三角洲湖的這種能力通常被稱為“時間旅行”。結果數據集將在所有實驗中保持一致,並且可以按原樣訪問以用於審計目的。
描述market_return曆史;選擇*從market_return時間戳作為的“2020-05-04”;選擇*從market_return版本作為的2;
為了在他們的模型中選擇正確的特征,量化分析師經常在Spark和熊貓dataframes.我們在這裏展示如何從pyspark切換到python上下文,以便提取市場因素的相關性。Databricks交互式筆記本帶有內置的可視化,也完全支持使用Matplotlib, seaborn(或R的ggplot2)。
factor_returns_pd=factor_returns_df.toPandas ()factor_corr=factor_returns_pd。相關係數(方法=“槍兵”, min_periods=12)
假設我們的指標是不相關的(他們是)和預測我們的投資組合回報(他們可能),我們想記錄這個圖表作為我們成功實驗的證據。這表明,內部審計、模型驗證功能以及監管機構以最高質量的標準進行了模型探索,其開發是由實證結果主導的。
mlflow.log_artifact (“/ tmp / correlation.png”)
並行訓練模型
隨著投資組合中工具數量的增加,我們可能希望並行訓練模型。這可以通過一個簡單的Pandas UDF函數實現,如下所示。為了方便起見(現實生活中的模型可能更複雜),我們希望訓練一個簡單的線性回歸模型,並將所有模型係數聚合為n × m矩陣(n是工具的數量,m是由市場因素派生的特征的數量)。
schema = StructType([StructField (“股票”、StringType ()真正的),StructField (“重量”ArrayType (FloatType ()),真正的)])@pandas_udf (模式,PandasUDFType。GROUPED_MAP)deftrain_model(組,pdf):X = np.array(pdf[“特性”])X = sm。add_constant (X,預謀=真正的)Y = np.array(pdf[“返回”])模型= sm。OLS (y, X) .fit ()w_df = pd.DataFrame(data=[[模型。params]],列= (“重量”])w_df [“股票”] = group[0]返回w_dfmodels_df = x_train.groupBy(“股票”蘋果(train_model) .toPandas ()
結果數據集(每個模型的權重)可以很容易地收集到內存中,並記錄到MLflow中,作為我們實驗剩餘部分的候選模型。在下圖中,我們報告了從我們的模型中得到的哥倫比亞石油和天然氣生產商Ecopetrol s.a.的預測和實際股票回報。
我們的實驗現在與獨立驗證單元(IVU)提交所需的所有證據一起存儲在MLflow上,IVU可能是您的一部分風險管理模型框架。值得注意的是,這個實驗不僅與我們的筆記本有關,而且與它的準確修訂有關,為獨立專家和監管機構帶來了我們模型的完整可追溯性以及模型驗證所需的所有必要背景。
用Apache Spark進行大規模蒙特卡羅模擬
風險價值是模擬隨機遊走的過程,它涵蓋了可能的結果和最壞的情況(n)。(t)天內95%的風險值是最糟糕的5%試驗中的最佳情況。因此,考慮到我們投資組合中所有工具的90天曆史市場波動,我們希望生成足夠的模擬來覆蓋一係列可能的結果。考慮到每個儀器所需的模擬數量,該係統在設計時必須考慮到高度的並行性,使風險價值成為在基於雲的環境中執行的完美工作負載。風險管理是當今頂級銀行評估雲計算分析並通過Databricks運行時加速價值的首要原因。
創建多元分布
盡管業內建議生成2萬至3萬次模擬,但計算混合投資組合的風險價值的主要複雜性並不在於衡量單個資產的回報,而是它們之間的相關性。在投資組合級別,市場指標可以在本地python中優雅地操作,而不必將複雜的矩陣計算轉移到分布式框架。由於操作多本書和作品集是很常見的,因此可以通過並行分布矩陣計算來輕鬆擴展相同的過程。我們使用過去90天的市場回報來計算今天的波動率(提取平均值和協方差)。
Def retrieve_market_factors(from_date, to_date):from_ts=F.to_date (F.lit (from_date))。投(TimestampType ())to_ts=F.to_date (F.lit (to_date))。投(TimestampType ())f_ret=spark.table market_return_table \.過濾器(F.col (“日期”)>from_ts) \.過濾器(F.col (“日期”)
我們生成一個具體的市場條件通過對一個點采樣的市場的多元預測(我們市場因素的個別正態分布的疊加)。這提供了一個特征向量,可以注入到我們的模型中,以預測我們的金融工具的回報。
defsimulate_market(F_ret_avg, f_ret_cov, seed):np.random。種子(年代eed = seed)返回np.random。multivariate_normal (f_ret_avg f_ret_cov)
大規模進行一致和獨立的試驗
模擬風險價值的另一個複雜性是通過使用“種子”仔細固定隨機數來避免自相關性。我們希望每個試驗都是獨立的,盡管在不同工具之間是一致的(每個模擬頭寸的市場條件都是相同的)。請看下麵一個創建獨立和一致的試驗集的例子——運行相同的塊兩次將產生完全相同的市場向量集。
seed_init =42種子= [seed_init + x .為x在np.arange (0,10)]Market_data = [simulate_market(f_ret_avg, f_ret_cov, s)為年代在種子)Market_df = pd。DataFrame (market_data、列= feature_names)market_df [“關注”=種子
在分布式環境中,我們希望集群中的每個執行程序都負責跨多個工具的多個模擬。我們定義了種子策略,以便每個執行程序都將負責num_instruments x (num_simulations / num_executors)試驗。在我們的投資組合中,給定100,000次蒙特卡洛模擬,50個執行器和10個樂器的並行度,每個執行器將運行20,000個樂器回報。
#修複我們的最初的種子與今天的實驗trial_date=datetime.strptime (“2020-05-01”,' % Y - % - % d ')seed_init=int(trial_date.timestamp ())#創建我們的種子戰略每遺囑執行人種子=[[seed_init+x, x%並行性)為x在np.arange (0,運行)seed_pdf=pd。DataFrame(數據=種子,列=[“種子”,“執行人”])seed_sdf=spark.createDataFrame seed_pdf .repartition(並行性,“執行人”)#評估而且緩存我們的重分區策略seed_sdf.cache ()seed_sdf。數()
我們對每個執行程序的種子集進行分組,並通過使用Pandas UDF為每個模型生成試驗。請注意,可能有多種方法可以實現相同的目標,但是這種方法的好處是可以完全控製並行度的級別,以確保沒有熱點發生,沒有執行程序閑置等待其他任務完成。
@pandas_udf ('股票字符串,種子int,試用浮動', PandasUDFType。GROUPED_MAP)defrun_trials(pdf):#恢複我們的廣播模式和90天的市場波動Models = model_dict.valuef_ret_avg = f_ret_avg_B.valuef_ret_cov = f_ret_cov_B.value
Trials = []為種子在np.array (pdf.seed):Market_features = simulate_market(f_ret_avg, f_ret_cov, seed)為股票行情自動收錄器、模型在models_dict.items ():Trial = model.predict(market_features)試用追加([ticker, seed, trial])返回pd。DataFrame(試驗、列= (“股票”,“種子”,“審判”])#並行執行蒙特卡洛mc_df = seed_sdf.groupBy(“執行人”蘋果(run_trials)
我們將按天劃分的試驗附加到Delta Lake表上,以便分析師可以輕鬆地訪問一天的模擬結果,並按試驗Id(即種子號)對個人收益進行分組,以便訪問收益的每日分布及其各自的風險價值。
根據我們最初將數據定義為核心資產(而不是成本)的定義,我們存儲了所有豐富了投資組合分類(如行業類型和運營國家)的試驗,從而能夠更全麵地、按需地看待我們投資策略麵臨的風險。我們將在第2部分的博客文章中介紹如何高效、輕鬆地(通過使用SQL)分割風險價值數據,主要側重於風險分析師角色。
從VaR和風險管理的現代方法開始
在本文中,我們展示了銀行如何利用雲計算的靈活性和Apache Spark的健壯性,有效地將蒙特卡羅模擬從數萬個擴展到數百萬個,從而實現風險管理實踐的現代化。我們還演示了Databricks作為唯一的統一數據分析平台,如何通過帶來實驗的透明度和數據的可靠性,彌合科學和工程之間的差距,並使銀行擁有更健壯Beplay体育安卓版本而敏捷的風險管理方法,從而幫助加速模型開發生命周期。
看看第2部分這個係列的。
試試下麵的Databricks今天!如果您想了解統一數據分析如何將數據科學、業務分析和工程結合在一起,以加速您的數據和ML工作,請查看按需研討會-使用Apache Spark™統一數據管道、業務分析和機器學習.
VaR和風險管理筆記:
聯係我們了解更多關於我們如何協助客戶處理市場風險用例的信息。beplay体育app下载地址