暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【交易技术前沿】基于列式存储和交互式数据分析的风险管理平台建设实践

上交所技术服务 2021-11-10
870

本文选自《交易技术前沿》总第四十五期文章(2021年6月)

光大理财有限责任公司

潘聪、杨光

panc.ew@cebwm.com


2019年9月光大理财有限责任公司作为首个股份制银行理财子公司获批开业。理财资管业务进入子公司经营阶段后,随着具有不同策略理财产品的推出,涉及到的交易市场、交易品种、交易体量不断增多,需要建设风险系统将公司的各项资产整合纳入其中,使得管理层能够从统一的视角进行风险控制;使得执行部门能够更加精确地评估投资绩效和控制投资风险,以达到“风险集中管理”的目标。搭建涵盖市场风险、信用风险、流动性风险和压力测试的一体化风险系统架构,系统能够通过灵活的风险指标配置,达到动态预警,同时依据绩效归因结果分析调整组合策略、优化组合持仓,减少不必要的风险敞口,获取更多的超额收益。
一、风险系统简介
依托光大理财企业架构和技术栈自主研发风险计量引擎,通过智能化的指标分组计算、自动调度次序,可以实现VaR、久期、Greeks等1000余个风险指标的计量,计量范围覆盖权益类、固收类等全部产品类别;可根据报表和前端功能自动配置所需数据、数据聚合和展现形式,实现应用快速响应。
风险数据集市作为企业级数据仓库的首次搭建与应用,接入了包括客户信息、交易信息、估值信息和资讯信息等100余张表、共8000多个字段,累积数据超过500G。如发现仍有部分数据未纳入,可通过数据管理系统操作界面便捷地扩展补充。每个风险模型的知识和经验以卡片式积累,按照统一规范、命名规则通过Jupyter Lab存储,模型代码与文档实时保持一致,方便业务人员和技术通过可视化编辑器搭建和优化模型实现。
二、系统架构设计
2.1功能架构

1)限额管理:通过限额监控模块,可随时灵活添加各种监控指标,包括合规性监控指标集和根据投资组合类型划分设置的监控指标子集。
2)组合管理:可维护投资组合的业绩比较基准,支持市场指数、市场利率和多样复合指数。可查询组合资产的配置情况,盈亏情况,交易数量和金额数据等。
3)组合风险:针对组合中不同资产类别,从市场风险、流动性风险、利率风险、信用风险等方面进行风险分析与控制,根据用户定义的不同维度对绝对风险/相对风险在任意时间段内进行计算和分解。主要包括VaR分析、波动率分析、Beta分析、利率敏感性分析、流动性分析、情景分析等。
4)组合绩效:从收益分析、业绩归因、风险调整收益、业绩持续性以及多组合横向对比等多个方面来对组合的绩效做出量化分析。
5)压力测试:根据监管要求,提供银行理财压力测试报表计算,并保存测试结果。
6)风控报告:可满足业务人员所需要的各类报告,支持人工自动配置报告栏目和内容模块,自动生成报表。
2.2系统架构

业务系统为风险管理系统提供源数据,从估值系统获取持仓等组合和资产数据;从资管系统获取组合和产品等基本信息;从TA系统获取销售数据;从资讯系统获取市场行情数据、资讯数据等基本信息;从信评系统获取内部评级数据。
风险计量引擎实现各类风险的加总计量和限额计算,引用数据集市基础层数据,进行指标计量,并将计量结果返回至集市指标层和风险管理系统。
风险数据集市作为基础数据整合平台,统一多数据源,共用一套基础数据,支持跨风险计量。作为核心功能之一包括数据管理模块和指标管理模块,数据管理模块包括源数据确认(表与字段)、数据模型定义,数据校验、数据质量修正等;指标管理模块包括指标模型管理、指标分类体系、指标间血缘关系追溯、指标计算逻辑与计算中间结果展示,指标逻辑与代码同步。
风险管理系统是基于风险计量引擎和风险数据集市的上层应用,目标是建立跨市场、跨品种、一体化的风险管理平台,实现公司一站式事后风险管理。
2.3技术架构

在应用层面采用前后端分离技术,数据库设计了ClickHouse - MySQL读写分离方案。
前端架构包括VUE框架,AntDesign界面组件库。
后端架构分为Spring Cloud微服务和Python金融微服务;前者提供基础应用功能,后者负责动态指标计算。
批处理任务组分为负责静态指标计算的Python金融指标计算引擎,负责限额计算的Java Spring Batch批处理任务和,负责外部数据导入ETL。金融模型使用Python微服务及二次封装Jupyter Lab,实现金融模型在线开发、指标血缘管理、指标算法卡片和金融模型在线发布。
2.4数据架构
风险数据集市整体分成基础层和指标层两结构。基础层分为估值数据、资产数据、市场数据、组合数据、交易数据等5个主题数据,基础层模型基于证券期货行业数据模型进行设计,根据银行理财子公司的特点对模型进行了改造,适用于银行理财风险管理的需求,同时具备较强的可扩展性,目前涵盖100多张表,7000多个字段。指标层基于基础层数据做金融指标计算,包括计算、统计、算法模型等加工形式,形成业务直接可用的指标数据,使用纯函数方式按需实时计算,一般情况下并不保存于数据库,除内外部的留痕要求外。
三、交互式数据分析

系统提供的实时交互式数据分析通过金融风险指标库和自助数据服务来实现。

3.1. 金融风险指标库

3.1.1. 指标库管理

金融指标库是金融指标的载体, 作为金融指标的逻辑组合, 与指标的物理存储结构无关。指标类型包括动态指标和静态指标,静态指标是指通过ET或批处理任务对指标进行计算,并写入数据集市供前台系统使用的指标。动态指标是指在系统或API服务对象发出请求后实时进行计算,并返回结果的指标。所有动态指标均由Jupyter实现计算逻辑,对外提供服务。金融指标库分成 6大类,29小类。

3.1.2. 指标管理

按照性质及生成方式的不同,金融指标分成事实维度类、查询计算类、统计计算类、模型计算类4种。
指标分类

实现方法

技术工具

指标举例

查询计算类

数据库查询统计为主,辅助基础数学运算

Python库:Pandas, Numpy, Math等

市值占资产净值比例、当日净现金流入

统计计算类

在基础数学运算的基础上需要进行回归、概率、相关性等统计计算

Python库:SciPy,StatsModels,Pandas,Numpy, Math等

Beta系数、Sharpe比例

模型计算类

金融模型计算指标

Campisi,Brinson,TM等模型

归因相关指标

其中事实维度类为静态金融指标;查询计算类、统计计算类和模型计算类为动态金融指标,使用Jupyter Lab进行开发,将Jupyter Lab嵌入风险应用系统,通过算法编辑功能可直接跳转到Jupyter Lab中修改代码,所见即所得;通过审批后才可以发布使用。指标算法可以存档,并可使用版本控制回溯。使用Jupyter Lab的开发方式简要描述如下:

3.1.3  指标血缘分析

指标间互相依赖,存在复杂的血缘关系,关系的精准表达及存储是进行及时准确指标计算的基础,从而增加指标结果的可回溯性。无指标血缘依赖关系则只能通过批量更新全部指标,无法支持细粒度及时调度和重计算。
如下图所示:“个券选择收益率”由“收益率”、“行业占基准权重”和“基准收益率”三个业绩归因类指标计算测出。“组合收益贡献率”等6个组合持仓信息指标由“交易金额”等来自组合估值信息和投资交易基本信息计算得出。

血缘分析分为两部分:1) ETL把数据从外部数据源抽取导入到风险数据集市,通过解析ETL SQL,获得SQL的数据逻辑,从而得到指标和基础层的表和字段的关系。2) 金融模型计算指标通过Python开发模板(如下图所示)上定义了每个指标的说明、算法、以及输入和输出。Jupyter引擎解析之后实现生成文档、算法卡片以及血缘关系等。

3.1.4  指标计算引擎

由于Jupyter Lab具有交互性好,易于探索式开发和热部署等优点,从而方便业务人员、需求分析人员和开发人员协同进行指标研发、测试及后期维护。如下图所示,每个Jupyter Lab脚本由四块主要内容组成:
1.  指标介绍和描述
2.  指标的来源表/字段
3.  指标的算法描述
4.  指标的具体代码实现

3.2自助数据服务

任何系统的功能和报表数量都是有限的,而风险前台应用的特点确要求对数据进行无限探索,固定的功能和报表不能满足风险前台应用对数据多样化的需求,在应用层面亟需支持用户自定义数据提取、加工、呈现的需求。数据服务支持用户可选择在指标库中的任何指标,指标可以来自一个或多个指标分类,多个指标分类之间需要定义各自的映射字段,中间结果集将以Dataframe形式存在,在其基础上还可以定义排序规则,聚合和分组规则,以及筛选条件,最终结果以Json形式返回给前端应用或API调用端,使得数据定义和提取流程完全自助化。
四、数据处理和分析

整个数据处理和分析分为OLTP和OLAP两个流程:

风险管理系统的特点是需要从业务系统中快速读入大量数据,数据的读取次数远多于写入次数,支持用户进行任意维度的灵活探索,对数据做挖掘、分析,并生成报表,是一个对数据应用不断调整和持续优化的应用场景,是典型的OLAP应用。OLAP类业务更关注写入吞吐,数据一旦导入完成,基本上不做更新和删除操作,对事务需求较少。ClickHouse从OLAP场景需求出发,定制开发了一套全新的高效列式存储引擎;列式存储在分析场景下有着许多优良的特性,列式存储只需读取参与计算的列,IO cost较低;提供更高的压缩比缩短磁盘中读取数据耗时,且对系统缓存使用的效果较好;在数据导入时全部是顺序写,充分利用了磁盘的吞吐能力,有着优异的写入性能。另外ClickHouse在计算层实现了单机多核并行、分布式计算、向量化执行与SIMD指令等工作,将硬件能力用到极致,极大地提升查询速度。而OLTP类业务对于写入延时要求高,因此采取MYSQL作为事务型数据库搭配ClickHouse,实时从事务型数据库中进行数据同步的方案。

数据加载与处理任务通过任务调度系统集中管理,支持ETL、Python和Java等不同任务类型。通过定义任务组和任务的执行时间及优先级确定任务的调度次序。任务调度计划和执行结果以关系图的形式展现,任务执行失败将尝试预定义的重试策略并提供告警事件通知。通过ETL从上游系统通过文件形式加载数据,经过处理之后导入到数据集市;静态指标于T-1日终,Python从ClickHouse读取数据,经过算法模型的计算出指标结果后,存入MySQL数据库。ClickHouse挂载为 MySQL 的一个从库 ,借助于ClickHouse的MaterializeMySQL引擎,MySQL的数据变动通过解析binlog的过程,将数据同步至ClickHouse。MySQL和ClickHouse的数据同步是一个准实时的过程。在日间做报表查询分析过程中,只有读操作,或者有少量的数据修改操作,数据传输延迟性在毫秒级别。但是对于夜间的ETL抽数,每次有百万级别数据事务写入,这时可能会出现秒甚至分钟级别的延迟,因此在ETL结束后增加一个批处理任务监控ClickHouse是否已经完成了数据同步。
以下为数据写入MySQL的三个场景:

功能

延迟性

方案

ETL

一次性事务百万数据,秒/分钟级别

增加监控批,待完成数据同步,再运行Python静态指标计算

Python静态指标批处理

每次按照组合写入更新,毫秒级别

无需监控

日常配置

毫秒级别

无需监控

前台应用所需指标的源数据从ClickHouse读取,ClickHouse通过多线程执行SQL,列存储顺序IO等特性提供高性能的复杂多表连接SQL执行效率。用户查询的指标由动态指标和静态指标构成。动态指标使用Python从ClickHouse获取源数据,实时计算出指标结果。该类型指标主要是通过区间查询开始日和查询结束日参数输入,实时计算时序指标结果集。静态指标通过Python从ClickHouse直接获取已存在的指标数据。静态指标一般分成两类:1) 事实类指标: 如证券外部评级为AA,2)计算类指标:如该券前一天的市值,通过数量*价格,在T-1日的日终批处理已经过计算后存入数据库。该指标的结果和查询时间区间无关,只作用于某一天。Python把静态指标和动态指标合并成一个Data Frame数据集,根据查询时传入的聚合维度和聚合算法参数,对数据集进行聚合处理,以树形或者二维数据集结构的形式返回给应用系统。

五、系统性能

5.1日终任务

1)ETL任务组负责外部数据加载并处理,共183项任务,每天增量处理的数据量为4千万条,执行时间为47分钟。
2)Python金融指标计算任务组负责计算静态指标,共23项任务,执行时间为5分钟。
3)Java限额计算任务组负责监管、产品和内控限额计算,共68项任务,执行时间为14分钟。
5.2系统功能

系统功能

时间区间

业务参数

平均用时

压力测试

1

组合数量:79个;

情景:净值型情景

15.3

VaR分析

1

组合数量:86个;

展望天数:1天;

VaR方法:历史模拟法

1.81

Brinson归因

1

组合数量:5个;

业绩基准:上证50指数

行业分类:申万一级

1.05

Campisi归因

1

组合数量:52个;

13.62

六、总结与展望
风险系统首期建设了风险分析、绩效归因、风险因子库、压力测试、情景分析、流动性风险分析等功能模块,提供直观集中的产品净值、持仓、风险和绩效情况的分析和展示。从长期来看,实现搭建具备量化风险因子库、建立各类风险分析模型,便捷地进行多种压力测试和虚拟组合试算分析,为投资提供前瞻性的分析结果;全面使用自动化系统报表替代手工风险报表,不断优化对理财产品的风险收益进行归因分析。
风险系统是典型的数据消费系统,业务数据源数据质量不高,会极大地影响风险数据计量的及时性和准确性。针对数据质量管理,期待建立例行化的长效运营体系,搭建数据质量管理端到端的闭环管理机制,做到事前治理,事中控制,事后预警相结合,全面地提升数据质量;同时建立多维度的数据监控体系,使例行化运营体系能持续运转。
底层数据关联关系复杂,指标数量多且粒度细;目前系统仅支持多维度查询,在风险数据可视化方面仍需进一步完善。

参考资料
  1. 《证券期货业数据模型 第1部分:抽象模型设计方法》(JR/T 0176.1—2019)

  2. 《证券期货业数据分类分级指引》 (JRT 0158-2018)

  3. ClickHouseOfficial Tutorial

  4. Jupyter OfficialDocumentation

  5. 《ClickHouse在字节跳动的技术应用与实践》

  6. 《光大理财风险管理与绩效评估系统设计说明书》

  7. 《光大理财风险管理与绩效评估系统性能测试报告》


免责声明    

本公众号内容仅供参考。对任何因直接或间接使用本公众号内容而造成的损失,包括但不限于因有关内容不准确、不完整而导致的损失,本公众号不承担任何法律责任。如有问题请反馈至tech_support@sse.com.cn。 

--------------------------
上海证券交易所为证券公司、基金管理公司等市场参与者及相关行业机构提供交易技术支持与服务,包括日常交易技术支持、技术交流研讨、市场调查反馈、证券信息技术知识库、测试等服务。

文章转载自上交所技术服务,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论