跳转到内容

查找最早可用数据点

历史行情不是无限回溯的。即使合约现在可以交易,也不代表所有年份、所有 whatToShow、所有 useRTH 组合都有数据。正式请求大范围历史 K 线之前,先查询最早可用时间点,可以避免把回测脚本写成“盲猜开始日期”。

官方参考:

reqHeadTimeStamp() 只回答一个问题:指定合约在指定历史数据类型下,最早可以从什么时候开始取。

角色接口 / 回调说明
发起请求reqHeadTimeStamp()向 TWS 查询最早可用历史行情时间。
接收结果headTimestamp()返回一个时间字符串或 Unix 时间戳,格式受 formatDate 影响。
取消请求cancelHeadTimeStamp()取消仍在运行的最早时间请求。

它常用于这些场景:

  • 回测程序先确定可用起点,再分段请求历史 K 线。
  • 用户输入很早的开始日期时,先判断是否早于数据可用范围。
  • 比较 TRADESMIDPOINTBID_ASK 等不同 whatToShow 的可用范围。
  • 避免一次请求过长历史区间后才发现数据缺口。

reqHeadTimeStamp() 的核心参数和历史 K 线请求类似,但它不需要 durationStrbarSizeSettingendDateTime

app.reqHeadTimeStamp(
reqId,
contract,
whatToShow,
useRTH,
formatDate,
)
参数中文解释常见取值
reqId请求编号,用来在回调里识别是哪一次请求自己分配的整数
contract合约对象,必须能被 IBKR 识别股票、期货、期权、外汇等
whatToShow要查询哪类历史数据的起点TRADESMIDPOINTBID_ASK
useRTH是否只看常规交易时段1 只看 RTH,0 包含盘前盘后
formatDate返回时间格式1 返回字符串时间,2 返回 Unix 时间戳

AAPL 股票合约查询 TRADES 的最早时间点:

REQUEST_SENT=reqId=3001;name=aapl_trades_rth_string;whatToShow=TRADES;useRTH=1;formatDate=1
REQUEST_SENT=reqId=3002;name=aapl_trades_all_string;whatToShow=TRADES;useRTH=0;formatDate=1
REQUEST_SENT=reqId=3003;name=aapl_trades_rth_unix;whatToShow=TRADES;useRTH=1;formatDate=2
CONNECTED=True
CONTRACT=AAPL STK SMART NASDAQ USD
INFO_CODES=2104,2106,2158
HEAD_ROWS=3
HEAD=reqId=3001;name=aapl_trades_rth_string;timestamp=19801212-14:30:00
HEAD=reqId=3002;name=aapl_trades_all_string;timestamp=19801212-14:30:00
HEAD=reqId=3003;name=aapl_trades_rth_unix;timestamp=345479400
NON_INFO_ERROR_COUNT=0

这个结果说明,在该合约、数据类型和账户权限组合下,AAPL 的 TRADES 历史数据起点可以追溯到 1980-12-12 14:30:00formatDate=2 会返回 Unix 时间戳风格的数值。

这个时间不是固定模板。换成其他合约、交易所、whatToShowuseRTH 或账户权限后都可能不同。

字段含义
CONNECTED=TrueSocket 连接已建立。
CONTRACT=AAPL STK SMART NASDAQ USD请求使用的合约口径。
HEAD_ROWS=3三个最早时间请求都收到了结果。
timestamp=19801212-14:30:00formatDate=1 的字符串时间。
timestamp=345479400formatDate=2 的 Unix 秒级时间戳。
NON_INFO_ERROR_COUNT=0没有参数、权限或连接类业务错误。

不要把 headTimestamp() 的结果直接当作回测真实起点。它只能说明 TWS API 可返回数据的最早边界,策略仍然要处理停牌、换合约、拆股、期货换月、成交稀疏和权限不足等情况。

更稳妥的流程是:

  1. 先用 reqContractDetails() 确认合约唯一。
  2. 再用 reqHeadTimeStamp() 查询可用历史起点。
  3. 按 step size 和 pacing 规则分段请求 reqHistoricalData()
  4. 对返回 K 线做缺口检查,而不是假设每个周期都有数据。