C++ 在高频交易中的应用

在高频交易中,我们需要在最短的时间内对市场上的行情进行反应,这时候就真正体现“时间就是金钱”那句古话,每多一个毫秒,甚至微秒的延迟,就意味着更多的风险。
 

为了应对以上情况,我们必须要在极短的时间内在同一个时间对每个合约进行定价,而计算一个期权的理论价格并不是一件简单的事情,对计算性能的要求非常高。不仅如此,对于如何能够更加准确地计算“隐含波动率”,同样具有极高的挑战性。

 

如何来提高计算速度,降低延迟?

要控制和降低延迟,首先要能准确测量延迟。因此需要比较准的钟,带GPS或原子钟primary standard的NTP服务器是少不了的。而且就算用了NTP,同一机房两台机器的时间也会有毫秒级的差异,计算延迟的时候,两台机器的时间戳不能直接相减,因为不在同一时钟域。
 

解决办法是设法补偿这个时差。另外,不仅要测量平均延迟,更重要的是要测量并控制长尾延迟,即99百分位数或99.9百分位数的延迟,即使sell side,系统偶尔慢一下被speculator利用也会亏钱。

 

 

具体从哪些方面可以降低延迟?

普通的C++服务程序,内部延迟(从进程收到消息到进程发出消息)做到几百微秒(即亚毫秒级)是不需要特殊的努力的。如果瓶颈在CPU,那么最有效的优化方式是“强度消减”,即不在于怎么做得快,而在于怎么做得少。

 

网络延迟分传输延迟和惯性延迟,通常局域网内以后者为主,广域网以前者为主。前者是传送1字节消息的基本延迟,大致跟距离成正比,千兆局域网单程是近百微秒,伦敦到纽约是几十毫秒。这个延迟受物理定律限制,优化办法是买更好的网络设备和租更短的线路。

 

惯性延迟跟消息大小成正比,跟网络带宽成反比,如果无法改变带宽,可以减小消息长度来降低延迟。

 

另外,延迟和吞吐量是矛盾的,通常吞吐量上去了延迟也会跟着升上去,因此控制负载是控制延迟的重要手段。延迟和资源使用率也是矛盾的,做高吞吐的服务程序,希望把CPU和IO都跑满,资源都用完。而低延迟的服务程序的资源占用率通常很低。实际上平时资源使用率低是为了准备应付突发请求,“排队”就意味着等待,等待就意味着延迟。