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 |
湖里已经采到的分钟线会一直保留,上表只限制回填能补到多早。
计算规则¶
- 选输入:按“股票 × 交易日”选择。某只股票某天有 1m 就只用 1m,没有才用 5m。各股票 1m 的起点不同,所以不按统一日期切换。
- 对齐:上午从 09:30、下午从 13:00 起算,不跨午休。
bar_time是区间的收盘分钟,例如 60m 一天四根:10:30、11:30、14:00、15:00。 - 开高低收:只计入有成交的输入 K 线(
volume > 0或amount > 0;后者保留股数被取整为零的小额成交)。区间内完全没有成交时,四个价格都取最后一个报价,成交量和成交额为零,这个价格不是成交价。 - 量额:区间内输入 K 线的成交量、成交额直接相加。
- 缺组成 K 线:区间只有部分输入 K 线时不补齐。查询时现算会直接报错;派生入湖会跳过这只股票当天的数据并计数。有 1m 但 1m 不完整的一天不会改用 5m,以免同一天混用两种口径。跳过的分三类:
- 停牌:整天没有一笔成交(
skipped_halted_1m/skipped_halted_5m)。停牌股的 1m 通常少一根,属于正常情况。 - 盘中停复牌:只交易了部分时段,K 线从盘中才开始或提前结束,但中间没有断档(
skipped_partial_session_1m/skipped_partial_session_5m),例如 13:41 复牌。同样是市场事件,不算异常。 - 数据不完整:当天有成交,K 线中间却有断档(
skipped_incomplete_1m/skipped_incomplete_5m),通常是取数缺失。这次运行记为降级(degraded),incomplete_examples列出前几条,可回填对应的分钟线后再派生。 - 其他无效输入:重复时间戳、午休或时段外的 K 线、非法价格等会让重采样报错。派生入湖时只跳过出问题的“股票 × 交易日”,其余照常写入;结果里的
skipped_invalid记数量,invalid_examples列出前几条原因,这次运行记为降级(degraded)。 - 来源标记:结果多一列
resampled_from,值为1m或5m。 - 不复权:价格与输入一样不复权,读取时用
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 打开面板后,有三个入口,都会打开同一张表单:
- 操作页 → 手动更新:「更新范围」选「一个派生(起止日期)」,「派生」选「15 分钟线 · minute_bars_15m」(或 30m、60m)。
- 操作页 → 常用命令 → 补数 → 重算派生:同一张表单。
- 数据集页:在「数据集」里打开「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 之前没有更早的分钟历史,重采样也补不出来。
- 派生不会修正输入:输入的分钟线缺失或有误,结果同样缺失或有误。