这篇文章会带你了解如下内容:
-
搞懂交易系统到底是什么
-
让交易系统和交易所“接上话”,顺利交易
-
学会管理订单簿
-
明白交易策略怎么决定什么时候该下单
等你读完这篇文章,就能自己设计交易系统、把它和交易所连起来,还能搭建限价订单簿啦。
理解交易系统
这部分,我们来聊聊设计交易系统最基本的思路。设计交易系统时,特别重要的一件事就是把需求想清楚、写明白。交易系统的作用,就是帮你把交易想法变成现实。不管是什么交易策略,都得先拿到市场数据,再根据这些数据做决策。
交易系统具体要做这些工作:收集市场数据,其实就是实时更新的资产价格;向交易所发送交易订单;接收交易所反馈的订单信息,比如订单是被取消了、拒绝了,还是成功成交了,或者只成交了一部分;还要计算各种数据,用来衡量投资组合的表现,像赚了多少钱、亏了多少钱,有多大风险,以及交易系统各个环节的运行情况。
在决定要不要开发交易系统软件时,有几个关键因素得考虑清楚:
-
资产类别:交易系统用在不同的资产类别上,软件的数据结构就得跟着变。不同资产类别各有特点,完全不一样。就拿开发美股交易系统和外汇交易系统来说,差别就很大。美股主要在纽约证券交易所和纳斯达克这两家交易所交易,大概有7000家公司的股票在上面挂牌。外汇市场就不同了,主要有六种主流货币对、六种次要货币对,还有六种 exotic 货币对,就算再加上其他的,总共能用的货币对也不超过100种。而且外汇市场有几百家交易所,不像美股市场就两家主要交易所。资产的数量和交易所的数量不同,交易系统的整体架构自然也要跟着调整。
-
交易策略类型:交易策略的类型会直接影响软件的架构。要是高频交易策略,就得在极短时间内把订单发出去。交易美股时,一般的交易系统得在几微秒内完成订单发送;在芝加哥商业交易所,交易系统的延迟甚至要达到纳秒级别。所以在设计软件时,技术的选择就特别关键。单从编程语言来看,Python不太适合对速度要求高的高频交易,C++或者Java会是更好的选择。但如果是长期持仓的交易策略,比如持仓好几天那种,交易者获取流动性的速度快一点慢一点,就没那么重要了。
-
用户数量:交易者越多,大家用的交易策略就越五花八门,订单数量也会跟着大幅增加。在向交易所提交订单前,必须得检查订单是不是有效,还要看看手里持有某种金融工具的总量有没有超标。
在交易行业,现在针对交易策略的规定越来越多,我们得检查准备发送的订单是不是符合规定,这就会增加计算的时间。要是订单特别多,就得一个一个工具慢慢验证。要是程序运行速度不够快,处理订单的时间就会拖得很长。用交易系统的人越多,系统就越得具备可扩展性,这样才能应对大量的交易请求。
这些因素会改变我们对交易系统的设计思路。下面,我们就来看看一个简单的交易系统该怎么设计。
交易系统架构
下面这张架构图展示了交易系统长啥样。在图的左边,能看到交易场所。交易场所是个比较宽泛的概念,只要是能帮大家匹配证券或衍生品买卖订单的平台,都能叫交易场所,像交易所、电子通信网络、聚合器或者银行都算。
交易系统要和交易场所“互通消息”,收集所有参与者的价格变动情况,还要把交易订单发过去。这就需要一个叫网关的软件组件,它专门负责保证交易系统和交易场所之间能正常通信。订单簿构建器会根据网关收集来的数据,搭建限价订单簿。最后,交易策略通过订单管理器把订单发送到交易场所,订单管理器要把系统里所有策略产生的订单都管起来,还要跟踪每个订单从产生到结束的整个过程。这些组件都是向市场发送订单的关键环节。
图1 - 交易系统架构设计
除了这些关键组件,交易系统还有一些没那么核心的服务。比如命令和控制组件,它负责启动系统里的各个部分。在算法交易里,查看器特别重要,它能让你清楚了解系统里每个组件的运行状态,还有订单情况、交易记录,以及各种对监控交易策略有帮助的数据指标。算法交易实现了自动化交易,所以实时掌握交易系统和交易策略的运行状况就很关键。尤其是在高频交易中,哪怕几微秒的延迟,都可能造成巨大的损失,这时候一个能及时发出警报的查看器和用户界面就必不可少。
接下来,我们详细说说交易系统里的关键组件。
连接到交易交易所的网关
网关是交易系统里的“通信员”,专门负责和交易所、交易系统内部沟通。它特别重要,因为在执行交易操作时,它最耗费时间和系统资源。从设计上来说,网关得从网络上获取数据,再把这些数据传给系统的其他部分,这对系统资源和操作系统的要求都很高。
交易系统通过网关收集价格更新信息,然后帮你向交易所发送订单。打个比方,就像你自己做交易一样,首先得决定买卖什么产品,选好产品后,得看看其他交易商给出的订单情况,包括交易规模、价格和数量,这些信息能反映出他们交易的意向。等收到足够多你想交易产品的订单后,你就能从中挑选合适的交易对象。产品价格是你做选择的重要依据,要是打算以后转手卖掉,肯定希望以低价买入。和对方谈妥价格后,告诉对方你愿意按这个价格交易,交易完成,产品就归你了。
数据收集
网关的主要任务就是从你选定的交易场所,比如交易所、电子通信网络或者暗池,收集价格更新信息。它是交易系统里最重要的组件之一,负责把交易所的订单簿数据“搬”到交易系统里。网关会和网络建立连接,通过接收和发送数据信息流,实现和交易所的通信。
下面这张图展示了网关在交易系统里的位置,它既是接收数据的入口,也是发送订单的出口:
图2 - 负责收集价格更新和发送订单的网关
从这张图能看出来:
-
交易场所包括交易者、交易所、电子通信网络等。
-
连接不同交易场所可能会用到不同的通信协议,图里用箭头来表示。
-
数据传输的方式有很多,像电线、无线网络、互联网、微波、光纤等,每种方式在传输速度、数据丢失情况和带宽大小上都不一样。
-
价格更新和订单信息的传输是双向的,也就是说,交易系统既能从交易场所接收数据,也能向交易场所发送数据。
-
要开始接收价格更新,网关得先和交易场所建立网络连接,验证自己的身份,然后订阅特定交易产品的信息。
-
处理订单的网关也要收发信息。下单的时候,订单通过网络发送到交易场所。
-
如果交易场所收到订单,就会给交易系统发确认消息。当订单成功匹配成交时,交易场所也会通知交易系统。要是交易场所没收到订单,就不会发确认,这时候交易系统就会判定订单超时,交易者就得检查系统是不是出问题了。
使交易系统与交易所交易
交易系统里有很多功能组件,它们负责完成交易、管理风险,还得监控一个或多个交易所的交易过程。交易策略编写好之后,就成了交易系统的一部分。交易系统运行时,输入的是价格数据,输出的是交易订单,订单就是系统发出的交易信号。在这个过程中,网关是必不可少的重要组件。
下面这张图展示了交易系统里的功能组件、网关的连接方式,以及交易系统和外界的交互情况:
图3 - 交易系统的功能组件
网关会根据价格变化和市场情况,收集订单并发送出去。它最主要的作用是搭建起交易系统和外界的连接,把从外界接收来的数据,转换成交易系统能用的数据格式。
从这张图能明白这些事:
-
交易策略在你的电脑上运行,但实际交易是在其他计算机上完成的。
-
因为这两台设备不在同一个地方,所以得通过网络连接起来。
-
根据设备的位置不同,采用的通信方式也不一样。
-
如果交易系统是托管的,也就是把设备放在同一个设施里,用一根电线连接就行,这样能大大减少网络延迟。
-
要是用云解决方案,就得通过互联网通信,这种方式的速度比直接连接慢得多。
再看看下面这张图,它展示了网关之间的通信情况:
图4 - 交易所与交易系统之间的通信
从这张图能了解到:
-
仔细看网关处理的通信信息就会发现,不同交易场所可能用的是不同的通信协议。
-
为了把这些协议转换为交易系统能识别的数据结构,网关得具备处理多种协议的能力。
现在我们知道交易系统怎么和交易所建立连接了,接下来再聊聊通信是怎么实现的,以及接收市场更新、发送订单会用到哪些协议。
检查通信API
网络协议就像是机器之间通信的“语言规则”,它规定了设备在网络上怎么“表明身份”,以及如何相互交流。在金融交易领域,常用的网络协议有用户数据报协议(UDP)和基于互联网协议(IP)的传输控制协议(TCP)。除了网络协议,还有软件协议,专门用来规定怎么发送订单、获取价格更新信息。在软件层面,通信API就是具体的通信规则,这些规则由你要进行交易的对象提供,相关文档里记录了获取价格更新、下单所需的所有信息。
要是想看看交易API文档是什么样,可以访问 https://en.wikipedia.org/wiki/List_of_electronic_trading_protocols 。
在深入了解交易API之前,我们先回顾一些网络基础知识。
网络基础知识
网络的作用就是让计算机之间能“相互联系”,要实现数据共享,就需要物理层。选对合适的传输介质,也就是通信层,对网络的速度、可靠性和安全性都非常重要。在金融交易里,常用到这些传输介质:
-
电线:传输的电流带宽比较窄。
-
光纤:带宽比电线大得多。
-
微波:设置起来比较方便,带宽也大,就是遇到风暴天气可能会受影响。
根据你选择的交易技术类型不同,要用的传输介质也不一样。在开放系统互连(OSI)模型里,选择传输介质属于网络第一层,也就是物理层的工作。在物理层上面还有六层,分别规定了不同类型的通信方式。
和大多数通信一样,金融交易也会用到IP协议,它属于ISO模型里网络层的一部分,主要负责规定网络数据包的传输路径。我们要说的最后一层是传输层,TCP和UDP是银行业最常用的两种传输层协议,它们的工作方式完全相反。TCP协议能保证两台机器之间稳定通信,先发送的消息也会先送达;UDP协议则没办法确定网络数据包有没有被成功接收。所有交易所都会选择TCP或者UDP作为通信协议。
订单簿管理
数据处理的一个重要目标,就是把交易场所的限价订单簿“复制”到交易系统里。为了整合从各个交易场所获取的订单簿数据,订单簿构建器要把价格信息收集起来,再按照交易策略的需求分类整理。就像下面这张图展示的,网关把价格变化信息转换后,传递给订单簿构建器,构建器再用网关接收来的订单簿数据,汇总并整理所有价格变动。
图5 - 从网关IN获取价格更新的订单簿构建器
下面这张图以一种金融产品的订单簿为例。订单簿分为买盘和卖盘两部分,每部分都记录着交易场所显示的订单、交易量和价格。每个交易场所都会提供自己的订单簿数据,订单簿构建器的任务就是把来自三个交易场所的订单簿整合到一起。图里的数据都是模拟的:
图6 - 交易系统整合三个不同交易场所的订单簿
从图中能看出这些内容:
-
订单簿里每一行代表一个订单。
-
比如说,在交易场所1的卖盘部分,有交易者愿意以1.21美元的价格卖出1000股;同时,买盘部分也有愿意买入的交易者。
-
一般来说,卖价都会比买价高,不然低买高卖赚钱就太容易了。
-
订单簿构建器要把网关收集来的三个交易场所的订单簿,整理得井井有条、排好顺序。
现在我们知道交易系统怎么获取价格更新,也知道怎么搭建限价订单簿了,接下来详细讲讲订单簿的功能。
订单簿的设计考量
限价订单簿的作用,就是把所有价格更新信息,也就是订单,按照一定规则排列好,这样交易策略执行起来就更方便。交易所用订单簿记录大家的买入和卖出意向。我们做交易的时候,从交易所拿到订单簿,就能知道资产价格的变化趋势、当前最合适的买卖价格,还有市场整体情况。
因为交易所的订单簿在其他服务器上,所以得通过网络把订单簿的变化信息传过来,主要有两种传输方式:
-
全量发送订单簿:这种方式特别耗时。像纽约证券交易所或者纳斯达克,每秒可能产生几百万笔订单,要是每次有新订单都把整个订单簿重新发一遍,网络马上就会被挤爆,价格更新也会变得特别慢。
-
先发送全量快照,再发送增量更新:订单簿是交易系统的核心,交易策略要不要下单,就得看订单簿里的信息。订单簿记录着当前交易所里所有的买入和卖出订单,当价格更新信息发到交易系统时,其他市场参与者也会同时收到,大家可能会根据这些信息马上行动。交易所收到大量订单时,都是先到先得,所以处理订单簿的速度和操作效率就特别关键。
一个订单从产生到结束,会涉及这些操作:
-
插入:往订单簿里添加新订单,这个操作得够快。因为要对收到的价格更新信息,按照买盘和卖盘分类排序,所以选对算法和数据结构很重要,最好能保证插入操作在极短时间内完成。
-
修改:通过订单ID找到对应的订单进行修改,操作耗时最好和插入操作差不多。
-
取消:根据订单ID把订单从订单簿里撤回来。
选择什么样的数据结构和算法,会直接影响订单簿的性能。要是搭建高频交易系统,在这方面就得慎重决策。高频交易里的订单簿又叫“基于订单的订单簿”,执行操作的复杂程度是重点考虑因素。
要设计出高效的订单簿数据结构,得满足这些要求:
-
快速查询和更新数量:订单簿会记录大量交易产品的订单信息,大型交易所每秒可能处理几百万笔订单。订单数量一直在增加,所以必须保证能快速查询订单ID,毕竟每秒可能要查几百万次来更新订单状态。另外,还得能迅速找到价格最优的订单,查询价格的速度不能太慢,得用快速索引方法。
-
按价格顺序查找:买卖大量资产时,为了达到目标交易量,得找到多个订单,这就需要从最优价格开始,依次查看次优价格的订单。所以,能用很低的时间成本找到下一个最优价格,对交易速度至关重要。
-
快速获取最优买价和卖价:交易时主要参考最优价格,数据结构得能快速找出买盘和卖盘里价格最优的订单。
除此之外,还需要考虑:
-
可以用大型关联数组,把订单ID和订单具体信息对应起来。
-
每个订单的数据里记录它所在的订单簿和价格层级,这样查到订单后,访问相关数据结构就很方便。执行订单成交或减少交易量操作时,能快速更新数量。要是想按时间顺序管理订单,还可以保存订单前后的指针。
-
因为大部分订单变动都集中在订单簿内部,给每个价格层级用向量数据结构,平均查询价格的速度最快。一般目标价格都离内部层级不远,从向量末尾开始线性查找,在计算机的分支预测器、优化器和缓存配合下更简单,平均速度比二分查找还快。虽然遇到极端情况,比如有人故意在订单簿末尾大量发送更新,可能会影响性能,但实际使用中,这种方式对插入、查询、更新和删除操作都很友好,速度接近最快,最坏情况也就是花费较多内存复制数据。
-
这种设计在理想情况下,插入、查询、删除、更新操作都能快速完成,耗时极短。就算遇到最坏情况,因为缓存、TLB和编译器的优化,虽然耗时可能会增加,但出现的概率很低,而且整体速度依然不错。特别是对于最重要的最优买价和卖价更新,速度几乎能达到理想状态。
通过了解高频交易中订单簿的实现方法,就能明白为什么掌握计算机操作系统和编程知识对交易系统开发这么重要。下一部分,我们就说说怎么利用这些组件实现最佳性能。
策略决策交易时机
交易策略就像是交易系统的“大脑”,它负责运行各种算法,把你的交易想法变成实际操作。看下面这张图:
图7 - 交易策略从订单簿构建器获取数据以决策交易时机
从图里能看出,交易策略主要包括两个部分:信号组件和执行组件。
-
信号组件:只负责生成交易信号。不过有了信号,也不一定能顺利完成交易拿到想要的资产。比如在高频交易里,可能因为下单速度不够快,订单就被拒绝了。
-
执行组件:主要处理市场的反馈信息。一旦订单被拒绝,执行组件就要决定下一步该怎么办,比如是继续尝试获取相同数量的资产,还是调整交易价格重新下单。
通过上面的介绍,相信你已经对交易策略有了一定的了解。接下来,我们再来认识一下交易系统的最后一个关键组件——订单管理系统(OMS)。
订单管理系统(OMS)
订单管理系统的工作是收集交易策略提交的订单,并全程跟踪订单的整个生命周期,包括订单的创建、执行、修改、取消以及被拒绝等各种状态。当交易策略生成订单后,会先提交给订单管理系统。如果订单存在问题,比如交易数量过大、交易方向错误、价格不合理、持仓量超过限制,或者是交易所不支持的订单类型,订单管理系统会直接拒绝这个订单。这样就能避免订单发送到交易所后才被拒绝,从而让交易策略更快地做出调整和响应。下面这张图展示了订单管理系统的核心功能:
图8 - 订单管理器收集交易系统中的所有订单
关键组件
交易系统的关键组件包括网关、订单簿构建器、交易策略和订单管理系统,它们相互协作,共同完成交易所需的全部功能。衡量交易系统性能(速度)的一个重要指标,是从价格更新信息进入系统开始计时,到根据这个更新信息生成的订单发送出去为止的这段时间,这段时间也被称为“从行情到交易”或“从行情到订单”的延迟。
非关键组件
除了关键组件外,交易系统中还有一些非关键组件,这些组件不直接参与订单提交的决策过程,主要用于设置修改、数据收集和报告等工作。例如,在优化交易策略时,可能需要实时调整一组参数,这时就需要通过“命令与控制”组件将新的参数传输给交易策略组件。
命令与控制
“命令与控制”组件是交易者与交易系统进行交互的桥梁,它可以是命令行界面,也可以是图形化用户界面。通过这个组件,交易者能够向交易系统发送各种指令,并将指令准确地路由到相应的组件进行处理。参考下图:
图9 - 交易系统的用户界面
其他服务
交易系统还可以根据实际需求添加以下组件(这只是一部分示例,并非全部):
-
仓位服务器(Position Server):它的作用是实时跟踪所有交易,并更新所有交易金融资产的持仓情况。举个例子,如果你以1.2美元的价格交易了100,000 EUR/USD,那么名义仓位就是120,000美元。如果其他组件需要获取EUR/USD的仓位金额,就可以通过订阅仓位服务器来获得最新的更新信息。在订单管理器或交易策略决定是否允许订单发出之前,通常会先查询仓位信息。比如某资产的持仓限制是200,000美元,此时再进行100,000 EUR/USD的交易,订单就会因为超出持仓限制而被拒绝。
-
日志系统(Logging System):负责收集系统各个组件产生的日志信息,并将这些日志写入文件或数据库中。这些日志对于系统调试、问题定位以及生成相关报告都有着重要的作用。
-
查看器(Viewers):这是一种只读的用户界面,通过它可以查看交易的各种视图,比如持仓情况、订单信息、交易记录以及任务监控等内容,方便交易者实时掌握交易动态。
-
控制查看器(Control Viewers):与查看器不同,控制查看器是一种交互式用户界面,交易者可以通过它修改系统参数,以及启动或停止交易系统的各个组件,实现对交易系统的灵活控制。
-
新闻服务器(News Server):它会收集来自多家新闻机构(如彭博、路透社)的新闻资讯,并根据交易系统的需求,实时或按需将这些新闻提供给交易系统。交易系统可以利用这些新闻数据,结合交易策略,做出更合理的交易决策 。
总结
通过本文的学习,我们全面了解了交易系统的构建过程,涵盖了设计和启动交易所需的所有必要组件。构建一个成熟的交易系统并非一朝一夕之功,需要经过长时间的经验积累。而且由于不同资产类别之间存在较大差异,在实际开发过程中,通常会专注于某一个或几个特定领域,而不是试图涵盖所有资产类别。
我们介绍了交易系统最基本的功能集合,但要让交易系统真正稳定、高效地运行,还需要进一步学习如何将各个组件有机地连接起来,以及如何根据实际交易需求进行优化。
如果你对交易系统的开发与设计感兴趣,可以阅读如下专栏:
如果你想求职交易系统相关的岗位,可以阅读如下专栏:
创作不易,如果觉得有帮助,请点个赞~