基于LightGBM排序算法的多因子选股策略详解
由bqj4f91v创建,最终由bqqax2qv 被浏览 14 用户
本文将详细介绍一款基于LightGBM排序算法的多因子选股策略,该策略依托BigQuant平台实现,融合多维度因子特征,通过机器学习模型挖掘股票未来收益规律,结合系统化交易引擎完成回测与落地,适用于A股市场的中短期量化交易场景。策略兼顾因子有效性与交易实操性,下面从核心逻辑、模块拆解、代码解析、使用说明等方面展开详细介绍。
一、策略核心逻辑 本策略的核心思路是“多因子特征提取+LightGBM排序建模+系统化交易执行”,具体分为三个关键环节:
- 因子筛选与特征构建:选取估值、市值、动量、反转、波动、换手等多维度核心因子,同时加入过滤因子剔除无效样本,构建全面的股票特征矩阵;
- LightGBM排序训练:以股票未来收益为标签,使用LightGBM排序算法训练模型,学习因子与未来收益的非线性关系,输出股票排序评分;
- 系统化交易回测:基于模型预测评分筛选优质股票,制定等权仓位分配规则,通过BigTrader交易引擎完成回测,验证策略有效性。 策略创新点:采用LightGBM排序算法替代传统线性模型,能更好捕捉因子间的交互效应和非线性关系;同时严格区分训练集与测试集,避免过拟合,提升策略泛化能力。
二、策略模块拆解(附平台模块对应关系) 策略基于BigQuant平台的可视化模块与Python代码结合实现,整体分为“数据准备-模型训练-预测选股-交易回测”四大模块,各模块对应平台组件及功能如下:
2.1 数据准备模块(基础数据与因子提取) 该模块负责获取A股基础数据、提取因子特征、生成训练标签及数据清洗,核心模块包括:
- m1(instruments_dai.v3)- 训练集股票池:定义训练集时间范围(2021-01-01至2024-12-31),选取中国A股全市场股票作为训练样本,为后续因子提取和模型训练提供基础股票列表。
- m2(input_features_expr.v2)- 因子定义:定义策略使用的所有因子,分为两类:
- 核心因子(参与模型训练):估值因子(pe_ttm、pb、ps_ttm等)、市值因子(total_market_cap、float_market_cap)、动量反转因子(momentum_5、reversal_5)、波动因子(volatility_5)、换手因子(turn);
- 过滤因子(不参与训练,仅用于数据筛选):st_status(ST状态)、low(最低价)、price_limit_status(涨跌停状态)、close(收盘价)。
- m3(extract_data_expr.v2)- 因子提取:根据m1的股票池和m2定义的因子,提取2021-2024年的因子数据,确保因子与股票的时间维度匹配,为模型训练提供特征数据。
- m4(auto_labeler.v3)- 标签生成:以股票未来收益为标签,通过计算未来2日收益(m_lead(close, 2)/m_lead(open, 1)),经过极值裁剪(1%分位和99%分位)和分箱处理,生成模型训练所需的标签,用于指导模型学习“因子-未来收益”的对应关系。
- m8(data_join.v5)- 数据拼接:将m4生成的标签数据与m3提取的因子数据,按“date(日期)+instrument(股票代码)”进行内连接,形成“特征-标签”一一对应的训练数据集。
- m6(data_filter.v5)- 数据过滤:通过筛选条件“st_status==0 & close>low”剔除ST股票和无有效交易价格的股票,保证训练数据的有效性。
- m12(data_dropnan.v6)- 缺失值处理:删除数据集中的缺失值样本,避免缺失值对模型训练的干扰,确保训练数据的完整性。
2.2 模型训练模块(LightGBM排序训练)
- m9(python.v3)- 数据预处理:通过Python代码对清洗后的训练数据进行进一步处理,删除不参与模型训练的过滤因子(st_status、low、close、price_limit_status),将处理后的数据写入BigDB,供后续模型训练调用。
- m7(stock_ranker_dai_train.v9)- LightGBM排序训练:核心训练模块,采用LightGBM排序算法,基于m9处理后的训练数据进行模型训练,关键参数设置如下: 训练完成后,模型会输出因子重要性、训练精度等指标,可用于验证因子有效性和模型拟合效果。
- learning_algorithm:排序(核心算法,专注于股票排序评分);
- number_of_leaves:30(控制决策树复杂度,避免过拟合);
- min_docs_per_leaf:1000(每个叶子节点最小样本数,提升模型稳定性);
- number_of_trees:20(决策树数量);
- learning_rate:0.1(学习率,控制每棵树的贡献度)。
2.3 预测选股模块(测试集预测与仓位分配)
-
m15(instruments_dai.v3)- 测试集股票池:定义测试集时间范围(2025-01-01至2025-12-31),选取中国A股全市场股票作为测试样本,用于验证模型的泛化能力。
-
m16(extract_data_expr.v2)- 测试集因子提取:基于m15的测试集股票池和m2定义的因子,提取2025年及后续的因子数据,确保测试集因子与训练集因子一致。
-
m10(data_filter.v5)- 测试集过滤:采用与训练集相同的过滤条件(st_status==0 & close>low),剔除测试集中的无效股票样本。
-
m17(data_dropnan.v6)- 测试集缺失值处理:删除测试集中的缺失值样本,保证预测数据的完整性。
-
m13(stock_ranker_dai_predict.v13)- 模型预测:调用m7训练好的LightGBM模型,对测试集股票进行预测,输出每只股票的排序评分(score),评分越高,代表模型预测该股票未来收益越高。
-
m18(score_to_position.v5)- 仓位分配:基于模型预测评分,制定选股和仓位分配规则:
- 选股规则:按score DESC(评分降序)排序,选取前10只股票作为持仓标的;
- 仓位分配:采用等权分配方式,每只股票分配1/10仓位(position=1,模块自动归一化总仓位为1);
- 可灵活调整:支持修改选股数量、仓位分配方式(如对数下降、排序倒数等)。
2.4 交易回测模块(系统化交易执行)
- m19(bigtrader.v53)- 交易回测引擎:BigQuant核心交易回测模块,基于m18输出的持仓信号,完成系统化交易回测,关键参数设置如下:
- 回测时间:2025-01-01至2026-04-20(覆盖测试集及后续一段时间,验证策略持续性);
- 初始资金:1000000元(可自定义调整);
- 调仓频率:每2个交易日调仓一次(rebalance_period_days=2);
- 交易成本:买入佣金0.03%、卖出佣金0.13%,最低5元/笔(贴合实际市场交易成本);
- 基准指数:沪深300指数(用于对比策略超额收益);
- 交易逻辑:每日盘前判断是否为调仓日,若为调仓日,卖出不在持仓列表的股票,买入目标持仓股票,执行等权仓位分配。
三、核心代码解析 策略中关键Python代码用于数据预处理和交易逻辑定义,以下是核心代码的详细解析:
3.1 数据预处理代码(m9模块)
from bigmodule import M, I
@param(id="m9", name="run")
def m9_run_bigquant_run(input_1, input_2, input_3): # Python 代码入口函数,input_1/2/3 对应三个输入端,data_1/2/3 对应三个输出端
import daidf = input_1.read() # 读取输入的清洗后数据(m12模块输出)
drop_cols =['st_status', 'low','close', 'price_limit_status'] # 定义需删除的过滤因子
df = df.drop(columns=drop_cols) # 删除过滤因子,保留核心训练因子
ds = dai.DataSource.write_bdb(df) # 将处理后的数据写入BigDB,供模型训练调用
return dict(data_1=ds, data_2={"hello": "world"}, data_3=None)
功能说明:该函数接收m12模块输出的清洗后数据,删除不参与模型训练的过滤因子,将处理后的数据转换为BigDB数据源格式,传递给m7模块用于模型训练。
3.2 交易逻辑代码(m19模块)
@param(id="m19", name="initialize")
交易引擎:初始化函数,只执行一次
def m19_initialize_bigquant_run(context): from bigtrader.finance.commission import PerOrder
# 设置交易手续费:买入0.03%、卖出0.13%,最低5元/笔
context.set_commission(PerOrder(buy_cost=0.0003, sell_cost=0.0013, min_cost=5))
@param(id="m19", name="handle_data")
def m19_handle_data_bigquant_run(context, data): import pandas as pd
# 下一个交易日不是调仓日,则不生成信号
if not context.rebalance_period.is_signal_date(data.current_dt.date()):
return
# 从传入的数据 context.data 中读取今天的信号数据(m18模块输出的持仓信号)
today_df = context.data[context.data["date"] == data.current_dt.strftime("%Y-%m-%d")]
# 卖出不在目标持有列表中的股票
for instrument in sorted(set(context.get_account_positions().keys()) - set(today_df["instrument"])):
context.order_target_percent(instrument, 0)
# 买入目标持有列表中的股票,等权分配仓位
for i, x in today_df.iterrows():
context.order_target_percent(x.instrument, 0.0 if pd.isnull(x.position) else x.position)
功能说明:
- initialize函数:初始化交易参数,主要设置交易手续费,贴合实际市场规则;
- handle_data函数:核心交易逻辑,每日判断是否为调仓日,若为调仓日,执行“卖出非持仓股票+买入目标持仓股票”的操作,确保持仓与m18模块输出的信号一致,实现等权仓位分配。
四、策略使用指南
4.1 平台环境要求 本策略基于BigQuant平台实现,需满足以下条件:
- 平台版本:支持BigModule模块(v3及以上版本)、DAI数据平台;
- 依赖库:dai、pandas、LightGBM(平台已预装,无需额外安装);
- 数据权限:需拥有A股行情数据、因子数据的访问权限。
4.2 参数调整建议 策略关键参数可根据实际需求调整,提升策略表现,核心调整方向如下:
- 模型参数(m7模块):
- number_of_leaves:可调整为20-50,数值越大模型复杂度越高,需避免过拟合;
- number_of_trees:可调整为10-50,增加决策树数量可提升模型拟合度,但需控制训练时间;
- learning_rate:可调整为0.05-0.2,学习率越小,模型训练越稳定,但需更多决策树。
- 选股与调仓参数(m18、m19模块):
- hold_count:持仓数量,可调整为5-20只,数量越少,集中度越高,风险越大;
- rebalance_period_days:调仓频率,可调整为1-5个交易日,频率越高,交易成本越高;
- position_expr:仓位分配方式,可修改为对数下降、排序倒数等,优化仓位分配效率。
- 因子调整(m2模块):可新增或删除因子(如加入盈利因子roe_ttm、成长因子eps_growth等),优化特征矩阵。
4.3 回测结果解读 策略回测完成后,可重点关注以下指标,评估策略有效性:
- 收益指标:年化收益率、超额收益率(相对沪深300)、最大回撤;
- 风险指标:夏普比率(建议>1)、波动率、胜率;
- 交易指标:换手率、平均持仓天数、交易成本拖累。 理想情况下,策略应实现“年化收益率高于基准、最大回撤可控、夏普比率较高”的效果,若回测表现不佳,可优先调整模型参数或因子组合。
五、注意事项
- 数据一致性:训练集与测试集的因子定义、数据过滤条件必须一致,避免因数据差异导致模型泛化能力下降;
- 过拟合风险:模型训练时需控制决策树复杂度(number_of_leaves、min_docs_per_leaf),可通过增加训练数据量、交叉验证等方式降低过拟合风险;
- 交易成本影响:调仓频率越高,交易成本拖累越明显,需在调仓频率与策略收益之间寻找平衡;
- 市场适应性:策略基于2021-2024年数据训练,适用于A股市场中短期行情,若市场风格发生重大变化(如牛市、熊市切换),需重新训练模型;
- 风险控制:实际落地时,可加入仓位限制、止损规则(如最大回撤超过20%减仓),提升策略抗风险能力。
六、策略总结
本策略基于LightGBM排序算法,融合多维度因子特征,通过系统化的“数据准备-模型训练-预测选股-交易回测”流程,实现了A股市场的多因子选股与回测。策略的核心优势在于利用机器学习算法捕捉因子间的非线性关系,相较于传统线性多因子策略,泛化能力更强;同时,策略模块化设计清晰,参数可灵活调整,适配不同的交易需求。 后续可进一步优化方向:加入行业中性化处理,降低行业集中风险;引入更多另类因子(如量价因子、情绪因子),丰富特征矩阵;优化仓位分配策略,提升资金使用效率。欢迎各位量化爱好者基于本策略进行二次开发,共同探索更优的量化交易方案。
完整代码分享:
https://bigquant.com/codesharev3/6b65220e-83f9-4554-ae55-73dfdc770736
\