工程的博客

风险管理现代化第1部分:流媒体的摄入、快速发展和蒙特卡罗模拟模型的规模

2020年5月27日 工程的博客

分享这篇文章

第2部分的加速器在这里

风险管理在金融服务,特别是在银行业,已经在过去的几年中增加了复杂性。首先,新框架(如FRTB)被引入,可能需要巨大的计算能力和多年的历史数据分析的能力。同时,监管机构要求更高的透明度和explainability其监管的银行。最后,引进新技术和商业模式意味着需要良好的风险管理是在一个高。然而,银行业的能力有效地满足这些需求没有一个轻松的任务。传统银行依靠本地基础设施不能有效地管理风险。银行必须放弃传统技术的计算效率低下,并构建一个敏捷的现代风险管理实践能够快速响应市场和经济波动通过使用数据和先进的分析。最近的经验表明,当出现新的威胁时,历史数据和聚合风险模型迅速失去预测值。风险分析师必须增强传统数据替代数据集,以探索的新方法识别和量化其业务所面临的风险,无论是在规模和实时。

在这个博客中,我们将演示如何现代化传统风险价值(VaR)计算通过使用砖统一数据分析平台的各种组件——三角洲湖,Apache SparkTM和MLflow——为了使更敏捷和前瞻性的风险管理方法。bob体育客户端下载

使用的砖建筑的现代化传统VaR计算。

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

  • 使用三角洲湖市场数据的统一视图
  • 利用MLflow作为模型的开发和部署的运载工具
  • 使用Apache引发大规模分发蒙特卡罗模拟

能够有效地分割成你的蒙特卡罗模拟为了有一个更灵活和前瞻性的风险管理方法将在第二个博客,更侧重于风险分析师角色。

现代化与三角洲湖数据管理

随着大数据和云计算技术的兴起,它的风景已经大大改变了过去十年。然而,大多数FSIs仍然依赖于主机和运作数据库等核心业务风险的VaR计算和移动只有一些下游过程的现代数据湖泊和云基础设施。结果,银行落后技术曲线及其当前的风险管理实践已不再满足现代经济。现代化风险管理开始于数据。具体地说,通过将镜片的数据是:不是成本,而是作为一种资产。

老方法:当数据被认为是一个成本FSIs的限制风险分析师的能力探索“如果”场景和限制他们的聚合数据竖井只满足预定义的风险策略。随着时间的推移,维护竖井的刚性导致工程师分支新流程和创建新的聚合视图已经脆弱的工作流程的基础上,为了适应不断变化的需求。矛盾的是,不断努力保持数据作为一个低成本商品本地导致生态系统更加脆弱,因此更昂贵的维护。失败的流程(注释如下X符号)有太多的下游影响为了保证数据的及时性和可靠性。因此,盘中(可靠的)视图市场风险日益复杂和成本高昂的实现给出如下的系统化和相互依赖的所有移动组件图。
传统的风险管理方法,优先考虑保存数据成本较低,地方金融风险管理者处于劣势。

现代的方法:当数据被认为是一种资产,组织接受的多功能特性数据,提供多个用例(如风险价值和预期缺口),使各种特别的分析(如理解风险暴露在一个特定的国家)。风险分析师不再局限于一个狭窄的风险,可以采用更敏捷的风险管理方法。通过统一的流和批ETL,确保酸合规和模式的实施,三角洲湖使性能和可靠性数据湖,逐渐增加的质量和相关性数据通过青铜,白银和黄金之间的鸿沟层和操作流程和分析数据。

现代金融风险管理方法强调增加数据的质量和相关性之间的鸿沟和操作流程和分析数据。

在这个演示中,我们评估各种投资的风险水平在拉美股票投资组合由40仪器跨多个行业,将所有返回存储在一个集中的三角洲湖表,将推动我们所有的风险价值计算(第2部分覆盖在我们的演示)。

样本的风险投资组合各种拉丁美洲的仪器。

这个演示的目的,我们从雅虎财经访问每日近价格使用python yfinance图书馆。在现实生活中,一个可能获取市场数据直接从源系统(如变化数据捕获从大型机)三角洲湖表,将原始信息存储在青铜和策划/银表,验证数据在实时。

三角洲湖上我们的核心数据,我们使用一个简单的窗口函数来计算每天的日志返回和输出结果返回给黄金表准备风险建模和分析。

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

在下面的示例中,我们将展示一种特定的投资担保的数据(Grupo AVAL accion y英勇s.a.),一个金融服务公司的操作在哥伦比亚。鉴于其股价下跌预期发布2020年3月,我们可以评估其影响整体风险的投资组合。

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

发展与MLFlow简化模型

虽然不是一个新概念,定量分析近期数据科学与数据量的爆炸式增长发现了主要银行的运作方式的低效率模型。没有行业标准,数据科学家经常操作在最大的努力的基础上。这通常意味着训练模型对数据样本单节点和手动跟踪模型在整个开发过程,导致发布周期长(可能需要6到12个月之间提供一个模型生产)。长模型开发周期阻碍的能力让他们快速适应新兴威胁和动态减少相关的风险。FSIs的脸在这个范式的主要挑战是减少模型开发到生产时间没有这样做的治理法规或导致数据科学的生态系统更加脆弱。

MLflow是事实上的标准来管理机器学习模型发展生命周期将不变性和透明度,但并不局限于人工智能。银行的定义模型通常是相当广泛的,包括任何金融从Excel宏模型基于规则的系统或先进的机器学习,他们将使中央模型提供的注册表内MLflow砖统一数据分析平台。bob体育客户端下载

复制模型开发

在这个例子中,我们要培养一个新的模型,预测股票收益给市场指标(如标准普尔500指数、原油和美国国债)。我们可以检索的数据,以确保完整的模型再现性和审计合规。这种能力的三角洲湖是通常被称为“时间旅行”。由此产生的数据集将保持一致的所有实验,可以访问现有用于审计。

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

为了选择合适的特征模型,定量分析师经常火花和导航熊猫dataframes。我们这里显示如何从pyspark python环境以提取我们的市场因素的相关性。砖互动的笔记本内置的数据可视化和也完全支持使用Matplotlib seaborn(或ggplot2 R)。

factor_returns_pd=factor_returns_df.toPandas ()factor_corr=factor_returns_pd。相关系数(方法=“枪兵”,min_periods=12)

样本variance-covariance表由砖互动生成的笔记本,证明其有效性和严格在构建其预测风险模型。

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

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

并行训练模型

随着仪器在我们的投资组合的数量增加,我们可能想要训练并行模型。这可以通过一个简单的熊猫UDF函数如下。为了方便(模型可能在现实生活中更复杂的),我们想训练一个简单的线性回归模型和聚合所有模型系数n x m矩阵工具的数量(n和m的数量特性来源于我们的市场因素)。

模式= 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 [“股票”)=集团(0]返回w_dfmodels_df = x_train.groupBy (“股票”苹果(train_model) .toPandas ()

由此产生的数据集(重量为每个模型)可以很容易地收集回记忆和记录到MLflow作为我们的模型候选人的实验。在下面的图,我们报告的预测与实际股票为哥伦比亚S.A.返回来自我们的模型,哥伦比亚的石油和天然气生产商。

样本模型输出可视化保留MLflow以及实验中,其修订,和底层数据,提供完整的透明度、可追溯性和上下文。

我们现在的实验是存储在MLflow与所有证据都需要一个独立的验证单位(IVU)提交可能你的一部分风险管理模型框架。是关键,这个实验不仅与我们的笔记本,但确切的修订,将独立专家和监管机构的全面跟踪我们的模型以及模型验证所需的所有必要的上下文。

蒙特卡罗模拟在规模与Apache火花

风险价值是模拟随机漫步的过程,涉及可能的结果以及最坏情况(n)场景。风险价值95% (t)天是最好的情况最差的5%试验。因此我们要产生足够的模拟覆盖一系列可能的结果给出一个90天的历史市场波动观察所有仪器在我们的投资组合。鉴于模拟每个仪器所需的数量,这个系统必须设计具有高度的并行性,使风险价值完美的工作负载在基于云的环境中执行。风险管理是首要原因今天的顶级银行评估云计算分析并加速通过砖运行时的值。

创建一个多元分布

同时行业建议20到30之间产生成千上万的模拟,混合组合的主要计算风险价值的复杂性并不是衡量个人资产的回报,但它们之间的相关性。在组合层面,市场指标可以在本机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,种子):np.random。种子(年代eed = seed)返回np.random。multivariate_normal (f_ret_avg f_ret_cov)

产生一致的和独立的大规模临床试验

另一个模拟的复杂性风险价值是通过精心修复随机数来避免自相关使用的“种子”。我们希望每个审判独立虽然一致工具(为每个模拟市场环境是相同的位置)。参见下面的一个例子创建一组独立的和一致的审判——运行相同的块会导致两次相同的一组向量生成的市场。

seed_init =42种子= [seed_init + xxnp.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)试验。鉴于100000年蒙特卡洛模拟,50执行人的并行性和10个工具在我们的投资组合,每个执行器将运行20000仪器返回。

#修复我们的最初的种子今天的实验trial_date=datetime.strptime (“2020-05-01”,' % Y - % - % d ')seed_init=int(trial_date.timestamp ())#创建我们的种子策略遗嘱执行人种子=[[seed_init+x, x%并行性)xnp.arange (0,运行)seed_pdf=pd.DataFrame(数据=种子,列=(“种子”,“执行人”])seed_sdf=spark.createDataFrame seed_pdf .repartition(并行性,“执行人”)#评估缓存实现策略seed_sdf.cache ()seed_sdf。()

我们组的种子,每个执行者和生成试验模型通过使用熊猫UDF。请注意,可能有多种方式来达到相同的,但这种方法的好处完全控制水平的并行性,以确保没有热点发生和执行人将闲置等待其他任务完成。

@pandas_udf (股票代码字符串,种子int,审判浮动,PandasUDFType.GROUPED_MAP)defrun_trials(pdf):#获取我们的广播市场波动模型和90天模型= model_dict.valuef_ret_avg = f_ret_avg_B.valuef_ret_cov = f_ret_cov_B.value
              试验= []种子np.array (pdf.seed):market_features = simulate_market (f_ret_avg f_ret_cov、种子)股票行情自动收录器、模型models_dict.items ():审判= model.predict (market_features)试用追加((股票、种子、试验))返回pd。DataFrame(试验、列= (“股票”,“种子”,“审判”])#并行执行蒙特卡洛mc_df = seed_sdf.groupBy (“执行人”苹果(run_trials)

白天我们追加试验分区到三角洲湖表这样,分析师可以很容易地访问一天的模拟和组个人返回由审判Id(即种子)为了访问每日收益分配模式及其各自的风险价值。

白天用试验样本三角洲湖表分区已附加到促进风险分析师的评论。

对原来的数据成为核心资产的定义(如反对作为成本),我们存储所有试验富含组合分类法(如行业类型和操作的国家),使一个更全面的和按需面临的风险投资策略的看法。这些概念的切割风险价值数据高效、轻松地(通过使用SQL)将在我们的博客第2部分,集中更多的对风险分析师角色。

开始使用现代VaR方法和风险管理

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

看看第2部分本系列的。

今天试试下面的砖!如果你想学习如何统一数据分析可以使数据科学、业务分析和工程一起加速您的数据和ML的努力,看看按需车间-统一的数据管道、业务分析和机器学习与Apache引发™

VaR和风险管理笔记本:

养成用笔记本

联系我们更多地BOB低频彩了解我们如何帮助客户与市场风险的用例。

免费试着砖

相关的帖子

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