跳转到内容

合约

IBKR 的 Web API 下单和行情请求通常不直接使用股票代码,而是使用 conidconid 是 IBKR 对具体金融合约的合约 ID。

例如 AAPL 只是股票代码;conid=265598 才能明确表示美股 Apple Inc. 普通股。

官方参考:Client Portal API

接口方法用途
/iserver/secdef/searchPOST按 symbol 搜索合约。
/iserver/secdef/infoGET查询指定合约的详细定义。
/iserver/secdef/strikesGET查询期权可用行权价。
/trsrv/stocksGET查询股票 symbol 对应的合约候选。
/trsrv/futuresGET查询期货合约候选。
Terminal window
curl -k -X POST "https://localhost:5000/v1/api/iserver/secdef/search" ^
-H "Content-Type: application/json" ^
-d "{\"symbol\":\"AAPL\",\"name\":false}"

常见返回结构:

[
{
"conid": "265598",
"companyName": "APPLE INC",
"symbol": "AAPL",
"description": "NASDAQ",
"sections": [
{
"secType": "STK"
}
]
}
]

字段解释:

字段中文说明
conidIBKR 合约编号,行情和下单接口经常使用它。
companyName公司或合约名称。
symbol交易代码。
description交易所、到期月份或其它描述信息。
sections可交易品种分类,例如股票、期权、期货等。
secType合约类型,常见有 STKOPTFUTCASH
Terminal window
curl -k "https://localhost:5000/v1/api/trsrv/stocks?symbols=AAPL"

这个接口适合做 symbol 自动补全。它可能返回多个市场或交易所下的同名 symbol,程序不要只取第一个就下单,应该让用户确认交易所、币种和合约类型。

import requests
BASE_URL = "https://localhost:5000/v1/api"
payload = {
"symbol": "AAPL",
"name": False,
}
response = requests.post(
f"{BASE_URL}/iserver/secdef/search",
json=payload,
verify=False, # 仅限开发调试;正式环境请配置受信任证书
timeout=10,
)
response.raise_for_status()
contracts = response.json()
for contract in contracts:
print(contract.get("conid"), contract.get("symbol"), contract.get("companyName"))

运行示例后,应重点检查这些结果:

检查项正常含义
返回数组不为空至少找到一个候选合约。
候选里有 conid行情、订单和合约详情可以继续使用该 ID。
symbolsecTypedescription 符合预期没有把同名股票、期货、期权或其它交易所合约混在一起。
问题说明
symbol 不等于合约AAPLESEUR 都可能对应多个具体合约。
期权必须进一步选到到期日和行权价只知道正股 conid 不能直接下期权单。
搜索结果可能包含不同交易所下单前要确认交易所、币种、合约类型。
conid 也可能随合约生命周期变化期货、期权到期后不要继续使用旧合约编号。