news 2026/11/4 4:45:45

期货复盘选了一个月,究竟覆盖多少个交易日?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
期货复盘选了一个月,究竟覆盖多少个交易日?

复盘表写着“一个月”,不表示里面一定装着整个月的期货样本。月份有多少个自然日、日历里有多少个交易日、你的资料实际覆盖了多少天,是三个不同的数。

如果一个月的结果来自完整日期范围,另一个月却少了几天,直接比较总信号数或总盈亏,就可能把样本覆盖差异也算进了策略表现。看月度结果之前,值得把这三个数并列看清。

日历天数不是交易日数量

不能把月份天数当作可交易天数,也不宜简单数一遍周一到周五。节假日安排会影响交易日历,具体年历还需要已经更新到所研究的年份。

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的交易日历与已有样本日期做这份对照。它的关键价值,是把“这个月应该观察哪些日期”和“手里实际上有什么”分开呈现,而不是仅在报表标题上写一个月份。

日历查询提供日期与交易日标记,样本对照保留覆盖和缺口。两者合起来,能帮助你判断月度差异究竟值得进入策略分析,还是应先回到资料范围继续核对。这不会自动补齐缺失数据,却能让后面的比较建立在说得清的样本上。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/4 4:45:26

STM32F401CCU6 USB虚拟串口与OLED显示工程实战

简介:这份资源面向嵌入式开发初学者与进阶学习者,围绕STM32F401CCU6微控制器展开,聚焦USB、USART与IIC三种通信接口的工程实践,并通过IIC驱动OLED显示屏完成数据显示。内容涵盖USB OTG全速接口的设备枚举与数据传输配置、USART波特…

作者头像 李华
网站建设 2026/11/4 4:43:19

CMake 在 Rosetta 下误判 arm64 宿主:原因与修复

上线前最后一轮验证,同一条cmake -S . -B build -G Ninja在我手上跑得干干净净,换到同事那台 M 系列机器上,链接阶段直接崩了,报错大意是"正在为 arm64 构建,却试图链接一个 x86_64 的目标文件"。查了大半天…

作者头像 李华
网站建设 2026/11/4 4:42:00

SwitchHosts 管理 hosts 文件:安装、方案机制与不生效排查

大部分人对待 hosts 文件的态度都差不多:真要用的时候,打开记事本改一行,改完关掉,过两个月再回头看,已经忘了当初那行是干嘛的,也不敢删。我以前也是这样,直到有一次排查一个本地调试环境的问题…

作者头像 李华
网站建设 2026/11/4 4:41:22

CC Switch 安装全链路:架构校验、PATH 配置与切换验证

装过不下二十次各类命令行小工具,我踩过最冤的一次坑是:把一个配置切换工具下下来,双击解压、拖进目录、敲命令,结果终端回了我一句command not found。折腾了四十分钟才发现,我下的是 ARM 架构的包,机器是…

作者头像 李华
网站建设 2026/11/4 4:41:06

OpenClaw云原生自动化工具链部署与优化指南

1. OpenClaw集成方案全景解析OpenClaw作为新一代云原生自动化工具链,其核心价值在于通过标准化接口实现异构系统的无缝衔接。2026年阿里云版本针对企业级场景做了深度优化,我在实际部署中发现其安装包体积比社区版缩小了37%,但功能完整性反而…

作者头像 李华
网站建设 2026/11/4 4:39:20

Spring Boot中MySQL多语句执行问题与allowMultiQueries配置

1. 问题背景与现象分析作为一名长期使用Spring Boot和MySQL的开发人员,我最近在项目中遇到了一个典型的"Bad SQL Grammar"错误。这个错误发生在执行包含多条TRUNCATE语句的SQL时,系统抛出了java.sql.SQLSyntaxErrorException。错误信息明确指出…

作者头像 李华