StockRanker 介绍
由jliang创建,最终由jliang 被浏览 11 用户
StockRanker
StockRanker 是 BigQuant 平台提供的高性能排序学习算法(list-wise),为量化投资场景做了优化。StockRanker可以根据输入的多个股票特征训练模型和做出排序预测。
在量化投资中,排序任务指的是根据某些标准对一组股票进行排序。例如,投资者可能希望按照未来收益潜力对股票进行排序,以决定投资组合的构成。排序学习(Learning to Rank)是一种机器学习方法,专门训练一个模型来优化排序效果。StockRanker 采用的是 list-wise 方法,它不仅考虑个别股票的特征,还关注整个股票列表的排序质量,从而实现更优的排序结果。
StockRanker的原理可以参考论文:From RankNet to LambdaRank to LambdaMART
使用说明
在 AIStudio 中,+ 新建策略 > 选择 可视化AI策略 模版,这里使用的是 StockRanker 算法。
M.stockranker.v9(
train_data: I.port("用于训练的数据", specific_type_name="DataSource", optional=True) = None, # type: ignore
validation_ds: I.port(
"验证集,用于在训练过程中检验模型的状态,收敛情况。验证集通常用于调整超参数,根据几组模型验证集上的表现决定哪组超参数拥有最好的性能",
optional=True,
specific_type_name="DataSource",
) = None, # type: ignore
base_model: I.port("基础模型,可以在此模型上继续训练", optional=True, specific_type_name="字符串") = None, # type: ignore
predict_data: I.port("用于预测的数据", specific_type_name="DataSource", optional=True) = None, # type: ignore
learning_algorithm: I.choice("学习算法,机器学习优化算法", ["排序", "回归", "二分类", "logloss"]) = "排序", # type: ignore
number_of_leaves: I.int("叶节点数量:每棵树最大叶节点数量。一般情况下,叶子节点越多,则模型越复杂,表达能力越强,过拟合的可能性也越高", min=1) = 30, # type: ignore
min_docs_per_leaf: I.int("每叶节点最小样本数:每个叶节点最少需要的样本数量,一般值越大,泛化性性越好", min=1) = 1000, # type: ignore
number_of_trees: I.int("树的数量:一般情况下,树越多,则模型越复杂,表达能力越强,过拟合的可能性也越高", min=1) = 20, # type: ignore
learning_rate: I.float("学习率:学习率如果太大,可能会使结果越过最优值,如果太小学习会很慢", 0.0, 1.0) = 0.1, # type: ignore
max_bins: I.int("特征值离散化数量:一般情况下,max_bins越大,则学的越细,过拟合的可能性也越高", min=1) = 1023, # type: ignore
feature_fraction: I.float("特征列采样率:在构建每一颗树时,每个特征被使用的概率,如果为1,则每棵树都会使用所有特征列", 0.0, 1.0) = 1, # type: ignore
data_row_fraction: I.float("数据行采样率:在构建每一颗树时,每个样本数据被使用的概率,如果为1,则每棵树都会使用所有数据行", 0.0, 1.0) = 1, # type: ignore
sort_by: I.str("数据排序字段,对输入数据排序,多个字段用英文逗号分隔,为空则不对数据排序,一般使用 date,instrument,兼容旧版使用 date") = "date,instrument", # type: ignore
plot_charts: I.bool("显示模型相关图表") = True, # type: ignore
ndcg_discount_base: I.float("NDCG base:用于计算NDCG的 discount = log2(base + position),其中position从1开始。base越大,位置的影响越小", 0.0) = 1, # type: ignore
) -> [
I.port("预测结果", "predictions"), # type: ignore
I.port("模型", "model"), # type: ignore
]
理解模型
- 特征重要性:一般用来观察不同特征的贡献度。排名越靠前越重要的。计算原理可以参考 xgboost 等算法的 feature importance。一般可用于:
- 模型的可解释性:期望情况下,重要的特征是符合观察和逻辑的
- 特征筛选:剔除贡献度不高的尾部特征,增强模型的鲁棒性的同时,起到特征降维的作用
- 模型:展示了StockRanker的树模型可视化。该模型由多棵决策树组成,每棵树的内部节点包含特征及判断条件,叶节点表示预测分数。所有树的分数相加得出最终预测分数。分数仅用于相对比较,绝对值大小不代表相关性,例如使用
score > 2.323
进行过滤可能导致过拟合。
优化模型
可以从如下几方面优化模型效果(可用于一般机器学习算法)
- 数据准备:使用高质量的数据,确认数据,BigQuant 平台提供行情、财务、技术指标、另类因子等丰富的数据,并对数据做了时间对齐和一般清洗。但在具体问题时,仍可能需要去确保完整性,处理缺失值和异常值等。
- 特征工程:特征选择和创新往往是alpha的根本来源,这是应该重点关注的。根据投资策略选择相关特征,如市盈率、动量指标等。创建新的特征以捕捉更多市场信息,例如滚动平均、波动率等。
- 算法参数:StockRanker默认提供了一组经验参数,但根据需求可能需要调整模型的超参数,如学习率、树的数量等
- 数据量(样本和特征)和模型复杂度一般正相关,常用相关参数
number_of_leaves
、min_docs_per_leaf
、number_of_trees
- 其他参数可以参考前面文档
- 数据量(样本和特征)和模型复杂度一般正相关,常用相关参数
- 评估模型
- 使用排序指标(如 NDCG)评估模型性能,可以在训练中指定 validation_ds(简单的可以直接把训练数据连接上去,验证集不影响训练结果),查看每个迭代的 NDCG 变化
- 根据策略绩效做端到端评估
常见问题
Q1: StockRanker 是否支持自定义特征?
是的,用户需要自己选择和构建特征,以提升模型的适应性和预测能力。
Q2: 如何处理模型的过拟合问题?
可以通过增加数据量、使用正则化技术、减少特征数量或采用交叉验证等方法来缓解过拟合。
Q3: StockRanker 的训练时间长吗?
由于 StockRanker 针对多核进行了优化,使用更多核心,往往可以数倍的提高计算速度。可以升级到 BigQuant Pro 获得更多算力和数据。
Q4: 我可以解释 StockRanker 的排序结果吗?
是的,StockRanker 提供了特征重要性分析,帮助用户理解哪些特征在排序中起到了关键作用。