元旦前开始,期粉儿推出“期权做市商系统”的系列文章,作为送给各位读者的新年礼物。这一系列文章均出自本平台签约作者,中粮祈德丰首席期权量化及架构师袁煜华先生之笔。袁老师学富五车不止,且乐于助人,江湖人称“期权相关问题的百科全书”——百全老师,昵称百泉。 关注本公众号在历史消息中可以查看《期权做市商系统的选择》、《期权做市商系统的硬件架构》以及《期权做市商系统的软件描述(1/5)—操作系统的选择》。
几乎所有的自建的做市商系统,或者至少是系统的核心模块,是使用C/C++编写的。其他可能用到的语言有C#和Java。Linux系统下虽然有C#的实现(Mono),但是并不完全,因此C#还是仅见于Windows系统平台。C/C++和Java是跨平台的,Linux和Windows下各有实现。 相比C#和Java,C/C++更接近系统底层,能够让程序员编写出运行效率更高的代码,比如C/C++允许程序员使用指针,甚至将一类指针强制转换为另一类指针,直接对任意内存位置进行操作。当然我们不是说使用C/C++编写的应用程序一定比使用C#或者Java编写的运行效率高,比如一个C++初学者写的程序就不一定会比一个熟练的Java程序员写出的程序运行得快,相反的,由于C/C++过于接近底层,初学者往往只看到功能的强大而忽视了同时存在的危险性,使得C/C++程序出现错误的可能性要高于C#和Java。我们只是说在开发人员具备相应能力的前提下,C/C++比C#或Java提供了更加多的可以优化的地方,而作为补偿,C#和Java提供了开发的便利。一般来说,实现同样功能的程序,使用C/C++开发的结果比使用C#或Java开发的结果运行速度更快,占用系统资源更少,但是开发和调试的时间更长。这是由编程语言的实现机制决定的,C#是基于微软.NET框架的,Java是基于Java虚拟机的,而C/C++没有类似的依赖性。C#和Java能够帮助程序员快速开发的一个重要原因是很多在C/C++开发中需要程序员自己处理的事项在C#和Java的开发中交由框架去完成了,比如垃圾回收,当程序发现一些分配的内存不会再被使用了,它会自动将其释放,为其它任务腾出空间,而在C/C++中,程序员必须主动要求去释放不再需要的内存。对期权做市商来说,这种将一些任务交由框架去完成的做法,是一个潜在的问题,因为它无法控制。比如标的资产的价格发生了波动,我们重新计算了理论价格,准备更新一大批报价,但是此时系统正在进行垃圾回收,更新报价的请求必须等待,这将直接负面影响做市商的盈亏。因此,C#或Java不适合作为期权做市商系统核心模块的编程语言。 另一方面,虽然C/C++可以编写高效的代码,但是它把更多的责任推到了开发者这边,对程序员有着更高的要求,以垃圾回收为例,如果没有释放不再需要的内存会造成内存泄漏,严重的情况下会导致系统崩溃,这也是C/C++开发调试周期较长的原因。大家可能注意到我们一直将C/C++并列,既然C++是C的扩展集为什么不单列C++呢?这是因为我们上面提到做市商系统是基于Linux的,会使用到部分POSIX的C接口,而这些是不在C++标准中的,比如说在C++11标准引入线程之前,C++标准是不包含线程的,Linux平台下多线程的实现依赖于POSIX的pthread,即使在现在C++11已经实现的情况下,pthread仍然提供了C++11标准中多线程所不具备的一些功能。 另外,C++对C的扩展主要表现在两方面,一是面向对象编程,二是模板,这两项特性在做市商系统中都有广泛的应用。比如行情和报价的接口,不同的交易所大同小异,这是一个经典的可以使用继承的地方。更进一步,虽然我们可以使用虚函数来实现针对不同的交易所的接口,但是实际使用过程中,我们程序运行时总是已经知道连接的是哪一个交易所,不需要每笔数据都判断对应哪个交易所,用C++的术语说,我们不需要运行时的动态多态,这时候我们可以使用CuriouslyRecurring Template Pattern利用模板来实现编译时的静态多态从而提高运行效率。在使用C++的一些特性提高系统性能的同时,我们也要注意避免使用一些功能,比如C++对异常的处理相当复杂,当一个函数扔出异常的时候,需要逐级向上追溯所有调用函数,一方面提高了代码的阅读难度,另一方面增加了编译后可执行文件的体积导致运行效率降低,考虑到做市商系统本身已经是一个相对庞大比较复杂的系统,所以我们会禁止使用C++的异常,而在处理错误时使用C风格的错误代码。 关于编程语言,最后我们介绍一下图形界面。由于图形界面对执行效率的要求相对较低,它们可以使用C#或Java来编写,这时候可以体现这两种语言的快速开发优势。当然效率要求相对较低是指人眼和人脑的反应相对于做市商系统核心模块内部微秒乃至纳秒级的延迟而言,如果交易员视觉上感觉到延迟也是一样不可接受的。如果追求效率,图形界面也可以采用C++,Qt是使用C++编写的一个被广泛使用的图形库,功能强大而高效。同时使用C++编写图形界面和核心模块也能使得两者之间的衔接更加自然和流畅。 (期权做市商通讯协议、多进程与多线程的选择、关于数据库和日志记录等内容,将在后期陆续推出。)
|