以AI量化为生:19.半小时K线与多周期系统完善

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

30分钟K线图表

写在前面

上一篇讲了实时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日的交易日,因为夜盘是为下一个交易日预热的。

现在修改后的逻辑:

  1. 先判断这根K线是不是夜盘
  2. 如果是夜盘且时间在daily_end之后(如21:00-23:59),属于下一个交易日
  3. 如果是夜盘且时间在daily_end之前(如00:00-02:29),已经是下一个自然日了,仍属于当前交易日
  4. 如果是日盘,直接按当天分组

测试结果:

交易日: 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量化为生》系列

《量化指标解码》系列


Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐