由于发布了个公开课程,常常可以见到一些小白问题。今天闲聊一下优化代码结构的重要性
对于套利来说,最重要的东西无非2个,1。资金利用率。2、抢单速度。
抢单速度一般可以依靠交易所的就近服务器,买更好的网络等问题解决。但是实际上对于大部分新手来说,仅仅把代码结构做优化,就可以让策略快几十毫秒,完全不逊则于换一个更好的网络的效果。然而成本却低得多。
不过当只有一个交易对时,优化代码结构往往提高的速度1ms都不到,几乎看不出区别。
而资金利用率的提高,往往需要同一笔资金同时观测多个交易对来实现,那么就会造成逻辑循环次数增加,此时优化代码结构的好处就显而易见了。一般多交易所多交易对轮询的复杂度是O(n!),通过优化完全可以降低到O(n!/(m!) )甚至O(n*m)(m<n)当交易对达到数百个,交易所同时观测数十个时。
举一个我经常遇到的问题,比方说有两条套利路径A-C和A-B-C, 两条路径分别需要计算两次,一次计算路径可带来的利润,假设为p1和p2,一次计算路径具体每个交易所及其交易对具体需要提单的price和amount。
最常见到的一种写发,是先写了一个函数,这个函数的功能是计算利润,具体提单price和amount。然后循环调用这个函数,获取了每一条路径的profit以后,选择profit最大的进行交易。
很明显,我们在比较时只需要计算profit,没必要一开始就把提单价格和amount进行计算了。
所以在优化时,可以拆分出profit和提单2个函数。先循环调用profit的函数,得到每一条路径的profit,然后再选择profit最大的进行交易。这样在逻辑上提单的函数就从每一次循环都调用,变成了只调用一次。时间复杂度从O(2n)变为了O(n+1),n为套利路径总数。
然后如果对代码进一步分析,发现通常情况下,因为有别的套利工作者的存在,所以一旦某一条路径存在利润,那么往往当时就被别人套利了。所以很难存在多条路径同时存在利润的情况。
所以我们可以进一步优化策略,设置一个循环,循环里加if语句,如果发现某个路径存在profit,则break出来,然后计算这个路径的提单数量和价格。
那么复杂度就从O(n+1)进一步简化为了O(m+1),m<n。当各交易所机会均等时,m约等于n/2即复杂度降低为O(n/2+1)
即通过简单的拆分函数,分析逻辑优化结构,就可以把时间复杂度从O(2n)降低到了O(n/2+1)。
实际在编写代码时,有大量的场景可以优化,我在写代码时经常写完以后,经常发现优化逻辑时存在可以把某个O(n!)的优化到O(n*(n+1))的可能性。有时候甚至能把一个几百毫秒才能执行完的逻辑,优化到1ms以内。
作为一个稍微付出一些时间,就能大幅降低策略轮询间隔的事,还是很建议大家优化一下代码结构。
骨刀 想请教一下,套利时如何高效地避免出现单腿的情况?
子楠 挂单到达交易所的延迟
allez-z 延迟是指深度数据的延时吗?
子楠 记录延迟,超过某一个值当次套利不进行。还有就是按照延迟高地排序挂单