Deephaven的Interactive Brokers集成
项目描述
deephaven-ib
Deephaven的Interactive Brokers集成。
Interactive Brokers是量化金融界非常受欢迎的经纪商,拥有约2000亿美元的客户权益。量化分析师和对冲基金经常选择Interactive Brokers,因为它具有低交易成本和便于自动化交易的API。由于其最低账户余额要求低,它也是个人投资者的一个有吸引力的选择。
Deephaven是世界上最大家对冲基金、银行和交易所量化交易的后台实时查询引擎。Deephaven使处理实时数据变得简单,并简化了非常简洁且易于阅读的代码。通过Deephaven,量化分析师可以快速创建新模型并投入生产,交易员可以监控市场和他们的投资组合,经理可以监控风险。
deephaven-ib 将 Interactive Brokers 的低成本交易与 Deephaven 社区核心 的分析能力和易用性相结合,从而产生一个开放、量化的交易平台。基本上,它提供了一个开放平台来构建量化交易策略和定制分析。您可以构建一些简单的东西,比如投资组合监控器,或者一些复杂的东西,比如完全自动化的、多策略量化对冲基金。
deephaven-ib 支持几乎所有常见的交易所交易产品。这些包括
- 股票
- 共同基金
- 期权
- 期货
- 期货期权
- 指数
- 债券
- 外汇(Forex 或 FX)
- 加密货币
- 差价合约(CFDs)
- 认股权证
- 商品
警告:自动化交易可能会非常快速地出错。在将交易投放到可能亏损的账户之前,请先在模拟交易账户中验证您的代码。如果您认为这种情况不会发生在您身上,请阅读 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_historical
或request_tick_data_realtime
请求的成交价格实时tick市场数据。ticks_bid_ask
:通过request_tick_data_historical
或request_tick_data_realtime
请求的买价和卖价实时tick市场数据。ticks_mid_point
:通过request_tick_data_historical
或request_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 可以从
- CSV
- Parquet
- Kafka.
有关详细信息,请参阅 Deephaven 文档。
运行 deephaven-ib
按照以下步骤运行一个 Deephaven 加 Interactive Brokers 系统。
这些说明会生成一个包含 deephaven-ib、Deephaven 和 ibapi
的虚拟环境。有关使用pip安装的Deephaven的更多详细信息,请参阅 Deephaven pip 安装指南。
:exclamation: Windows用户 必须 在WSL中运行这些命令。 |
---|
设置IB
要设置和配置系统
-
在 IB Trader Workstation (TWS) 中,点击右上角的齿轮。
在API->设置
中,确保- "启用ActiveX和Socket客户端"被选中。
- "仅允许来自localhost的连接"没有被选中。
- 选择“只读API”以防止从 deephaven-ib 提交交易。
此外,请注意“套接字端口”的值。在连接 deephaven-ib 时需要它。
-
【对于纸面交易】登录到 Interactive Brokers 网络界面。
-
【对于纸面交易】在 Interactive Brokers 网络界面 中,导航到
账户->设置->纸面交易账户
并确保“将实时市场数据订阅与纸面交易账户共享?”设置为“是”。 -
一旦 deephaven-ib 启动(见下文),接受来自 IB Trader Workstation (TWS) 的连接。 (可能不是所有会话都需要。)
虚拟环境
Interactive Brokers 不通过 PyPI 提供其 Python 轮子,并且轮子不可重新分发。因此,安装 deephaven-ib 需要一个 Python 脚本在安装之前本地构建轮子。该脚本将 deephaven-ib
、ibapi
和 deephaven
安装到环境中。
为了保持开发环境的整洁,该脚本为 deephaven-ib 创建了一个虚拟环境。按照以下说明,使用 ./dhib_env.py 脚本构建和激活虚拟环境。
可以使用 --create_venv false
和 --path_venv <path>
选项使用现有的虚拟环境。
如果您希望在没有虚拟环境的情况下直接将安装到系统 Python 中,您可以使用 --use_venv false
选项来使用 ./dhib_env.py。
构建虚拟环境
-
安装 Java 17 并设置适当的
JAVA_HOME
环境变量。 -
检出 deephaven-ib
git clone git@github.com:deephaven-examples/deephaven-ib.git
-
切换到 deephaven-ib 目录
cd deephaven-ib
-
构建 deephaven-ib 虚拟环境
首先,安装运行脚本所需的依赖项
python3 -m pip install -r requirements_dhib_env.txt
查看所有选项
python3 ./dhib_env.py --help
从 PyPi 安装 deephaven-ib 的最新生产版本,以及发布指定的
ibapi
和deephaven
版本python3 ./dhib_env.py release
从源安装 deephaven-ib 的最新开发版本,以及默认的
ibapi
和deephaven
版本python3 ./dhib_env.py dev
在 PyCharm 中创建 deephaven-ib 的 venv:(这不会安装
deephaven-ib
,但它会安装默认的ibapi
和deephaven
版本。)python3 ./dhib_env.py dev --install_dhib false
-
在日志中注意虚拟环境的位置。它将在类似
./venv-<versiondetails>
的目录中。
激活虚拟环境
要激活虚拟环境
source ./venv-<versiondetails>/bin/activate
一旦虚拟环境被激活,python
和 pip
将使用虚拟环境的 Python 和软件包,包括运行 deephaven-ib 所需的一切。
关闭虚拟环境
要关闭虚拟环境
deactivate
一旦虚拟环境被关闭,python
和 pip
将使用系统的 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 服务器命令 必须 在导入
deephaven
或deephaven_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
。
port
是 IB 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_groups
、accounts_allocation_profiles
和 accounts_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 要求接受连接。
获取数据
IB Trader Workstation (TWS) 数据存储在 deephaven-ib 客户端中,作为两个表格字典
tables
包含大多数用户希望使用的表格。tables_raw
包含原始 IB Trader Workstation (TWS) 数据。
例如,可以通过以下方式获取包含所有发送到 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")
绘图
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()
帮助!
错误表
deephaven-ib 将所有 IB Trader Workstation (TWS) 错误记录到 errors
表中。使用 deephaven-ib 时,应监控此表。
errors = client.tables["errors"]
日志记录
deephaven-ib 和 ibapi
都使用 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的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 2ec78b732f238078fd60c6bacb5c86e6a1f4aec4c4a465d5d60f905713f75098 |
|
MD5 | 707331ae259839b71e953b39e4330f6d |
|
BLAKE2b-256 | b23d3f5242991c5d6711daad25054987163c10d6cdc2775e108f20a381e72c7a |
deephaven_ib-0.4.0-py3-none-any.whl的哈希值
算法 | 哈希摘要 | |
---|---|---|
SHA256 | 88ffbf7ab664d29fba2404f9cf87c5e74cfe8f67a06f40d816c211acf06c5521 |
|
MD5 | cbb74167eab6363172beaf6908fcbef4 |
|
BLAKE2b-256 | a0f7088b370aa95277aab36e410a6f78cd9a89999a4e3f124fd5a942e2119e3a |