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

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

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

日历天数不是交易日数量

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

TqSdk的get_trading_calendar可以查询一段时间的交易日历。返回的表有两列:date是北京时间的日期,类型为datetime64[ns];trading是布尔值,表示该日期是否为交易日。数交易日,应该数trading为真的日期,而不是把整张表的行数直接当答案。

下面的参考代码接在已有合法连接的api上,以一个已经结束的月份为例,获取所选月份的交易日日历,并筛出交易日。

python 复制代码
from datetime import date

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()
    for day in calendar.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,可以把样本覆盖分成三部分:

python 复制代码
# sample来自已有研究资料,不在这里请求行情。
sample_dates = set(sample["trading_day"])

covered_dates = trading_dates & sample_dates
missing_dates = trading_dates - sample_dates
outside_dates = sample_dates - trading_dates

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

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

相关推荐
量化吞吐机4 天前
期货主连换月,涨跌和合约价差怎么分清?
期货·tqsdk
CTA量化套保4 天前
研究期货价差,最新报价和同周期K线该怎么选?
期货·tqsdk
nanawinona4 天前
期货持仓没变,挂单为什么变了?用TqSdk分清仓位和委托
期货·tqsdk
开源量化GO11 天前
期货研究反复取数,什么时候值得用下载程序?
tqsdk
CTA终结者12 天前
期货价格又回到原位,刚才那段波动怎么复盘?
量化交易·期货·tqsdk
筱璦4 个月前
量化交易系统源码可售
区块链·交易·期货·期货交易
筱璦7 个月前
期货软件开发 - 策略编辑
前端·区块链·交易·期货
筱璦8 个月前
期货软件开发「启动加载页 / 初始化窗口」
前端·c#·策略模式·期货
筱璦8 个月前
期货软件开发 - 交易报表
前端·windows·microsoft·报表·期货