工程的博客

现代化风险管理第1部分:流数据摄取,快速模型开发和大规模蒙特卡罗模拟

2020年5月27日 工程的博客

分享这篇文章

加速器的第二部分在这里

管理金融服务内部的风险在过去几年中,尤其是在银行业内部,其复杂性有所增加。首先,引入了新的框架(如FRTB),这些框架可能需要强大的计算能力和分析多年历史数据的能力。与此同时,监管机构要求他们监管的银行提高透明度和解释性。最后,新技术和商业模式的引入意味着对健全风险治理的需求空前高涨。然而,银行业有效满足这些需求的能力并不是一件容易的事情。依靠内部基础设施的传统银行已无法有效管理风险。银行必须放弃传统技术计算效率低下的做法,建立灵活的现代风险管理实践,能够通过使用数据和高级分析快速响应市场和经济波动。最近的经验表明,随着新威胁的出现,历史数据和汇总风险模型很快就失去了预测价值。风险分析师必须使用替代数据集来增强传统数据,以便探索识别和量化其业务面临的大规模和实时风险的新方法。

在这篇博客中,我们将演示如何通过使用Databricks统一数据分析平台的各种组件(Delta Lake、Apache SparkTM和MLflow)来使传统的风险价值(VaR)计算现代化,从而实现更灵活和前瞻性的风险管理方法。bob体育客户端下载

用于现代化传统VaR计算的Databricks架构。

这第一个系列的笔记本将涵盖多个数据工程和数据科学的挑战,必须解决有效的现代化风险管理实践:

  • 使用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 (-10
              火花\.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月后的预期下跌,我们可以评估其对我们整体风险投资组合的影响。

Databricks使用的样本数据说明了现代金融风险和数据管理方法的有效性。

使用MLFlow简化模型开发

尽管定量分析并不是一个新概念,但最近数据科学的兴起和数据量的爆炸式增长,揭示了银行运营模型的主要低效之处。在没有任何行业标准的情况下,数据科学家通常会尽最大努力工作。这通常意味着针对单个节点上的数据样本训练模型,并在整个开发过程中手动跟踪模型,从而导致较长的发布周期(可能需要6到12个月才能将模型交付到生产)。较长的模型开发周期阻碍了他们快速适应新出现的威胁和动态减轻相关风险的能力。金融服务机构在这种模式中面临的主要挑战是缩短模型开发到生产的时间,而不以牺牲治理和法规为代价,或者为更脆弱的数据科学生态系统做出贡献。

MLflow是通过为模型开发带来不变性和透明性来管理机器学习生命周期的事实上的标准,但并不局限于AI。银行对模型的定义通常相当广泛,包括从Excel宏到基于规则的系统或最先进的机器学习的任何金融模型,所有这些模型都可以从Databricks统一数据分析平台中MLflow提供的中央模型注册表中受益。bob体育客户端下载

复制模型开发

在这个例子中,我们想训练一个新模型,在给定市场指标(如标准普尔500、原油和国债)的情况下预测股票回报。我们可以检索“AS OF”数据,以确保完整的模型再现性和审计遵从性。三角洲湖的这种能力通常被称为“时间旅行”。结果数据集将在所有实验中保持一致,并且可以按原样访问以用于审计目的。

描述market_return历史;选择market_return时间戳作为“2020-05-04”选择market_return版本作为2

为了在他们的模型中选择正确的特征,量化分析师经常在Spark和熊猫dataframes.我们在这里展示如何从pyspark切换到python上下文,以便提取市场因素的相关性。Databricks交互式笔记本带有内置的可视化,也完全支持使用Matplotlib, seaborn(或R的ggplot2)。

factor_returns_pdfactor_returns_df.toPandas ()factor_corrfactor_returns_pd。相关系数方法“枪兵”, min_periods12

由Databricks交互式笔记本生成的样本方差-协方差表,展示了其在构建预测风险模型时的有效性和严谨性。

假设我们的指标是不相关的(他们是)和预测我们的投资组合回报(他们可能),我们想记录这个图表作为我们成功实验的证据。这表明,内部审计、模型验证功能以及监管机构以最高质量的标准进行了模型探索,其开发是由实证结果主导的。

mlflow.log_artifact (“/ tmp / correlation.png”

并行训练模型

随着投资组合中工具数量的增加,我们可能希望并行训练模型。这可以通过一个简单的Pandas UDF函数实现,如下所示。为了方便起见(现实生活中的模型可能更复杂),我们希望训练一个简单的线性回归模型,并将所有模型系数聚合为n × m矩阵(n是工具的数量,m是由市场因素派生的特征的数量)。

schema = StructType([StructField (“股票”、StringType ()真正的),StructField (“重量”ArrayType (FloatType ()),真正的])@pandas_udf (模式,PandasUDFType。GROUPED_MAPdeftrain_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.的预测和实际股票回报。

由MLflow保留的示例模型输出可视化,以及实验、其修订和底层数据,提供了完全的透明性、可跟踪性和上下文。

我们的实验现在与独立验证单元(IVU)提交所需的所有证据一起存储在MLflow上,IVU可能是您的一部分风险管理模型框架。值得注意的是,这个实验不仅与我们的笔记本有关,而且与它的准确修订有关,为独立专家和监管机构带来了我们模型的完整可追溯性以及模型验证所需的所有必要背景。

用Apache Spark进行大规模蒙特卡罗模拟

风险价值是模拟随机游走的过程,它涵盖了可能的结果和最坏的情况(n)。(t)天内95%的风险值是最糟糕的5%试验中的最佳情况。因此,考虑到我们投资组合中所有工具的90天历史市场波动,我们希望生成足够的模拟来覆盖一系列可能的结果。考虑到每个仪器所需的模拟数量,该系统在设计时必须考虑到高度的并行性,使风险价值成为在基于云的环境中执行的完美工作负载。风险管理是当今顶级银行评估云计算分析并通过Databricks运行时加速价值的首要原因。

创建多元分布

尽管业内建议生成2万至3万次模拟,但计算混合投资组合的风险价值的主要复杂性并不在于衡量单个资产的回报,而是它们之间的相关性。在投资组合级别,市场指标可以在本地python中优雅地操作,而不必将复杂的矩阵计算转移到分布式框架。由于操作多本书和作品集是很常见的,因此可以通过并行分布矩阵计算来轻松扩展相同的过程。我们使用过去90天的市场回报来计算今天的波动率(提取平均值和协方差)。

Def retrieve_market_factors(from_date, to_date):from_tsF.to_date (F.lit (from_date))。(TimestampType ())to_tsF.to_date (F.lit (to_date))。(TimestampType ())f_retspark.table market_return_table \过滤器(F.col (“日期”>from_ts) \过滤器(F.col (“日期”
              我们生成一个具体的市场条件通过对一个点采样市场的多元预测(我们市场因素的个别正态分布的叠加)。这提供了一个特征向量,可以注入到我们的模型中,以预测我们的金融工具的回报。
defsimulate_marketF_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 .xnp.arange (010)]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_datedatetime.strptime (“2020-05-01”' % Y - % - % d 'seed_initint(trial_date.timestamp ())创建我们的种子战略遗嘱执行人种子[[seed_init+x, x并行性)xnp.arange (0,运行)seed_pdfpd。DataFrame(数据种子,列“种子”“执行人”])seed_sdfspark.createDataFrame seed_pdf .repartition(并行性,“执行人”#评估而且缓存我们的重分区策略seed_sdf.cache ()seed_sdf。()

我们对每个执行程序的种子集进行分组,并通过使用Pandas UDF为每个模型生成试验。请注意,可能有多种方法可以实现相同的目标,但是这种方法的好处是可以完全控制并行度的级别,以确保没有热点发生,没有执行程序闲置等待其他任务完成。

@pandas_udf ('股票字符串,种子int,试用浮动', PandasUDFType。GROUPED_MAPdefrun_trialspdf):#恢复我们的广播模式和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(即种子号)对个人收益进行分组,以便访问收益的每日分布及其各自的风险价值。

附有按天划分试验的Delta Lake表样本,以方便风险分析人员审查。

根据我们最初将数据定义为核心资产(而不是成本)的定义,我们存储了所有丰富了投资组合分类(如行业类型和运营国家)的试验,从而能够更全面地、按需地看待我们投资策略面临的风险。我们将在第2部分的博客文章中介绍如何高效、轻松地(通过使用SQL)分割风险价值数据,主要侧重于风险分析师角色。

从VaR和风险管理的现代方法开始

在本文中,我们展示了银行如何利用云计算的灵活性和Apache Spark的健壮性,有效地将蒙特卡罗模拟从数万个扩展到数百万个,从而实现风险管理实践的现代化。我们还演示了Databricks作为唯一的统一数据分析平台,如何通过带来实验的透明度和数据的可靠性,弥合科学和工程之间的差距,并使银行拥有更健壮bob体育客户端下载而敏捷的风险管理方法,从而帮助加速模型开发生命周期。

看看第2部分这个系列的。

试试下面的Databricks今天!如果您想了解统一数据分析如何将数据科学、业务分析和工程结合在一起,以加速您的数据和ML工作,请查看按需研讨会-使用Apache Spark™统一数据管道、业务分析和机器学习

VaR和风险管理笔记:

带上笔记本

联系我们了解更BOB低频彩多关于我们如何协助客户处理市场风险用例的信息。

免费试用Databricks

相关的帖子

看到所有工程的博客的帖子