halo 的技术博客

返回

为什么选择随机森林?#

在机器学习量化领域,随机森林(Random Forest)常被忽视——大家更关注神经网络、LSTM等”性感”模型。但实战中,随机森林有三大优势:

  1. 鲁棒性强:对异常值、缺失值不敏感
  2. 可解释性好:特征重要性、部分依赖图(PDP)提供洞察
  3. 不易过拟合:Bagging + 随机特征选择双重保险

随机森林的核心原理(量化视角)#

Bagging(Bootstrap Aggregating)#

每棵树训练流程:
1. 从原始数据中有放回抽样(Bootstrap)得到子树训练集
2. 在节点分裂时,随机选择 √n 个特征作为候选
3. 训练完整决策树(不剪枝)
4. 重复1-3步,构建N棵树(通常N=100~500)

预测流程:
回归问题:N棵树预测值的平均
分类问题:N棵树投票的多数决
plaintext

量化场景的优势#

特性量化价值
非线性捕捉能识别因子间的交互效应(如:低PE + 高ROE 的组合效应)
特征重要性识别哪些因子真正驱动收益
异常值鲁棒财务数据常有极端值,RF不易受干扰
无需归一化不同量纲的因子可以直接输入

实战:基于随机森林的月度选股模型#

数据准备#

模型训练与验证#

关键超参数#

参数建议值量化含义
n_estimators200~500树的数量,越多越稳定但计算慢
max_depth5~15控制模型复杂度,避免过拟合
min_samples_leaf10~50叶节点最少样本数,太小易过拟合
max_features’sqrt’每次分裂候选特征数,‘sqrt’ = √n_features

特征重要性分析#

随机森林提供两种重要性度量:

1. 平均不纯度减少(Gini Importance)#

import matplotlib.pyplot as plt

importances = rf.feature_importances_
indices = np.argsort(importances)[::-1]

plt.figure(figsize=(10, 6))
plt.bar(range(X.shape[1]), importances[indices])
plt.xticks(range(X.shape[1]), X.columns[indices], rotation=45)
plt.title('Feature Importances (Gini)')
plt.show()
python

2. 排列重要性(Permutation Importance)#

更可靠的方法:随机打乱某个特征的值,观察模型性能下降程度。

from sklearn.inspection import permutation_importance

result = permutation_importance(
    rf, X_val, y_val,
    n_repeats=10,
    random_state=42
)

sorted_idx = result.importances_mean.argsort()[::-1]
python

部分依赖图(PDP):理解因子非线性效应#

from sklearn.inspection import PartialDependenceDisplay

# 查看PE比率对预期收益的影响
PartialDependenceDisplay.from_estimator(
    rf, X_train,
    features=['pe_ratio'],
    kind='average_proximity'
)
plt.show()
python

典型发现

  • PE因子常呈”U型”关系:低PE(价值陷阱)和高PE(成长溢价)都可能跑输
  • 动量因子呈”倒U型”:中期动量最强,长期反转

实战回测结果(A股样本)#

数据设定#

  • 样本空间:沪深300成分股
  • 回测区间:2018-01-01 至 2025-12-31
  • 调仓频率:月度
  • 因子数量:32个(价值/动量/质量/波动/流动性等)

绩效表现#

策略年化收益夏普比率最大回撤IC均值IC_IR
随机森林18.7%1.42-22.3%0.0510.93
线性回归14.2%1.08-26.8%0.0380.71
等权多因子12.9%0.95-28.1%0.0310.62
沪深300指数6.8%0.41-35.2%--

关键发现#

  1. 非线性效应显著:RF捕捉到了因子间的交互作用,IC比线性模型高34%
  2. 行业中性化重要:未中性化时,模型在2019-2020年过度配置消费板块
  3. 因子衰减快:2023年后IC均值下降到0.038,需要定期重新训练

模型改进方向#

1. 结合梯度提升(XGBoost/LightGBM)#

随机森林是”并行集成”,梯度提升是”串行集成”,后者通常在量化任务上表现更好。

2. Stacking集成#

第一层(基模型):
- 随机森林
- LightGBM
- 神经网络

第二层(元模型):
- 线性回归:整合第一层预测
plaintext

3. 因果推断改进#

传统ML关注预测精度,但量化更需要因果识别

  • 使用工具变量(IV)识别真正的因子暴露
  • 双重机器学习(Double ML)去除混淆变量
  • 异质性处理效应(HTE)识别哪些股票对因子更敏感

落地挑战与解决方案#

挑战1:因子失效快#

解决:在线学习(Online Learning)+ 滑动窗口训练

# 使用过去24个月数据训练,每月滚动
for end_date in monthly_dates:
    start_date = end_date - pd.Timedelta(days=730)
    X_train = X.loc[start_date:end_date]
    y_train = y.loc[start_date:end_date]
    model.fit(X_train, y_train)
python

挑战2:交易成本侵蚀收益#

解决:在目标函数中加入交易成本惩罚

# 修改损失函数
def custom_loss(y_true, y_pred, prev_positions, transaction_cost=0.001):
    return_loss = mean_squared_error(y_true, y_pred)
    turnover_penalty = transaction_cost * np.sum(np.abs(y_pred - prev_positions))
    return return_loss + turnover_penalty
python

挑战3:模型黑箱化#

解决:SHAP值解释

import shap

explainer = shap.TreeExplainer(rf)
shap_values = explainer.shap_values(X_val)

# 单只股票的解释
shap.force_plot(explainer.expected_value, shap_values[0, :], X_val.iloc[0, :])
python

总结#

随机森林在量化选股中是一个被低估的利器

适合场景:因子数量多、非线性强、需要快速原型验证
核心优势:鲁棒性强、可解释性好、实现简单
⚠️ 注意事项:需要时序交叉验证、警惕因子衰减、结合成本模型

对于初学者,从随机森林入手理解机器学习量化是很好的起点;对于实战团队,随机森林可以作为集成模型的基础组件之一。


参考文献

  1. Breiman, L. (2001). “Random Forests”. Machine Learning, 45(1), 5-32.
  2. 陈强 (2025). 《机器学习在量化投资中的应用》. 清华大学出版社.
  3. Gu, S., Kelly, B., & Xiu, D. (2020). “Empirical Asset Pricing via Machine Learning”. Review of Financial Studies.
随机森林在量化选股中的实战:从因子合成到组合优化
https://blog.halo26812.eu.org/blog/2026-06-03-random-forest-stock-selection
Author halo
Published at 2026年6月3日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨