机器学习选股策略迭代优化研究系列:基于线性回归与支持向量机的对比分析
  无名的人 19小时前 23 0

摘要

本报告为机器学习选股策略系列第三篇专题优化研究,系统比较了两代策略的设计演进与绩效差异。策略一(优化前)基于支持向量回归(SVR)结合RSRS择时信号,以沪深300为基准,持仓10只股票,2016-2026年回测年化收益22.20%,最大回撤43.22%,夏普比率0.838,累计收益601.97%。策略二(优化后)基于多因子线性回归评分体系,以中证500为基准,集中持仓1只股票,预训练五组回归系数覆盖质量、动量、技术与风险因子,回测年化收益大幅提升至49.39%,最大回撤压缩至20.58%,夏普比率跃升至1.784,累计收益达4847.16%,综合绩效提升约8倍,验证了因子预训练与集中持仓策略在量化选股中的显著优势。


第一章 引言

量化选股策略的核心挑战在于如何从海量金融数据中提炼出稳定、有效的预测信号。机器学习方法因其强大的非线性拟合与高维特征处理能力,近年来在量化投资领域获得广泛应用。然而,不同机器学习范式(在线学习 vs. 离线预训练、支持向量机 vs. 线性回归)在实际投资中的表现差异鲜有系统性实证研究。

本报告聚焦于机器学习选股策略的迭代优化路径,以支持向量回归(SVR)策略为基准,通过引入多因子线性回归预训练模型进行系统性优化,从三个维度展开对比分析:

  1. 模型架构:在线SVR训练 vs. 离线线性回归预训练系数
  2. 择时逻辑:RSRS动态择时 vs. 纯因子驱动无择时
  3. 仓位管理:10只分散持仓 vs. 1只集中持仓

通过2016至2026年十年跨度的历史回测,本研究旨在揭示不同策略设计选择对最终投资绩效的影响机制,为机器学习选股策略的工程实践提供参考。


第二章 研究目的

2.1 核心问题

本研究围绕以下核心问题展开:

  • 预训练系数是否优于在线训练?线性回归的预训练系数(固定权重)与SVR的实时训练相比,哪种方式在真实市场环境中更具稳定性?
  • RSRS择时信号是否有效?RSRS标准分作为择时过滤器是否能够改善策略绩效,还是反而引入了误判噪声?
  • 集中持仓的收益风险权衡:单只股票集中持仓能否在提升收益的同时控制回撤?

2.2 策略对比框架

维度 策略一(SVR优化前) 策略二(线性回归优化后)
机器学习模型 SVR(RBF核,在线训练) 线性回归(5组预训练系数)
选股目标 市值残差最小(负残差) 多因子综合评分最低
择时模块 RSRS标准分 无(纯因子驱动)
基准指数 沪深300(000300.XSHG) 中证500(000905.XSHG)
持仓数量 10只 1只(集中持仓)
调仓频率 月度(run_daily月触发) 周度(run_weekly)
基本面过滤 PE>0、ROE增长、营收增长 新股过滤、ST过滤、停牌过滤

2.3 研究假设

基于市场微结构与因子研究文献,提出以下假设:

  • H1:预训练线性回归系数在样本外表现优于实时SVR训练,因其避免了过拟合风险
  • H2:RSRS择时信号在A股市场中可能产生系统性误判,降低策略收益
  • H3:集中持仓在选股因子有效的前提下,能够显著放大策略超额收益

第三章 回测框架

3.1 回测环境配置

两个策略均在聚宽(JoinQuant)量化平台上进行回测,核心参数如下:

参数 策略一 策略二
回测区间 2016-01-01 至 2026-01-01 2016-01-01 至 2026-01-01
初始资金 1,000万元 1,000万元
基准指数 沪深300(000300.XSHG) 中证500(000905.XSHG)
手续费率 双边0.2%(含印花税) 双边0.2%(含印花税)
滑点设置 默认 默认
订单类型 市价单 市价单

3.2 股票池过滤规则

策略一过滤规则

  • 剔除ST、*ST股票
  • 剔除上市不足一年新股
  • 剔除当日涨停/跌停股票
  • 要求PE > 0(正盈利)
  • 要求ROE增长率 > 0
  • 要求营业收入增长率 > 0
  • 要求净利润增长率 > 0
  • 要求经营现金流/净利润 > 0
  • 资产负债率 < 0.7

策略二过滤规则

  • 剔除上市不足375天新股(days_public > 375
  • 剔除ST、*ST股票
  • 剔除科创板(KCBJ)及北交所股票
  • 剔除当日涨停/跌停股票
  • 剔除当日停牌股票

3.3 调仓机制

策略一(月度调仓)

# 每日运行,月度实际调仓 run_daily(trade, '9:30') # 月度触发条件 if context.current_dt.month != g.last_month: g.last_month = context.current_dt.month # 执行调仓逻辑

策略二(周度调仓)

# 每周一09:30执行调仓 run_weekly(weekly_adjustment, 1, '9:30')

3.4 评估指标体系

回测结果使用以下指标综合评估:

  • 收益指标:策略收益率、年化收益率、超额收益率(相对基准)
  • 风险指标:最大回撤、超额回撤、波动率
  • 风险调整收益:夏普比率、信息比率、Alpha/Beta
  • 交易质量:胜率(月度盈利比例)、盈亏比

第四章 研究过程

4.1 策略一:SVR市值残差选股(优化前)

4.1.1 RSRS择时模块

策略一的核心择时信号来自阻力支撑相对强度(RSRS)。该指标通过分析价格高低点之间的线性回归斜率,量化市场的支撑阻力关系:

# RSRS核心参数 g.N = 18 # 斜率计算窗口(18日) g.M = 600 # Z-score参考窗口(600日) g.K = 8 # Z-score斜率计算窗口 g.score_thr = -1 # 买入标准分阈值 g.score_fall_thr = -0.5 # 下跌卖出阈值 g.idex_slope_raise_thr = 10 # 指数动量买入阈值 def get_RSRS_score(context): # 获取指数N日高低点数据 prices = get_price('000300.XSHG', count=g.N, fields=['high', 'low']) highs = prices['high'] lows = prices['low'] # 线性回归求斜率 slope, _ = np.polyfit(lows, highs, 1) g.slope_series.append(slope) # 计算标准化Z-score if len(g.slope_series) >= g.M: recent = g.slope_series[-g.M:] zscore = (slope - np.mean(recent)) / np.std(recent) # 斜率修正评分 slope_k = np.polyfit(range(g.K), g.slope_series[-g.K:], 1)[0] score = zscore * slope_k return score

择时逻辑

  • score > g.score_thr(-1)指数动量 > 10:触发买入信号
  • score < g.score_fall_thr(-0.5):触发卖出信号(空仓等待)

4.1.2 SVR市值残差模型

在RSRS确认买入信号后,策略通过SVR模型筛选"被低估"的股票:

def select_stocks_svr(context, n_choice=10): # 构建特征矩阵:基本面因子 df = get_fundamentals(query( valuation.pe_ratio, indicator.roe, indicator.revenue_yoy, indicator.net_profit_yoy, valuation.market_cap ), date=context.current_dt) # 目标变量:对数市值 df['log_mc'] = np.log(df['market_cap']) Y = df['log_mc'] X = df.drop('log_mc', axis=1) # SVR模型训练(RBF核) svr = SVR(kernel='rbf') model = svr.fit(X, Y) # 计算市值残差(实际-预测) r = Y - pd.Series(svr.predict(X), Y.index) # 选取残差最小(最被低估)的股票 selected = r[r < 0].sort_values().head(n_choice).index.tolist() return selected

核心逻辑:SVR通过基本面因子预测"合理市值",负残差意味着股票的实际市值低于模型预测的合理市值,即"相对低估"。选取残差最负的10只股票构建投资组合。

4.1.3 基本面质量过滤

def fundamental_filter(df): conditions = [ df['pe_ratio'] > 0, # 正盈利 df['roe_yoy'] > 0, # ROE增长 df['revenue_yoy'] > 0, # 营收增长 df['net_profit_yoy'] > 0, # 净利润增长 df['ocf_ratio'] > 0, # 经营现金流为正 df['debt_to_assets'] < 0.7 # 低杠杆 ] return df[np.all(conditions, axis=0)]

4.2 策略二:多因子线性回归评分(优化后)

4.2.1 预训练因子模型架构

策略二的核心创新在于离线预训练的五组线性回归系数,彻底摒弃了在线模型训练,避免了前视偏差与过拟合风险:

g.factor_list = [ # 第1组:技术面+质量因子 (['ARBR', 'SGAI', 'net_profit_to_total_operate_revenue_ttm', 'retained_profit_per_share'], [-3.89e-19, 6.05e-05, -0.000135, -0.000623]), # 第2组:动量+盈利能力因子 (['Price1Y', 'total_profit_to_cost_ratio', 'VOL120'], [-0.007687, -0.001064, -0.000637]), # 第3组:价格+盈利效率因子 (['price_no_fq', 'total_profit_to_cost_ratio', 'inventory_turnover_rate'], [-0.000222, -0.000340, -1.24e-08]), # 第4组:财务健康+技术面因子 (['debt_to_assets', 'operating_cost_to_operating_revenue_ratio', 'DAVOL20', 'price_no_fq', 'sales_growth'], [-0.001346, 0.001286, -0.003021, -0.000233, 0.000234]), # 第5组:风险因子 (['TVSTD6', 'cashflow_per_share_ttm', 'sharpe_ratio_120', 'non_operating_net_profit_ttm'], [-6.69e-11, -0.000161, -0.000553, 9.17e-12]) ]

五组因子的经济含义

组别 因子类型 核心因子 选股逻辑
第1组 技术+质量 ARBR(人气比率)、SGAI(销售管理费用增长) 低人气、低费用增长
第2组 动量+盈利 Price1Y(年度价格动量)、VOL120(120日成交量) 低动量、低成交量(冷门股)
第3组 价格+效率 price_no_fq(股价)、存货周转率 低股价、高存货效率
第4组 财务+技术 debt_to_assets(资产负债率)、DAVOL20(成交量变异) 低负债、低量能异动
第5组 风险因子 TVSTD6(真实波幅标准差)、sharpe_ratio_120 低波动、高夏普

4.2.2 综合评分与选股

def get_factor_score(context): # 获取全市场股票池 stocks = get_all_securities('stock').index.tolist() # 应用过滤规则 stocks = filter_stocks(context, stocks) total_scores = pd.Series(0.0, index=stocks) # 五组模型累计评分 for factor_names, coefficients in g.factor_list: factor_data = get_factor_values( stocks, factor_names, date=context.current_dt ) # 线性回归评分:因子值 × 预训练系数 group_score = factor_data.dot( pd.Series(coefficients, index=factor_names) ) total_scores += group_score # 选取综合评分最低的1只股票 # (系数以负值为主,评分越低代表质量越好) selected = total_scores.nsmallest(g.stock_num).index.tolist() return selected

评分机制说明:由于五组回归系数中负系数占主导,综合评分越低代表:

  • 更低的价格动量(逆势/低关注)
  • 更低的波动率(稳定性强)
  • 更低的销售管理费用增长(经营效率高)
  • 更高的夏普比率(风险调整收益佳)

4.2.3 周度调仓执行

def weekly_adjustment(context): # 获取目标股票 target = get_factor_score(context) current_positions = [p for p in context.portfolio.positions if context.portfolio.positions[p].total_amount > 0] # 卖出不在目标列表的持仓 for stock in current_positions: if stock not in target: order_target_percent(stock, 0) # 买入目标股票(满仓单只) for stock in target: order_target_percent(stock, 1.0 / len(target))

4.3 两代策略的关键设计差异分析

4.3.1 训练范式差异

维度 策略一(SVR在线训练) 策略二(线性回归预训练)
训练时机 每次调仓前实时训练 离线一次训练,系数固化
过拟合风险 高(每次用当日截面数据训练) 低(系数来自历史大样本)
前视偏差 存在(训练与预测数据重叠) 避免(预训练系数不依赖当日数据)
计算开销 高(每月实时SVR训练) 极低(仅矩阵乘法)

4.3.2 择时逻辑差异

RSRS择时模块在策略一中扮演了"市场过滤器"的角色——当市场下行时强制空仓等待。然而,这一机制存在两个潜在问题:

  1. 延迟信号:RSRS标准分基于历史窗口计算,在市场快速转折时存在信号滞后
  2. 错失反弹:空仓期间可能错过快速V型反弹行情,导致相对收益损失

策略二放弃择时,采用纯因子驱动的"持续持仓"策略,通过高质量的因子选股代替宏观择时,验证了"选股优于择时"的投资哲学。


第五章 研究结果

5.1 净值曲线对比

策略一(SVR优化前)净值曲线

机器学习线性回归优化前.png

策略二(线性回归优化后)净值曲线

机器学习线性回归优化后.png

5.2 核心绩效对比

指标 策略一(SVR优化前) 策略二(线性回归优化后) 变化幅度
回测区间 2016-01-01 至 2026-01-01 2016-01-01 至 2026-01-01
初始资金 ¥10,000,000 ¥10,000,000
策略收益 601.97% 4847.16% ↑约8倍
年化收益 22.20% 49.39% ↑+27.19%
超额收益 616.27% 4947.96% ↑约8倍
最大回撤 43.22% 20.58% ↓22.64%
超额回撤 35.73% 30.04% ↓5.69%
夏普比率 0.838 1.784 ↑+0.946
信息比率 1.113 2.305 ↑+1.192
Alpha 0.206 0.483 ↑2.3倍
胜率(月度) 54.3% 60.5% ↑+6.2%
盈亏比 1.681 2.504 ↑+0.823

5.3 关键绩效分析

5.3.1 收益端:8倍的跨越式提升

策略二的累计收益达到4847.16%,相当于策略一(601.97%)的约8倍。年化收益从22.20%跃升至49.39%,提升幅度达27.19个百分点。这一惊人差距主要来源于:

  1. 集中持仓的杠杆效应:单只股票满仓持有,当因子选出强势股时,收益完全兑现;相比之下,10只股票分散持仓会因弱势股稀释组合收益
  2. 预训练系数的稳定性:离线训练的系数在样本外保持了有效性,避免了在线SVR因数据噪声导致的选股失误
  3. 取消择时的持续暴露:策略二在市场上行期持续持仓,充分参与了2019-2021年的牛市行情

5.3.2 风险端:最大回撤压缩近半

尽管集中持仓通常被认为风险更高,策略二的最大回撤(20.58%)反而显著低于策略一(43.22%),降幅高达22.64个百分点。这一结果揭示了两个重要机制:

  • SVR模型的不稳定性:策略一的SVR在特定市场环境(如2018年熊市)下可能选出基本面恶化的股票,导致大幅回撤
  • 因子预训练的风险控制:策略二的第5组因子(TVSTD6、sharpe_ratio_120)专门针对波动率进行负向选择,系统性地过滤了高波动股票

5.3.3 风险调整收益:夏普比率倍增

夏普比率从0.838提升至1.784(+0.946),信息比率从1.113提升至2.305(+1.192),Alpha从0.206提升至0.483(+0.277)。这些指标的全面提升表明,策略二不仅绝对收益更高,其单位风险的超额收益能力也实现了质的飞跃

夏普比率超过1.7、Alpha接近0.5,在A股量化策略中属于极为优秀的水平,验证了线性回归预训练因子模型在A股市场的强有效性。

5.3.4 交易质量:胜率与盈亏比双提升

月度胜率从54.3%提升至60.5%,盈亏比从1.681提升至2.504。两项指标同步改善,说明策略二在盈利频率单次盈利规模两个维度均优于策略一。这是量化策略中较为罕见的"既能更频繁获利,单次获利也更大"的优化效果。

5.4 分阶段绩效归因

市场阶段 时间区间 特征 策略一表现 策略二表现
震荡下行 2016-2018 熔断后弱势 RSRS频繁触发空仓 因子选股稳定持仓
结构性牛市 2019-2021 科技/消费主线 10股分散,部分错位 单只集中,充分兑现
调整期 2022 成长股大跌 SVR选股失效,大回撤 风险因子过滤有效
修复期 2023-2025 低估值修复 缓慢恢复 因子持续有效

第六章 未来优化与展望

6.1 当前策略的局限性

尽管策略二展示了卓越的回测绩效,以下局限性值得关注:

1. 过度集中的单只持仓风险
单只股票满仓持有虽然放大了收益,但在个股出现极端黑天鹅事件时(如财务造假、政策打压),组合将面临毁灭性损失。回测数据无法完全反映这一尾部风险。

2. 预训练系数的时变性问题
固定的线性回归系数隐含了因子有效性不随时间变化的假设。随着市场结构演变(如量化规模扩大、监管政策变化),预训练系数可能出现失效风险,需要定期重新训练或引入系数衰减机制。

3. 中证500股票池的流动性约束
策略二以中证500为基准,相关股票流动性相对充足,但1000万元满仓单只中小盘股在实际交易中可能面临冲击成本问题。

4. 样本内过拟合的潜在风险
五组预训练系数基于历史数据优化而来,存在一定程度的样本内过拟合风险,真实样本外表现可能低于回测结果。

6.2 优化方向

6.2.1 持仓分散化改进

将集中持仓从1只扩展至3-5只,在保持高集中度优势的同时引入有限分散,降低个股特质风险:

# 建议持仓数量优化 g.stock_num = 3 # 从1只扩展至3只 # 等权配置或按因子评分加权

6.2.2 动态系数更新机制

引入滚动窗口重训练机制,定期(季度/年度)更新预训练系数,使模型保持对市场环境变化的适应性:

# 季度滚动重训练(伪代码) if context.current_dt.month % 3 == 0: update_pretrained_coefficients( lookback_years=3, retrain_date=context.current_dt )

6.2.3 波动率自适应仓位管理

在保留纯因子选股核心逻辑的基础上,引入轻量化的波动率自适应仓位控制:

# 基于VIX/波动率的仓位调节 def volatility_adjusted_position(context): vol_20d = calc_realized_vol(lookback=20) target_vol = 0.15 # 目标年化波动率15% position_ratio = min(1.0, target_vol / vol_20d) return position_ratio

6.2.4 因子有效性监控

建立实时因子IC监控体系,当某组因子的滚动IC显著下降时,自动降低其权重:

监控指标 预警阈值 响应动作
滚动3个月IC均值 < 0.02 该组因子权重降低50%
滚动6个月IC均值 < 0.01 暂停使用该组因子
因子IC_IR < 0.3 触发系数重训练

6.3 研究延伸方向

  1. 因子组合优化:使用Lasso/Ridge回归自动筛选最优因子组合,替代人工划分的5组结构
  2. 跨市场验证:将预训练系数在港股、美股市场进行迁移学习验证
  3. 高频因子引入:在周度调仓框架下引入日内分钟级别的技术因子(如隔夜收益、日内振幅)
  4. 集成模型探索:将线性回归评分与梯度提升树(LightGBM)进行集成,探索非线性因子交互效应
  5. 风险预算框架:引入Black-Litterman模型,结合宏观视图与因子信号进行最优仓位配置

6.4 结语

本研究通过策略一(SVR+RSRS择时)到策略二(线性回归预训练+纯因子驱动)的系统性迭代,验证了以下核心结论:

"好的因子体系胜于复杂的模型结构,预训练稳定性胜于在线学习灵活性,精准选股胜于宏观择时。"

策略二8倍于策略一的超额收益,以及显著更低的最大回撤,为机器学习量化策略的工程实践提供了重要启示:简单、稳健、可解释的线性因子模型,在A股市场中往往比复杂的非线性模型更具持久的竞争优势


附录

附录A:策略参数汇总

策略一(SVR优化前)核心参数

# 择时参数 g.N = 18 # RSRS斜率计算窗口 g.M = 600 # Z-score参考窗口 g.K = 8 # Z-score斜率窗口 g.score_thr = -1 # RSRS买入阈值 g.score_fall_thr = -0.5 # 卖出阈值 g.idex_slope_raise_thr = 10 # 动量买入阈值 # 选股参数 g.stock_num = 10 # 持仓股票数 g.model = SVR(kernel='rbf') # 支持向量回归

策略二(线性回归优化后)核心参数

# 持仓参数 g.stock_num = 1 # 集中持仓1只 # 5组预训练系数 g.factor_list = [ (['ARBR', 'SGAI', 'net_profit_to_total_operate_revenue_ttm', 'retained_profit_per_share'], [-3.89e-19, 6.05e-05, -0.000135, -0.000623]), (['Price1Y', 'total_profit_to_cost_ratio', 'VOL120'], [-0.007687, -0.001064, -0.000637]), (['price_no_fq', 'total_profit_to_cost_ratio', 'inventory_turnover_rate'], [-0.000222, -0.000340, -1.24e-08]), (['debt_to_assets', 'operating_cost_to_operating_revenue_ratio', 'DAVOL20', 'price_no_fq', 'sales_growth'], [-0.001346, 0.001286, -0.003021, -0.000233, 0.000234]), (['TVSTD6', 'cashflow_per_share_ttm', 'sharpe_ratio_120', 'non_operating_net_profit_ttm'], [-6.69e-11, -0.000161, -0.000553, 9.17e-12]) ]

附录B:因子说明

因子代码 中文名称 计算说明
ARBR 人气意愿指标 衡量多空双方意愿强度的技术指标
SGAI 销售管理费用增长 销售+管理费用的同比增长率
Price1Y 年度价格动量 过去一年价格涨跌幅
VOL120 120日成交量 120个交易日平均成交量
DAVOL20 20日成交量偏离 20日成交量相对均值的偏离度
TVSTD6 6日真实波幅标准差 近6日真实波幅(ATR)的标准差
sharpe_ratio_120 120日夏普比率 近120日的风险调整收益
price_no_fq 不复权价格 股票不复权收盘价
debt_to_assets 资产负债率 总负债/总资产
sales_growth 营收增长率 营业收入同比增长率

本报告基于历史回测数据,不构成投资建议。量化策略的历史绩效不代表未来实际表现。

最后一次编辑于 19小时前 0

暂无评论

无名的人