cbpred
这是一个统一模型的 8H U 本位 USDT 合约回调预测管线。它只使用 banbot 的 K 线 OHLCV 数据,默认调用 banbot 下载 1H 存储数据,再按完整的 8 根 1H K 线聚合为 8H;不使用资金费率、盘口、持仓量或外部行情。
目标定义为有符号的未来最低价收益,并按品种训练期波动尺度归一化:
raw_return = quantile(low[t+1:t+6], 0.20) / anchor_close - 1
target = raw_return / asset_atr_price_top20_median
这里的 20% 分位数是未来窗口的稳健低点参考,不会被单根异常影线完全决定;它不是严格的 lowestLow。负值表示该低点参考低于当前收盘价,正值表示它仍高于当前收盘价;因此上涨阶段不会被强行压成 0。asset_atr_price_top20_median 是该品种训练期 ATR/price 降序前 20% 的中位数,预测输出会乘回该尺度。训练锚点和未来 6 根必须连续,跨越测试边界的训练样本会被丢弃,避免把测试期标签泄漏进训练集。
运行
先安装依赖:
python3 -m venv .venv
.venv/bin/pip install -e .
使用 banbot 的配置连接数据库,筛选 market=linear、符号为 BASE/USDT:USDT、上市至少 730 天且未退市的品种;默认连接配置来自 /home/ctyun/ban/banbot/biz/config.yml:
.venv/bin/python -m cbpred prepare \
--banbot-config /home/ctyun/ban/banbot/biz/config.yml \
--out-dir data
如果数据已经由 banbot 下载完成,可以跳过下载,只执行筛选和导出:
.venv/bin/python -m cbpred prepare --skip-download --out-dir data
训练会执行三轮特征迭代。点模型候选包括随机森林平方误差和 ExtraTrees,另用 HistGradientBoosting 分位数模型输出 q20/q80;验证集和测试集均为最近 10 个月中的按品种随机拆分,测试集只在最终选模后使用:
.venv/bin/python -m cbpred train \
--data-dir data \
--artifact-dir artifacts_signed
默认保留所有连续样本,把当前 ATR 在过去 200 根 8H K 线中的排名作为特征;可以通过 --volatility-rank-threshold 0.80 或 0.90 做高波动样本对照实验。训练阶段会把数据集行数、过滤前后数量、阶段和候选模型进度输出到 stderr。
一条命令完成准备和训练:
.venv/bin/python -m cbpred run --out-dir data --artifact-dir artifacts_signed
输出在 artifacts_signed/report.md、artifacts_signed/report.json 和 artifacts_signed/model.joblib。报告会列出三轮特征的验证表现、最终模型和测试集 MAE/RMSE、q80 覆盖率、q20 下界未跌破率。
对某个已导出的 8H CSV 预测任意锚点:
.venv/bin/python -m cbpred predict \
--artifact artifacts_signed/model.joblib \
--csv data/raw/123_BTC_USDT_USDT.csv \
--at 2026010100000000
future_low_return_q20 是稳健未来低点收益的较低分位,对应 future_low_price_q20 这个保守的价格下界;future_low_return_q80 是较浅、较乐观的分位。负收益才表示回撤,正收益表示稳健未来低点仍高于当前收盘价。兼容字段 drawdown_* 等于对应收益取负,实际覆盖率应以测试集校准报告为准,不能把 80% 当成保证概率。
如果预测时 eligible_for_model 为 false,说明过去 200 根不足以计算 ATR 排名,或显式设置的 ATR 排名门槛未达到,返回的模型数值为 null,应跳过该时刻。
特征迭代
第一轮使用 18 根 K 线的方向、实体/影线占比、收盘在 K 线中的位置、相对波幅、对数收益,以及基于法币成交额的 18 根窗口成交量排名和相对中位数;再加入两个固定的品种画像值:训练期 ATR/price 降序前 20% 的中位数、训练期法币成交额对数前 20% 的中位数。所有绝对价格都被转换为比例或滚动相对量,品种画像再用训练品种的均值/标准差标准化。
第二轮追加归一化 ATR、RSI、布林带位置/宽度、EMA 距离、趋势收益、滚动波动率和滚动回撤;第三轮追加 18 根窗口的趋势、波幅、方向比例、成交量趋势、收盘位置和指标交互摘要。三轮使用同一批训练/验证/测试边界,选择验证 q80 pinball loss 加覆盖率偏差后的最佳组合,最后只在测试集报告一次。
运行标准库回归测试:
.venv/bin/python -m unittest discover -v