跳转到主要内容

Deephaven的Interactive Brokers集成

项目描述

deephaven-ib

Deephaven Data Labs Logo

Build CI

Deephaven的Interactive Brokers集成。

Interactive Brokers是量化金融界非常受欢迎的经纪商,拥有约2000亿美元的客户权益。量化分析师和对冲基金经常选择Interactive Brokers,因为它具有低交易成本和便于自动化交易的API。由于其最低账户余额要求低,它也是个人投资者的一个有吸引力的选择。

Deephaven是世界上最大家对冲基金、银行和交易所量化交易的后台实时查询引擎。Deephaven使处理实时数据变得简单,并简化了非常简洁且易于阅读的代码。通过Deephaven,量化分析师可以快速创建新模型并投入生产,交易员可以监控市场和他们的投资组合,经理可以监控风险。

deephaven-ibInteractive Brokers 的低成本交易与 Deephaven 社区核心 的分析能力和易用性相结合,从而产生一个开放、量化的交易平台。基本上,它提供了一个开放平台来构建量化交易策略和定制分析。您可以构建一些简单的东西,比如投资组合监控器,或者一些复杂的东西,比如完全自动化的、多策略量化对冲基金。

deephaven-ib 支持几乎所有常见的交易所交易产品。这些包括

  • 股票
  • 共同基金
  • 期权
  • 期货
  • 期货期权
  • 指数
  • 债券
  • 外汇(Forex 或 FX)
  • 加密货币
  • 差价合约(CFDs)
  • 认股权证
  • 商品

Overview Image

警告:自动化交易可能会非常快速地出错。在将交易投放到可能亏损的账户之前,请先在模拟交易账户中验证您的代码。如果您认为这种情况不会发生在您身上,请阅读 Knight Capital 的兴衰。在 设置 部分展示了防止意外提交交易的配置。

有关更多详细信息,请参阅

有关 deephaven-ib 的帮助

有关 Deephaven 指南,请参阅

有关 Deephaven 的帮助

Deephaven 中可用的数据

Deephaven 查询引擎建立在表的概念上,类似于 Pandas 数据框。
与 Pandas 数据框不同,Deephaven 表可以随着新数据的流入而动态更新。随着输入表的变化,Deephaven 查询引擎确保所有查询(无论多么复杂)都保持最新。

一旦数据转换为 Deephaven 表,就可以在查询中使用任何其他 Deephaven 表。

IB TWS 数据

来自 IB Trader Workstation (TWS) 的数据可以通过使用 deephaven-ib 作为 Deephaven 表来访问。随着数据流进来,这些表和使用的查询将自动更新。

这些表包括

  • 通用
    • errors:错误日志
    • requests:向 IB 的请求
  • 合同
    • contract_details:描述感兴趣合同的细节。自动填充。
    • contracts_matching:与 request_contracts_matching 提供的查询字符串匹配的合同。自动填充。
    • market_rules:表示合同可以交易的价格增量的市场规则。自动填充。
    • short_rates:卖空证券的利率。如果 download_short_rates=True 则自动填充。
  • 账户
    • accounts_managed:由 TWS 会话登录管理的账户。自动填充。
    • accounts_family_codes:账户家族。自动填充。
    • accounts_groups:账户组。自动填充。
    • accounts_allocation_profiles:账户的分配配置文件。自动填充。
    • accounts_value:账户价值。自动填充。
    • accounts_overview:账户详情概述。自动填充。
    • accounts_summary:账户摘要。自动填充。
    • accounts_positions:账户持仓。自动填充。
    • accounts_pnl:账户 PNL。自动填充。
  • 新闻
    • news_providers:当前订阅的新闻来源。自动填充。
    • news_bulletins:新闻快讯。自动填充。
    • news_articles:通过 request_news_article 请求的新闻文章内容。
    • news_historical:通过 request_news_historical 请求的历史新闻标题。
  • 市场数据
    • ticks_price:通过 request_market_data 请求的价格值实时tick市场数据。
    • ticks_size:通过 request_market_data 请求的大小值实时tick市场数据。
    • ticks_string:通过 request_market_data 请求的字符串值实时tick市场数据。
    • ticks_efp:通过 request_market_data 请求的实物交换(EFP)值实时tick市场数据。
    • ticks_generic:通过 request_market_data 请求的通用浮点值实时tick市场数据。
    • ticks_option_computation:通过 request_market_data 请求的期权计算实时tick市场数据。
    • ticks_trade:通过 request_tick_data_historicalrequest_tick_data_realtime 请求的成交价格实时tick市场数据。
    • ticks_bid_ask:通过 request_tick_data_historicalrequest_tick_data_realtime 请求的买价和卖价实时tick市场数据。
    • ticks_mid_point:通过 request_tick_data_historicalrequest_tick_data_realtime 请求的中点价格实时tick市场数据。
    • bars_historical:通过 request_bars_historical 请求的历史价格条。实时条随新数据的到来而变化。
    • bars_realtime:通过 request_bars_realtime 请求的实时价格条。
  • 订单管理系统(OMS)
    • orders_submitted:提交的订单 针对客户的ID。客户ID为0包含手动输入的订单。自动填充。
    • orders_status:订单状态。自动填充。
    • orders_completed:完成的订单。自动填充。
    • orders_exec_details:订单执行详情。自动填充。
    • orders_exec_commission_report:订单执行佣金报告。自动填充。

大多数表格都包含一个 ReceiveTime 列。此列表示数据被 deephaven-ib 接收的时间。它不代表事件发生的时间。

您的数据

您可能想将来自其他来源的数据与您的IB数据合并。Deephaven 可以从

运行 deephaven-ib

按照以下步骤运行一个 DeephavenInteractive Brokers 系统。

这些说明会生成一个包含 deephaven-ibDeephavenibapi 的虚拟环境。有关使用pip安装的Deephaven的更多详细信息,请参阅 Deephaven pip 安装指南

:exclamation: Windows用户 必须 在WSL中运行这些命令。

设置IB

要设置和配置系统

  1. 按照 TWS 安装说明 启动 IB Trader Workstation (TWS)

  2. 启动 IB Trader Workstation (TWS)

  3. IB Trader Workstation (TWS) 中,点击右上角的齿轮。
    API->设置 中,确保

    • "启用ActiveX和Socket客户端"被选中。
    • "仅允许来自localhost的连接"没有被选中。
    • 选择“只读API”以防止从 deephaven-ib 提交交易。

    此外,请注意“套接字端口”的值。在连接 deephaven-ib 时需要它。

  4. 【对于纸面交易】登录到 Interactive Brokers 网络界面

  5. 【对于纸面交易】在 Interactive Brokers 网络界面 中,导航到 账户->设置->纸面交易账户 并确保“将实时市场数据订阅与纸面交易账户共享?”设置为“是”。

  6. 一旦 deephaven-ib 启动(见下文),接受来自 IB Trader Workstation (TWS) 的连接。 (可能不是所有会话都需要。)

虚拟环境

Interactive Brokers 不通过 PyPI 提供其 Python 轮子,并且轮子不可重新分发。因此,安装 deephaven-ib 需要一个 Python 脚本在安装之前本地构建轮子。该脚本将 deephaven-ibibapideephaven 安装到环境中。

为了保持开发环境的整洁,该脚本为 deephaven-ib 创建了一个虚拟环境。按照以下说明,使用 ./dhib_env.py 脚本构建和激活虚拟环境。

可以使用 --create_venv false--path_venv <path> 选项使用现有的虚拟环境。

如果您希望在没有虚拟环境的情况下直接将安装到系统 Python 中,您可以使用 --use_venv false 选项来使用 ./dhib_env.py

构建虚拟环境

  1. 安装 Java 17 并设置适当的 JAVA_HOME 环境变量。

  2. 检出 deephaven-ib

    git clone git@github.com:deephaven-examples/deephaven-ib.git
    
  3. 切换到 deephaven-ib 目录

    cd deephaven-ib
    
  4. 构建 deephaven-ib 虚拟环境

    首先,安装运行脚本所需的依赖项

    python3 -m pip install -r requirements_dhib_env.txt
    

    查看所有选项

    python3 ./dhib_env.py --help
    

    从 PyPi 安装 deephaven-ib 的最新生产版本,以及发布指定的 ibapideephaven 版本

    python3 ./dhib_env.py release
    

    从源安装 deephaven-ib 的最新开发版本,以及默认的 ibapideephaven 版本

    python3 ./dhib_env.py dev
    

    在 PyCharm 中创建 deephaven-ib 的 venv:(这不会安装 deephaven-ib,但它会安装默认的 ibapideephaven 版本。)

    python3 ./dhib_env.py dev --install_dhib false
    
  5. 在日志中注意虚拟环境的位置。它将在类似 ./venv-<versiondetails> 的目录中。

激活虚拟环境

要激活虚拟环境

source ./venv-<versiondetails>/bin/activate

一旦虚拟环境被激活,pythonpip 将使用虚拟环境的 Python 和软件包,包括运行 deephaven-ib 所需的一切。

关闭虚拟环境

要关闭虚拟环境

deactivate

一旦虚拟环境被关闭,pythonpip 将使用系统的 Python 和软件包。 deephaven-ib 将不可用。

使用 deephaven-ib

要使用 deephaven-ib,您需要启动一个 Deephaven 服务器并连接到 IB Trader Workstation (TWS)。您还可以选择使用 Deephaven IDE 来可视化数据和运行查询。

启动 Deephaven

首先,启动一个 Deephaven 服务器。此服务器将用于处理数据和运行查询。

此处文档和示例展示了使用 Deephaven 的 预共享密钥(PSK)认证,密码为 DeephavenRocks!。其他类型的 Deephaven 认证也可以使用。
有关详细信息,请参阅 Deephaven 文档

选项 1:使用 deephaven 命令

启动 deephaven 服务器最简单的方法是在命令行中使用 deephaven。在创建虚拟环境时添加了 deephaven 命令。它适用于 Deephaven 版本 >= 0.34.0

此命令将以 4GB 内存和密码 DeephavenRocks! 启动 deephaven 服务器。它还将自动在网页浏览器中打开 Deephaven IDE。

source ./venv-<versiondetails>/bin/activate
deephaven server --jvm-args "-Xmx4g -Dauthentication.psk=DeephavenRocks! -Dstorage.path=~/.deephaven"

选项 2:使用 Python 脚本

另一种启动 deephaven 服务器的方法是使用 Python 脚本。这适用于所有版本的 Deephaven,并可用于在服务器中填充查询。
有关使用此方法运行 Deephaven 的更多详细信息,请参阅 Deephaven pip 安装指南

要启动具有虚拟环境的 Python,请运行

source ./venv-<versiondetails>/bin/activate
python

一旦 Python 运行,您可以使用以下脚本启动 deephaven 服务器

import os
from time import sleep
from deephaven_server import Server

_server = Server(port=10000, jvm_args=['-Xmx4g','-Dauthentication.psk=DeephavenRocks!','-Dstorage.path=' + os.path.expanduser('~/.deephaven')])
_server.start()

# You can insert queries here

# Keep the server running
while True:
    sleep(1)

:warning>这些 deephaven 服务器命令 必须 在导入 deephavendeephaven_ib 之前运行。

在脚本中的指定位置,您可以放置希望在服务器启动时运行的查询。
这可以是连接到 IB Trader Workstation (TWS)、请求数据、分析数据、可视化数据或进行交易的相关代码。
有关更多详细信息,请参阅下面的示例。

启动 Deephaven IDE

一旦 Deephaven 服务器启动,您就可以启动 Deephaven IDE。如果您使用 deephaven 命令启动服务器,Deephaven IDE 将自动在您的网页浏览器中打开。

Deephaven IDE 是一个基于网页的界面,用于与 Deephaven 一起工作。在 IDE 中,您可以运行查询、创建笔记本和可视化数据。您还可以运行下面的所有示例代码和 ./examples 中的更复杂示例。

要启动 Deephaven IDE,请在您的网页浏览器中导航到 http://localhost:10000/ide/。Chrome、Edge、基于 Chrome 的和 Firefox 浏览器都受支持。Safari 浏览器不受支持。您的认证方式将取决于认证的配置方式。
在此处的示例中,您将使用密码 DeephavenRocks!

连接到 TWS

所有 deephaven-ib 会话都需要首先创建一个用于与 IB Trader Workstation (TWS) 交互的客户端。

host 是要连接的计算机。当在本地使用 deephaven-ib 时,host 通常设置为 localhost。当在 Docker 内使用 deephaven-ib 时,host 应设置为 host.docker.internal

portIB Trader Workstation (TWS) 进行通信的网络端口。此值可在 IB Trader Workstation (TWS) 设置中找到。默认情况下,生产交易使用端口 7496,模拟交易使用端口 7497。有关详细信息,请参阅 设置TWS 初始设置

read_only 是一个用于启用交易的布尔值。默认情况下 read_only=True,阻止交易。使用 read_only=False 可启用交易。

is_fa 是一个布尔值,用于指示账户是否为财务顾问(FA)账户或普通账户。使用 is_fa=True 请求 FA 账户配置详细信息。默认情况下 is_fa=False
在非 FA 账户上使用 is_fa=True 时,一切应该正常,但会有错误信息。在 FA 账户上使用默认的 is_fa=False 时,FA 账户配置将不会填充到 accounts_groupsaccounts_allocation_profilesaccounts_aliases 等表格中。

order_id_strategy 是用于获取新订单 ID 的策略。订单 ID 算法在执行时间、支持多会话并发以及避免 TWS 错误方面存在权衡。

  • OrderIdStrategy.RETRY(默认)- 每次需要时从 TWS 请求新的订单 ID。如果 TWS 响应较慢,则重试。这通常可以避免 TWS 不总是响应的 bug。
  • OrderIdStrategy.BASIC - 每次需要时从 TWS 请求新的订单 ID。不重试,如果 TWS 不响应,则可能导致死锁。
  • OrderIdStrategy.INCREMENT - 使用 TWS 发送的初始订单 ID 并在每次请求时递增值。这很快,但可能因 TWS 连接的多个并发会话而失败。

对于允许交易的读写会话

import deephaven_ib as dhib

client = dhib.IbSessionTws(host="localhost", port=7497, read_only=False)
client.connect()

对于不允许交易的只读会话

import deephaven_ib as dhib

client = dhib.IbSessionTws(host="localhost", port=7497, read_only=True)
client.connect()

对于不允许交易的只读财务顾问(FA)会话

import deephaven_ib as dhib

client = dhib.IbSessionTws(host="localhost", port=7497, read_only=True, is_fa=True)
client.connect()

在调用 client.connect() 之后,TWS 要求接受连接。![连接状态](https://pypi-camo.freetls.fastly.net/3e38c4ac8f0c19d5bc28fb038ef79ef0b7bd6930/68747470733a2f2f7261772e67697468756275736572636f6e74656e742e636f6d2f64656570686176656e2d6578616d706c65732f64656570686176656e2d69622f6d61696e2f646f63732f6173736574732f6163636570742d636f6e6e656374696f6e2e706e67)

获取数据

IB Trader Workstation (TWS) 数据存储在 deephaven-ib 客户端中,作为两个表格字典

例如,可以通过以下方式获取包含所有发送到 IB Trader Workstation (TWS) 请求的 requests 表:

requests = client.tables["requests"]

要在 Deephaven IDE 中显示所有表格,请将表格放在全局命名空间中。这可以通过以下方式最简单地完成:

for k, v in client.tables.items():
    globals()[k] = v

类似地,可以通过以下方式查看原始表格:

for k, v in client.tables_raw.items():
    globals()[k] = v

可以通过以下方式获取可用表格的列表:

print(client.tables.keys())
print(client.tables_raw.keys())

创建合约

在 IB 中,金融合约包括

  • 股票
  • 外汇
  • 加密货币
  • 指数
  • CFDs
  • 期货
  • 期权
  • 期货期权
  • 债券
  • 共同基金
  • 认股权证
  • 商品

要创建在 deephaven-ib 中使用的合约,必须首先将其创建为 ibapi.contract.Contract。合约创建后,必须将其注册到 deephaven-ib,然后才能使用它。

有关创建合约的详细信息,请参阅 https://interactivebrokers.github.io/tws-api/basic_contracts.html

注册合约会在 contracts_details 表中显示合约详细信息。

from ibapi.contract import Contract

c = Contract()
c.symbol = 'AAPL'
c.secType = 'STK'
c.exchange = 'SMART'
c.currency = 'USD'

rc = client.get_registered_contract(c)
print(rc)

./examples/example_all_functionality.py 示例演示了创建和注册多种不同类型的合约。

请求市场数据

可以通过以下方式从客户端请求市场数据:

  • request_market_data
  • request_bars_historical
  • request_bars_realtime
  • request_tick_data_realtime
  • request_tick_data_historical
from ibapi.contract import Contract

import deephaven_ib as dhib

# Use delayed market data if you do not have access to real-time
# client.set_market_data_type(dhib.MarketDataType.DELAYED)
client.set_market_data_type(dhib.MarketDataType.REAL_TIME)


c = Contract()
c.symbol = 'AAPL'
c.secType = 'STK'
c.exchange = 'SMART'
c.currency = 'USD'

rc = client.get_registered_contract(c)
print(rc)

client.request_market_data(rc)
client.request_tick_data_realtime(rc, dhib.TickDataType.BID_ASK)
client.request_tick_data_realtime(rc, dhib.TickDataType.LAST)
client.request_tick_data_realtime(rc, dhib.TickDataType.MIDPOINT)

./examples/example_all_functionality.py 展示了请求多种市场数据的方法。

请求新闻

可以通过以下方式从客户端请求市场数据:

  • request_news_historical
  • request_news_article
from ibapi.contract import Contract

from deephaven.time import to_datetime

contract = Contract()
contract.symbol = "GOOG"
contract.secType = "STK"
contract.currency = "USD"
contract.exchange = "SMART"

rc = client.get_registered_contract(contract)
print(contract)

start = "2021-01-01T00:00:00 ET"
end = "2021-01-10T00:00:00 ET"
client.request_news_historical(rc, start=start, end=end)

client.request_news_article(provider_code="BRFUPDN", article_id="BRFUPDN$107d53ea")

./examples/example_all_functionality.py 展示了请求新闻数据的方法。

请求账户详情

默认请求标准账户详情。《IB Trader Workstation (TWS)》不提供请求所有模型代码的API,因此《deephaven-ib》不能订阅不同模型代码的数据。如果您需要非标准账户/模型代码组合的详细信息,可以使用

  • request_account_pnl
  • request_account_overview
  • request_account_positions

订单管理

可以使用以下方式创建和取消订单:

  • order_place
  • order_cancel
  • order_cancel_all

要下单,请在 deephaven-ib 中注册合约,并创建一个包含订单详细信息的 ibapi.order.Order

有关创建订单的详细信息,请参阅 https://interactivebrokers.github.io/tws-api/orders.html

from ibapi.contract import Contract
from ibapi.order import Order

contract = Contract()
contract.symbol = "GOOG"
contract.secType = "STK"
contract.currency = "USD"
contract.exchange = "SMART"

rc = client.get_registered_contract(contract)
print(contract)

order = Order()
order.account = "DF4943843"
order.action = "BUY"
order.orderType = "LIMIT"
order.totalQuantity = 1
order.lmtPrice = 3000
order.eTradeOnly = False
order.firmQuoteOnly = False

req = client.order_place(rc, order)
req.cancel()

client.order_place(rc, order)
client.order_cancel_all()

查询和数学

Deephaven 具有非常强大的查询引擎,允许对静态和实时数据进行数学和查询操作。查询可以像过滤数据一样简单,也可以像人工智能一样复杂。

以下示例每5秒钟计算一次 DIA(道琼斯指数)和 SPY(标普500指数)的实时价格比率。

有关更多详细信息,请参阅 Deephaven 社区核心文档

from ibapi.contract import Contract

c1 = Contract()
c1.symbol = 'DIA'
c1.secType = 'STK'
c1.exchange = 'SMART'
c1.currency = 'USD'

rc1 = client.get_registered_contract(c1)
print(rc1)

c2 = Contract()
c2.symbol = 'SPY'
c2.secType = 'STK'
c2.exchange = 'SMART'
c2.currency = 'USD'

rc2 = client.get_registered_contract(c2)
print(rc2)

client.set_market_data_type(dhib.MarketDataType.REAL_TIME)
client.request_market_data(rc1)
client.request_market_data(rc2)
client.request_bars_realtime(rc1, bar_type=dhib.BarDataType.MIDPOINT)
client.request_bars_realtime(rc2, bar_type=dhib.BarDataType.MIDPOINT)

bars_realtime = client.tables["bars_realtime"]

bars_dia = bars_realtime.where("Symbol=`DIA`")
bars_spy = bars_realtime.where("Symbol=`SPY`")
bars_joined = bars_dia.view(["Timestamp", "TimestampEnd", "Dia=Close"]) \
    .natural_join(bars_spy, on="TimestampEnd", joins="Spy=Close") \
    .update("Ratio = Dia/Spy")

DIA SPY Ratio

绘图

Deephaven 具有非常强大的静态和实时数据绘图功能。以下示例绘制了市场上每个tick的 AAPL(苹果公司)的买入价和卖出价。

有关更多详细信息,请参阅 Deephaven 社区核心文档

from ibapi.contract import Contract

c = Contract()
c.symbol = 'AAPL'
c.secType = 'STK'
c.exchange = 'SMART'
c.currency = 'USD'

rc = client.get_registered_contract(c)
print(rc)

client.set_market_data_type(dhib.MarketDataType.REAL_TIME)
client.request_market_data(rc)
client.request_tick_data_realtime(rc, dhib.TickDataType.BID_ASK)

ticks_bid_ask = client.tables["ticks_bid_ask"]

from deephaven.plot import Figure

plot_aapl = Figure().plot_xy("Bid",  t=ticks_bid_ask, x="ReceiveTime", y="BidPrice") \
    .plot_xy("Ask",  t=ticks_bid_ask, x="ReceiveTime", y="AskPrice") \
    .show()

AAPL Bid Ask

帮助!

错误表

deephaven-ib 将所有 IB Trader Workstation (TWS) 错误记录到 errors 表中。使用 deephaven-ib 时,应监控此表。

errors = client.tables["errors"]

日志记录

deephaven-ibibapi 都使用 Python 的 logging 框架。默认情况下,记录 ERROR 和更高级别的日志。可以通过更改日志级别来显示更多或更少的日志。

要查看更少的日志消息

import logging
logging.basicConfig(level=logging.CRITICAL)

要查看所有日志消息

import logging
logging.basicConfig(level=logging.DEBUG)

有关可用的日志级别的讨论,请参阅 Python logging 模块文档

支持

如果您无法通过 errors 表或日志记录来解决您的问题,您可以尝试

接受 N 个位置参数,但只提供了 M 个

您可能会遇到类似于以下错误的错误: 接受 N 个位置参数,但只提供了 M 个
如果您看到这样的问题,您的 ibapi 版本与 deephaven-ib 需要的版本不匹配。
PyPI 中的 ibapi 版本 已过时,似乎已被 Interactive Brokers 弃用。
目前,Interactive Brokers 通过 IB Trader Workstation (TWS) 下载或通过 git 提供代码。

要检查您的 ibapi 版本

import ibapi
print(ibapi.__version__)

ibapi API非常不稳定。如果您的版本与deephaven-ib所需的版本不完全匹配,您需要安装正确的版本。按照上述方法重新生成虚拟环境。

示例

示例可以在./examples中找到。

项目详情


下载文件

下载适用于您平台的应用程序。如果您不确定要选择哪个,请了解有关安装包的更多信息。

源代码分发

deephaven_ib-0.4.0.tar.gz (63.0 kB 查看哈希值)

上传时间 源代码

构建分发

deephaven_ib-0.4.0-py3-none-any.whl (51.0 kB 查看哈希值)

上传时间 Python 3

由以下组织支持