历史数据过滤
TWS API 返回的历史 K 线适合交易终端、图表和常规策略使用,但它不等于交易所原始逐笔流水的完整拷贝。IBKR 的历史数据服务会按数据类型、交易时段和展示规则做整理。
官方参考:Historical Data Limitations
过滤可能带来的差异
Section titled “过滤可能带来的差异”| 差异 | 说明 |
|---|---|
| 异常成交可能被过滤 | 极端价格或不符合展示规则的记录可能不进入 K 线。 |
whatToShow 口径不同 | TRADES、MIDPOINT、BID_ASK 等数据源和含义不同。 |
useRTH 改变时段 | 1 只取常规交易时段,0 包含更多可用时段。 |
| 历史数据和实时聚合可能略有差异 | 实时流和历史服务不是完全相同的数据路径。 |
| 不同产品的字段意义不同 | 股票、期货、外汇、债券和收益率类数据不能用同一套成交量解释。 |
如果策略依赖每一笔成交、盘口队列、毫秒级顺序或交易所原始行情,普通历史 K 线可能不够细。此时应考虑历史逐笔接口或专门市场数据服务。
useRTH 的影响
Section titled “useRTH 的影响”app.reqHistoricalData( 1001, contract, "", "1 D", "5 mins", "TRADES", 1, # useRTH=1,只返回常规交易时段。 1, False, [],)同样的请求,如果把 useRTH 改为 0,可能返回盘前、盘后或更完整时段的数据。股票、期货、外汇的交易时段差异很大,回测时要固定这个参数。
whatToShow 的影响
Section titled “whatToShow 的影响”whatToShow | 中文含义 | 适合场景 |
|---|---|---|
TRADES | 成交价 | 股票、期货等基于成交价格的 K 线。 |
MIDPOINT | 买卖中间价 | 外汇、价差分析、没有成交量要求的价格研究。 |
BID | 买价 | 盘口买价历史。 |
ASK | 卖价 | 盘口卖价历史。 |
BID_ASK | 买卖价 | 买卖价口径,限频计算更严格。 |
不要把不同口径的数据混进同一个回测样本。比如一部分用 TRADES + useRTH=1,另一部分用 MIDPOINT + useRTH=0,最终结果会很难解释。
回测记录清单
Section titled “回测记录清单”| 必须记录 | 原因 |
|---|---|
合约字段或 conId | 防止同名合约混淆。 |
whatToShow | 不同口径不能混用。 |
useRTH | 决定是否包含盘前盘后。 |
barSizeSetting | 决定 K 线粒度。 |
durationStr / endDateTime | 决定数据窗口。 |
| 返回行数 | 发现空结果、缺失或异常截断。 |
历史 K 线适合做大多数策略研究,但不要把它当成交易所原始撮合明细。策略越依赖微观结构,越需要确认数据源和过滤规则。