282 lines
16 KiB
Markdown
282 lines
16 KiB
Markdown
# v6.4 生产模型体系详细说明
|
||
|
||
---
|
||
|
||
## 一、整体架构
|
||
|
||
v6.4 是一个四层串联的 LightGBM 模型体系,按照“排序 → 精选 → 校准 → 定价”的流程协同工作。
|
||
|
||
```
|
||
输入:一只股票的原始行情数据(K线、成交量等)
|
||
│
|
||
▼
|
||
┌─────────────────────────────────────┐
|
||
│ 第1层:Rank(全市场排序) │
|
||
│ 模型:LGBMRegressor │
|
||
│ 输入:38维特征(34基础 + 4情绪) │
|
||
│ 输出:rank_predicted_rounds │
|
||
│ 角色:初级分析师,回答“谁更活跃” │
|
||
└─────────────────────────────────────┘
|
||
│
|
||
▼
|
||
┌─────────────────────────────────────┐
|
||
│ 第2层:Top(头部精选) │
|
||
│ 模型:LGBMClassifier │
|
||
│ 输入:35维(34基础 + Rank预测值) │
|
||
│ 输出:top_elite_prob(0~1) │
|
||
│ 角色:资深专家,回答“谁是头部5%” │
|
||
└─────────────────────────────────────┘
|
||
│
|
||
▼
|
||
┌─────────────────────────────────────┐
|
||
│ 第3层:Stacking(融合校准) │
|
||
│ 模型:LGBMRegressor │
|
||
│ 输入:36维(34基础 + Rank + Top) │
|
||
│ 输出:calibrated_prob │
|
||
│ 角色:投资总监,回答“综合谁最好” │
|
||
└─────────────────────────────────────┘
|
||
│
|
||
▼
|
||
┌─────────────────────────────────────┐
|
||
│ 第4层:Meta Ranker(定价决策) │
|
||
│ 模型:LGBMRegressor │
|
||
│ 输入:3维(价格 + Stacking + Rank)│
|
||
│ 输出:predicted_profit │
|
||
│ 角色:定价师,回答“买谁最赚钱” │
|
||
└─────────────────────────────────────┘
|
||
│
|
||
▼
|
||
最终选出预测利润最高的10只建仓
|
||
```
|
||
|
||
---
|
||
|
||
## 二、各层模型详细说明
|
||
|
||
### 2.1 Rank 模型——全市场排序
|
||
|
||
| 属性 | 说明 |
|
||
|:---|:---|
|
||
| **文件** | `rank.pkl` |
|
||
| **模型类型** | LightGBM 回归(LGBMRegressor) |
|
||
| **训练目标** | `y_rounds`(未来60天网格匹配轮回数,log1p变换) |
|
||
| **输入维度** | 38维(34基础特征 + 4情绪因子) |
|
||
| **输出** | `rank_predicted_rounds`(预测匹配轮数,log1p空间) |
|
||
| **核心指标** | Spearman 0.5355(5折交叉验证均值) |
|
||
| **训练样本** | 约21.2万条,覆盖1,799只股票 |
|
||
|
||
**角色**:Rank 是整个链条的起点。它不关心价格合不合适、不关心最终能不能赚钱,只做一件事——给全市场股票排序,预测“谁最活跃”。它是整个体系中最依赖基础特征的模型。
|
||
|
||
**输出如何被使用**:Rank 的预测值作为 Top 模型的关键输入特征(第35维),也是 Stacking 和 Meta Ranker 的输入之一。它不以最终决策者的身份出现,而是作为“活跃度信号”传递给下游。
|
||
|
||
---
|
||
|
||
### 2.2 Top 模型——头部精选
|
||
|
||
| 属性 | 说明 |
|
||
|:---|:---|
|
||
| **文件** | `top.pkl` |
|
||
| **模型类型** | LightGBM 分类(LGBMClassifier) |
|
||
| **训练目标** | 是否属于同 period 内 P95 头部(二分类) |
|
||
| **输入维度** | 35维(34基础特征 + `rank_predicted_rounds`) |
|
||
| **输出** | `top_elite_prob`(特等契合概率,0~1) |
|
||
| **核心指标** | PR-AUC 0.3389,Top5命中率 100%,Top10命中率 100% |
|
||
| **训练样本** | 与 Rank 相同 |
|
||
|
||
**角色**:Top 是“站在 Rank 肩膀上”的精选专家。它不自己做全市场排序,而是用 Rank 的输出作为最重要的参考信号,从中识别出“头部 5%”的特等契合标的。它的标签不是看绝对匹配次数的高低,而是看“在同一时期的所有股票里,是不是最优秀的那一批”。
|
||
|
||
**标签构造逻辑**:
|
||
- 将训练样本按 `period_id`(时间段)分组
|
||
- 在每个 `period_id` 内,取 `y_rounds` 的 P95 分位数作为阈值
|
||
- `y_rounds >= P95` → 标签=1(正样本,头部5%)
|
||
- `y_rounds < P95` → 标签=0(负样本)
|
||
|
||
**为什么要用 period_id 分组**:不同时期的网格活跃度差异很大。2024年2月恐慌期和2024年10月亢奋期,全市场的匹配次数分布完全不同。如果不用 period_id 分组,模型会把“恐慌期的中等活跃”和“亢奋期的高活跃”错误对比。分组让 Top 学会的是“在当前环境下,这只股票是不是相对最好的”。
|
||
|
||
**输出如何被使用**:Top 的概率值作为 Stacking 的核心输入之一,帮助 Stacking 做最终校准。
|
||
|
||
---
|
||
|
||
### 2.3 Stacking 模型——融合校准
|
||
|
||
| 属性 | 说明 |
|
||
|:---|:---|
|
||
| **文件** | `stacking_calibrated.pkl` |
|
||
| **模型类型** | LightGBM 回归(LGBMRegressor) |
|
||
| **训练目标** | `y_rounds`(log1p变换) |
|
||
| **输入维度** | 36维(34基础特征 + `rank_predicted_rounds` + `top_elite_prob`) |
|
||
| **输出** | `calibrated_prob`(校准后的最终评分) |
|
||
| **核心指标** | Spearman 0.6932 |
|
||
| **训练样本** | 与 Rank 相同 |
|
||
|
||
**角色**:Stacking 是“投资总监”。它不像 Rank 那样直接看原始数据,也不像 Top 那样只做头部精选,而是综合所有可用信息——原始特征、Rank 的判断、Top 的判断——做一次最终的校准评分。它能学会“当 Rank 和 Top 意见一致时,强化信号;当两者矛盾时,折中处理”。
|
||
|
||
**与 Meta Ranker 的本质区别**:
|
||
- Stacking 回答的是“谁最好”(质量排序),不考虑价格
|
||
- Meta Ranker 回答的是“买谁最赚钱”(利润预测),必须考虑价格
|
||
|
||
**输出如何被使用**:在 v6.3 中,Stacking 的输出直接作为最终评分排序选股。在 v6.4 中,它退后半步,作为 Meta Ranker 的关键输入特征之一。
|
||
|
||
---
|
||
|
||
### 2.4 Meta Ranker 模型——定价决策
|
||
|
||
| 属性 | 说明 |
|
||
|:---|:---|
|
||
| **文件** | `meta_ranker_v2.pkl` |
|
||
| **模型类型** | LightGBM 回归(LGBMRegressor) |
|
||
| **训练目标** | `future_60d_profit`(买入后60天实际网格利润,log1p变换) |
|
||
| **输入维度** | 3维(`latest_close` + `calibrated_prob` + `rank_predicted_rounds`) |
|
||
| **输出** | `predicted_profit`(预测利润) |
|
||
| **核心指标** | Spearman 0.7663 |
|
||
| **训练样本** | 1,288条(v6.4自身回测产生的真实买入交易记录) |
|
||
|
||
**角色**:Meta Ranker 是 v6.4 区别于 v6.3 的核心创新。前三个模型都在回答“好不好”,Meta Ranker 回答的是“值不值”——以当前价格买入,未来60天能赚多少。
|
||
|
||
**为什么要单独训练 Meta Ranker**:Stacking 虽然擅长排序,但它不考虑入场价格。一只评分 0.99 的股票,如果当前价格太贵,向上空间很小,实际利润可能不如一只评分 0.70 但价格合适的股票。Meta Ranker 通过直接学习真实买入利润,学会了在“质量、活跃度、价格”三者之间做最优权衡。
|
||
|
||
**训练样本的独特来源**:Meta Ranker 的训练样本不来自候选池特征快照,而来自 v6.4 自身回测中实际发生的买入交易。每条样本记录了“以某个价格买入某只股票后,未来60天实际赚了多少”。这让 Meta Ranker 学到的是“真实交易的利润规律”,而不是“理论上的匹配次数规律”。
|
||
|
||
**为什么样本量只有 1,288 条**:利润标签比匹配轮数标签更难获取——必须模拟一次真实的买入操作,然后跟踪后续60天的网格交易结果。但 Meta Ranker 仅需少量高质量样本就能生效,因为它只需要学习 3 个特征的组合规律。
|
||
|
||
---
|
||
|
||
## 三、因子体系详细说明
|
||
|
||
### 3.1 34 维基础特征(按类别分组)
|
||
|
||
#### 价格波动类(6个)
|
||
|
||
| 特征 | 中文名称 | 计算逻辑 | 对模型的意义 |
|
||
|:---|:---|:---|:---|
|
||
| `price_cv` | 价格变异系数 | 观察窗口内收盘价标准差 / 均值 × 100 | 衡量价格离散程度,值越大说明价格波动越剧烈 |
|
||
| `volatility_20d` | 20日波动率 | 近20日日收益率标准差 × sqrt(252) × 100 | 年化波动率,衡量短期波动强度 |
|
||
| `avg_daily_amp` | 日均振幅 | 近20日 (high-low)/open × 100 的均值 | 日均波动幅度,直接反映网格触发潜力 |
|
||
| `atr_pct` | ATR百分比 | 14日ATR / 最新收盘价 × 100 | 考虑跳空缺口的真实波动,比单纯振幅更准确 |
|
||
| `bb_width` | 布林带宽度 | (上轨-下轨)/中轨 × 100 | 价格通道宽度,过窄没有交易空间,过宽风险大 |
|
||
| `amplitude_cv` | 振幅变异系数 | 近20日日振幅标准差 / 均值 | 衡量振幅稳定性,稳定高振幅比忽大忽小更好 |
|
||
|
||
#### 成交量与资金类(6个)
|
||
|
||
| 特征 | 中文名称 | 计算逻辑 | 对模型的意义 |
|
||
|:---|:---|:---|:---|
|
||
| `amount_mean_20d` | 20日平均成交额 | 近20日成交额均值 | 绝对成交活跃度 |
|
||
| `amount_cv_20d` | 20日成交额变异系数 | 近20日成交额标准差/均值 | 成交稳定性 |
|
||
| `turnover_proxy_20d` | 换手率代理 | 近20日成交量/总股本 | 相对成交活跃度,已标准化规模 |
|
||
| `volume_ratio` | 量比 | 近20日均量 / 近60日均量 | >1放量,<1缩量 |
|
||
| `obv_slope` | OBV斜率 | 近20日OBV线性回归斜率 | 资金流向趋势,正=流入,负=流出 |
|
||
| `liquidity_drying_up_20d` | 流动性枯竭 | 20日最低量 / 60日均量 | 负向指标,成交量急剧萎缩是风险信号 |
|
||
|
||
#### 趋势与位置类(7个)
|
||
|
||
| 特征 | 中文名称 | 计算逻辑 | 对模型的意义 |
|
||
|:---|:---|:---|:---|
|
||
| `trend_slope_60d` | 60日趋势斜率 | 近60日收盘价线性回归斜率 | 中长期趋势方向 |
|
||
| `trend_slope_20d` | 20日趋势斜率 | 近20日收盘价线性回归斜率 | 短期趋势方向 |
|
||
| `trend_abs_slope_20d` | 20日趋势绝对斜率 | 近20日趋势斜率的绝对值 | 趋势强度,不区分方向 |
|
||
| `drawdown_60d` | 60日最大回撤 | 近60日最高点到最低点的跌幅 | 风险度量 |
|
||
| `range_position_60d` | 60日区间位置 | (当前价-60日最低)/(60日最高-60日最低) | 当前价格在中期波动区间中的相对位置 |
|
||
| `rebound_from_low_60d` | 60日低点反弹幅度 | (当前价-60日最低)/60日最低 | 从底部反弹的力度 |
|
||
| `intraday_trend_strength` | 日内趋势强度 | 近20日 abs(close-open)/open 均值 | 日内单边vs震荡的度量 |
|
||
|
||
#### 网格结构类(5个)
|
||
|
||
| 特征 | 中文名称 | 计算逻辑 | 对模型的意义 |
|
||
|:---|:---|:---|:---|
|
||
| `grid_room_balance` | 网格空间均衡度 | (当前价到上界距离)/(当前价到下界距离) | 价格在网格区间内的位置是否均衡 |
|
||
| `grid_touch_count_60d` | 60日网格触达次数 | 近60日K线触碰整数网格线的次数 | 价格在网格线附近活动的频率 |
|
||
| `dist_to_grid_upper` | 距上方网格距离 | (11-当前价)/11 | 向上卖出的空间大小 |
|
||
| `dist_to_grid_lower` | 距下方网格距离 | (当前价-1)/当前价 | 向下买入的空间大小 |
|
||
| `cross_freq_x_bb` | 穿网频率×布林带宽 | 交互特征 | 网格穿越效率与价格通道的组合 |
|
||
|
||
#### 市值与风格类(5个)
|
||
|
||
| 特征 | 中文名称 | 计算逻辑 | 对模型的意义 |
|
||
|:---|:---|:---|:---|
|
||
| `ln_float_mv` | 流通市值对数 | log(流通市值) | 规模因子,小市值弹性更大 |
|
||
| `mv_vol_interact` | 市值波动交互 | ln_float_mv × volatility_20d | 规模与波动的交互效应 |
|
||
| `small_cap_premium` | 小市值溢价 | 1/(流通市值+1) | 市值越小值越大 |
|
||
| `amplitude_uniqueness_20d` | 振幅独特性 | 个股振幅相对沪深300振幅的偏离度 | 独立于大盘的震荡程度 |
|
||
| `price_entropy` | 价格分布熵 | 近60日收盘价分10bin计算信息熵 | 价格分布是否均匀 |
|
||
|
||
#### 交互与辅助类(5个)
|
||
|
||
| 特征 | 中文名称 | 计算逻辑 | 对模型的意义 |
|
||
|:---|:---|:---|:---|
|
||
| `amp_x_grid` | 振幅×网格占比 | avg_daily_amp × rolling_grid_ratio | 网格内可交易波动空间 |
|
||
| `amp_x_grid_vol` | 振幅×网格×成交量 | 三维交互特征 | 带量支持的网格波动性 |
|
||
| `amp_cv_x_entropy` | 振幅变异×价格熵 | 交互特征 | 波动不稳定度与价格分布复杂度 |
|
||
| `price_stagnation_20d` | 20日价格停滞 | 近20日振幅极小程度 | 负向指标,价格过于呆滞不适合网格 |
|
||
| `gap_risk_20d` | 20日跳空风险 | 近20日跳空次数或幅度 | 负向指标,跳空会导致网格失效 |
|
||
|
||
---
|
||
|
||
### 3.2 4个情绪因子(v6.3 Rank 的 38 维中包含)
|
||
|
||
| 特征 | 中文名称 | 计算逻辑 | 对模型的意义 |
|
||
|:---|:---|:---|:---|
|
||
| `relaxed_panic_rebound_strength` | 宽松恐慌反弹强度 | 恐慌日最低点到次日最高点的平均反弹幅度 | 恐慌后修复能力 |
|
||
| `relaxed_panic_amplification_ratio` | 宽松恐慌振幅放大比 | 恐慌日振幅 / 正常日振幅 | 恐慌时波动是否放大 |
|
||
| `relaxed_greed_relative_gain` | 宽松贪婪相对涨幅 | 贪婪日个股涨幅 / 大盘涨幅 | 普涨时是否跟风 |
|
||
| `relaxed_greed_amplitude_ratio` | 宽松贪婪振幅比 | 贪婪日振幅 / 正常日振幅 | 普涨时是否维持独立震荡 |
|
||
|
||
**注意**:这4个情绪因子只进入 Rank 模型(38维),不进入 Top(35维)和 Stacking(36维)。因为 Top 和 Stacking 通过 `rank_predicted_rounds` 间接获取情绪信号,不需要自己再学一遍。
|
||
|
||
**计算窗口**:情绪因子使用 180 天历史窗口(不是 120 天),这是历史口径的要求。
|
||
|
||
---
|
||
|
||
## 四、模型间的数据流
|
||
|
||
```
|
||
输入:股票的 OHLCV 数据
|
||
│
|
||
▼
|
||
34维基础特征计算 ← 依赖 K线 + 股本 + 指数数据
|
||
│
|
||
├── + 4个情绪因子 → 38维 → Rank模型 → rank_predicted_rounds (log1p空间)
|
||
│ │
|
||
├── 34基础 + rank_pred → 35维 → Top模型 → top_elite_prob (0~1)
|
||
│ │
|
||
├── 34基础 + rank_pred + top_prob → 36维 → Stacking模型 → calibrated_prob
|
||
│ │
|
||
└── latest_close + calibrated_prob + rank_pred → 3维 → Meta Ranker → predicted_profit
|
||
│
|
||
▼
|
||
最终排序选股
|
||
```
|
||
|
||
**关键注意点**:
|
||
- Rank 输出是 log1p 空间,传给 Top 时不做 expm1 还原(保持与 v6.4 训练口径一致)
|
||
- Top 输出直接是概率值,无需变换
|
||
- Meta Ranker 的输入 `rank_predicted_rounds` 是还原后的原始值(expm1)
|
||
|
||
---
|
||
|
||
## 五、模型训练数据来源
|
||
|
||
| 模型 | 训练数据 | 样本量 | 覆盖股票 |
|
||
|:---|:---|:---|:---|
|
||
| Rank | `share_fixed_training_frame.parquet` | 211,976 | 1,799 |
|
||
| Top | 同上 | 同上 | 同上 |
|
||
| Stacking | 同上 | 同上 | 同上 |
|
||
| Meta Ranker | v6.4 自身回测产生的买入交易记录 | 1,288 | — |
|
||
|
||
Rank/Top/Stacking 共享同一份训练样本,这是 v5.0 时代固化的全历史滑窗样本。Meta Ranker 的训练样本完全不同——来自 v6.4 自身回测中实际发生的买入,每条记录包含真实利润。
|
||
|
||
---
|
||
|
||
## 六、关键参数汇总
|
||
|
||
| 参数 | 值 | 适用模型 |
|
||
| :----- | :---------- | :------------------- |
|
||
| 补仓价格区间 | [9.0, 10.0] | 实盘回测 |
|
||
| 建仓价格区间 | [8.0, 11.0] | 实盘回测 |
|
||
| 淘汰阈值 | Top100 | 实盘回测 |
|
||
| TOP_N | 10 | 实盘回测 |
|
||
| 每格股数 | 200 | 实盘回测 |
|
||
| 初始资金 | 60,000 | 实盘回测 |
|
||
| 观察窗口 | 120天 | Rank/Top/Stacking 训练 |
|
||
| 标签窗口 | 60天 | Rank/Top/Stacking 训练 |
|
||
| 滑窗步长 | 20天 | Rank/Top/Stacking 训练 |
|
||
| 情绪窗口 | 180天 | 情绪因子计算 | |