127 lines
4.1 KiB
Markdown
127 lines
4.1 KiB
Markdown
|
|
# TabM Top-K 优化指南
|
|||
|
|
|
|||
|
|
针对每日只买入预测分最高的 5-10 只股票的 Top-K 选股场景,对 TabM 排序学习进行了三大方向优化。
|
|||
|
|
|
|||
|
|
## 优化概述
|
|||
|
|
|
|||
|
|
### 1. 损失函数优化(核心)
|
|||
|
|
|
|||
|
|
**加权 ListNet (推荐首次尝试)**
|
|||
|
|
- 原理:给予高分标签样本更高的损失权重
|
|||
|
|
- 参数:`loss_type="weighted_listnet"`, `topk_weight=5.0`
|
|||
|
|
- 效果:头部样本权重是尾部的 5 倍,强迫模型关注头部排序
|
|||
|
|
|
|||
|
|
**LambdaLoss (精细 Top-K 优化)**
|
|||
|
|
- 原理:基于 DeltaNDCG 计算每对样本交换位置后的损失
|
|||
|
|
- 参数:`loss_type="lambda"`, `lambda_sigma=1.0`, `ndcg_weight_power=1.5`
|
|||
|
|
- 效果:精准优化 NDCG@K 指标,适合追求极致 Top-K 性能
|
|||
|
|
|
|||
|
|
### 2. 标签工程优化(增强)
|
|||
|
|
|
|||
|
|
**指数化增益变换**
|
|||
|
|
- 公式:`Gain = 2^(rank/scale) - 1`
|
|||
|
|
- 参数:`label_transform="exponential"`, `label_scale=20.0`
|
|||
|
|
- 效果:rank=0 → 0, rank=19 → ~0.93, rank=99 → ~30.5
|
|||
|
|
- 用途:拉大高分样本与低分样本的差距,强化头部区分度
|
|||
|
|
|
|||
|
|
### 3. 推荐配置组合
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 配置 A: 温和优化(推荐首次尝试)
|
|||
|
|
MODEL_PARAMS = {
|
|||
|
|
"loss_type": "weighted_listnet",
|
|||
|
|
"topk_weight": 3.0,
|
|||
|
|
# ... 其他参数
|
|||
|
|
}
|
|||
|
|
LABEL_TRANSFORM = None # 保持标准分位数
|
|||
|
|
|
|||
|
|
# 配置 B: 平衡优化(兼顾效果和稳定性)
|
|||
|
|
MODEL_PARAMS = {
|
|||
|
|
"loss_type": "weighted_listnet",
|
|||
|
|
"topk_weight": 5.0,
|
|||
|
|
"ndcg_k": 20, # 验证时关注 NDCG@20
|
|||
|
|
}
|
|||
|
|
LABEL_TRANSFORM = "exponential"
|
|||
|
|
LABEL_SCALE = 20.0
|
|||
|
|
|
|||
|
|
# 配置 C: 激进优化(专注 Top-10)
|
|||
|
|
MODEL_PARAMS = {
|
|||
|
|
"loss_type": "lambda",
|
|||
|
|
"lambda_sigma": 1.0,
|
|||
|
|
"ndcg_weight_power": 1.5,
|
|||
|
|
"ndcg_k": 10,
|
|||
|
|
}
|
|||
|
|
N_QUANTILES = 50 # 提高分位数分辨率
|
|||
|
|
LABEL_TRANSFORM = "exponential"
|
|||
|
|
LABEL_SCALE = 25.0
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 使用示例
|
|||
|
|
|
|||
|
|
在 `tabm_rank_train.py` 中修改配置:
|
|||
|
|
|
|||
|
|
```python
|
|||
|
|
# 分位数配置
|
|||
|
|
N_QUANTILES = 30
|
|||
|
|
|
|||
|
|
# 标签工程配置
|
|||
|
|
LABEL_TRANSFORM = "exponential" # 启用指数化增益
|
|||
|
|
LABEL_SCALE = 20.0
|
|||
|
|
|
|||
|
|
# 模型参数配置
|
|||
|
|
MODEL_PARAMS = {
|
|||
|
|
# ... 基础参数 ...
|
|||
|
|
|
|||
|
|
# Top-K 优化参数
|
|||
|
|
"loss_type": "weighted_listnet", # 或 "lambda"
|
|||
|
|
"topk_weight": 5.0, # 仅 weighted_listnet 有效
|
|||
|
|
"lambda_sigma": 1.0, # 仅 lambda 有效
|
|||
|
|
"ndcg_weight_power": 1.0, # 仅 lambda 有效
|
|||
|
|
"ndcg_k": 20, # 验证指标
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
## 参数说明
|
|||
|
|
|
|||
|
|
### 损失函数参数
|
|||
|
|
|
|||
|
|
| 参数 | 类型 | 默认值 | 说明 |
|
|||
|
|
|------|------|--------|------|
|
|||
|
|
| `loss_type` | str | "listnet" | 损失类型: "listnet"/"weighted_listnet"/"lambda" |
|
|||
|
|
| `topk_weight` | float | 5.0 | 头部权重系数 (weighted_listnet),越大越关注头部 |
|
|||
|
|
| `lambda_sigma` | float | 1.0 | Sigmoid 陡峭程度 (lambda) |
|
|||
|
|
| `ndcg_weight_power` | float | 1.0 | DeltaNDCG 权重幂次 (lambda),>1 进一步放大头部 |
|
|||
|
|
| `ndcg_k` | int/None | None | 验证时计算的 NDCG@k,None 表示全局 |
|
|||
|
|
|
|||
|
|
### 标签工程参数
|
|||
|
|
|
|||
|
|
| 参数 | 类型 | 默认值 | 说明 |
|
|||
|
|
|------|------|--------|------|
|
|||
|
|
| `n_quantiles` | int | 20 | 分位数数量,越大分辨率越高 |
|
|||
|
|
| `label_transform` | str/None | None | 变换类型: None/"exponential" |
|
|||
|
|
| `label_scale` | float | 20.0 | 指数变换缩放因子,控制增益幅度 |
|
|||
|
|
|
|||
|
|
## 实施建议
|
|||
|
|
|
|||
|
|
1. **渐进式优化**:
|
|||
|
|
- 第1轮:仅启用 `loss_type="weighted_listnet"`, `topk_weight=3.0`
|
|||
|
|
- 第2轮:增加标签工程 `label_transform="exponential"`
|
|||
|
|
- 第3轮:尝试 `loss_type="lambda"` 精细优化
|
|||
|
|
|
|||
|
|
2. **监控指标**:
|
|||
|
|
- 关注 NDCG@K(K 设为实际 Top-K 大小)
|
|||
|
|
- 对比不同配置的回测收益率
|
|||
|
|
- 观察训练损失是否稳定下降
|
|||
|
|
|
|||
|
|
3. **注意事项**:
|
|||
|
|
- LambdaLoss 训练更慢,每 epoch 需更多时间
|
|||
|
|
- 指数化增益会改变标签分布,可能需要调整学习率
|
|||
|
|
- 过高的 topk_weight 可能导致过拟合头部样本
|
|||
|
|
|
|||
|
|
## 参考论文
|
|||
|
|
|
|||
|
|
1. **ListNet**: "Learning to Rank: From Pairwise Approach to Listwise Approach" (Cao et al., 2007)
|
|||
|
|
2. **LambdaRank**: "From RankNet to LambdaRank to LambdaMART: An Overview" (Burges, 2010)
|
|||
|
|
3. **LambdaLoss**: "The LambdaLoss Framework for Ranking Metric Optimization" (Wang et al., 2018)
|
|||
|
|
4. **深度学习选股**: "Deep Learning for Stock Selection" (Gu, Kelly, & Xiu, 2020)
|