
正文系统比较 SVR + RSRS 择时与多因子线性回归评分体系,围绕模型架构、回测框架、绩效差异和后续优化展开。
本报告为机器学习选股策略系列第三篇专题优化研究,系统比较了两代策略的设计演进与绩效差异。
策略一(优化前)基于支持向量回归(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)策略为基准,通过引入多因子线性回归预训练模型进行系统性优化,从三个维度展开对比分析:
通过2016至2026年十年跨度的历史回测,本研究旨在揭示不同策略设计选择对最终投资绩效的影响机制,为机器学习选股策略的工程实践提供参考。
本研究围绕以下核心问题展开:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
基于市场微结构与因子研究文献,提出以下假设:
两个策略均在聚宽(JoinQuant)量化平台上进行回测,核心参数如下:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
策略一过滤规则:
策略二过滤规则:
策略一(月度调仓):
# 每日运行,月度实际调仓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')
回测结果使用以下指标综合评估:
策略一的核心择时信号来自阻力支撑相对强度(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-scoreif 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_kreturn score
择时逻辑:
在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只股票构建投资组合。
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)]
策略二的核心创新在于离线预训练的五组线性回归系数,彻底摒弃了在线模型训练,避免了前视偏差与过拟合风险:
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])]
五组因子的经济含义:
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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
评分机制说明:由于五组回归系数中负系数占主导,综合评分越低代表:
def weekly_adjustment(context):# 获取目标股票target = get_factor_score(context)current_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))
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
RSRS择时模块在策略一中扮演了"市场过滤器"的角色——当市场下行时强制空仓等待。然而,这一机制存在两个潜在问题:
策略二放弃择时,采用纯因子驱动的"持续持仓"策略,通过高质量的因子选股代替宏观择时,验证了"选股优于择时"的投资哲学。
策略一(SVR优化前)净值曲线:
策略二(线性回归优化后)净值曲线:
|
|
|
|
|
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
策略二的累计收益达到4847.16%,相当于策略一(601.97%)的约8倍。年化收益从22.20%跃升至49.39%,提升幅度达27.19个百分点。这一惊人差距主要来源于:
尽管集中持仓通常被认为风险更高,策略二的最大回撤(20.58%)反而显著低于策略一(43.22%),降幅高达22.64个百分点。这一结果揭示了两个重要机制:
夏普比率从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股市场的强有效性。
月度胜率从54.3%提升至60.5%,盈亏比从1.681提升至2.504。两项指标同步改善,说明策略二在盈利频率和单次盈利规模两个维度均优于策略一。这是量化策略中较为罕见的"既能更频繁获利,单次获利也更大"的优化效果。
|
|
|
|
|
|
|---|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
尽管策略二展示了卓越的回测绩效,以下局限性值得关注:
1. 过度集中的单只持仓风险
单只股票满仓持有虽然放大了收益,但在个股出现极端黑天鹅事件时(如财务造假、政策打压),组合将面临毁灭性损失。回测数据无法完全反映这一尾部风险。
2. 预训练系数的时变性问题
固定的线性回归系数隐含了因子有效性不随时间变化的假设。随着市场结构演变(如量化规模扩大、监管政策变化),预训练系数可能出现失效风险,需要定期重新训练或引入系数衰减机制。
3. 中证500股票池的流动性约束
策略二以中证500为基准,相关股票流动性相对充足,但1000万元满仓单只中小盘股在实际交易中可能面临冲击成本问题。
4. 样本内过拟合的潜在风险
五组预训练系数基于历史数据优化而来,存在一定程度的样本内过拟合风险,真实样本外表现可能低于回测结果。
将集中持仓从1只扩展至3-5只,在保持高集中度优势的同时引入有限分散,降低个股特质风险:
# 建议持仓数量优化g.stock_num = 3 # 从1只扩展至3只# 等权配置或按因子评分加权
引入滚动窗口重训练机制,定期(季度/年度)更新预训练系数,使模型保持对市场环境变化的适应性:
# 季度滚动重训练(伪代码)if context.current_dt.month % 3 == 0:update_pretrained_coefficients(lookback_years=3,retrain_date=context.current_dt)
在保留纯因子选股核心逻辑的基础上,引入轻量化的波动率自适应仓位控制:
# 基于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
建立实时因子IC监控体系,当某组因子的滚动IC显著下降时,自动降低其权重:
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
本研究通过策略一(SVR+RSRS择时)到策略二(线性回归预训练+纯因子驱动)的系统性迭代,验证了以下核心结论:
策略二8倍于策略一的超额收益,以及显著更低的最大回撤,为机器学习量化策略的工程实践提供了重要启示:简单、稳健、可解释的线性因子模型,在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])]
|
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
本报告基于历史回测数据,不构成投资建议。量化策略的历史绩效不代表未来实际表现。
Until next time

