跳转到内容

历史数据过滤

TWS API 返回的历史 K 线适合交易终端、图表和常规策略使用,但它不等于交易所原始逐笔流水的完整拷贝。IBKR 的历史数据服务会按数据类型、交易时段和展示规则做整理。

官方参考:Historical Data Limitations

差异说明
异常成交可能被过滤极端价格或不符合展示规则的记录可能不进入 K 线。
whatToShow 口径不同TRADESMIDPOINTBID_ASK 等数据源和含义不同。
useRTH 改变时段1 只取常规交易时段,0 包含更多可用时段。
历史数据和实时聚合可能略有差异实时流和历史服务不是完全相同的数据路径。
不同产品的字段意义不同股票、期货、外汇、债券和收益率类数据不能用同一套成交量解释。

如果策略依赖每一笔成交、盘口队列、毫秒级顺序或交易所原始行情,普通历史 K 线可能不够细。此时应考虑历史逐笔接口或专门市场数据服务。

app.reqHistoricalData(
1001,
contract,
"",
"1 D",
"5 mins",
"TRADES",
1, # useRTH=1,只返回常规交易时段。
1,
False,
[],
)

同样的请求,如果把 useRTH 改为 0,可能返回盘前、盘后或更完整时段的数据。股票、期货、外汇的交易时段差异很大,回测时要固定这个参数。

whatToShow中文含义适合场景
TRADES成交价股票、期货等基于成交价格的 K 线。
MIDPOINT买卖中间价外汇、价差分析、没有成交量要求的价格研究。
BID买价盘口买价历史。
ASK卖价盘口卖价历史。
BID_ASK买卖价买卖价口径,限频计算更严格。

不要把不同口径的数据混进同一个回测样本。比如一部分用 TRADES + useRTH=1,另一部分用 MIDPOINT + useRTH=0,最终结果会很难解释。

必须记录原因
合约字段或 conId防止同名合约混淆。
whatToShow不同口径不能混用。
useRTH决定是否包含盘前盘后。
barSizeSetting决定 K 线粒度。
durationStr / endDateTime决定数据窗口。
返回行数发现空结果、缺失或异常截断。

历史 K 线适合做大多数策略研究,但不要把它当成交易所原始撮合明细。策略越依赖微观结构,越需要确认数据源和过滤规则。