“他们建议熟悉一个指标的计算,并且有两张带有积分和二阶导数的表”

这是对德意志银行技术中心的Anton Batiaev的采访。 我们将讨论金融数学家的工作,银行数据来自何处,如何处理和优化它们。 关于进入金融部门的复杂性,交易所交易以及对银行的普遍需求。



他们在银行中算什么以及如何算?


-请自我介绍:告诉我你是谁,你做什么。


我于今年1月初搬到了德意志银行技术中心,现在正在开发一个项目的服务器端,该项目考虑了世界各地许多不同交易者以及需要此数据的其他团队的各种金融工具风险。


该项目建立了相当广泛的基础架构,该基础架构使用了许多流行的标准框架,非关系型数据库,并在Kafka上处理了大数据。 我们还与用于数万个CPU的网格一起使用,使用各种自定义项目,通过protobuf优化工作,在财务数学中实现计算,


作为基础架构的一部分,还有许多其他优化和芯片。 也许这很明显,但是要始终如一地从逻辑上讲出银行中发生的事情是非常困难的,有百分之二的人将其扔给银行并获得了财务资源-这是复杂的数学,算法,大型基础设施,技术和优化任务。


-来吧。 您说过,您在TechCenter中正在为全球银行平台进行计算。 在银行中可以考虑什么?


根据我的经验,在投资活动的框架中,考虑了价格和各种工具的许多其他指标。 如果我们谈论股票,那么一切都是清楚的:报价就是价格。 对于债券,这将是票面价值的百分比。


如果我们谈论衍生工具(衍生金融工具),那么价格就是必须为此工具支付的权利金的大小。 它由许多不同的公式计算。 有一个Black-Scholes公式可以估算期权的价值-该函数取决于当前报价,基础资产,波动率,到期时间和许多其他因素的函数。


有一些模型可以让您计算交易者的投资组合价值。 部门或公司在投资组合中有一组交易,衍生金融工具,您需要计算它们当前的成本。 另外,可以有一个价格,但总的来说-它们可以以某种方式相互关联,提供折扣等。 例如,合成头寸:如何建立与期权期货等价的期权。 例如,这适用于诸如期权之类的非线性资产,但不一定适用于所有类型的衍生产品。 评估基于衍生工具所基于的基础资产的报价。 例如,一个或多个货币对的报价。 衍生工具可以建立在不同的基础资产上:对于货币,基础资产将是欧元,美元等; 用于商品衍生物-石油,黄金,小麦; 现货-各种股票和债券。


除了评估衍生产品外,还考虑了风险-如果市场价格暴涨(波动率变化),将会发生什么。 或者,如果美元相对于一种或所有其他货币的价值不等于60,而是100卢布,将会发生什么。 特定工具,投资组合将会发生什么。


您需要实时进行计算,并针对每种货币的价格走势以及市场波动的变化得出的各种不利结果,估算投资组合的当前状态。 为此,我们正在建立所有可能变化的矩阵,该矩阵显示了现在的情况,明天将发生的情况以及如果发生市场危机将发生的情况。


为了评估当前买卖什么以及有什么风险,这是必要的。 并且,包括评估未来将发生的情况,评估交易策略并更准确地响应市场变化。 例如,一个量子区提出了一种用于计算风险的新算法-您需要检查历史数据,例如驱动数十年来所有交换信息,然后看看会发生什么。


为了满足这些需求,有连接到各种交换平台的基础架构,这些平台将市场数据发送给我们。 由于我们公司在全球拥有大量数据,因此我们需要以某种方式存储和构建预聚合,以便快速对其进行处理。


-在继续进行基础架构部分之前,我想问一下您刚才所说的内容。 您谈到了一堆各种各样的分析算法,这些算法来自哪里? 这是某种书籍知识还是您的最佳实践?


有几点。 首先,采用数学家发明的众所周知的公式,算法。 例如,公认的期权定价模型是布莱克-舒尔斯公式。 但是,除此之外,还有一些内部改进:特别是,我们使用其他价格分布定律,我们扭曲了这些公式中的系数。 价格,交易和其他指标的分布曲线的公式可以非常不同。


如果我们谈论优化,这些已经是内部改进。 例如,开发人员可以计算键值并进行近似计算,而不是在每个点上计算指标,这将节省20倍的计算机时间,但同时又可以提供可接受的足够的准确性。


所有数据都在不断变化,这不仅对我们报告至关重要,而且对于交易者来说,掌握市场状况的最新情况也很重要。


-这是相当复杂的信息,可能很难在人与人之间传递。 您的团队规模是多少,如何在彼此之间传递知识?


我们在莫斯科的项目拥有35名员工。 这些团队负责处理某些功能:UI,后端,基础结构,财务数学。 每个这样的团队在特定模块的功能方面都有深厚的专业知识。 但是除了这些人之外,参与与我们项目相关的系统的人也很多。


Confluence的分析人员描述了有关该项目的所有信息,这些信息也包含在JIRA的任务描述中,其中包含与标准机制和公共公式的链接。 在测试中可以找到使用功能的示例。 好吧,人类的交流并没有被取消。


-金融数学家:有多少人?他们是谁? 有重要的科学家吗?


是的,他们主要是专家(量子),他们坐在伦敦,并建立市场运作的财务模型。 大多数情况下,他们拥有金融或数学博士学位。 他们知道市场的运作方式,交易者的需求,并能提出某种数学模型来描述市场状况,风险计算算法和对衍生工具的正确评估。


例如,我的同事Alexander 在哈布雷(Habré)上写了一篇文章 ,他已经提到了量子技术的经验。


-普通开发人员可以与他们交流吗? 这种交流进展如何? 确实,数学和传统发展有着截然不同的世界。


他们可以进行沟通和交流:很明显,与领导者讨论了一些顶级业务任务和概念,但是在特定风险计算或其他指标的框架中,开发人员直接与构建此模型的交易员或专家进行了沟通。


但是实际上,这是相互作用的相互过程,因为理论算法并非总是在实践中实现的。 因此,开发人员可以提出对模型的更改,使其基于当前的应用程序体系结构。


有很多交互方式-相同的Skype,电话和所有标准通信工具。


-结果出来的软件是自动的吗? 是这些机器人,还是从事技术分析的交易者可以使用的东西-图表或其他工具?


有几种使用软件的选项:第一种是自动的,即 交易机器人,第二个是交易者的助手,它显示投资组合的当前状态,详细说明各种指标下的风险,他现在可以进行的交易选择以及投资组合的未来状态和基于这些操作结果的风险。 还有用于交易者的指标,风险计算和投资组合状态数据。


-另一个指标是数据分析的频率,您多久进行一次? 据我了解,频谱的一方面是几微秒,另一方面是大数据的分析,可能需要数周才能完成。


根据指标的复杂性和重要性,这些指标可以是实时指标,它们会针对每个刻度进行重新计算,然后进行毫秒计算。 而且,如果我们计算投资组合的成本,则更新每秒发生一次,因此人眼有时间感知它。


如果您描述长时间的计算(例如,一些复杂的风险),白天需要的数据,则将任务发送到表格,并考虑更改货币报价的情况。 通用机制如下:考虑某个周期内的所有新交易,然后在网格上执行一项艰巨的任务,以重新计算当前市场状态下整个交易集的指标。


这样的任务可以每小时更新一次。 如果您需要放弃交易策略-这是一项漫长的任务,则将其扔掉,并考虑几个小时,具体取决于数据的复杂性和数量。 网格上的任务可以很小,例如,计算一个公式并给出一个结果,也可以很大,例如,对于需要计算所有可能的风险情景的相关性并给出组合结果的表,这些任务可以很大。


此处出现的任务是优化网格的负载,并根据工具的类型,数据量和其他指标来预测计算任务的时间,以便最大程度地加载网格。 因为,如果您执行一项重要任务,其他所有人都会排队等候,尽管在此期间您还可以数其他事情。


通常,背包的任务和其他优化。 在ping到网格的时间长于计算时间本身的情况下,我们将在后端进行此操作,在该后端,已经为此类小任务部署了迷你群集。


-我能以某种方式将其放入某种结构吗? 据我了解,根据任务的数量,会采用不同的优化方法。 对于小型任务,优化JIT编译器是有意义的,而对于大型任务,还有其他事情。 告诉我问题的领域是什么,那里使用了哪些方法来加速和优化。


一个重要任务的示例是在将每种货币的报价更改1-2-3-10%时计算所有金融工具和风险。 在这种情况下,优化将包括将交易分组到捆绑中,以便在一个捆绑中存在针对一种投资组合或一种货币的交易。


因此,每笔交易没有太多风险计算,因此我们将它们作为大笔交易显示为一笔交易,然后按比例划分结果。 因此,我们减少了必要的计算数量。


另一个优化示例是这次使用货币对。 假设有两对“卢布美元”和“卢布欧元”。 在第一对货币对中,您可以想象卢布正在下跌,但美元可能在上涨。 实际上,这是相同的。 卢布-欧元对也是如此。 因此,基于卢布在两种情况下都会发生变化,我们可以在一包中乍一看考虑不同的货币对。


计算数量减少,结果加速。 它似乎改变了一种货币(在我们的示例中为卢布),但实际上,我们计算了异构资产的风险。


-您能直接解决问题并将其分解成一个巨大的集群吗?


有一个这样的集群,但是已经加载了许多计算。 尽管目前有成千上万的CPU,但群集并不是橡胶的。


-从软件角度来看,还是In-Memory DataGrid或Hadoop?


是的,有Hadoop和Kafka用于处理所有这些,还有ClickHouse数据库用于优化处理大数据。 就数据堆栈而言,很明显,驱动JSON效率低下。 在这方面,Protobuf可以进行优化。 对于我们来说,重要的是,不仅要放入二进制数据,而且还要使用字典同时尽可能紧密地进行处理。


例如,我们将在其中存储所有交易的相同类型的合同规格。 由于使用字典进行了优化,因此同事节省了30%的占用内存。


-这些词典是否在特定节点上重复并且位于中央库中?


以不同的方式。 通常在中央基地。 还有一些字典,您可以通过大量计算将其转移到网格中。 她希望尽可能紧凑,以免拖累大量数据,因为Internet渠道不是一成不变的。


如何运作? 您将带有所有必要信息的计算任务发送到网格,将其打包在字典中以避免重复。 内部,已经有所有内容,您无需转到其他存储库。 这样可以节省网络流量并减少计算的延迟。


-据我所知,银行对历史数据进行了分析,历史数据是每千兆字节TB的一大包数据。 并且使用单个数据库的方法行不通吗? 您可以在密钥上放入2 TB,但这并不好。


是的,这些时刻是由分配决定的。 由于将有关从纽约到新加坡的所有交易的信息发送都非常耗费资源,因此您将具有按国家/地区划分的本地缓存,并按交易所信息分散。 显然,在这里按国家划分是合乎逻辑的:例如,在美国的事务将放置在美国数据中心中。 与引号类似的情况-您需要构建路由并确定它是哪种交易,它属于哪个区域,以便了解缓存在哪里,将其发送到必要的存储和数据库,而不必再次追逐数据。


-碰巧需要连接来自不同区域的数据吗?


是的,确实如此,这是一项艰巨的任务。 显然,为了获得汇总结果,我们不会从所有区域抽出数TB的数据。 最有可能在每个区域中计算该区域的本地聚合,然后收集所有这些结果以获得摘要数据。


-最有可能存在外部数据,例如交换历史记录。 以及如何处理它们? 您是将自己镜像到内部还是有处理这些镜像的方法?


有协议和与标准数据提供者的连接:路透社,彭博社,提供交换信息。 我们将所需的数据存储在内部存储器中,但是某些事情可以从数据提供者处重新请求。 再次,按地区划分,以免增加流量。


显然,他们还在全球部署了服务器,以确保速度和性能。


-以及用于读取或读取/写入的数据? 如果记录不吓到此类卷?


基本上,为了阅读,写作时要记录有关交易的信息以及监管机构要求的其他信息。 基本上,是针对国内需求的计算:风险,投资组合的价值等等。 这是一个内部厨房,您可以上交某个区域或数据中心的数据,而无需将其发送到外部。


-如果有一块从月球上飞下来并飞往数据中心,那会发生什么? 都结束了吗


数据中心中的数据已镜像。 显然,在该区域内,数据并不位于一个数据中心的一个硬盘驱动器上。 否则,就像那辆自行车一样,任何清洁女工都可能会意外切断服务器。 一切都在线复制:有两个方向的数据流,您从最近的镜像读取,并同步到记录以确保一致性。


但是,通常来说,可用于记录的信息要少得多,因为需要将其显示给用户。 如果他不是现在就看到重新计数,而是在2秒后从另一个来源看到了重新计数,那很可悲,但是您可以活下去。 显然,监管机构,外部营销人员和市场参与者所需的数据是在多个来源中重复并同步的,以便不会丢失任何内容。


德意志银行技术中心如何准备数据并收集垃圾



-有关数据准备的问题。 据我了解,每个源都有其自己的格式,立即转换它们不是一个好主意。 您是否以某种方式预先准备好要进行计算?


有内部单一格式。 显然,使用相同的数据更方便,但这意味着需要转换它们。 有数据流和团队负责交换信息,并连接到供应商。 它们以我们的单一格式来形成和丰富数据。 为了解决性能问题,将有两个数据流,其中一个是快速循环,它将发出来自交换数据流的信息。 因此,无需去各种仓库并形成标准结构。 您可以在其上实时计算所需的指标。


而且采用我们的格式时,处理相同流但具有所有必要字段集的周期更慢。 它运行的速度越来越慢,需要大量附加信息,字段和其他所有内容。


-从开发人员的角度来看是什么样? 您是否总是知道数据库的哪个区域会受到大量计算的影响?


您会遇到一些事件,其中的字段可以100%填充,也可以部分填充。 在快速事件中,您需要对在线快速重新计算的指标进行计数。 如果要花很长时间才能获得完整的数据集,则需要重新计算需要所有指标的任务。 这是您不深入的工作,因为这完全取决于任务的细节。


-数据存储在什么地方? HDD,SSD,RAM完全在RAM中?


主要在内存中。 我们在后端处理大型堆,这些堆使用Java或某些内存数据网格中的标准结构来消耗和存储数据,具体取决于所需数据的速度和接近程度。 显然,过去几天的历史数据将存储在SSD和磁盘上。 但是计算所需或可能需要的内容将被加载到内存中的缓存中。


-是否可以使用不正确的计算来执行某些操作而不进行缓存,但是会丢失信息?


是的 我提到过一点,有时候随着指标的变化,您需要计算资产从0到100%的变化链的风险。 根据公式或线性关系,将分布图构建为百分比。 您建立关键点并进行近似。 获得了近似结果,如果我们在图中的每个特定点进行计数,则与实际值不会相符100%,但足以使用这些数据。


经常使用这种方法是因为,例如,当相对于所有其他货币更改每种货币的价值时,它不允许以一美分为增量进行全部计算。 您可以计算出极少的步伐,或者选择一些特定的点,然后对其余的点进行插值。 精度值就足够了。


-Java总是很热闹吗?还是一切都没有了?


多半躺在臀部。


-那么您如何与垃圾收集作斗争呢?


, - huge pages, . , Shenandoah. full GC .


: flame graph, , , , .


— , flame graph?


, - Java-, , . ELK-, GC- , , . 150 — , . , 150 . , .


— Java GC ?


Java 8, 11- . . , , G1.


— ?


, . JVM.


— , , . - , ?


, . , . . ( UAT — user acceptance testing ) — , . , , . 2 , — 3 , , .


. , , , . , .


— , - , , ? ?


. : , GC, live set . - . — . , . , .


-, - . , . , JSON diff. JSON .


, . , , . .


— , , ?


, , . 100 «», . , . .


master, , , . , , , , . .


, , , , . , , . CI, .


— ?


. — , , . , , , , . - , .



— , .
— , , . , , , , - .


, - , — - , UI, . , , , , UI.


— ? «» Spring?


Spring, Java, MongoDB Protobuf, dependency injection. UI React, gRPC , .


— Mongo, Oracle. - ?


, , . . - , JDBC . - SpringData , JDBC. , , , .


— - CQRS?


, , .



— ? , …


.


— ? , .


, . , , ++ . GNU/Linux, Java. -, . , . , , , . .


, .


— ?


, «» . , , - , - . , , - «» . , , , , , .


— ?


-, , .
: , , . . , , , . , .


, 150 , . - . , .


, , , . , , , — . , , .


-



— - , , , ?


, — . , - , - . , . , 4, .


, - . — . , .


, , . , .


— - - , ?


« ». — , — , .


- - , , - . , , .


, . , , . — . - , . , -.


, , . , , - ( -, - ).


— ?


. , . , , .


— , , , - . , — , .


. , : , - , .


, , - , , . , , , , — . , , , .


( , )


— , ? ?


, , Java. dependency injection, , , — , . , . . : , - .


, . , , , , happens-before. , , .


如您所知,类似IntStream#distinct事情涉及将原始类型包装为Java类型,然后进行反向操作。 似乎并不十分令人恐惧,但是在大量数据上,大量装箱和装箱将是显而易见的,而徒劳地使用内存。 您需要了解Java本身的精髓,因为在诸如拳击之类的琐事上,您可以生成大量不需要的其他分配。 为了及时注意到这一点,您需要能够使用工具来评估性能,收集指标并了解其他标准内容。


-您需要了解银行的详细信息吗?


不,基本上。 我们都知道,那些了解银行细节的人已经在银行工作。 当您来自另一个领域时,您很可能不认识她。 从一开始,您就可以从以下方面研究文档:什么是期货,什么是期权,它们有何不同,风险是什么。 然后,您就跳水并开始了解业务细节。


但是,这很重要。 首先,您可以简单地实现不依赖于特定业务特性的功能,而是逐步学习更复杂且特定于主题的内容。 这是什么,最后一个工作地点是什么(当我(作为部门主管时,已雇用员工))-您会注意到,如果十个人中至少有一个了解期货是什么,这已经很好了。


如果您一般都有算法,多线程和Java的知识,那么研究业务细节将不会很困难。 当您进入这种环境,阅读文档并理解时,它就会自动显示出来。


-您将如何在面试中测试如此丰富的Java知识? 这是真的吗?


很显然,您极有可能不会对其进行检查。 但是在逻辑,算法,对内部结构的理解上还有标准任务。 这是一个测试任务,是白板编码。 例如,一项用于在队列中实现缓存的任务将使您了解候选人是否理解多线程-竞争,死锁以及其他所有内容。 在此过程中,您可以询问有关消耗多少内存,为什么使用TreeMap而不是HashMap的问题。 因此,解决一个普遍的问题,您可以从不同的细节出发。 相反,这里是计算某些细微差别的做法。


-您认为要成为一名更好的程序员需要做什么?


进化! 编码并观看什么技术和算法,什么是新语言,解决算法问题。 实际上,很大程度上取决于经验。 如果您已经解决了算法上的许多问题,那么您可以从一个陌生的新任务中找到与过去的任务类似的东西。 有必要发展思维,迅速找到答案的能力。 Google能够在StackOverflow上找到解决方案的功能非常有用。 如果您不了解某些东西,但是知道在哪里找到它,这就是成功的途径。


语言在变化,技术和框架正在变化。 新的模式来了,但是每个人仍然使用某些模式。 没有关于反应式流的报告的Java会议和关于Kotlin的讨论不再通过。 坐在茧中,不了解从某种意义上说,现在的事件采购正在逐渐占领世界,这很奇怪。


有必要发展背景。 例如,纳特的书仍然有用。 基础加上新技术。 而且您需要知道Google的位置和内容。


-他最后了解的是什么?


在Kotlin协程。 酷,我喜欢。 在语法和逻辑上。 我看一下如何在多线程和异步中使用它。 以前,我很少使用Kotlin。 现在,我正在积极研究它,一些项目已经在利用它。 它甚至存在于产品的一些小模块中。


Source: https://habr.com/ru/post/zh-CN449630/


All Articles