支持1d级别插针模型
This commit is contained in:
77
docs/1d_2026-08-24.md
Normal file
77
docs/1d_2026-08-24.md
Normal file
@@ -0,0 +1,77 @@
|
||||
# 1d 模型实验报告
|
||||
|
||||
## 结论
|
||||
|
||||
在与当前 8H 正式模型相同的模型、特征、过滤和切分协议下,1d 版本成功完成全市场数据导出、训练、验证、最终测试和最新预测。验证集仍选择 `compact6`,模型使用 146 个特征、ExtraTrees 点模型和两个 HistGradientBoosting 分位数模型。
|
||||
|
||||
1d 最终测试点预测 MAE 为 `0.043335`,RMSE 为 `0.056943`。q80 覆盖率为 `72.76%`,q20 下界命中率为 `93.68%`。
|
||||
|
||||
## 数据快照
|
||||
|
||||
| 项目 | 值 |
|
||||
| --- | --- |
|
||||
| 周期 | 1d |
|
||||
| 快照结束 | 2026-08-24 00:00 UTC |
|
||||
| 历史范围 | 36 个月 |
|
||||
| 历史起点 | 2023-08-24 00:00 UTC |
|
||||
| 训练快照 | 2025-10-24 00:00 UTC |
|
||||
| 最低上市年龄 | 730 天 |
|
||||
| 市场过滤 | Binance linear、USDT 结算、非组合、未在训练快照前退市 |
|
||||
| 保留/排除品种 | 151 / 2,125 |
|
||||
| 原始行情文件 | 151 个 CSV,约 15 MB |
|
||||
| bar 连续性检查 | 全部文件相邻时间差均为 24h |
|
||||
|
||||
原始数据和筛选清单:[`data_1d/manifest.json`](../data_1d/manifest.json) 与 [`data_1d/raw/`](../data_1d/raw/)。
|
||||
|
||||
## 训练协议
|
||||
|
||||
- 输入最近 18 根已收盘 1d K 线。
|
||||
- 预测未来 6 根 1d K 线的最低价 20% 分位数收益。
|
||||
- 目标按品种训练期 `ATR/close` 高波动 20% 样本中位数归一化。
|
||||
- 训练/验证/测试品种数量为 `90/30/31`。
|
||||
- 最近 10 个月按时间切成验证 30%、校准 20%、最终测试 50%。
|
||||
- 训练/验证/校准/最终测试样本数为 `68,840/2,550/1,650/4,526`。
|
||||
- `atr_rank_200` 窗口为 200 根日线,样本过滤阈值为 `0.0`,因此不主动排除低波动样本。
|
||||
- 随机种子为 `42`,点模型树数为 `20`,与当前正式 8H 实验配置一致。
|
||||
|
||||
## 特征选择
|
||||
|
||||
| 版本 | 特征数 | 验证选择分数 | 测试 MAE | 测试 RMSE |
|
||||
| --- | ---: | ---: | ---: | ---: |
|
||||
| baseline | 182 | 0.17235337 | 0.043468 | 0.057143 |
|
||||
| compact6 | 146 | 0.17234073 | 0.043335 | 0.056943 |
|
||||
|
||||
`compact6` 在验证集胜出,因此作为 1d 产物保存。它相比 baseline 的测试 MAE 下降约 `0.31%`,RMSE 下降约 `0.35%`;测试集只用于最终报告,没有参与选择。
|
||||
|
||||
## 最终测试指标
|
||||
|
||||
| 指标 | compact6 |
|
||||
| --- | ---: |
|
||||
| 样本数 | 4,526 |
|
||||
| 点预测 MAE | 0.043335 |
|
||||
| 点预测 RMSE | 0.056943 |
|
||||
| q20 pinball | 0.021642 |
|
||||
| q80 pinball | 0.011617 |
|
||||
| q20 coverage | 6.32% |
|
||||
| q80 coverage | 72.76% |
|
||||
| q20 下界命中率 | 93.68% |
|
||||
|
||||
误差指标在乘回品种 ATR 尺度后的实际收益空间计算。日线未来 6 根约对应 6 天,8H 未来 6 根约对应 2 天,因此 1d 和 8H 的绝对误差不能简单解释为同一预测期限的优劣。
|
||||
|
||||
## 最新批量预测
|
||||
|
||||
基于同一快照最后一根完整日线 `2026-08-23 00:00 UTC`,151/151 个品种满足预测资格。按 1d USDT 成交额排序的前五个品种为:
|
||||
|
||||
| 排名 | 品种 | 1d 成交额 USDT | 点预测回撤 |
|
||||
| ---: | --- | ---: | ---: |
|
||||
| 1 | ETH/USDT:USDT | 10,761,726,205 | 4.14% |
|
||||
| 2 | BTC/USDT:USDT | 10,079,189,363 | 2.46% |
|
||||
| 3 | SOL/USDT:USDT | 2,411,667,199 | 5.02% |
|
||||
| 4 | ZEC/USDT:USDT | 2,306,432,737 | 6.27% |
|
||||
| 5 | XRP/USDT:USDT | 2,174,780,164 | 4.51% |
|
||||
|
||||
预测 CSV 和摘要:[`predictions/latest_1d/predictions.csv`](../predictions/latest_1d/predictions.csv) 与 [`predictions/latest_1d/report.json`](../predictions/latest_1d/report.json)。模型文件:[`artifacts_1d/best/model.joblib`](../artifacts_1d/best/model.joblib)。
|
||||
|
||||
## 限制
|
||||
|
||||
这是同一历史快照上的离线实验,不能作为交易信号或未来收益保证。日线的样本数量明显少于 8H,且 6 根日线覆盖更长的未来区间;q80 覆盖率低于名义 80%,说明当前校准在这份 1d 测试集上仍有偏差。banbot 导出过程中有两个既有 1d pending job 的可见性告警,但本次导出命令成功完成,最终文件连续性检查全部通过。
|
||||
@@ -123,3 +123,11 @@ price_level = close × (1 + future_low_return)
|
||||
- 模型只对保存了训练画像且有足够历史的品种预测。当前 ATR 排名至少需要 200 根 8H K 线。
|
||||
- `atr_rank_200_pct` 是状态描述,不代表模型只预测高波动时刻;正式阈值为 `0.0`。
|
||||
- 预测结果中的空值表示当前时刻不满足模型资格条件,不应替换成零。
|
||||
|
||||
## 1d 实验结果
|
||||
|
||||
1d 实验使用与默认模型相同的 `compact6` 特征(146 个特征)、ExtraTrees 点模型、两个 HistGradientBoosting 分位数模型、seed=42、20 棵树、36 个月数据、最后 10 个月留出、上市至少 730 天和 ATR 排名阈值 0.0。仅将 bar 周期、连续性步长和对应的 18/6 根窗口改为 1d。
|
||||
|
||||
固定快照截止 `2026-08-24 00:00 UTC`,导出 151 个品种、排除 2,125 个品种。品种按 90/30/31 拆分为训练/验证/测试,样本按训练/验证/校准/最终测试为 68,840/2,550/1,650/4,526。验证选择分数为 `0.17234073`,1d 测试点预测 MAE/RMSE 为 `0.043335/0.056943`,q80 覆盖率为 `72.76%`,q20 下界命中率为 `93.68%`。
|
||||
|
||||
详细机器可读报告和模型分别是 [`artifacts_1d/report.json`](../artifacts_1d/report.json)、[`artifacts_1d/report.md`](../artifacts_1d/report.md) 和 [`artifacts_1d/best/model.joblib`](../artifacts_1d/best/model.joblib)。这些指标在真实收益空间中计算,日线的 6 根预测跨度与 8H 的 6 根预测跨度不同,不应直接当作同一持有期的收益比较。
|
||||
|
||||
@@ -31,7 +31,7 @@ python3 -m venv .venv
|
||||
1. 检查配置中的 QuestDB 是否可连接;QuestDB 默认不可用时,通过 banbot 的导出命令触发其启动流程。
|
||||
2. 从数据库筛选 Binance `linear` 市场、结算币为 USDT、上市至少 730 天且未退市的品种。
|
||||
3. 调用 banbot 下载最近 36 个月的 1H K 线。
|
||||
4. 调用 banbot 导出原始 K 线,并只保留连续完整的 8 根 1H K 线聚合成 8H K 线。
|
||||
4. 调用 banbot 导出请求周期的完整 K 线;默认是 8H,也可以通过 `--timeframe 1d` 导出日线。
|
||||
5. 写入 `data/manifest.json` 和 `data/raw/*.csv`。
|
||||
6. 加载 `artifacts/v1/model.joblib`,对清单中的每个品种使用最新完整 8H K 线预测。
|
||||
7. 按最新 8H USDT 成交额降序写入 `predictions/latest_v1/predictions.csv`,并写入 `report.json`。
|
||||
@@ -48,7 +48,7 @@ python3 -m venv .venv
|
||||
--end 2026-08-23T00:00:00Z
|
||||
```
|
||||
|
||||
`--end` 用于固定数据快照,支持 UTC 日期、ISO 时间或毫秒时间戳。默认使用当前 UTC 时间向下取整到 8H 边界。
|
||||
`--end` 用于固定数据快照,支持 UTC 日期、ISO 时间或毫秒时间戳。默认按 `--timeframe` 向下取整到对应边界。
|
||||
|
||||
## 手动命令
|
||||
|
||||
@@ -71,6 +71,15 @@ python3 -m venv .venv
|
||||
|
||||
`prepare` 的默认范围是最近 36 个月,训练快照前的品种至少上市 730 天,最近 10 个月预留给测试。`manifest.json` 记录筛选出的品种、数据范围、数据库类型和被排除的原因。
|
||||
|
||||
导出日线时使用独立目录,避免覆盖 8H 快照:
|
||||
|
||||
```bash
|
||||
.venv/bin/python -m cbpred prepare \
|
||||
--timeframe 1d \
|
||||
--out-dir data_1d \
|
||||
--banbot-config /home/ctyun/ban/banbot/biz/config.yml
|
||||
```
|
||||
|
||||
### 训练模型
|
||||
|
||||
```bash
|
||||
@@ -96,9 +105,9 @@ python3 -m venv .venv
|
||||
--symbol BTC/USDT:USDT
|
||||
```
|
||||
|
||||
不传 `--at` 时使用 CSV 中最新完整 8H K 线。传入 `--at` 时,时间必须精确匹配一个 8H K 线起始时间,且不能早于模型训练快照。
|
||||
不传 `--at` 时使用 CSV 中最新完整周期 K 线。传入 `--at` 时,时间必须精确匹配一个模型周期 K 线起始时间,且不能早于模型训练快照。
|
||||
|
||||
模型需要至少 200 根 8H K 线计算 ATR 排名,并需要模型中保存的该品种训练画像。`eligible_for_model` 为 `false` 时,预测数值返回空值,并包含 `skip_reason`。
|
||||
模型需要至少 200 根对应周期 K 线计算 ATR 排名,并需要模型中保存的该品种训练画像。`eligible_for_model` 为 `false` 时,预测数值返回空值,并包含 `skip_reason`。
|
||||
|
||||
## 文件布局
|
||||
|
||||
@@ -123,7 +132,7 @@ cbpred/
|
||||
- QuestDB 连接失败:检查 banbot 配置中的数据库地址、QuestDB 服务和端口;一键脚本只对默认 QuestDB 端口尝试触发 banbot 启动。
|
||||
- `missing data/manifest.json`:先运行 `prepare`,或确认一键脚本没有在下载/导出阶段失败。
|
||||
- 某品种预测为空:检查 `eligible_for_model` 和 `skip_reason`,通常是 200 根 ATR 历史不足或该品种没有正式模型画像。
|
||||
- 数据只有部分 8H K 线:导出会丢弃不连续或不完整的 8 根 1H 桶,这是为了避免特征和未来标签跨越缺口。
|
||||
- 数据只有部分 K 线:导出和训练会丢弃不连续或不完整的 bar,这是为了避免特征和未来标签跨越缺口。
|
||||
|
||||
## 验证
|
||||
|
||||
|
||||
Reference in New Issue
Block a user