实时计算基金估值和风险指标的方法、装置及可读介质
技术领域
本发明涉及金融产品估值与风险评估领域,具体的说,是涉及一种实时计算基金估值和风险指标的方法、装置及可读介质。
背景技术
随着社会经济的发展,现代信息技术的提高,互联网技术呈现高速发展的态势,对人们的日常生活产生深远的影响。各行业开始将业务逐渐渗透到网络上,在改变人们消费观念的同时,更是将发展眼光深入到金融理财领域。现代化的互联网技术被广泛地应用到金融市场,并使用网络搜索引擎、社交网站、在线支付以及云计算等多样化的发展方式,将金融市场对资源配置的优化作用进行了积极的发挥,利用互联网进行理财便成为一种普遍的现象。互联网理财运作模式逐渐建立,而金融产品作为一种日常理财途径,更以其完善的互联网基金商业运作模式,适应经济市场的同时,不断发展。
人们投资金融产品,必然面临着资产的估值问题,即根据相关规定对资产和负债按一定的价格进行评估与计算,进而确定资产净值与单位资产净值的过程。但就我国现有的金融行业法律的制定来看,还缺乏健全的法律体系,金融产品的发展还存在着很大的风险,不仅存在着金融产品本身的市场风险、道德风险以及流动性风险以外,还存在着互联网发展所带来的信息技术风险以及安全风险等。在新的发展形势下,无论作为投资者还是金融产品发行者都应当在对风险进行分析和认识的前提下,对风险进行积极的规避,在此基础上,实现投资者、第三方支付机构以及基金的可持续发展,为互联网金融产品的发展提供强有力的法律保障和规制,实现金融产品效益的最大发挥。
在这个大环境的背景下,业务量的增加和规模的不断壮大,使资产管理公司如雨后春笋般不断发展起来,同时行业竞争也如火如荼的进行当中。作为证券资产管理公司的核心业务系统,从运营部门开始到投资部门甚至到决策领域的部门都开始对高可用、稳定安全的证券估值、风险控制系统进行严格的要求,使之能保障业务的顺利展开。
随着互联网飞速发展,企业数据越来越庞大,应用对性能要求也越来越高。单机关系型数据库对大批量数据的处理存在一定的局限性。在当前的硬件条件下,主流数据库可以支持单表千万级数据量的存储,但是难以支撑密集的并发读写,存在性能瓶颈。在面对海量数据时,单机计算对系统的压力较大,同时计算时间也大大增加,通过增加硬件规格来提升并发性能的成本太高,且能到达的性能高度有限。如果采用分区表方案,数据不能跨实例存储,扩展性和维护性较差。采用分库方案,客户端需要自行管理各库连接,数据库连接管理和升级复杂,扩容迁移困难。而基于Oracle等类型的关系型数据库对基金进行估值,计算需要串行逐条计算基金中的每笔持仓数据,这种计算方式耗时且低效。
同时,基于Oracle类型的数据库的风控系统普遍存在风控规则覆盖不全面,大量风控条款需人工控制,风控计算缓慢耗时,盘中无法实时监控,风控需求响应缓慢,无法快速支持快速扩展等问题,且目前风控系统主要依赖交易系统,缺乏独立风控系统。
发明内容
为了克服现有的技术的不足,本发明提供一种实时计算基金估值和风险指标的方法、装置及可读介质,以解决关系型数据库对硬件依赖性强、扩展能力有限、数据量增大后扩容困难、数据库响应变慢等难题,通过分布式集群架构方案实现“平滑扩容”,扩容过程中保持业务不中断。
本发明技术方案如下所述:
第一方面,本发明提供一种实时计算基金估值和风险指标的方法,包括:
步骤S1、获取交易系统的数据源,建立计算数据模型;
步骤S2、根据业务对所述数据源进行分组加载;
步骤S3、对分组加载的数据进行并行计算;
步骤S4、将并行计算的结果进行聚合汇总;
步骤S5、根据业务场景生成估值结果集或者风控结果集。
根据上述方案的本发明,所述计算数据模型包括贴源层、明细宽表层、分类聚合层及组合聚合宽表层;
所述数据源存放于所述贴源层中,所述贴源层的数据存放于内存存储框架中;
所述数据源根据表功能分四类,分为基础设置类、行情资讯类、业务数据类及系统配置类。
进一步的,在步骤S2中,包括:
步骤S21、通过线程池启动多个线程读取所述内存存储框架的数据,所述线程池启动的线程个数与所述数据源分类的个数相同;
步骤S22、所述线程池启动的线程处理读取完所述内存存储框架的数据后,进行Dataset并行转换。
进一步的,在步骤S21中,所述线程池启动的线程采用事物方式读取所述内存存储框架中所述业务数据类的数据。
进一步的,在步骤S3中,包括:
步骤S31、通过数据采集层将Dataset并行转换后的数据发送到分布式数据流框架中;
步骤S32、通过实时计算框架每隔一段时间对所述分布式数据流框架的数据进行计算,并通过批次号区分每批次的数据;
步骤S33、根据计算结果生成第一维度表和第二维度表;
步骤S34、根据所述第一维度表和所述第二维度表聚合生成轻度聚合数据;
其中,所述第一维度表和所述第二维度表存放于所述明细宽表层,所述轻度聚合数据存放于所述分类聚合层。
更进一步的,在步骤S31中,所述实时计算框架计算时,按照业务类型通过所述线程池启动多个线程并行执行,所述线程池启动的线程个数与所述业务类型数相同;
所述业务类型包括股票类、债券类、资产信息类、现金类、其他类、基金类、期货类、回购类及期权类,所述第一维度表不包含换资产信息类的数据。
更进一步的,在步骤S4中,通过实时流式计算框架将所述分类聚合层的数据汇总到所述组合聚合宽表层中。
更进一步的,在步骤S5中,通过所述实时计算框架对所述明细宽表层和所述分类聚合层的数据进行批式并行计算后,得到所述估值结果集;
通过所述实时流式计算框架对所述明细宽表层和所述组合聚合宽表层的数据进行流式并行计算后,得到所述风控结果集。
第二方面,本发明提供一种计算装置,包括:
至少一个处理器;以及
与所述至少一个处理器通信连接的存储器;其中,
所述存储器存储有可被所述至少一个处理器执行的指令,所述指令被所述至少一个处理器执行,以使所述至少一个处理器能够执行上述的实时计算基金估值和风险指标的方法。
第三方面,本发明提供一种计算机可读介质,存储有计算机可执行指令,所述计算机可执行指令用于执行上述的实时计算基金估值和风险指标的方法。
根据上述方案的本发明,本发明的有益效果在于:
1、本发明利用分布式大数据框架,可以轻松实现数据的并行计算,且基于分布式计算机系统可以里利用多台计算机的计算能力,使得比单机系统有更快的处理速度;
2、本发明采用按照不同分组,一次性把数据全部加载的方式实现数据读取的过程,对数据分组并行处理,针对复杂计算逻辑,完全基于内存计算,减少磁盘IO次数,减轻系统负载同时提升效率;
3、从业务上讲,本发明利用大数据框架整合了资产管理的估值和风险监控,是一种金融技术支持平台的创新;从技术上来讲,系统对业务模块进行抽取,通过数据统一,各个模块之间业务独立,最大限度上利用了系统各个模块的功能,节约了开发时间和人力成本;通过对模块中业务逻辑和技术的剥离,利用可配置的系统需求,可以轻松的增加新的业务,降低开发成本和系统开发周期,达到快速响应的目的;
4、本发明基于统一数据源格式,可以实现轻松的增加一个新的数据来源,而不需要修改系统的计算模块,同时计算模式从单机扩展为集群,支持通过增加硬件投入提升系统容量;保证数据量增加时,系统的保持相同时间内返回结果,不仅提升了计算的效率,更扩大了数据处理的容量和规模。
附图说明
图1为本发明实施例的方法流程图;
图2为本发明实施例的数据计算逻辑框图;
图3为本发明实施例计算数据模型的示意图。
具体实施方式
下面结合附图以及实施方式对本发明进行进一步的描述:
请参阅图1,为本发明实施例提供的一种实时计算基金估值和风险指标的方法流程图。
如图1所示,该方法包括:
步骤S1、获取交易系统的数据源,建立计算数据模型。其中,数据源包括交易系统的持仓、交易、指令等数据,计算数据模型包括L0:贴源层、L1:明细宽表层、L2:分类聚合层及L3:组合聚合宽表层。数据源存放于贴源层中,贴源层的数据存放于内存存储框架中。本实施例的内存存储框架采用基于内存的Redis内存存储框架。
步骤S2、根据业务对数据源进行分组加载。其中,数据源根据表功能分四类,分为基础设置类、行情资讯类、业务数据类及系统配置类。
具体的,在步骤S2中,包括:步骤S21、通过线程池(Executors)启动多个线程读取Redis内存存储框架的数据,线程池启动的线程个数与数据源分类的个数相同,同时可使用Count Down Latch多线程控制工具控制线程的读取,保证数据源全部加载完成后再进行后续流程处理。其中,线程池启动的线程采用事物方式读取Redis内存存储框架中业务数据类的数据,一次性读取多个表数据不受其他客户端的干扰,保证数据的一致性。
步骤S22、线程池启动的线程处理读取完Redis内存存储框架的数据后,进行Dataset并行转换,供后续计算使用。
步骤S3、对分组加载的数据进行并行计算。具体的,在步骤S3中,包括:
步骤S31、通过数据采集层将Dataset并行转换后的数据发送到分布式数据流框架中(或者使用 Flume框架采集HDFS或者Mysql的数据到分布式数据流框架中)。本实施例的分布式数据流框架采用Kafka分布式数据流框架和批量加载Redis内存存储框架的数据。
步骤S32、通过实时计算框架每隔一段时间对分布式数据流框架的数据进行计算,并通过批次号batch_number区分每批次的数据。本实施例的实时计算框架采用SparkStreaming实时计算框架,Spark Streaming实时计算框架可以基于某一段时间的分布式数据流框架的数据,采用RDD相关操作文成业务的计算需求,继而将结果输出到下一层,供后续Flink实时流式计算框架对数据进行汇总。
其中,Spark Streaming实时计算框架计算时,按照业务类型通过线程池(Executors)启动多个线程并行执行,线程池启动的线程个数与业务类型数相同。业务类型包括股票类、债券类、资产信息类、现金类、其他类、基金类、期货类、回购类及期权类9类业务。
步骤S33、根据计算结果生成第一维度表和第二维度表。其中,第一维度表不包含换资产信息类的数据。
步骤S34、根据第一维度表和第二维度表聚合生成轻度聚合数据。其中,第一维度表和第二维度表存放于明细宽表层,轻度聚合数据存放于分类聚合层。
步骤S4、将并行计算的结果进行聚合汇总。具体的,由Flink实时流式计算框架订阅Kafka分布式数据流框架中对应计算之后的分类聚合层的数据,实时汇总到组合聚合宽表层中。汇总计算模式为实时读取分类汇总表中的数据,按照日期、产品序号、批次号分批次,针对持仓类数据的总资产、净资产、总负债、单位净值进行汇总,将汇总的结果写入Kafka分布式数据流框架中。
Flink实时流式计算框架是基于内存的实时流式计算框架,优点:吞吐量大,延迟低,同时满足流与批的数据处理,能基于时间维度和数据量进行批次处理,能从多种数据源中实时读取数据进行实时计算,因此风控计算基于Flink、Redis、Kafka等框架,可以构建一个稳定的、可容错的实时流式应用,并可结合Data Stream、Table、SqlAPI进行实时的数据汇总和风控结果处理。
步骤S5、根据业务场景生成估值结果集或者风控结果集。其中,通过实时计算框架对明细宽表层和分类聚合层的数据进行批式并行计算后,得到估值结果集;通过实时流式计算框架对明细宽表层和组合聚合宽表层的数据进行流式并行计算后,得到风控结果集。
对于风控结果集的计算,具体的由Flink实时流式计算框架订阅Kafka分布式数据流框架对应的topic,实时读取明细宽表层、组合聚合宽表层的数据,基于数据的批次号batch_number进行聚合,生成基于内存的宽表。将流处理转换成批处理,对一批次的全量数据执行风控规则解析SQL,将执行的结果写入到Kafka分布式数据流框架。应用层可根据Kafka分布式数据流框架中返回的计算结果判断触警情况,供风控监控展示,并根据规则ID查询对应明细数据。
请参阅图2,为本发明实施例一种实时计算基金估值风险指标的数据计算逻辑图。如图2所示,该数据计算逻辑包括:
1、实时处理:由通过数据采集层将Dataset并行转换后的数据发送到Kafka分布式数据流框架中(或者使用 Flume框架采集HDFS或者Mysql的数据到Kafka分布式数据流框架中),然后Spark Streaming实时计算框架可以基于某一段时间的分布式数据流框架的数据,采用RDD相关操作文成业务的计算需求,继而将结果输出到下一层,供后续Flink实时流式计算框架对数据进行汇总。
2、离线处理:由于Spark框架基于内存的计算方式,可以将离线数据存储到HDFS中,由Spark框架读取该文件,然后做相关计算。此方法可以达到比 Map Reduce框架更快的计算速度,继而降低离线计算的时间。
3、将业务系统或其他计算程序所产生的业务数据在进程启动时批量加载到Redis内存存储框架中。为了降低网络传输,批量写入之后,如果有业务数据的变更,采用实时更新方式。覆盖原数据,增加数据处理速度。数据采用HASH格式存储,数据更新时直接覆盖key中的value数据,并采用protobuf压缩的方式,降低数据容量,减少Redis内存存储框架的内存压力,增加数据的网络传输速度,进而增强系统的稳定性。
4、Spark Streaming实时计算框架的数据处理层读取Redis内存存储框架和Kafka分布式数据流框架的数据,并采用Hadoop 集群的Yarn模式计算。在DirectStreaming中,启动多个Job并行读取Redis内存存储框架中的数据,具体分为四个Job,分别读取基础设置、行情资讯、业务数据、系统配置。其中,业务数据采用事务方式读取,保证数据的一致性。
5、读取Redis内存存储框架数据时设置倒计时锁,当数据全部读取完成才能进入下一步计算逻辑。在读取过程中对数据进行转换操作,步骤如下:1)将某个表中所有数据读取到List中;2)将该 List数据转换成JavaRDD,此时数据类型为byte[]形式;3)将JavaRDD采用mapPartitions算子,对每条数据进行protobuf转化,并使用JsonUtil将每条数据转换成对应的Object,并存储到JavaRDD中;4)使用sparkSession将JavaRDD转换成DataSet<Row>并注册临时表,供后续计算使用;5)使用Spark算子或者TableAPI进行相应的计算,将结果写入到Kafka分布式数据流框架中,等待下一轮计算开始。
6、Kafka分布式数据流框架基于Spark框架实时计算结果汇总结果数据,生成风控宽表。具体为,使用明细宽表层数据,按照各风控类别生成不同的风控宽表,并根据前端页面配置生成规则解析SQL,由Flink实时流式计算框架执行规则SQL,将结果写出到Kafka分布式数据流框架和Mysql中。
请参阅图3,为本发明实施例计算数据模型的示意图。如图3所示,在该计算数据模型中:
L0-L1:将交易系统多张表的交易数据归纳至L1一张表里存为多条记录。
L1-L2:将明细数据汇总成产品层。如由单个组合的单个券市值,汇总成产品层股票资产等。
L2-L3:产品层多类资产汇总,如:产品净值、总资产。
本发明的有益效果在于:
1、本发明利用分布式大数据框架,可以轻松实现数据的并行计算,且基于分布式计算机系统可以里利用多台计算机的计算能力,使得比单机系统有更快的处理速度;
2、本发明采用按照不同分组,一次性把数据全部加载的方式实现数据读取的过程,对数据分组并行处理,针对复杂计算逻辑,完全基于内存计算,减少磁盘IO次数,减轻系统负载同时提升效率;
3、从业务上讲,本发明利用大数据框架整合了资产管理的估值和风险监控,是一种金融技术支持平台的创新;从技术上来讲,系统对业务模块进行抽取,通过数据统一,各个模块之间业务独立,最大限度上利用了系统各个模块的功能,节约了开发时间和人力成本;通过对模块中业务逻辑和技术的剥离,利用可配置的系统需求,可以轻松的增加新的业务,降低开发成本和系统开发周期,达到快速响应的目的;
4、本发明基于统一数据源格式,可以实现轻松的增加一个新的数据来源,而不需要修改系统的计算模块,同时计算模式从单机扩展为集群,支持通过增加硬件投入提升系统容量;保证数据量增加时,系统的保持相同时间内返回结果,不仅提升了计算的效率,更扩大了数据处理的容量和规模。
所属技术领域的技术人员能够理解,本发明的各个方面可以实现为系统、方法或程序产品。因此,本发明的各个方面可以具体实现为以下形式,即:完全的硬件实施方式、完全的软件实施方式(包括固件、微代码等),或硬件和软件方面结合的实施方式,这里可以统称为“电路”、“模块”或“系统”。
根据本实施例的模块、子模块、单元、子单元中的任意多个、或其中任意多个的至少部分功能可以在一个模块中实现。根据本实施例的模块、子模块、单元、子单元中的任意一个或多个可以被拆分成多个模块来实现。根据本实施例的模块、子模块、单元、子单元中的任意一个或多个可以至少被部分地实现为硬件电路,例如现场可编程门阵列(FPGA)、可编程逻辑阵列(PLA)、片上系统、基板上的系统、封装上的系统、专用集成电路(ASIC),或可以通过对电路进行集成或封装的任何其他的合理方式的硬件或固件来实现,或以软件、硬件以及固件三种实现方式中任意一种或以其中任意几种的适当组合来实现。或者,根据本实施例的模块、子模块、单元、子单元中的一个或多个可以至少被部分地实现为计算机程序模块,当该计算机程序模块被运行时,可以执行相应的功能。
在一些可能的实施方式中,本发明提供一种计算装置可以包括至少一个处理单元、以及至少一个存储单元。其中,存储单元存储有程序代码,当程序代码被处理单元执行时,使得处理单元执行本说明书上述描述的根据本发明各种示例性实施方式的实时计算基金估值和风险指标的方法中的步骤。例如,处理单元可以执行如图1所示的步骤S1~S5中实时计算基金估值和风险指标的的流程。
在一些可能的实施方式中,本发明提供一种计算机可读介质,该存储有计算机可执行指令,计算机可执行指令用于执行本说明书上述描述的根据本发明各种示例性实施方式的实时计算基金估值和风险指标的方法中的步骤。
可读介质可以是可读信号介质或者可读存储介质。可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。可读信号介质可以包括在基带中或者作为载波一部分传播的数据信号,其中承载了可读程序代码。可读信号介质还可以是可读存储介质以外的任何可读介质,该可读介质可以发送、传播或者传输用于由指令执行系统、装置或者器件使用或者与其结合使用的程序。可读介质上包含的程序代码可以用任何适当的介质传输,包括——但不限于——无线、有线、光缆、RF等等,或者上述的任意合适的组合。
此外,尽管在附图中以特定顺序描述了本发明方法的操作,但是,这并非要求或者暗示必须按照该特定顺序来执行这些操作,或是必须执行全部所示的操作才能实现期望的结果。附加地或备选地,可以省略某些步骤,将多个步骤合并为一个步骤执行,和/或将一个步骤分解为多个步骤执行。
应当理解的是,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,而所有这些改进和变换都应属于本发明所附权利要求的保护范围。
上面结合附图对本发明专利进行了示例性的描述,显然本发明专利的实现并不受上述方式的限制,只要采用了本发明专利的方法构思和技术方案进行的各种改进,或未经改进将本发明专利的构思和技术方案直接应用于其它场合的,均在本发明的保护范围内。