哪种编程语言最适用于算法交易系统?(上)

用户头像量化小精灵
2023-03-08 发布

哪种编程语言最适用于算法交易系统?(下)

2)硬件和操作系统
硬件操作的策略可以显著提升算法的效率。这种情况并不仅仅局限在交易中,如果软件和系统没有选好,电脑也会出现一定程度的故障。这个问题需要我们慎重考虑。
桌面电脑的使用和维护都很容易,特别是像 Windows 7/8, Mac OSX 和 Ubuntu 这样的新型操作系统。不过,台式机系统也有着许多不足之处。首先,针对桌面电脑的 OS 版也许会被重启/修复,而且 GUI 的需求也会占用大量的计算资源。在家里或办公室办公时,硬件的应用会造成网络的流畅度和供能的问题。台式机的最大优势在于它可以以相当速度的远程专用服务器(或基于云的系统)的一小部分成本购买大量的计算能力。尽管一般情况下,私有的或者基于云计算的计算机要比台式机更贵,但是它可以支持更多的复杂的架构,比如自动化的资料备份,从而可以更直观地保证系统的正常工作和远程监视。
在 Windows 中,这一般是通过GUI,由 RDP (Remote Desktop Protocol)来完成的。SSH (Secure Secure)指令在基于Unix的系统上进行使用。Unix 上的服务架构基本上都是以指令为基准的,这会使以 GUI 为基础的程式设计,例如 MatLab 或 Excel 都无法使用。
就像在资本市场上说的那样,共享地址服务器就是一个专门的服务器,它可以降低交易规则的滞后程度。在一些需要低延时的业务战略中,这一点是必不可少的。

3)灵活性测试
一个缺乏灵活性的体系很容易导致亏损,这意味着当一个体系遭遇一些少见情况时,例如经纪公司破产,突发过度波动,云服务器供应商地区停电,误删等,会对系统造成负面影响。把调试,日志记录,备份,高可用性和监测工作作为一个系统的关键部件是非常重要的。在任何复杂的自定义量化交易应用程序中,我们需要至少花50%的开发时间在调试、测试和维护上。
几乎每一种程式设计语言都包含了相应的调试程序,或是使用了高效的第三方选择。从本质上讲,调试器允许在程序执行时,在代码中插入任意断点。这些断点会暂时停止程序执行,以检查系统的状态。调试的最大的优点是能够在已知故障发生前对带码的表现进行分析研究。
在对程序的故障进行分析时,调试是非常关键的一环。但是,他们被更多地用于 C++或者 Java 等汇编语言中,而像 Python 之类的解释性语言往往更容易进行测试,原因是 LOC 减少,繁杂的声明也就减少了。
软件开发中的测试是指将已知参数和结果应用于代码库中的特定功能、方法和对象的过程,以模拟行为并评估多个代码路径,从而保证程序能够正常运行。最新的例子是驱动测试开发(Test Driven Development),而其中测试代码是在没有运行的情况下针对指定的接口开发的。在实际代码库完成之前,所有测试都不会通过。而由于此代码的编写是为了“填充空白”,测试最终会全部通过,此时软件开发应该停止。
在制作软件的过程中,我们必须保留详细的日志。日志记录是指将与系统的执行行为有关的,具有不同严重程度的消息输出到平面文件或数据库的过程。日志是查找程序执行阶段中异常情况的首要资料,但遗憾的是,日志记录也存在缺陷,因此在设计时应该对日志系统进行全面的分析。
微软视窗和 Linux 都具有广泛的系统日志记录功能,且大部分编程语言通常都会提供符合大部分情况的标准日志记录库。我们最好将这些日志记录统一集中起来以备以后的研究,这样做通常会提升我们的绩效或者降低我们的误差,从而给我们的交易带来客观的收益。
系统的日志记录会告诉我们之前发生了什么,而监控应用可以让我们了解现在的实时情况。我们应该对整个体系进行全面的监测,诸如磁盘使用率、可用内存、网络带宽和 CPU 使用率等系统级指标都会提供基本的负载信息。
此外,我们还应该对各个产业/市场的交易指数进行持续监控,例如非正常价格/成交量、突然快速提现以及帐户风险敞口。另外,我们应当建立一个阈值系统,在某些指数被破坏时发出警报,并根据指数的严重程度选择不同的警报方式(电子邮件、短信、电话)。

7. 语言的选择
现在,大量关于开发、定制高性能算法交易系统时出现的各种情况的细节已经被提供。我们的下一阶段是讨论编程语言的分类。
1)语言分类
算法交易中广泛运用的编程语言有两周,分别是静态语言,或动态语言。在编译期间,静态语言会执行类型检查(例如整数,浮点,自定义类等等)。静态语言的代表有 C++、 Java 等。动态语言在代码运行时执行类型检查。这些语言包括Python、Perl和JavaScript等。
对于高度数值化的系统,如算法交易引擎,编译时的类型检查可能非常有益,因为它可以消除许多导致数值错误的bug。但是,类型检测并不能捕获所有问题,在这里,我们需要进行例外处理来解决许多非预期的操作。为必须处理意外操作“动态”语言通常会导致运行错误,在这种情况瞎, TDD和单位试验的理念就产生了,并且,如果能够恰当地进行,那么它们往往要比单独的编译中检查更加可靠。
静态语言另外一个优点是,编译器能够进行许多优化,而这些优化对于动态语言来说是不可行的。事实上,许多动态类型语言效率低下的部分原因是某些对象必须在运行时进行类型检查,从而影响效能。像 NumPy/SciPy 这样的动态语言库通过在数组中强制执行类型来减轻这种问题。

2)是否开源?
算法交易开发人员最大的可用选择之一是使用专有(商业)还是开源技术。两者各有利弊,因此需要注意语言支持的程度,社区语言活动,安装和维护,文档质量,以及使用/维护成本。
Microsoft.NET堆栈(包括Visual C++、Visual C#)和MathWorks的MatLab是开发自定义算法交易软件的两大专有选择。这两种工具都在金融领域进行了大量的实战检验,前者构成了投资银行交易基础设施的主要软件堆栈,后者被大量用于投资基金内的量化交易研究。
Microsoft和MathWorks都为其产品提供了广泛的高质量文档。此外,每个工具社区都非常大,它们都有活跃的网络论坛。NET 可以用 C++, C#, VB 等各种不同的语言进行内部聚合。MatLab 还为几乎所有量化研究领域提供了大量的插件和类库。
但是,缺陷同样存在。无论使用哪种软件,对于一个单独的交易者来说,成本都是非常可观的(尽管微软确实免费提供了Visual Studio的入门版)。微软的软件互相之间协作流畅,但对外部代码的集成却不太友好。Visual Studio 也必须在微软视窗上运行,因此其表现与经过优化的 Linux 系统相比有很大差距。
MatLab还缺少一些关键插件,如Interactive Brokers API的良好包装,这是少数几个适合高性能算法交易的broker之一。专有产品最大的问题是源代码缺少可行性。这就意味着,当真正需要高性能时,这两种产品的吸引力都会大打折扣。

开源工具成为工业级工具已经有一段时间了。许多替代资产空间在高性能生产角色中广泛使用开源Linux、MySQL/PostgreSQL、Python、R、C++和Java。然而,它们远不仅限于此领域。特别是Python和R包含大量的数字库,可以执行几乎任何类型的数据分析,执行速度与编译语言相当,但有一些注意事项。另外,他们还支持以控制台为基础的交互发展,因此可以迅速地缩短迭代进程。

开源工具通常缺乏专门的商业支持合同,并且在高限制用户界面系统上运行最佳。经典的Linux服务器(如Ubuntu)通常完全面向命令行。另外, Python 和 R 在特定的执行过程中会非常缓慢,因此有一些机制可以与C++集成以提高执行速度,但这需要一些多语言编程的经验。
8. 结语
显而易见,算法交易系统的编程语言选择并不简单。主要的考虑因素有性能、开发便利性、弹性和测试、关注点分离、熟悉度、维护、源代码可用性、版权成本和库的成熟度。
分离体系结构的好处是,当需求发生变化时,它允许为交易栈的不同方面“插入”语言。交易系统是一个不断发展的工具,任何语言选择都可能会随着它的发展而发展。

评论