跳转到内容

历史数据限制

历史行情不是无限制下载接口。IBKR 会限制请求速度、单次返回数据量、可追溯时间和部分产品的数据类型。写回测、数据同步或批量补数程序时,要先按这些限制设计请求节奏。

官方参考:

限制含义常见后果
不要请求太快小周期 K 线有明确限频返回 pacing violation,后续请求可能被拒。
不要一次取太多durationStrbarSizeSetting 要匹配请求慢、超时、空结果或被拒绝。
不是所有历史数据都存在过期衍生品、退市证券、很久以前的小周期数据可能不可用空结果或错误码。

历史行情开发建议先做单标的、短周期、小窗口测试,再扩大到多标的批量拉取。

目标请求接口回调
历史 K 线reqHistoricalData()historicalData()historicalDataEnd()historicalDataUpdate()
最早可用时间reqHeadTimeStamp()headTimestamp()
价格直方图reqHistogramData()histogramData()
历史逐笔reqHistoricalTicks()historicalTicks() / historicalTicksLast() / historicalTicksBidAsk()
app.reqHistoricalData(
reqId,
contract,
endDateTime,
durationStr,
barSizeSetting,
whatToShow,
useRTH,
formatDate,
keepUpToDate,
chartOptions,
)
参数类型中文含义说明
reqIdint请求编号自己分配,用来匹配后续回调。
contractContract合约对象先确保合约能被 reqContractDetails() 识别。
endDateTimestr结束时间空字符串表示以 TWS 服务器可用时间为结束点;也可传指定时间。
durationStrstr请求跨度例如 "1 D""2 W""1 M"
barSizeSettingstrK 线周期例如 "5 mins""1 hour""1 day"
whatToShowstr数据口径常见有 TRADESMIDPOINTBIDASKBID_ASK
useRTHint是否只取常规交易时段1 只取常规交易时段,0 包含更多可用时段。
formatDateint日期格式1 返回可读时间字符串,2 返回 Unix 秒级时间戳。
keepUpToDatebool是否保持更新TrueendDateTime 应为空,可能继续收到 historicalDataUpdate()
chartOptionslist图表选项Python API 通常传空列表 []

AAPL TRADES 历史 K 线请求:

REQUEST_SENT=reqId=4101;name=aapl_5min_rth;duration=1 D;barSize=5 mins;whatToShow=TRADES;useRTH=1;formatDate=1;keepUpToDate=False
REQUEST_SENT=reqId=4102;name=aapl_1hour_unix;duration=2 D;barSize=1 hour;whatToShow=TRADES;useRTH=1;formatDate=2;keepUpToDate=False
REQUEST_SENT=reqId=4103;name=aapl_keep_up_to_date;duration=1 D;barSize=5 mins;whatToShow=TRADES;useRTH=1;formatDate=1;keepUpToDate=True
CONNECTED=True
CONTRACT=AAPL STK SMART NASDAQ USD
BAR_TOTAL_COUNT=reqId=4101;name=aapl_5min_rth;count=78
BAR=reqId=4101;name=aapl_5min_rth;date=20260612 09:30:00 US/Eastern;open=295.9;high=297.14;low=294.89;close=295.35;volume=1472090;wap=295.893;barCount=10645
BAR_TOTAL_COUNT=reqId=4102;name=aapl_1hour_unix;count=14
BAR=reqId=4102;name=aapl_1hour_unix;date=1781184600;open=293.71;high=293.95;low=290.37;close=291.59;volume=3422903;wap=292.438;barCount=30066
END_COUNT=3
NON_INFO_ERROR_COUNT=0

这说明:

输出含义
NON_INFO_ERROR_COUNT=0这组历史 K 线请求没有业务错误。
BAR_TOTAL_COUNT=781 天、5 分钟、常规交易时段返回 78 根 K 线。
formatDate=1bar.date 返回可读时间字符串。
formatDate=2bar.date 返回 Unix 秒级时间戳。
keepUpToDate=True先返回历史 K 线,交易时段内可能继续进入 historicalDataUpdate()
END_COUNT=3三个请求都收到了 historicalDataEnd()
确认 Contract
-> reqHeadTimeStamp() 查询最早可用时间
-> 按 barSize 选择 duration
-> 用请求队列控制节奏
-> 保存 reqId、参数、返回行数、错误码和耗时

每条请求至少记录:

字段用途
contract / conId确认请求的是哪个合约。
durationStr确认单次请求跨度。
barSizeSetting判断是否触发小周期限制。
whatToShow区分成交、买卖价、中间价、收益率等口径。
useRTH区分常规交易时段和全部可用时段。
返回行数判断是否空结果或被截断。
错误码区分参数、限频、权限和数据不可用。

不要用反复压测的方式试限频。更稳妥的做法是在程序里主动排队、缓存、记录请求窗口,并把空结果和不可用数据当成可解释状态处理。