在 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 是单一的-线程。

解决方法

Python 不是技术上是单线程的,你可以在 Python 中创建多个线程,但是有 GIL,它一次只允许一个线程运行,这就是为什么有时说它是单线程的-线程!但是,GIL 处理它非常有效,以至于它似乎不是单线程的!我在 Python 中使用了多线程,它很好。 GIL 处理所有切换和交换线程的编排,但事实证明这对单线程程序来说意义重大,因为速度提升很小,而在多线程程序中则有点慢。

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

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