Files

282 lines
16 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# v6.4 生产模型体系详细说明
---
## 一、整体架构
v6.4 是一个四层串联的 LightGBM 模型体系,按照“排序 → 精选 → 校准 → 定价”的流程协同工作。
```
输入:一只股票的原始行情数据(K线、成交量等)
┌─────────────────────────────────────┐
│ 第1层:Rank(全市场排序) │
│ 模型:LGBMRegressor │
│ 输入:38维特征(34基础 + 4情绪) │
│ 输出:rank_predicted_rounds │
│ 角色:初级分析师,回答“谁更活跃” │
└─────────────────────────────────────┘
┌─────────────────────────────────────┐
│ 第2层:Top(头部精选) │
│ 模型:LGBMClassifier │
│ 输入:35维(34基础 + Rank预测值) │
│ 输出:top_elite_prob0~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.53555折交叉验证均值) |
| **训练样本** | 约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.3389Top5命中率 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维),不进入 Top35维)和 Stacking36维)。因为 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天 | 情绪因子计算 |