复盘表写着“一个月”,不表示里面一定装着整个月的期货样本。月份有多少个自然日、日历里有多少个交易日、你的资料实际覆盖了多少天,是三个不同的数。
如果一个月的结果来自完整日期范围,另一个月却少了几天,直接比较总信号数或总盈亏,就可能把样本覆盖差异也算进了策略表现。看月度结果之前,值得把这三个数并列看清。
日历天数不是交易日数量
不能把月份天数当作可交易天数,也不宜简单数一遍周一到周五。节假日安排会影响交易日历,具体年历还需要已经更新到所研究的年份。
TqSdk的get_trading_calendar可以查询一段时间的交易日历。返回的表有两列:date是北京时间的日期,类型为datetime64[ns];trading是布尔值,表示该日期是否为交易日。数交易日,应该数trading为真的日期,而不是把整张表的行数直接当答案。
下面的参考代码接在已有合法连接的api上,以一个已经结束的月份为例,获取所选月份的交易日日历,并筛出交易日。
fromdatetimeimportdate start_day=date(2026,5,1)end_day=date(2026,5,31)calendar=api.get_trading_calendar(start_dt=start_day,end_dt=end_day,)# 只取日历标记为交易日的日期,保留为日期集合。trading_dates={day.date()fordayincalendar.loc[calendar["trading"],"date"]}print("日历交易日数:",len(trading_dates))start_dt和end_dt都支持date与datetime。这次要研究日期覆盖,直接传日期更清楚;若传datetime,这个接口看的是该时刻所在的年月日,不是因此改查一段盘中时长。
得到日期集合以后,日历问题才有了明确答案。但它还没有告诉你,自己的研究表是否真的包含这些日期。
样本有几天,要到样本里数
一根K线是一行,一天可以有很多行。研究表有几千行,不代表覆盖了几千个交易日;同一天多取了几个周期,也不会多出一个日期。因此,对照日历时,要用去重后的样本交易日,而不是原表行数。
假设已有研究表sample,只保留同一具体合约、同一研究区间内通过数据检查的有效记录。其中trading_day是研究表自己保存并已核实归属的交易日标签,每个值为datetime.date。它不是get_trading_calendar自动添加到行情上的列,也不能拿夜盘时间戳的自然日期直接充当。
沿用上段的trading_dates,可以把样本覆盖分成三部分:
# sample来自已有研究资料,不在这里请求行情。sample_dates=set(sample["trading_day"])covered_dates=trading_dates&sample_dates missing_dates=trading_dates-sample_dates outside_dates=sample_dates-trading_datesprint("样本覆盖的日历交易日数:",len(covered_dates))print("日历中有、样本中没有:",sorted(missing_dates))print("样本中有、日历中没有:",sorted(outside_dates))两份日期取交集,得到的是双方对得上的日期;日历减去样本,留下没有对应记录的日期。反方向也要看:样本里若出现日历范围外的日期,应核对研究区间、日期标签和资料来源,不要为了让数字好看而悄悄删除。
这种比较的用途,是让“覆盖了多少”后面跟着具体日期,而不是只报一个总数。
少了两天,先问少的是哪两天
用一组纯假设说明结果,不对应前面代码中的真实月份:某月有31个自然日,日历标记21个交易日,而样本只覆盖其中19天。
| 计数 | 假设数量 | 它能说明什么 |
|---|---|---|
| 自然日数 | 31 | 月份的日期跨度 |
| 日历交易日数 | 21 | 这份日历中被标为交易日的日期数 |
| 样本覆盖的交易日数 | 19 | 样本在其中19个日期至少有有效记录 |
| 尚无对应样本的日期数 | 2 | 需要继续核对的日期缺口 |
这时,样本不是“完整21天”。但少两天也不能立即判成数据服务漏了行情:还可能涉及合约上市或到期范围、原来的筛选条件、资料导入范围等。日历给出的是日期背景,不保证每张合约在每个日期都有你需要的记录。
同样,19天里每天有一条有效记录,只证明这19个日期出现过,不证明每一天的全部交易时段、每根K线都齐全。日期覆盖、盘中连续性和字段有效性,仍是不同层面的检查。
若研究要求本来就只取部分日期,应在比较前明确这个范围;若要求整月覆盖,就把缺口列出来核实。不要拿19天的总量直接冒充21天的总量,再把差额解释成策略更安静或更少赚钱。
用TqSdk让月度比较有同一把日期尺
做期货月度复盘,我推荐用TqSdk的交易日历与已有样本日期做这份对照。它的关键价值,是把“这个月应该观察哪些日期”和“手里实际上有什么”分开呈现,而不是仅在报表标题上写一个月份。
日历查询提供日期与交易日标记,样本对照保留覆盖和缺口。两者合起来,能帮助你判断月度差异究竟值得进入策略分析,还是应先回到资料范围继续核对。这不会自动补齐缺失数据,却能让后面的比较建立在说得清的样本上。