量化策略实战——从单因子到多因子的选股模型构建与优化

发布时间:2026/5/21 14:33:13

量化策略实战——从单因子到多因子的选股模型构建与优化 1. 量化选股的基础理解因子投资我第一次接触因子选股是在2015年当时发现一个有趣的现象长期来看小市值股票往往能跑赢大市值股票。这个发现让我开始深入研究量化选股的世界。所谓因子其实就是选择股票的标准或特征就像我们挑选水果时会看大小、颜色、甜度一样。因子主要分为三大类基本面因子反映公司财务状况比如PE市盈率、ROE净资产收益率等。这些数据来自公司的财务报表就像体检报告能反映人的健康状况。技术面因子基于价格和成交量等市场数据比如动量、波动率等。这类因子更新快就像实时监控的心率数据。其他因子包括宏观经济因子、分析师预测因子等这类因子覆盖面广但获取难度较大。在实际操作中单因子策略最容易上手。比如小市值策略就是定期买入市值最小的一批股票。这个策略逻辑简单回测表现也不错但单独使用时波动较大就像骑独轮车虽然能走但不够稳。2. 从单因子到多因子的进化之路只用单一因子选股就像只用身高选拔篮球运动员可能会错过一些灵活的小个子球员。我在2017年就吃过这个亏当时只关注低市盈率股票结果遇到价值陷阱亏损严重。这促使我开始研究多因子模型。构建多因子模型需要五个关键步骤因子筛选就像组建球队要选不同位置的球员我们需要挑选互补的因子。比如结合估值因子PE和质量因子ROE。有效性检验通过分组回测验证因子效果。我常用十分位法把股票按因子大小分成10组看各组收益差异。去除冗余用相关系数矩阵检查因子间的相关性避免重复使用相似因子。权重分配给不同因子分配权重。初期可以等权后期根据IC值信息系数调整。持续优化市场风格会变因子效果也会变需要定期检视。这里有个实用技巧新手可以从双因子开始比如市值ROE。这两个因子逻辑清晰数据易得是很好的入门组合。3. 数据预处理标准化处理的实战技巧多因子模型最大的挑战是因子量纲不同。就像不能把身高厘米和体重公斤直接相加市值亿元和ROE百分比也不能简单组合。这时就需要数据标准化。我常用的标准化方法有三种Min-Max归一化将数据压缩到0-1区间# Python示例代码 def min_max_scale(series): return (series - series.min()) / (series.max() - series.min())Z-score标准化使数据符合标准正态分布def zscore_scale(series): return (series - series.mean()) / series.std()排序法直接用排名代替原始值简单粗暴但有效在实际操作中我发现不同标准化方法对结果影响很大。比如成长类因子用Z-score效果更好而估值类因子适合Min-Max。建议回测时多尝试几种方法。4. 多因子策略的聚宽实现详解在聚宽平台实现多因子策略可以分为四个步骤4.1 初始化设置def initialize(context): # 设置基准为沪深300 set_benchmark(000300.XSHG) # 设置手续费 set_order_cost(OrderCost(open_commission0.0003, close_commission0.0003, close_tax0.001), typestock) # 获取沪深300成分股 g.stock_pool get_index_stocks(000300.XSHG) # 设置查询语句 g.q query(valuation, indicator).filter( valuation.code.in_(g.stock_pool)) # 设置持仓股票数 g.hold_num 20 # 每月第一个交易日执行 run_monthly(rebalance, 1)4.2 因子数据处理def process_factors(df): # 市值越小越好取倒数 df[inv_mcap] 1 / df[market_cap] # 标准化处理 df[roe_norm] min_max_scale(df[roe]) df[inv_mcap_norm] min_max_scale(df[inv_mcap]) # 综合评分 df[score] df[roe_norm] * 0.6 df[inv_mcap_norm] * 0.4 return df4.3 调仓逻辑def rebalance(context): # 获取基本面数据 df get_fundamentals(g.q)[[code, market_cap, roe]] # 处理因子数据 df process_factors(df) # 按评分排序 df df.sort_values(score, ascendingFalse) # 选择TOP股票 to_hold df.head(g.hold_num)[code].values # 卖出不在持仓列表的股票 for stock in context.portfolio.positions: if stock not in to_hold: order_target(stock, 0) # 买入新股票 to_buy [s for s in to_hold if s not in context.portfolio.positions] if to_buy: cash_per_stock context.portfolio.available_cash / len(to_buy) for stock in to_buy: order_value(stock, cash_per_stock)4.4 策略优化建议因子权重优化可以用ICIR信息比率动态调整因子权重行业中性化避免因子选股集中在某些行业风险控制设置最大回撤止损交易成本考虑滑点和冲击成本5. 策略回测与绩效分析回测是量化策略的试金石。我常用的评价指标有年化收益策略的赚钱能力最大回撤策略的风险程度夏普比率收益风险比胜率盈利交易的比例信息比率超额收益的稳定性以市值ROE双因子策略为例在2015-2020年的回测结果指标策略表现基准表现年化收益18.7%9.2%最大回撤-32.4%-38.7%夏普比率0.890.45月胜率63%55%从结果看双因子策略确实优于单一市值因子。但要注意2017年后小市值因子效果减弱这时就需要引入新因子。6. 常见问题与解决方案在实际操作中我遇到过不少坑这里分享几个典型问题问题1因子失效现象原来有效的因子突然不灵了解决方案建立因子监控体系设置失效预警问题2过度拟合现象回测曲线完美实盘一塌糊涂解决方案坚持简单有效原则避免使用太多因子问题3交易冲击现象小市值股票流动性差实际成交价差大解决方案加入流动性因子筛选设置合理下单策略问题4行业集中现象选股集中在某个行业解决方案做行业中性的因子处理7. 进阶方向机器学习在多因子中的应用传统多因子模型是线性加权而机器学习可以捕捉非线性关系。我最近尝试用LightGBM构建选股模型效果不错。基本流程是准备因子数据20-30个候选因子标注股票下期收益率分类或回归问题训练模型并做特征重要性分析根据重要因子构建策略不过机器学习模型容易过拟合建议使用交叉验证限制模型复杂度保持经济逻辑可解释性一个简单的示例代码框架import lightgbm as lgb from sklearn.model_selection import train_test_split # 准备数据 X df[factor_list] # 因子数据 y (df[next_ret] df[next_ret].median()).astype(int) # 二分类标签 # 划分训练测试集 X_train, X_test, y_train, y_test train_test_split(X, y) # 训练模型 params { objective: binary, metric: auc, num_leaves: 31, learning_rate: 0.05, feature_fraction: 0.8 } model lgb.train(params, lgb.Dataset(X_train, labely_train), num_boost_round100) # 特征重要性分析 lgb.plot_importance(model)8. 实盘注意事项从回测到实盘是惊险的一跃。根据我的经验要注意以下几点数据延迟财务数据有公布延迟要确保使用正确的时点数据停牌处理避免买入即将停牌的股票资金管理不要一次性投入所有资金监控系统建立实时监控及时发现异常日志记录详细记录每笔交易的决策依据我现在的做法是先用模拟盘跑3-6个月确认策略稳定性后再逐步投入实盘资金。同时会保留部分现金在市场极端情况下进行手动干预。

相关新闻