浙商银行FICC量化领域中的程序化交易系统设计探讨

发表时间: 2024-06-04 21:07

【浙商银行FICC·量化】浅谈程序化交易的系统设计###

一、程序化交易的定义

程序化交易是指使用计算机程序根据预设的算法模型自动执行买卖指令的交易方式。其核心在于通过计算机程序和算法模型,自动执行交易指令。程序化交易能够提高交易速度、减少人为错误、实现高频交易和复杂策略的执行。通过自动化和系统化的手段,程序化交易使得交易过程更加高效和精准。

二、程序化交易的执行过程

程序化交易的执行是一个循环往复的过程,可以分为四个阶段:

阶段一:接收交易信号

交易信号的来源有多种形式:①交易员手工输入;②外部系统产生后输入;③包含在程序化交易系统中,由交易员预设的策略模型产生后输入。无论采用哪种方式输入,其目的是通知程序化交易系统当前需要做什么交易,由程序化交易系统接收后进行下一步的处理。

阶段二:交易指令的产生

当程序化交易系统收到一个交易信号时,首先根据信号中的交易要素将信号转换为原始的交易指令。接着,算法模型依据当前的市场数据、之前交易的交易结果以及其他的数据按照既定的交易指令生成逻辑生成对应的交易指令。一个交易信号最终可能会生成多笔交易指令。

阶段三:事前风控

事前风控是对第一阶段产生的交易指令进行各项必要的检查,防止出现交易风险的过程。通常是由风险控制参数、风险控制逻辑等组成。风控逻辑依据当前的市场环境、提前设置好的风险控制参数校验交易中的各项要素,判断交易指令是不是可以在风险可控的前提下发送到市场中。如果判断结果为交易指令存在风险,则自动撤销该笔交易指令,不让该笔交易指令进入到市场中。如果判断结果为交易指令风险可控,则将该笔交易指令发送至市场中。

阶段四:数据反馈

数据反馈包含了交易指令进入市场后执行的结果、当前的市场环境以及其他的市场数据等。当前的市场环境和其他的市场数据是由交易的市场产生后自动反馈。交易指令的执行结果则是当交易指令被执行了才会由市场反馈。有了这些反馈后,交易的执行过程就进入了下一轮从阶段一至阶段四的循环了。

三、程序化交易的系统设计 1、设计思路

程序化交易系统从层次上来划分大致可分为四层:

1)交易执行

交易执行主要由固化的算法模型组成。固化的算法模型是将交易信号通过计算机程序的方式转换为交易指令的一个个执行程序,在程序化交易系统中,通常以模块、可执行程序的形式存在系统中,用于执行固定不变的交易逻辑。当系统收到交易信号时,程序化交易系统装载/调用这一个个执行程序,使其运行起来执行交易指令生成的逻辑。执行交易指令生成逻辑时,通常需要使用到下一层“公共组件”中的市场数据处理引擎推送的市场数据和之前的交易结果数据。

2)公共组件

这层主要是用来统一处理接入的市场数据、管理系统内的所有已产生的交易结果和已生成的交易指令,是系统内公用的组件。

市场数据处理引擎负责处理筛选、清洗市场数据等工作,再将处理后的市场数据分发、推送给需要的固化算法模型。

交易指令管理用于接收市场反馈的交易指令状态跟踪、维护系统内所有交易指令的生命周期。

交易结果管理接收市场反馈的交易指令执行的结果,按不同的的维度对量、成本等交易要素进行汇总。

3)事前风控

在订单产生后发送给市场之前,依据系统内当前的订单簿、持仓量、市场数以及事前设置好的风险控制参数,以一定的风险控制逻辑对订单中的各项交易要素分别进行必要的检查,判断该笔订单是否可以发送给市场。只有在所有检查都通过后,才把该订单发送给市场。其中,风险控制参数可以通过风控端随时进行调整。

4)API接口

API接口由市场内的交易所、交易对手提供,用于通过以程序的方式接入市场参与交易。API接口通常分为两类,一类用于发送交易指令、接收交易指令执行的结果;另一类用于接收市场数据。

2、实现需关注的点 1)单节点还是多节点

整个系统可以被实现为单节点,也可以把某些层单独实现作为一个节点实现,节点与节点之间通过网络进行交互。但这两种实现的方式都有利有弊:

单节点实现方式:无节点之间的交互损耗,但是单节点受资源限制无法进行横向拓展。

多节点实现方式:可将不同的组件的实现分散在多个节点上,通过节点间的交互可实现横向拓展,但增加了系统内的损耗,无形中降低了报撤单的速度。

采用单节点还是多节点的实现方式还是得考虑算法模型的偏好以及运行的算法模型的数量等因素。如果算法模型对报撤单速度较为敏感或算法模型同时运行的数量并不多,采用单节点的实现方式更为有利。反之,如果算法模型同时运行的数量会很多或报撤单速度并不十分敏感,可采用多节点的方式实现。如果两者皆有,可以考虑将部分的层以单节点方式实现,部分的层分散到不同节点的实现方式,以平衡资源与性能之间矛盾。

2)报撤交易指令的速度

在程序化交易中,报送交易指令和撤消交易指令的速度在某些交易场景下至关重要,因为它直接影响到交易的执行效果和风险控制。可以从以下几个方面入手考虑影响报送交易指令速度的点:

一笔交易指令从生成到进入市场,再从市场反馈回到系统继续处理执行结果通常会经历上图所示的一系列处理环节。这些环节涉及到:

1)每个环节自身的处理速度,是否有数据同步等这类延迟较高操作;

2)环节间的数据传递速度可能受到序列化、数据传递技术的影响。如果两个环节不在同一节点上,还需考虑网络带来的影响;

3)实时数据持久化带来的延迟;

针对上述这些可能出现影响点,可以考虑以下采用以下一些方式来解决:

1)设计适合以小颗粒度进行数据同步的数据结构,降低数据同步的延迟;

2)采用高效的序列化技术,减少序列化和反序列化时间;

3)使用低延迟的网络线路及设备,降低网络的延迟;

4)通过使用内存+数据持久化相结合、异步处理数据持久化的方式,降低持久化带来的延迟;

撤销交易指令与报送交易指令类似,也需要经过同样的交易路径,只是撤销指令在每个环节的处理过程中,相较报送交易指令逻辑可能略简单一些。

3)算法模型的计算速度

复杂算法模型的计算速度可能受限于对依赖的大量数据的处理或算法本身的复杂性,也有可能是两者皆有。算法模型计算的速度在对时效性要求较高的交易场景中会直接影响到是否能把握住市场机会。这里引出了两个需要关注的点:

1)如何快速读取大量的依赖数据

在对依赖数据进行处理之前,首先得从持久化的数据中读取出需要的数据。数据读取的速度直接受到I/O、网络、数据量的大小等因素的影响。读取的数据量越大受到的影响就越大,反之亦然。如果想要降低读取的数据量,那首先要考虑在对数据做持久化的时候缩小数据的体积。缩小数据的体积可以采用对数据进行压缩与编码、高效的序列化技术实现。持久化时保存缩小体积后的数据,在读取数据出数据后,对数据进行反向操作就可以获得需要的数据了。通过缩小数据体积的方式可以获得降低整体读取延迟的效果。

2)怎么提高算法模型的计算速度

在处理算法模型时,提高计算速度的一个关键方法是利用并行计算。并行计算通过将任务分解成多个独立的子任务,利用多核处理器、分布式计算资源、GPU同时处理,从而加速计算过程。对于涉及大量历史数据分析、实时市场数据处理、投资组合涉及大量的变量和约束条件等的算法模型来讲,适当的采用并行计算,将计算的过程拆解成可以同时计算的多个子任务进行处理,可以有效的提高算法模型的计算速度。

四、程序化交易的系统设计案例

考虑一个在程序化交易系统的设计过程中经常会遇到的简单交易场景:

1)一个交易组合需要跨越不同的市场,在不同的市场进行交易;

2)生成期货交易指令时,需要考虑当前的持仓量,且不同的类型的持仓在平仓时区分优先级;

3)多个期货交易指令间可能存在自成交;

4)交易组合的敞口不能超过指定的敞口;

假设上述交易场景中的不同市场为:上海期货交易所和境外市场,交易的合约为黄金期货合约和境外XAU/USD的交易,现需要设计一个满足上述交易场景的程序化交易系统。

按照本文上述的“设计思路”,首先需要设计的是“交易执行”,即将交易信号转换为交易指令的算法模块。从对上述交易场景的描述中可知,需要在设计算法模块时将期货持仓对期货交易指令的影响和期货交易指令的自成交两个场景进行处理。其中,①期货持仓对交易期货指令的影响的依据是“公共组件”中的已完成的期货交易指令的最终“交易结果”,即市场反馈的期货交易指令执行结果,通过对期货交易指令执行结果的实时汇总,可以获得产生期货交易指令时当前的期货持仓量和期货不同类型的持仓。当产生期货交易指令是需要平仓时,判断优先平仓的期货持仓类型的持仓量是否满足期货需要交易的量,如在满足的情况,可直接生成一笔期货交易指令,如不满足,则需要将需要平仓的期货交易量拆分到多个期货交易指令中,每个指令执行的是平不同类型的持仓,所有期货交易指令中的平仓量总和为期货需要交易的量;②期货交易指令的自成交依据的是“公共组件”中的当前生命周期暂未结束的期货“交易指令”,通过将这些交易指令按交易方向、交易价格构建成一个订单簿,即可判断出该笔期货交易指令的价格是与当前订单簿中的期货交易指令存在自称交易的可能。至此,上述交易场中与期货交易指令相关的部分即可满足。

在“交易执行”生成完交易指令后就进入了下一个“事前风控”的环节,事前风控在设计上需要满足:①可以设置该种交易组合的敞口参数,且即时生效;②对交易信号转换后的全部交易指令作为一个整体进行检查。检查的依据是公共组件”中已完成的与该交易组合中牵涉到的合约交易指令的最终“交易结果”汇总后形成的敞口。只有在全部交易指令作为一个整体在当前设置的敞口参数下检查通过,才能传递给下一环节的“API接口”。

“API接口”在上述场景中至少会涉及到两个,一个是接入上海期货交易所的接口,可以采用直接用交易所提供的API接入,也可以采用CTP等市场主流的接口接入;另外一个是接入境外交易市场的交易接口,通常是FIX协议。这两套接口在系统中需要分别实现。

五、小结

本文简要探讨了程序化交易系统设计的一些思路,主要涵盖了作者对程序化交易基本概念的理解、交易执行过程的描述、设计思路的阐述以及设计过程中常见的挑战和考虑因素。希望通过本文,能够为读者在程序化交易系统设计方面提供一些参考意见。