【问题标题】:Using IBrokers and R, what is the appropriate way to retrieve live trading data for multiple stocks?使用 IBrokers 和 R,检索多只股票的实时交易数据的合适方法是什么?
【发布时间】:2020-09-01 01:54:23
【问题描述】:

显然,交易者可以在实时交易时段轻松监控 100 支股票。

以下代码仅检索 30 多个股票代码的实时数据:

tws <- twsConnect()
sym <- c("AAPL", "MSFT", "GOOGL", "TWTR", "MSFT", "BABA","JD", "WLTW", "DIA",
         "QQQ", "VOO", "MOMO","IBB", "VOOG", "VYM","VNQ", "BIDU", "BA",
         "AYX", "ROKU", "UBER","ACB", "CRON", "TTD","BAM", "AZO", "JPM",
         "WMT", "GRUB", "TSN")
contracts <- lapply(sym, function(x) twsEquity(x, 'SMART','ISLAND'))

system.time(
last_prices <-   lapply(contracts, function(x) reqMktData(tws, 
                                                          Contract = x,
                                                          snapshot = TRUE))

)

这是性能指标:

2 -1 2104 Market data farm connection is OK:usfarm 
2 -1 2106 HMDS data farm connection is OK:ushmds 
2 -1 2158 Sec-def data farm connection is OK:secdefil 
   user  system elapsed 
  0.408   0.367  46.727 
Warning message:
In .Internal(gc(verbose, reset, full)) :
  closing unused connection 6 (->localhost:7496)

这显然是不可接受的。检索仅 30 多只股票的实时数据不应超过 40 秒以上。

使用 quantmod::getSymbols,这个操作基本上是即时的。

我做错了什么?

我有一个 8 核 XEON 处理器。也是最新款之一。不可能是我的硬件。

【问题讨论】:

    标签: r ibrokers


    【解决方案1】:

    Ibrokers 仅是单线程的。这就是为什么某些 ibrokers 功能会一直运行直到您中断 R 会话的原因。这基本上是一个 R 问题,因为 R(目前)是单线程的。您可以通过创建新线程来模拟这一点,因为 ib 可以处理这个,但这需要异步语言,而不是 R。例如,socketConnection 无法处理并行(异步)请求,您需要设置一个完整的每个线程的新连接。可能,但随后正确跟踪从 ib 返回的消息变得更加困难。

    reqMktData 函数仅接受 1 个代码(独立于语言),您需要遍历代码。这个速度在其他语言中也往往是一个问题,开销、ib 服务器的速度、延迟等等等。但是将它与你正在使用 quantmod 进行的 yahoo 检索进行比较并不完全相同。在 ib 端进行了很多检查,比如它是否是一条正确的消息,并且在向您显示数据之前需要对被发送回的消息进行解码。所有这些都会增加开销。

    通常,您会同时请求多达 100 个代码的 reqMktData (snapshot = FALSE) 市场数据流,并实时检查流中的最新价格,但随后您需要使用 python、c# 或 c++(或 java )。此外,您还需要区分代码,这意味着使用 requestid 或其他识别信息。对于 python,请参见 ib_insync 库。信息here

    有关 ib api 问题的更多信息,请查看twsapi group 以获取有关 api 的最新错误/问题。 R 在那里没有太多代表,因为它仍然在一个非常旧的 api 版本上。还要检查stackoverflow 上的interactive-brokers 标签。这也可能会给你一些想法/帮助。

    【讨论】:

    • 那么有没有解决办法呢?如果无法及时检索实时数据,如何构建自动交易系统?
    • 及时定义。有很多人使用 ibapi 或类似的 ib_insync 来拥有他们的交易系统。但是不要指望像 hft 人那样的速度。就像我写的那样,如果你想一直查看价格,你需要一个异步系统。 Java、.net、c#、c++、python,都有这些。 R可以工作,也有人这样做,但他们不依赖最后一秒的数据信息,仅在下订单检查滑点时。
    • 您相信这个解决方案会奏效吗?我启动了 10 个不同的 R 进程。我使用其中的 9 个来不断地从 TWS 检索数据并写入一个公共文件。剩下的其他进程将不断地从这个公共文件中读取。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-02
    • 1970-01-01
    • 2011-04-13
    相关资源
    最近更新 更多