Hikyuu 2.8.1:把盘中时点价格和时间采样指标放进量化流水线

2026-07-10 30 预计阅读时间: 1 分钟
来源: oschina.net AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:8 分钟

Hikyuu 2.8.1 是一次偏实战的更新:它没有只停留在框架层面的性能叙事,而是补上了策略开发里经常要写胶水代码的两类能力:获取当日指定时间点价格,以及在扩展指标里做时间采样聚合。对做日内信号、开盘后固定窗口统计、尾盘风控检查的团队来说,这些能力能减少不少重复实现。

这次更新解决的不是“能不能算”,而是“算得是否稳定”

Hikyuu 本身定位是基于 C++/Python 的高速开源量化交易框架。C++ 负责性能底座,Python 负责策略表达和研究迭代,这种组合很适合量化团队常见的工作方式:研究员在 Python 中快速验证,关键路径尽量交给底层高性能实现。

2.8.1 摘要里最值得注意的新增能力有两类:

  • strategy:新增获取当日指定时间点价格的功能,并提供 Python 绑定。
  • extind:新增时间采样聚合指标,包括 AGG_SAMPLEAGG_SAMPLE_MAXAGG_SAMPLE_MIN 等。

前者让策略可以直接询问“今天 10:00 的价格是多少”,而不是每个策略都自己从分钟线里找索引、处理缺口、补齐交易日边界。后者则把“按时间点抽样再聚合”的逻辑做成指标部件,更容易在不同策略之间复用。

指定时点价格:日内策略里最容易被低估的小功能

很多策略并不是只看收盘价。例如:

  • 开盘后 30 分钟确认趋势。
  • 午盘前检查是否触发减仓条件。
  • 尾盘固定时间读取价格做再平衡。
  • 回测中比较某个固定时点与收盘价的偏离。

如果没有框架级 API,开发者通常会在每个策略里写一段类似逻辑:过滤当天 K 线、找最接近的时间戳、处理停牌或无成交、决定缺失值策略。问题不在代码难写,而在每个策略写出来都可能不一样,最后回测口径难以统一。

2.8.1 把“获取当日指定时间点价格”放到策略能力中,并提供 Python 绑定,实际价值就在这里:让时点取价成为策略部件的一部分,而不是散落在 Notebook 和脚本里的临时函数。

时间采样聚合指标:把固定窗口统计做成可复用资产

AGG_SAMPLEAGG_SAMPLE_MAXAGG_SAMPLE_MIN 这类扩展指标适合处理“在一组时间点上采样,然后聚合”的问题。它和普通滚动窗口不完全一样:滚动窗口按 bar 数量或时间跨度滑动,而时间采样更像是在交易日内设置几个观察点。

可以这样理解:

  • AGG_SAMPLE:按指定采样规则取值,形成可比较的时间序列。
  • AGG_SAMPLE_MAX:在采样集合中取最大值,适合观察盘中冲高。
  • AGG_SAMPLE_MIN:在采样集合中取最小值,适合观察盘中回撤或弱势区间。

摘要没有展开这些指标的完整参数和边界行为,因此接入时要以本地安装版本的文档或 help() 输出为准。工程上更关键的是:把这些指标包装进策略部件后,团队可以沉淀“开盘区间强度”“午盘风险检查”“尾盘价格偏离”这类资产,而不是每个策略重写一次。

可以这样实践:先用 Python 固化时点取价口径

下面这个例子不依赖 Hikyuu 运行环境,而是用 pandas 演示如何把“指定时点价格”和“时间采样聚合”做成可测试的小模块。接入 Hikyuu 2.8.1 时,可以把示例里的 price_at_time 替换为框架新增的 Python 绑定,把聚合逻辑替换为 AGG_SAMPLE* 指标。

运行前安装依赖:

python -m pip install pandas

保存为 intraday_sampling_demo.py 后运行:

from __future__ import annotations

import pandas as pd


def price_at_time(bars: pd.DataFrame, day: str, hhmm: str, column: str = 'close') -> float | None:
    '''Return the first price at or after day hh:mm. Missing data returns None.'''
    target = pd.Timestamp(f'{day} {hhmm}')
    same_day = bars.loc[bars.index.date == target.date()]
    hit = same_day.loc[same_day.index >= target]
    if hit.empty:
        return None
    return float(hit.iloc[0][column])


def aggregate_samples(bars: pd.DataFrame, day: str, sample_times: list[str]) -> dict[str, float | None]:
    samples = [price_at_time(bars, day, t) for t in sample_times]
    valid = [x for x in samples if x is not None]
    return {
        'samples': samples,
        'sample_max': max(valid) if valid else None,
        'sample_min': min(valid) if valid else None,
    }


if __name__ == '__main__':
    bars = pd.DataFrame(
        {
            'close': [10.1, 10.4, 10.2, 10.8, 10.6, 10.3],
        },
        index=pd.to_datetime(
            [
                '2025-01-02 09:30',
                '2025-01-02 10:00',
                '2025-01-02 10:30',
                '2025-01-02 13:30',
                '2025-01-02 14:30',
                '2025-01-02 15:00',
            ]
        ),
    )

    print('10:00 price:', price_at_time(bars, '2025-01-02', '10:00'))
    print(aggregate_samples(bars, '2025-01-02', ['10:00', '13:30', '14:30']))

预期输出类似:

10:00 price: 10.4
{'samples': [10.4, 10.8, 10.6], 'sample_max': 10.8, 'sample_min': 10.4}

这个例子故意把缺失数据策略写清楚:找不到指定时点时返回 None,聚合时跳过缺失值。真实策略里不要把这个细节藏起来,因为它会直接影响回测收益、成交假设和风控触发。

接入 2.8.1 时的检查清单

升级这类量化框架,不建议只跑安装命令就结束。更稳妥的做法是围绕策略口径做回归:

  • 对比升级前后核心策略的净值曲线、交易次数、持仓切换时间。
  • 为“指定时点价格”补充停牌、无分钟线、半日交易、集合竞价附近等样例。
  • AGG_SAMPLE_MAXAGG_SAMPLE_MIN 这类指标确认缺失值和边界时间的处理方式。
  • 把新增指标封装成团队内部策略部件,避免研究脚本直接散落调用。
  • 在生产或准生产环境中先跑影子任务,观察信号是否与预期一致。

Hikyuu 2.8.1 的更新点看起来不大,但它触碰的是量化系统里很关键的一层:策略语义的统一。时点价格和时间采样指标越早框架化,后续策略资产越容易复用,也越容易解释回测和实盘之间的差异。


相关推荐