原文章:https://mp.weixin.qq.com/s/GOLe0Ni-kgB2jZIu64JnGA
作者:zartbot
随着中国证券市场对海外的开放,担忧国内一些机构还在使用陈旧的技术被人家割韭菜,然后有些机构风气也很不好,其实很简单的东西,总是神叨叨的以为自己都懂还是绝顶的商业机密,所以来写一个短文吧,让不知道的学一点,知道的就一笑而过吧。
本文主要分几个部分,第一部分是交易所低延迟系统架构给交易所的朋友们看的,当然有些券商也有自己的场外期权交易部门也可以看看。第二部分是券商和私募机构用的低延迟交易系统。第三部分是针对最近股票期权的做市商系统,当然你也可以理解为程序化交易,程序化套利,高频/低延迟交易,我只是选了一个合规的词,同时相对于股票和期货,选择了较复杂的期权系统给读者做交流。
1.交易所交易系统
1.1 交易所系统架构概述
通常整个交易系统架构如下,原有的交易系统采用多品种在一台小型机上进行集中式处理,网络则同时承载了行情/报盘/清算等数据传输。
低延迟的交易系统能够承受更大量的订单,以某交易所为例,其交易延低延迟的交易系统能够承受更大量的订单, 以某交易所为例,其交易延迟从2004年的127ms下降到2016年278us,订单数增长了近1000倍。延迟从2004年的127ms下降到2016年278us,订单数增长了近1000倍。
而背后延迟下降所采用的技术,主要来自于:
分布式撮合系统
独立的消息总线
低延迟通信网络
1.2 交易所系统优化
1.2.1 分布式撮合系统
通常为了降低延迟提高系统并发处理能力采用的方案都是使用分布式处理,我国A股交易品种已经多达3800只,还有大量的期货期权等衍生品交易。分布式调度算法相对简单,即把不同的代码放置在不同的服务器进行交易撮合即可。
当然分布式系统最重要的便是时间一致性的处理,传统的方式服务器可以通过网络使用NTP协议同步时钟,但是随着交易频率越来越高和交易公平性的需求,通常需要在各个交易服务器及报盘前置上进行时钟同步和时间戳标记,严格执行公平的价格优先时间优先交易策略。一种方法是使用网络交换机接收GPS时钟源并通过网络带内的PTP协议同步时钟,而带内传输需要考虑网络通信流量和交换机转发时延带来的干扰,另一种方式则是使用GPS等时钟信号带外同步。
对于交易等时钟敏感的业务,如果不考虑成本需求,可以采用第二种构建单独的带外时钟同步系统。而针对报盘前置,通常需要在报文中对到达时间进行精确标记供交易撮合服务器定序。
注:如果采用基于PTP的方案,低延迟交换机建议使用基于FPGA的L1 FanOut交换机构建独立的时钟网络,但是会多占用服务器的一个网口。而可以采用带有SMA接口和OXCO晶振构建本地的时钟同步和守时系统,具体技术细节在1.1.3中详细讨论。
1.2.2 独立的消息总线
从业务模式上来看,撮合服务器承担了大量的通信流量,同时连接了报盘/行情/清算三条交易总线,使用同一套网络传输会潜在的影响,影响了整个交易的公平性并使得交易系统极端性能的处理能力受限。
而通信模式上具有相对固定的特征,因此可以在通信系统中可以将总线分离,并配置特殊的网络设备加速每一种业务模式:
报盘和分布式撮合涉及订单分发,它为标准的多对多通信模式,通常只能选择普通的基于MAC地址查询的低延迟ASIC交换机,例如Cisco Nexus3548和Arista 7150。
清算总线为标准的多对一通信,而行情汇总总线也为标准的多对一通信模式,通常无需使用MAC地址查询,直接将报文转发到特定端口即可。在这种场景下,可以使用带有低延迟MAC IPCORE的FPGA交换机实现, 例如Cisco的FusionMux和Arista MetaMux技术构建的交换机。
行情分发给会员单位时为标准的一对多通信模式,也可以采用L1交换机直接将数据复制到多个出口,而无需使用组播OIF查询机制,同样Cisco和Arista都提供这样的交换机产品。
注意:在行情分发网络中,曾经也有部分采用模块化交换机或者路由器,由于设备组播复制机制不同,会存在行情分发不公平的情况,而使用L1交换机Fan Out和级联FanOut可以保证行情的完全公平。
1.2.3 低延迟通信网络
证券交易网络通信通常具有一个非常明显的特征:Microburst。即从宏观结构上来看,平均每秒流量非常小:
但是缩放到毫秒级刻度,则会出现链路使用率几乎满载的情况:
因此微观传输时延变得非常重要,常见网络传输时延统计:
使用更低延迟的交换机和更大的带宽通常可以缓解延迟,但是在较高带宽时需要考虑到编码带来的时延。通常每次burst时传输的数据包数量相对较小,而高速带宽通常使用大量的FEC和编码技术反而增大了传输延迟,最佳的解决方案为10Gbps光纤网络或者部分可以禁用RS-FEC的25Gbps光纤网络(例如Cisco部分交换机可以支持在30米距离内使用高质量光纤禁用RS-FEC),同时在短距离内,为了进一步降低传输延迟,可以采用无源的铜质直连线(Passive Twinax Direct Attached Cable)
另一方的优化在系统侧,大量的交易应用程序基于TCP通信,而经典的Linux内核实现也使得TCP通信延迟相对较高,同时伴随着多对一通信模式下的TCP incast带来的延迟。
业界为了解决这个问题,通常采用如下几种做法:
使用InfiniBand网络重构通信,但是由于交易所开发资源受限和项目潜在风险较高,且IB网络成本等多种因素的影响,仅有极少数交易所采用
ROCE(RDMAover Converged Ethernet):大量的对于通信有低延迟需求的行业(AI/存储/消息队列)已经开始使用,例如在存储和AI训练等众多方案中都开始采用,Nvidia甚至因为这个技术收购了Mellanox。阿里云等企业也开始大面积部署ROCE等技术。但对于交易所行业而言,同样需要在传统的TCP通信代码上进行较大的改动,因此进展缓慢。
-
Kernel Bypass:这种技术是交易所现阶段使用较多的技术,通过特定的网卡和驱动实现,上层应用则继续仅作较小的修改,这类技术包括Solarflare的Onload和Exablaze的 ExaSOCK
TCP Offload:即在FPGA上构造TCP状态机和应用逻辑,完全脱离于主机执行交易相关的数据处理,交易所可以在这个场景中实现对交易订单的价格优先/时间优先定序,并在满足可执行撮合条件时通知主机进行撮合。常通常这部分如下图所示:
也有混合TCP Offload Engine和TCP Kernelbypass技术的解决方案,例如Exablaze的FDK-XP
除此之外,在主机侧的优化则集中在CacheLine对齐,BIOS调整禁用CPU省电降频,使用高频率CPU和绑定CPU核等技术。未来几年还有基于CXL等技术来进一步降低网卡到CPU的通信延迟。
2.证券期货公司交易系统
证券期货等交易系统架构如下图所示:
延迟衡量的标准为T3-Delay(Tick-to-TradeDelay)即收到行情后可以在多快发出交易订单指令。
2.1 时钟校准及时延监控
由于我国特殊的涨跌停交易制度,使得大量的机构需要准确测量交易所时间并第一时间送入订单对涨跌停股票进行交易。而某交易所报盘的机制也使得机构需要使用精确时钟去测量,并实现守时系统。通常的做法和前述交易所内部分布式系统时钟同步的解决方法类似,通过对交易所过来的信息构建时钟同步逻辑,并采用在网卡上配备OXCO恒稳晶振的做法进行守时处理。
而通常也需要一套系统对T3-Delay进行监控,通常的做法是对报文直接进行Taping并打上高精度的时间戳,某些时候为了兼容Wireshark等分析软件,通常可以在报文的尾部添加时间戳信息,或者构造ERSPAN Type-3 Header放置时间戳,具体实现可以参考Arista收购的Metamako MetaWatch和思科收购的Exablaze ExaLink FunsionHPT
2.2 行情加速
从交易所收到行情后通常需要一个交换机分发给多个内部服务器,此处为标准的一对多通信模式,可以采用L1 FanOut的方式,使用特殊定制的基于FPGA的交换机(Arista 7130或者Exablaze Fusion L1)实现。还有一部分可以采用FPGA对行情过滤和重编码的方式降低传输带宽和策略服务器解码时间。
2.3 报盘加速
报盘加速则是标准的多对一通信模式,同样可以使用特殊定制的基于FPGA的交换机实现
2.4 主机加速
主机侧加速的方案和交易所方案也类似,采用特定的网卡进行Kernel Bypass。通常交易所限制使用特殊的lib库进行交易,任何其它的方式可能带来潜在的违规风险就不多做描述了。因此在这样的监管体系下,大多数交易指令的下发采用Solarflare onload和Exablaze ExaSOCK的方式进行,因为无需对报盘系统做代码修改。而在行情接收上,也有使用solarflare ef_vi对接收队列直接操作,而Exablaze则可以基于FPGA直接使用RTL对接受行情编码处理和计算,并产生计算结果告知CPU侧,具体内容可以在第三章中的实例找到。
)
3.做市商系统
伴随着我国期权交易逐步放开,特别是未来个人股票期权程序化交易放开,期权做市商系统或者程序套利算法成为各个机构追捧的业务类型。做市商是指持续为做市合约提供买卖双边报价,并且在该价位上接受投资者的买卖需求,以自有账户和资金与投资者进行交易的交易商。
做市商主要的任务是在尽量避免影响市场价格的前提下,对做市合约进行连续的双边报价,为市场提供流动性。一般来说,做市商需要具有雄厚的资金实力、准确的报价能力和风险管理能力。
3.1 我国期权交易系统复杂度在商品期权上,通常这些机构在交易系统延迟上领先国内机构很多,算法上也有很大的优势,同时还有CME到上海的低延迟线路资源,使得信息上极大的不对称。但在股票期权上,国内机构则可以发挥自己的优势。50ETF期权所有底层资产交易均在上海,处理相对容易。而300ETF底层资产涉及沪深两个交易所,期权则同时可以在三个交易所交易(沪深股票期权和中金所股指期权),到期日不同进一步增加了计算的复杂度,跨市场套利和底层资产行情快速同步对整个系统提出了更高的要求。
3.2期权行情系统实现
3.2.1 行情传输系统
行情系统同样需要进行跨交易所的测量和校准,具体技术和2.1节类似。虽然所有的机构都知道Co-location机房建设,但是如何降低行情跨交易所传输时延及如何确定交易数据中心需要仔细考虑。
上交所和深交所交易机房相距1200km,光在光纤中由于密度不同,其传输速率为光速的50%~66%,因此沪深如果存在完全直连的光传输,理论单向时延为6ms。其它几个交易所的物理距离和光传输理论延迟如下:
上海--->大连: 850km 4.25ms 上海--->郑州: 830km 4.15ms上海--->深圳: 1214km 6.07ms 郑州--->大连: 849km 4.25ms前些年在美国发生的传输网优化的故事已经家喻户晓,两年前有部电影《蜂鸟计划》便是讲述的这个故事,无聊了可以去看看
当然影片总归会有一些艺术性的情节,实际上的情况是CME(芝加哥)到NYSE(新泽西 Mahwah)之间相距1100km,和沪深交易所距离相似,但两所之间的线路延迟在2016年已经降到了单向4ms以内,比完全笔直的光纤还快。原因就是前面所述,由于光在光纤中传播的速度比空气中慢,大量的机构采用了微波通信的方式,唯一的缺陷就是在每年的大气波导时期会存在较高的丢包率。
在我国搞长距离微波通信并不是一个合适的解决办法,而大多数券商依赖的都是找朋友托关系去电信或者联通要低延迟线路,甚至还有一个外资机构为了这件事需要招聘一个项目经理。而现阶段,直接申请沪深的光纤,并不知道电信在传输网上做了什么,例如从深圳->江西->浙江->上海大约需要1300km,而从深圳->福建->上海可能只需要1250km,留张我国某运营商光纤干线工程的拓扑图给大家解释,具体距离测量用百度地图自己算吧
3.2.2 行情过滤和重编码
这是传输延迟,另一方面是传输内容大小带来的串行时延,我国证券交易行情通常是市场快照切片传输的,但是对于300ETF期权仅需要把底层相关的股票过滤出来进行传输,另一方面传输一个行情需要<股票代码,现价,最高价,最低价,买价12345,卖价12345,买量12345,卖量12345>等信息需要占用大量的带宽.
常见的做法是收到组播行情后,直接使用FPGA对行情进行重编码后再次发出:
例如原有代码为600000的编码改为INT8,即在300ETF权重表格中的索引号即可,而指数的权重计算也可以在本地接收行情时先计算完毕,再一起发送到远端另一个交易所
重编码的方法很多,需要具体的算法结合,采用预处理的方式
3.2.3 行情分发
对于期权来说,通常会有多种行权价格多种期限的品种
大量的行情计算可以采用分布式并发的方式
当然这种按照到期日区分的主要用于平价(Call-Put-Parity)套利策略,还有一些例如果冻卷(JellyRoll)或者日历价差需要跨期套利则可以根据行权价格分发到不同的策略服务器。
3.3 期权套利算法实例
3.3.1 平价(Call-Put-Parity)套利策略
平价套利策略的原理基于如下的平价公式产生的,即在忽略市场交易成本的情况下,相同标的资产且执行价格也相同/到期日也相同的认购期权和认沽期权与标的资产之间的价格满足如下公式关系,并假设假设标的资产不分红:
正向平价套利:当K-(C-P-S)e^rT -交易成本>0时,就可以实现正向平价套利,即:
1. 卖出行权价K的认购期权
2. 买入行权价为K的认沽期权
3. 买入现货标的
该套利策略中部分机构因为持有现货可以进行备兑开仓以节省期权卖出开仓保证金的占用。所以可以看到,策略相对非常简单,计算量也非常低,变成了一笔拼速度的交易,K-交易成本和e^rT 可以预先在开盘前计算好作为常量放入。但是常见的做法为使用solarflare ef_vi等方法读取,降低行情传输延迟,但是CPU需要几个Cycle进行计算,如果同时观测大量的产品(不同期限/不同行权价)时,或者在执行箱体套利策略时,会出现大量的计算,CPU计算延迟明显增大,通常的做法是将行情解码和套利机会计算在FPGA上完成,最后发送给CPU交由CPU执行订单程序。
3.3.2 希腊值和波动率曲面构建期权做市策略中极其重要的部分是希腊值(Greeks)计算和隐含波动率曲面,Greeks主要包括:1. delta:衡量标的证券价格变化对期权的影响,它是期权价格关于标的价格的一阶导数 2. gamma:当底层资产价格(underlay price)变化比较大时引入,它是期权价格关于标的价格的二阶导数3. vega:隐含波动率变化引起的期权价格的变化,它是期权价格关于波动率的一阶导数4. theta
:期权的时间价值随时间流逝的损耗速度,它是期权价格关于到期时间的一阶导数5. rho
:利率变动对期权价格的影响,即期权价格关于无风险利率的一阶导数而隐含波动率计算及校准各个机构都有不同的计算方法,针对我国 300ETF期权三胞胎还有一系列针对underlay资产和跨交易所波动率校准的方法。常见的计算代码可以参考《Modeling Derivatives in C++》这本书,这里面包含了一些较老算法的实现:
部分已有C++计算程序的机构,如果机构有特别有经验的FPGA工程师也可以直接使用verilog实现,当然也可以通过Xilinx Vivado HLS将其转为FPGA的IP core,并将计算Offload到FPGA网卡中:
在HLS中还需要对计算的循环展开模式做精心的调整及数据位宽做调整。通常这一系列计算可以在Arista 7130交换机,Cisco Exablaze Fusion交换机或者Exablaze系列网卡上实现,它们都是基于Xilinx的FPGA实现的。
当期权的波动率曲面构建后,做市商可对一些不活跃的合约根据波动率曲面进行合理的报价,同时还可以根据波动率曲面进行蝶式套利或日历套利。例如出现突发未知情况时,近期的隐含波动率涨幅远远大于远期,因此可以做空近月波动率,做多远月波动率实现。