以AI量化为生:19.多周期K线系统完善
以AI量化为生:19.半小时K线与多周期系统完善
本文是《以AI量化为生》系列的第19篇,我们将完善多周期K线系统,支持30分钟周期,并修复日线聚合中夜盘归属的问题。从交易时段划分到自动市场识别,让系统真正适配全球市场。

写在前面
上一篇讲了实时K线图表的开发,有读者私信问:“能不能支持30分钟K线?我的策略用的是半小时周期。”
说实话,一开始觉得这不就是加个按钮的事吗?结果一细想,问题来了。
中国期货市场10:15-10:30休市,11:30-13:00午休。如果按自然半小时切分,10:00-10:30这根K线会包含15分钟的休市时间,数据就不准了。这跟之前做小时K线时遇到的问题一样——得按实际交易时段合成,而不是按时钟时间。
顺便把图表系统的日线聚合也完善了一下。之前日线K线的夜盘归属有问题,15日晚上21:00的夜盘应该属于16日的交易日,但图表显示时没按这个规则来。策略回测倒是没问题,因为BarGenerator本身就是按交易日聚合的,但看图表的时候就会发现日线的开盘价、收盘价对不上实际交易时间。
对了,这次还加了3分钟周期。有些短线策略喜欢用3分钟,正好一起支持了。
半小时K线的时段划分
先看中国期货市场的日盘时间:
09:00-10:15 正常交易
10:15-10:30 休市
10:30-11:30 正常交易
11:30-13:00 午休
13:00-15:00 正常交易
如果按自然半小时切分(每30分钟一根),10:00-10:30这根K线会包含15分钟休市,11:30-12:00这根完全是空的。
怎么解决?参考小时K线的做法,按实际交易时段划分。关键是这几根:
- 10:00-10:44:跨越10:15-10:30休市,时长45分钟,但都是实际交易数据
- 11:15-13:44:跨越11:30-13:00午休,时长150分钟,实际交易时间45分钟
- 其他时段:尽量保持30分钟
这样每根K线都只包含实际交易数据,不会有"掺水"的情况。
完整的时段配置在config/trading_sessions_config.py里,系统会根据品种代码自动识别市场并应用对应的时段规则。中国期货用特殊时段,美股港股用自然30分钟。
图表系统的多周期支持
这次在core/charts/enhanced_chart_widget.py里加了3分钟和30分钟两个周期按钮。
3分钟比较简单,按自然时间切分就行:
elif interval_str == "3m":
key = (bar.datetime.date(), (bar.datetime.hour * 60 + bar.datetime.minute) // 3)
30分钟的聚合逻辑是这样的:
if interval_str == "30m":
# 如果配置了half_hour_sessions,使用交易时段合成
idx = self._get_half_hour_session_index(bar.datetime.time())
key = (bar.datetime.date(), f"h{idx}") if idx is not None else \
(bar.datetime.date(), (bar.datetime.hour * 60 + bar.datetime.minute) // 30)
关键是这个key的设计:
- 有
half_hour_sessions配置,用f"h{idx}"按时段索引分组 - 没有配置,用自然30分钟分组
这样不同市场可以有不同的行为。系统会自动识别市场,无需手动配置。
周期按钮现在支持:1分钟、3分钟、5分钟、15分钟、30分钟、1小时、日线。基本覆盖了常用的交易周期。
日线聚合的夜盘归属
图表系统的日线聚合之前有个问题:夜盘没有正确归入下一个交易日。
中国期货的交易时间是这样的:
2025-01-15 21:00-23:59 夜盘
2025-01-16 00:00-02:29 夜盘(跨日)
2025-01-16 09:00-15:00 日盘
15日21:00开始的夜盘应该属于16日的交易日,因为夜盘是为下一个交易日预热的。
现在修改后的逻辑:
- 先判断这根K线是不是夜盘
- 如果是夜盘且时间在
daily_end之后(如21:00-23:59),属于下一个交易日 - 如果是夜盘且时间在
daily_end之前(如00:00-02:29),已经是下一个自然日了,仍属于当前交易日 - 如果是日盘,直接按当天分组
测试结果:
交易日: 2025-01-16
- 包含: 2025-01-15夜盘21:00-23:59
+ 2025-01-16凌晨00:00-02:29
+ 2025-01-16日盘09:00-14:59
- 开盘价: 4000.0 (夜盘开盘)
- 收盘价: 4100.0 (日盘收盘)
这样图表显示的日线就跟实际交易时间一致了。
自动市场识别
系统会根据品种代码和交易所自动判断市场类型,并应用对应的交易时段配置。
config/trading_sessions_config.py里定义了12+个全球市场的交易时段:
- 中国期货(三大商品交易所)
- 中金所(股指期货)
- A股市场
- 港股、美股、日股等
图表组件在加载数据时会调用set_trading_session_by_symbol(symbol, exchange),自动设置交易时段。你切换不同市场的品种,系统会自动适配。
比如:
jm2501.DCE→ 中国期货时段(跨休市)00700.SEHK→ 港股时段(跨午休)AAPL.NASDAQ→ 美股时段(自然小时)
写在最后
到这里,多周期K线系统算是比较完善了。从1分钟到日线,从自然时间到交易时段,该考虑的都考虑到了。
最重要的是理解这个思路:不要机械地按时钟时间切分K线,要按实际交易时段。市场有休市,K线合成就得考虑休市。这是量化交易的基本功。
先写到这,有问题欢迎留言交流。
本文是《以AI量化为生》系列文章的第19篇,完整代码已开源至GitHub:https://github.com/seasonstar/atmquant
本文内容仅供学习交流,不构成任何投资建议。交易有风险,投资需谨慎。
加入「量策堂·AI算法指标策略」
想系统性掌握策略研发、指标可视化与回测优化?加入我的知识星球,获得持续、体系化的成长支持:

往期文章回顾
《以AI量化为生》系列
- 以AI量化为生:18.实时K线图表系统开发
- 以AI量化为生:17.系统架构优化 - 指标模块化与动态加载
- 以AI量化为生:16.图表交互优化 - X轴延伸与专注模式
- 以AI量化为生:15.双图与四图视图开发实战
- 以AI量化为生:14.多周期交易买卖点连线智能匹配实战
《量化指标解码》系列
- 量化指标解码15:Adaptive MACD Deluxe - 会自己调参的智能MACD
- 量化指标解码14:Supertrended RSI - RSI与趋势跟踪的完美融合
- 量化指标解码13:WaveTrend波浪趋势 - 震荡行情的超买超卖捕手
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)