Hikyuu 2.8.1 是一次偏实战的更新:它没有只停留在框架层面的性能叙事,而是补上了策略开发里经常要写胶水代码的两类能力:获取当日指定时间点价格,以及在扩展指标里做时间采样聚合。对做日内信号、开盘后固定窗口统计、尾盘风控检查的团队来说,这些能力能减少不少重复实现。
这次更新解决的不是“能不能算”,而是“算得是否稳定”
Hikyuu 本身定位是基于 C++/Python 的高速开源量化交易框架。C++ 负责性能底座,Python 负责策略表达和研究迭代,这种组合很适合量化团队常见的工作方式:研究员在 Python 中快速验证,关键路径尽量交给底层高性能实现。
2.8.1 摘要里最值得注意的新增能力有两类:
strategy:新增获取当日指定时间点价格的功能,并提供 Python 绑定。extind:新增时间采样聚合指标,包括AGG_SAMPLE、AGG_SAMPLE_MAX、AGG_SAMPLE_MIN等。
前者让策略可以直接询问“今天 10:00 的价格是多少”,而不是每个策略都自己从分钟线里找索引、处理缺口、补齐交易日边界。后者则把“按时间点抽样再聚合”的逻辑做成指标部件,更容易在不同策略之间复用。
指定时点价格:日内策略里最容易被低估的小功能
很多策略并不是只看收盘价。例如:
- 开盘后 30 分钟确认趋势。
- 午盘前检查是否触发减仓条件。
- 尾盘固定时间读取价格做再平衡。
- 回测中比较某个固定时点与收盘价的偏离。
如果没有框架级 API,开发者通常会在每个策略里写一段类似逻辑:过滤当天 K 线、找最接近的时间戳、处理停牌或无成交、决定缺失值策略。问题不在代码难写,而在每个策略写出来都可能不一样,最后回测口径难以统一。
2.8.1 把“获取当日指定时间点价格”放到策略能力中,并提供 Python 绑定,实际价值就在这里:让时点取价成为策略部件的一部分,而不是散落在 Notebook 和脚本里的临时函数。
时间采样聚合指标:把固定窗口统计做成可复用资产
AGG_SAMPLE、AGG_SAMPLE_MAX、AGG_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_MAX、AGG_SAMPLE_MIN这类指标确认缺失值和边界时间的处理方式。 - 把新增指标封装成团队内部策略部件,避免研究脚本直接散落调用。
- 在生产或准生产环境中先跑影子任务,观察信号是否与预期一致。
Hikyuu 2.8.1 的更新点看起来不大,但它触碰的是量化系统里很关键的一层:策略语义的统一。时点价格和时间采样指标越早框架化,后续策略资产越容易复用,也越容易解释回测和实盘之间的差异。