# 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)
