首页 > 解决方案 > 在 Python 的算法交易中使用 IB / TWS 的最佳方式是什么?

问题描述

我想知道从性能的角度来看,在 Python 中使用 TWS/IB API 的最有效方式是什么?我想根据实时数据计算和更新我的策略(Python 有很多库,与我认为的 Java 相比可能会有所帮助)并基于发送买/卖订单。这些策略计算可能涉及相当长的处理时间,所以从这个意义上说,我正在考虑实现某种线程/并发(对于 Java,如果我理解正确,它使用 3 个线程,请参阅 *1)。

我知道有 IBpy(我认为它是相同的,只是为了方便起见包装了一些东西)。如果我理解正确的话,由于 Python 的并发限制,我遇到了 IB-insync 作为 Python 中线程的替代方案: https ://ib-insync.readthedocs.io/api.html, 它异步和单线程地实现了 IB API。

在此处阅读 Python 中的并发性: https: //realpython.com/python-concurrency/ 如果我理解正确,异步具有一些主要优势,因为 Python 是使用全局解释器锁 (GIL) 设计的(只有一个线程来控制 Python口译员)。但是,IB-insync 库也可能有一些限制(但可以通过修改代码来修复,如下所示):

例如,如果用户代码在计算中花费了很多时间,或者使用 time.sleep() 有很长的延迟,那么框架将停止旋转,消息累积并且事情可能会出错

如果用户操作需要很长时间,则可以将其外包给不同的进程。或者,可以进行操作,使其定期调用 IB.sleep(0); 这将让框架处理任何待处理的工作并在完成后返回。该操作应该知道当前状态可能已在 sleep(0) 调用期间更新。

为了引入延迟,永远不要使用 time.sleep() 而是使用 sleep() 。

多线程解决方案会像 Java 一样更好吗(我不知道是否有 Java Async 等价物可以与许多操作数据的简单工具/库结合使用)?还是我应该坚持使用 Python Async?也欢迎其他建议。关于 Python(和 Java)中的多线程,以下站点:

https://interactivebrokers.github.io/tws-api/connection.html

提及(*1):

API 程序总是至少有两个执行线程。一个线程用于向 TWS 发送消息,另一个线程用于读取返回的消息。第二个线程使用 API EReader 类从套接字读取并将消息添加到队列中。每次将新消息添加到消息队列时,都会触发通知标志以让其他线程现在有消息等待处理。在API程序的双线程设计中,消息队列也是由第一个线程处理的。在三线程设计中,会创建一个附加线程来执行此任务。

“The two-threaded design is used in the IB Python sample Program.py ...”这句话表明已经涉及到两个线程,这对我来说有点混乱,因为第二个参考文献提到 Python 是单线程的。

标签: pythonmultithreadingapiasynchronoustws

解决方案


Python 在技术上不是单线程的,你可以在 Python 中创建多个线程,但是有 GIL,它一次只允许一个线程运行,这就是为什么有时说它是单线程的!但是,GIL 处理它的效率如此之高,以至于它看起来不像是单线程的!我在 Python 中使用了多线程,它很好。GIL 处理切换和交换线程的所有编排,但这被证明对单线程程序很重要,因为速度提升很小,而在多线程程序中则有点慢。

我也在寻找用于 IB API 的多线程 SDK!我还没有找到一个,除了原生的,这对我来说有点复杂。而且 IB_Insync 不允许多线程:(

顺便说一句,我是 Stack Overflow 的新手,所以不要介意我......


推荐阅读