3、树模型基础:决策树原理、分裂准则(信息增益、基尼系数)、过拟合与剪枝策略
在量化选股中,树模型之所以受到青睐,是因为它天然具备处理非线性关系、自动进行特征交互以及输出可解释规则的能力。与线性回归假设特征与收益呈单调关系不同,树模型通过递归划分特征空间,将复杂的选股逻辑拆解为一系列“如果—那么”的决策规则。本节将深入剖析决策树的核心构造原理、两种主流分裂准则的数学内涵与适用场景,并重点讨论树模型在金融数据中极易出现的过拟合问题及其系统性的剪枝解决方案。
3.1 决策树原理:从递归划分到规则生成
核心原理
决策树是一种基于树结构的监督学习算法,其核心思想是通过递归划分特征空间,使得每个子区域内的样本标签尽可能一致。在量化选股场景中,特征可以是市盈率(PE)、市净率(PB)、动量因子(过去12个月收益率)、波动率等,标签则是股票未来一段时间的超额收益或上涨/下跌类别。树的生长过程本质上是一个贪心搜索过程:在每个节点,算法遍历所有候选特征及其可能的切分点,选择能够最大程度提升子节点“纯度”的特征与阈值进行分裂。
从数学角度看,一棵决策树可以表示为:f(x) = Σ(c_m · I(x ∈ R_m)),其中 R_m 是第 m 个叶节点对应的特征空间区域,c_m 是该区域的预测值(分类问题为多数类,回归问题为均值)。这种分段常数函数的表达能力有限,但通过足够深的分裂,可以逼近任意复杂的决策边界。
判断方法或操作流程
构建一棵决策树通常遵循以下标准流程:
- 特征与标签准备:对股票池进行因子标准化(z-score)、去极值处理,并定义标签(如未来20日收益率是否跑赢中证500指数)。
- 递归分裂:从根节点开始,对当前节点数据集
D,计算每个特征a的每个取值v作为切分点时的分裂收益。 - 停止条件判断:若节点样本数小于预设最小值(如
min_samples_leaf=50)、树深度达到上限(如max_depth=5)或分裂收益低于阈值,则停止分裂,生成叶节点。 - 叶节点输出:分类树输出多数类标签,回归树输出样本均值(即该组股票的平均未来收益)。
案例拆解或实战场景
假设我们使用A股市场2015-2020年的月度截面数据,构建一个简单的分类树来预测股票下月是否跑赢市场。初始根节点包含3000只股票样本,其中跑赢市场的比例为45%。算法首先评估“市净率PB”这一特征,发现当 PB ≤ 2.5 时,子节点中跑赢比例提升至58%;而“过去一个月动量”特征在切分点 MOM ≤ -3% 时,子节点跑赢比例仅为32%。根据信息增益最大化原则,根节点选择PB作为首要分裂特征。这一过程不断递归,最终生成一棵深度为4的树,叶节点对应不同的股票风格组合(如“低估值+高动量+低波动”)。
常见误区或总结复盘
此外,单棵决策树的方差较大,训练集上微小的扰动可能导致完全不同的树结构。因此,实际量化选股中很少直接使用单棵树,而是将其作为随机森林、XGBoost等集成模型的基础组件。但理解单棵树的原理是掌握集成方法的前提。
3.2 分裂准则:信息增益与基尼系数的数学内涵
核心原理
分裂准则用于量化一次分裂带来的“纯度提升”。两种最主流的方法分别是基于信息论的信息增益和基于概率分布的基尼系数。
- 信息增益(ID3算法):基于熵的概念。熵
H(D) = -Σ p_k · log₂(p_k)衡量数据集的不确定性。分裂后,按样本量加权计算子节点熵之和,信息增益 = 分裂前熵 - 分裂后加权熵。增益越大,说明分裂后不确定性降低越多。 - 基尼系数(CART算法):基尼指数
Gini(D) = 1 - Σ p_k²,表示从数据集中随机抽取两个样本,其类别不一致的概率。基尼指数越小,纯度越高。分裂时,计算加权基尼指数,选择使基尼指数下降最大的特征。
判断方法或操作流程
| 对比维度 | 信息增益(熵) | 基尼系数 |
|---|---|---|
| 计算复杂度 | 需计算对数,速度较慢 | 仅需平方运算,速度更快 |
| 对多分类的偏好 | 倾向于取值较多的特征 | 对特征取值数量相对中性 |
| 典型算法 | ID3、C4.5 | CART(分类与回归树) |
| 量化选股适用性 | 适用于离散因子(如行业分类) | 更常用于连续型估值/动量因子 |
在量化选股中,由于因子多为连续变量,CART树使用的基尼系数计算效率更高,且Sklearn、XGBoost等库默认采用基尼系数或以其为基准的改进版本。对于二分类问题(跑赢/跑输),基尼系数与信息增益的排序结果通常高度一致,但在多分类或类别极度不平衡时需谨慎选择。
案例拆解或实战场景
我们以一组简化的因子数据为例:10只股票,标签为“上涨”(1)或“下跌”(0),特征为“市盈率PE”和“换手率Turnover”。初始数据中5涨5跌,熵 H(D) = -0.5·log₂0.5 - 0.5·log₂0.5 = 1.0。若按 PE ≤ 20 分裂,左子节点3涨1跌,右子节点2涨4跌,计算加权熵为 (4/10)·0.811 + (6/10)·0.918 = 0.875,信息增益为0.125。若按 Turnover ≤ 2% 分裂,左子节点4涨1跌,右子节点1涨4跌,加权熵为 (5/10)·0.722 + (5/10)·0.722 = 0.722,信息增益为0.278。因此,换手率是更优的分裂特征。这一计算过程在每层节点重复,直至满足停止条件。
常见误区或总结复盘
另外,基尼系数在类别极度不平衡(如上涨股票仅占5%)时,初始基尼指数已经很小(1 - 0.05² - 0.95² = 0.095),分裂带来的下降幅度有限,可能导致树模型倾向于预测多数类。此时建议使用F1-score或AUC作为分裂评估指标,或对少数类进行过采样。
3.3 过拟合与剪枝策略:从“死记硬背”到“归纳规律”
核心原理
过拟合是树模型在量化选股中最突出的风险。一棵完全生长的决策树可以完美记忆训练集中每只股票的涨跌,但面对新数据时表现极差。其本质原因是:树模型通过不断分裂,将特征空间划分得过于细致,以至于捕捉到了训练集中的噪声而非真实规律。在金融数据中,噪声占比极高(信噪比通常低于0.1),因此过拟合几乎是必然发生的。
剪枝策略是抑制过拟合的核心手段,分为预剪枝和后剪枝两类。预剪枝在树生长过程中提前停止分裂,后剪枝则先让树充分生长,再自底向上合并叶节点。
判断方法或操作流程
预剪枝常用参数(以Sklearn为例):
DecisionTreeClassifier(
max_depth=4, # 限制最大深度,防止无限分裂
min_samples_split=50, # 内部节点最少样本数,低于此值不再分裂
min_samples_leaf=20, # 叶节点最少样本数,保证预测稳定性
max_features=0.8, # 每次分裂最多考虑80%的特征,增加随机性
min_impurity_decrease=0.01 # 分裂带来的不纯度下降必须超过阈值
)
后剪枝(代价复杂度剪枝,CCP)流程:
- 先生成完整决策树,计算每个非叶节点的表面误差率增益率
α。 - 从下往上逐一剪掉
α值最小的子树,得到一系列剪枝后的候选树。 - 使用交叉验证(如5折)评估每棵候选树的验证集AUC或IC值,选择最优
α对应的树。
案例拆解或实战场景
我们构建一个用于中证500成分股选股的回归树,预测未来20日收益。初始不设限制,树深度达到15层,训练集R²为0.85,但验证集R²仅为-0.2(即比直接用均值预测还差)。通过网格搜索调整预剪枝参数,当 max_depth=4、min_samples_leaf=100 时,训练集R²降至0.12,验证集R²提升至0.05。虽然训练集表现大幅下降,但验证集从负值转为正值,说明模型开始捕捉到真实的横截面收益规律。
进一步使用CCP后剪枝,通过 cost_complexity_pruning_path 获取不同 α 值下的树信息,选择验证集IC最高的 α=0.002,最终树深度为3层,仅使用了4个因子(EP、BP、动量、波动率)。该模型在样本外滚动回测中,月度IC均值达到0.04,IC_IR(信息比率)为0.6,显著优于未剪枝模型。
常见误区或总结复盘
最后需要强调的是,决策树的可解释性是其最大优势。通过 tree_.feature 和 tree_.threshold 可以提取分裂路径,例如“BP ≤ 0.8 → 动量 > 5% → 波动率 ≤ 30% → 预测收益 +2.3%”。这种规则可以直接转化为量化策略的选股条件,也便于风控部门理解模型逻辑。但需注意,当树深度超过5层时,规则组合数量呈指数级增长,人工解读变得困难,此时应依赖特征重要性(基于分裂增益的累计贡献)进行宏观层面的解释。