跳转至

15 / 30 / 60 分钟线

CNEquity 不从数据源抓取 15 / 30 / 60 分钟线,而是用湖里已有的 1m(minute_bars)和 5m(minute_bars_5m)重采样得到。有两种用法:

用法 怎么做 是否入湖 适合
查询时现算 Python 调用 resample_minute_history 否,结果只在内存里 写 Python 的研究、临时换频率
派生入湖 cne derive minute_bars_15m,或在网页面板的操作页发起 是,写成派生数据集 用 SQL、HTTP 接口、MCP 或面板读取,或反复使用

两种用法的计算规则相同。默认不计算:日更、cne init 和任何定时任务都不会生成这三个数据集,只有用户主动运行才会入湖。

前提

湖里至少要有 minute_bars 或 minute_bars_5m 中的一个。两者默认关闭,需要在配置的 [minute_bars] 中开启并回填,见配置参考与数据集目录。

输入 数据源保留的历史 能算出的频率
1m 约 95 个交易日 5m、15m、30m、60m
5m 约 491 个交易日(约 2 年) 15m、30m、60m

湖里已经采到的分钟线会一直保留,上表只限制回填能补到多早。

计算规则

  1. 选输入:按“股票 × 交易日”选择。某只股票某天有 1m 就只用 1m,没有才用 5m。各股票 1m 的起点不同,所以不按统一日期切换。
  2. 对齐:上午从 09:30、下午从 13:00 起算,不跨午休。bar_time 是区间的收盘分钟,例如 60m 一天四根:10:30、11:30、14:00、15:00。
  3. 开高低收:只计入有成交的输入 K 线(volume > 0 或 amount > 0;后者保留股数被取整为零的小额成交)。区间内完全没有成交时,四个价格都取最后一个报价,成交量和成交额为零,这个价格不是成交价。
  4. 量额:区间内输入 K 线的成交量、成交额直接相加。
  5. 缺组成 K 线:区间只有部分输入 K 线时不补齐。查询时现算会直接报错;派生入湖会跳过这只股票当天的数据并计数。有 1m 但 1m 不完整的一天不会改用 5m,以免同一天混用两种口径。跳过的分三类:
  6. 停牌:整天没有一笔成交(skipped_halted_1m / skipped_halted_5m)。停牌股的 1m 通常少一根,属于正常情况。
  7. 盘中停复牌:只交易了部分时段,K 线从盘中才开始或提前结束,但中间没有断档(skipped_partial_session_1m / skipped_partial_session_5m),例如 13:41 复牌。同样是市场事件,不算异常。
  8. 数据不完整:当天有成交,K 线中间却有断档(skipped_incomplete_1m / skipped_incomplete_5m),通常是取数缺失。这次运行记为降级(degraded),incomplete_examples 列出前几条,可回填对应的分钟线后再派生。
  9. 其他无效输入:重复时间戳、午休或时段外的 K 线、非法价格等会让重采样报错。派生入湖时只跳过出问题的“股票 × 交易日”,其余照常写入;结果里的 skipped_invalid 记数量,invalid_examples 列出前几条原因,这次运行记为降级(degraded)。
  10. 来源标记:结果多一列 resampled_from,值为 1m 或 5m。
  11. 不复权:价格与输入一样不复权,读取时用 adjust="hfq" / "qfq" 按需复权。

1m 与 5m 的口径差别

供应商的 5m K 线由全部 1m 直接合成,未成交分钟沿用的报价也算进了开高低价。一根 5m 只要有成交,它的 OHLC 就原样参与计算,因此由 5m 算出的 15 / 30 / 60 分钟线,少数区间的开盘价、最高价、最低价会与由 1m 算出的不同;收盘价和量额基本一致。1m 覆盖到的日期总是优先用 1m;研究需要统一口径时,按 resampled_from 过滤或分组。

用法一:查询时现算

from cnequity.query import load, resample_minute_history

window = dict(start="2025-01-02", end="2026-09-30", symbols=["603869.SH"])
bars_30m = resample_minute_history(
    load("minute_bars", **window),
    load("minute_bars_5m", **window),
    "30m",
)

只想用一种输入时,用 resample_trade_bars(frame, "15m"):传入 1m 或 5m 中的一种,不能混用。详见查询指南。

用法二:派生入湖

命令行

cne derive minute_bars_15m
cne derive minute_bars_60m --start 2025-01-02 --end 2025-12-31
参数 作用
不带参数 只算需要重算的交易日:还没算过;1m / 5m 的内容变了(包括后来回填的 1m、回滚或从备份恢复);计算规则随版本升级变了;或输出被改动过。按内容判断,不看文件时间
--start / --end 只算这个窗口内有分钟线的交易日
--full 重算全部有分钟线的交易日

命令输出 JSON:写入行数、交易日数、来自 1m / 5m 的“股票 × 交易日”数、被跳过的数量(skipped_halted_*、skipped_partial_session_*、skipped_incomplete_*、skipped_invalid),以及 sessions_cleared:原来有结果、重算后已无可用数据的交易日,这些交易日的分区会被替换为空分区,旧数据不会继续留在湖里。湖里既没有 1m 也没有 5m 时,命令报错并提示先回填分钟线。

三个频率是三个独立数据集,需要哪个就派生哪个。

网页面板

cne serve 打开面板后,有三个入口,都会打开同一张表单:

  1. 操作页 → 手动更新:「更新范围」选「一个派生(起止日期)」,「派生」选「15 分钟线 · minute_bars_15m」(或 30m、60m)。
  2. 操作页 → 常用命令 → 补数 → 重算派生:同一张表单。
  3. 数据集页:在「数据集」里打开「15 分钟线」等数据集,点页面顶部的「重算派生」,表单会预先选好这个数据集。

选中分钟线目标后,表单下方会说明上面的计算规则。起点、终点都不填,就是只算还没算过或输入已更新的交易日;勾选「全量重写」重算全部交易日。点「预览」先看将要执行的命令,确认后作为后台任务运行,进度和结果在「最近的任务」里查看。关掉页面或 serve 不会中断任务。

也可以直接打开 http://127.0.0.1:8787/#/ops?op=derive.run&name=minute_bars_15m,表单会预先选好目标。只读模式(--read-only)和非回环地址默认不能从页面发起,见 CLI 参考。

存放与发布

  • 位置:{data.root}/derived/minute_bars_15m/trade_date=YYYY-MM-DD/,按交易日分区;30m、60m 同理。
  • 主键:(symbol, trade_date, bar_time, frequency);字段见字段与单位。
  • 发布:与其他派生数据集一样,在写锁下生成新版本,并记录所用 1m / 5m 的版本;正在读的程序不会读到写了一半的数据。
  • 新鲜度:这三个数据集没有水位。cne status 和面板不会因为它们没有每天更新而标成落后;从未派生过时显示为空,不算错误。分钟线更新后需要再运行一次 cne derive。
  • 落后提示:已经派生过的数据集,如果 1m / 5m 有交易日尚未重算,cne status --datasets 会在表格下方提示「输入有 N 个交易日尚未重算」;面板的数据集页在「覆盖」下显示同样的数字,并附「重算派生」入口。

读取已入湖的数据

途径 写法
Python load("minute_bars_15m", start=..., symbols=[...], adjust="hfq")
SQL cne query --sql "SELECT * FROM minute_bars_15m WHERE symbol = '603869.SH'"
HTTP cne serve 后读取 /api/read/minute_bars_15m?start=2026-09-01&end=2026-09-30&symbol=603869.SH,限制见下
MCP query_bars,dataset 选 minute_bars_15m,可传 adjust
网页面板 数据集页浏览样例

HTTP 接口和 MCP 只读已入湖的数据,不能现算;要从这两个入口取数,先派生入湖。

HTTP 读取接口 /api/read/<数据集> 用于有边界的小窗口:

  • start、end 必填,窗口不超过 366 个自然日;跨多天时必须带 symbol(单数,一次一只股票)。
  • 一次最多返回 1000 行,超过返回 413。按单只股票算,15m 一次最多约 62 个交易日,30m 约 125 个;60m 先碰到 366 天的窗口上限,约 240 个交易日;更长的历史分段读取,或改用 Python / SQL。
  • adjust=hfq / qfq 要求 adj_factors 已有发布版本。

限制

  • 不从数据源直接抓取 15 / 30 / 60 分钟线。通达信虽然提供这些频率,但历史深度与 5m 相同,开高低价同样混入未成交分钟沿用的报价。
  • 5m 之前没有更早的分钟历史,重采样也补不出来。
  • 派生不会修正输入:输入的分钟线缺失或有误,结果同样缺失或有误。