排序学习的定义 排序学习(Learning to Rank,LTR)又名“机器排序学习”(Machine-learned Ranking),是一种监督学习方法,此机器学习算法通过在数据集上对大量特征进行训练,从而学习生成排序模型,以用于解决实际中的排序问题。排序学习在文档检索、过滤和推荐系统等领域,已得到广泛应用。 超参数优化框架:Optuna Optuna是一款用于超参数优化的开源框架,旨在帮助机器学习从业者自动找到最佳超参数配置,以提高模型性能。其独特之处在于支持多种优化算法,包括随机搜索、网格搜索和贝叶斯优化,用户可以根据问题的性质选择最合适的算法。框架提供了分布式优化的支持,允许在多个计算节点上并行运行优化试验,从而显著缩短搜索时间。Optuna还灵活地允许用户定义不同的优化目标,如最小化或最大化目标函数、最小化资源使用或最小化运行时间等。 模型设计 在之前的报告《基于价量数据的排序学习选股模型》中,我们使用价量等资金流数据,对沪深300、中证500、中证1000的成份股构建了排序学习模型。在本报告中,我们进一步利用价量等资金流数据,对沪深300指数的成分股进行了排序学习模型的构建。通过引入更丰富的特征数据集,并结合Optuna框架的强大功能,构建针对沪深300成分股的排序学习模型。根据历史数据回测,最终模型在区间内的年化收益率为11.86%,年化超额收益率为10.73%,夏普比率为0.44,月度胜率为58.23%,年度胜率为85.71%,显著跑赢相应基准。 风险提示: 本报告中所有统计结果和模型方法均基于历史数据,不代表未来趋势。 投资主题 报告亮点 本篇报告作为排序学习系列研究的第三篇报告,首先简单回顾了排序学习的理论基础与算法逻辑,然后在前两篇报告的基础上,引入更多数据以及Optuna框架,在沪深300股票池中进行训练,最终构建出能取得超额收益的排序学习选股模型。 投资逻辑 排序学习将个股的特征作为参数输入,将其转化为当期对个股未来走势的相对优劣排序。根据历史数据回测,通过持仓排名较前的个股,可以取得一定的相较于等权基准的超额收益。 一、什么是排序学习? (一)排序学习的背景 随着数字时代的来临,社会信息化程度的不断加深,互联网上承载的信息量呈指数级增长。想要在海量的数据中检索到自己需要的信息或者想要提高用户的需求与信息之间的匹配程度,就会涉及到排序问题。排序问题,简单来说就是如何从信息膨胀下的数据洪流中便捷地检索出用户最感兴趣的结果,重要性不言而喻,同时也引起了学术界和工业界的广泛关注与研究。与此相关的推荐系统在过去十几年的时间里取得了长足的发展并普遍运用于搜索、推荐、广告等各个领域。而处理排序问题的方法不同也会产生不同的推荐系统,同样的关键词,一个搜索引擎可以让用户在搜索结果的前几页就快速找到想要的信息,而另外一个搜索引擎则无法做到,或者经常浏览的两个软件,一个总能推送出用户最新最感兴趣的内容,而另一个只能生硬的根据用户所选的标签静态的匹配内容,这些显著的差异就是因为其核心的推荐算法不同。 “排序学习”(Learning to Rank,LTR)又名“机器排序学习”(Machine-learned Ranking),顾名思义是使用机器学习用于解决分类与回归问题的方法,来解决排序问题。通过机器学习算法在数据集上对大量的特征进行训练,构建出排序模型,让其能够依据数据的相关性、重要性等衡量指标对数据进行排序,从而满足用户的需求。 (二)排序学习的特殊之处 相比于传统的分类和回归模型,排序学习有着一些显著的不同之处。首先,排序学习关注的是多个对象之间的相对排序关系,而不是单个对象的分类或回归问题。其次,由于排序学习需要处理多个对象的排序信息,所以排序学习模型通常更加复杂,需要考虑对象之间的交互信息和排序关系。 其他机器学习方法通过对一系列数据进行训练,并不断优化迭代从而得到一个预测模型,再把验证数据一个一个放到预测模型中,生成其对应的预测值再加以利用,最终目的是要降低预测值与真实值之间的差异来达到精确预测。而排序学习训练集是以(q,D)的形式输入模型,其中q为query查询,对于每一个查询query q,我们由n个文档D ={d1,d2,…,dn},n>=1,以此作为模型的参数并让模型对其进行排序,然后根据真实排序与预测排序衡量排序效果,再以提升排序效果为目的不断优化迭代。 由此可以看出,排序学习中使用的评估指标也不同于传统的分类和回归任务。对于排序学习而言,传统分类和回归任务中使用的评估指标如准确率、均方误差等都不再适用,而常用的排序学习评估指标包括Normalized Discounted Cumulative Gain (NDCG),则用于度量模型在对象排序上的性能。 二、Optuna框架介绍 (一)Optuna概述 在机器学习和深度学习领域,模型的性能很大程度上取决于超参数的选择。这些关键的超参数,包括学习率、隐藏层的数量、激活函数的选择等,对模型的训练效率和最终性能有着决定性的影响。然而,寻找这些超参数的最优组合通常需要通过一系列繁琐的试验,这一过程不仅耗时,而且往往难以达到最佳效果。传统的优化方法,如网格搜索和手动调整参数,虽然被广泛使用,但效率不高,且往往难以找到全局最优解。因此,自动化超参数优化工具的出现,旨在简化并加速这一复杂过程。 在这样的背景下,Optuna作为一款开源的超参数优化框架应运而生,它致力于为机器学习任务提供一种既高效又易于上手的优化解决方案。Optuna以其用户友好的界面、强大的优化算法和便捷的集成性,迅速成为数据科学家和机器学习工程师们的首选工具。 作为一款自动超参数优化工具,Optuna的主要特性和优势包括: 轻量级框架:Optuna设计简洁,完全用Python编写,依赖性小,使得用户能够轻松上手并快速部署。 灵活的目标函数定义:在超参数优化的目标函数中,Optuna提供了强大的搜索函数,允许用户使用熟悉的Python语法定义搜索空间,包括条件判断和循环等逻辑结构。 高效的搜索策略:Optuna提供了多种高效的剪枝策略和取样策略以加速搜索过程并提高寻找最优解的效率。 广泛的框架集成性:与几乎所有的主流机器学习框架包括PyTorch、Tensorflow、XGBoost、LightGBM等紧密集成,确保了其易用性和广泛的适用性。 直观的可视化工具:Optuna提供了可视化功能,使得优化过程清晰可见,帮助用户更好地理解和监控搜索过程。 并行与分布式优化:支持并行和分布式计算,使得Optuna能够充分利用可用的计算资源,进一步提高优化效率。 (二)Optuna工作原理 Optuna的优化过程中引入了“研究”(Study)和“试验”(Trial)的概念。一个“研究”是指一次完整的超参数优化任务,它由多个“试验”组成。每个“试验”代表了目标函数的一次运行,其中使用了一组特定的超参数值。通过这种方法,Optuna能够有效地探索参数空间,逐步锁定并优化至最佳解。以下是Optuna工作原理的详细步骤: 1.定义搜索空间及目标函数: 用户首先需要定义一个目标函数,这是一个可调用的对象,它接收一个“试验”对象作为输入,并返回一个用于评估的指标分数,如模型的准确度、损失值或其他自定义的性能指标。在目标函数内部,用户可以利用试验对象来设定超参数的搜索范围。Optuna支持多种参数类型,包括连续数值、离散类别和离散集合,同时允许通过条件语句和循环来构建复杂的搜索空间。 2.创建研究对象: 在定义了搜索空间和目标函数之后,用户可以创建一个“研究”对象。Optuna提供了简洁的API来启动优化过程,通常只需一行代码即可开始。用户可以指定优化的目标(最大化或最小化)以及选择的优化算法。通过调用研究对象的.optimize()方法,并传入目标函数、试验次数或其他停止条件,Optuna会自动执行优化任务。在优化过程中,可以应用剪枝策略来评估中间结果,并与先前的试验进行比较,以便提前结束那些表现不佳的试验,从而理论上显著提升优化效率。 3.优化完成后,用户可以通过研究对象获取到最优的超参数组合和对应的最佳性能值。 此外,Optuna提供了一系列的可视化工具,如参数重要性图、优化历程图等,这些工具帮助用户深入分析优化结果,并据此调整后续的策略。 (三)使用Optuna框架优化LightGBM超参数的例子 为了更加直观的介绍如何使用Optuna框架,我们引入了Optuna官网上的一段优化LightGBM超参数的demo代码。 图表1 LightGBM超参数优化Demo代码 这段代码展示了如何使用Optuna库来自动化优化LightGBM模型的超参数以提高二分类任务的模型性能。 首先第一步我们定义了目标函数:首先,定义了一个名为objective的函数,这个函数的目的是最大化模型的评估指标(在此例中是准确度)。 第二步我们在object函数中对于我们每一个想要优化的超参数确定了他的搜索范围,这上文的例子中包括: lambda_l1和lambda_l2:L1和L2正则化项的强度,使用trial.suggest_float方法在对数空间中建议一个浮点数值。 num_leaves:树中叶子节点的数量,使用trial.suggest_int方法建议一个整数值。 feature_fraction和bagging_fraction:分别用于控制在每次迭代中随机选择的特征比例和数据的比例,以防止过拟合。 bagging_freq:执行bagging(自助聚合)的频率。 min_child_samples:一个叶子节点上数据的最小数量,也是为了防止模型过拟合。 这些参数构成了LightGBM模型的配置字典param。然后我们在训练模型的时候,使用上述超参数配置来训练一个LightGBM模型。这里通过调用lgb.train(param, dtrain)来训练模型,其中dtrain是训练数据集(在代码片段中未显示)。训练完成后,模型的性能(比如准确度)被计算并返回。这个返回值将被Optuna用来判断不同的超参数设置下模型的表现。 第三步我们通过调用optuna.create_study(direction='maximize')创建一个研究对象,其中direction='maximize'表明目标是最大化目标函数返回的值(在此例中是模型的准确度)。 然后,使用study.optimize(objective, n_trials=100)开始优化过程,其中objective是定义的目标函数,n_trials=100指定进行100次试验。 综上所述,这段代码通过Optuna库自动调整LightGBM模型的超参数,以在二分类任务上最大化模型的准确度。这个过程涉及到在预定义的超参数空间内进行智能搜索,旨在找到最优的模型配置。 可以看到相比传统的网格搜索等人工调优方法,我们不再需要依靠经验或直觉来手动选择和调整超参数,因为通常这个过程往往是迭代式的、时间消耗大且效率低下。并且由于超参数空间庞大且复杂,人工调优很难覆盖到所有可能的参数组合,因此可能错过最优解。 相比之下,Optuna通过自动化的搜索策略智能地探索参数空间,能够高效地定位到性能更优的参数组合。并且易于部署、配置,对现存代码有着很强的兼容性。 三、模型设计 (一)股票池选择 在构建股票池的时候,本篇报告选择了沪深300历史成份股作为备选股票池。 沪深300指数是中国股市的重要指数之一,由中证指数公司编制。它反映的是沪深两市中规模最大、流动性最好的300家上市公司的股票表现,因此常被视为衡量中国A股市场整体表现的重要指标。沪深300指数覆盖了中国A股市场主要的行业,其成分股的选择既考虑了市值的大小,也考虑了流动性的好坏。 (二)特征选择 在本篇报告中,我们将继续挖掘A股市场的资金流向数据,将其作为构建模型特征的核心元素。我们所依赖的原始数据集记录了每日