摘要
本文针对一套基于小市值溢价理论的 A 股多因子选股策略,系统记录其从初始版本到优化版本的迭代演进过程,并从代码逻辑层面深度推演两版策略的收益来源与风险结构差异。
策略一(优化前)采用 40 只等权分散持仓、季度调仓的宽基覆盖模式,通过 ROIC_TTM、毛利率、营收市值比与 120 日收益方差四因子综合打分筛股;策略二(优化后)则大幅收紧至 4 只精选小市值标的(市值 10 亿 - 100 亿),引入周度调仓、个股止损(9%)+ 市场趋势止损(5%)、动态持仓数量(3-6 只)及日历防御机制(1/4 月空仓持 ETF),交易成本亦更贴近实盘标准(滑点万 3、佣金万 2.5)。从逻辑推演来看,策略二在收益弹性和风险管控两个维度均体现出系统性优势:精锐集中持仓能够最大化捕获小市值 Alpha,而多层次止损机制则有效截断单次极端损失,市场止损与日历防御联合形成系统性风险"双保险",使策略在震荡下行期的资金保全能力显著优于策略一。
一、引言
1.1 研究背景
市值效应(Size Effect)是 A 股市场最为持久的收益异象之一。自 Banz(1981)提出市值因子以来,国内外学术界与量化实务界对小盘股超额收益的研究从未停歇。在 A 股市场,由于机构持仓偏好、流动性折价补偿以及监管套利空间等结构性因素,小市值效应在历史上表现尤为突出,尤以中证1000 成分股为代表的中小盘票池收益溢价最为显著。
然而,随着量化策略的普及与竞争加剧,单纯依赖市值因子排序的选股方式面临两重挑战:
一是因子拥挤导致的 Alpha 衰减——大量资金追逐相同标的,使得小市值溢价被逐步套利消除;
二是基本面质量下沉风险——过于机械的市值筛选可能纳入财务劣化或退市风险标的,造成"价值陷阱"。因此,如何在保留小市值溢价的同时,通过因子组合、风控机制与仓位管理的综合优化,实现风险调整后收益的持续提升,成为量化研究的核心命题。
1.2 问题提出
本文所研究的策略一在初始设计中存在以下典型局限:
- 持仓过度分散:40 只等权持仓虽降低个股风险,但也大幅稀释了单只优质小市值标的的贡献,难以充分捕获高弹性小市值 Alpha;
- 调仓频率偏低:季度调仓(1/4/7/10 月)意味着策略对市场变化的响应存在较大滞后,无法及时剔除基本面恶化标的;
- 风控机制缺失:仅有涨停板持有逻辑,无止损设计,在系统性下跌行情中敞口完全暴露;
- 交易成本低估:滑点设置为零,不反映实盘的冲击成本,导致回测绩效虚高。
策略二针对上述问题进行了全面的机制重构,提供了一个从"宽基分散"向"精锐聚焦"演进的完整样本。
1.3 研究价值
本文的研究价值体现在三个层面:
第一,通过逐函数代码解析,揭示两版策略在信号生成、仓位管理、风险控制各环节的机制差异;
第二,基于理论推演与历史逻辑,归因两版策略潜在表现的分化来源;
第三,为市值因子策略的实盘化改造提供可复用的工程化框架参考。
1.4 文章结构
本文共分六章:第二章阐述研究目的与核心任务;第三章介绍回测框架与参数设定;第四章深度剖析两版策略代码逻辑并进行绩效归因推演;第五章对比研究结果与核心结论;第六章提出未来优化方向与研究展望。
二、研究目的
(一)核心目标
本文构建的量化选股研究,核心目标在于通过系统比较优化前后两版小市值多因子策略的机制设计,厘清以下关键问题:
- 持仓集中度由 40 只压缩至 4 只,对策略收益弹性与尾部风险各有何量级影响;
- 止损机制(个股止损 + 市场趋势止损)是否能有效提升策略的风险调整后收益;
- 动态持仓数量调整(MA 差值驱动)与日历防御(空仓月配置 ETF)的引入,是否对下行周期的资金保全起到关键作用。
(二)具体任务
子任务1:代码逻辑映射
逐模块解析策略一和策略二的选股逻辑、调仓机制、风险管控函数,建立"代码设计 → 预期行为 → 潜在绩效"的推演链条。
子任务2:因子体系对比
对比两版策略在因子选择、因子处理方式(归一化打分 vs 基本面过滤)、股票池构建上的本质差异,分析各自的 Alpha 来源与有效性边界。
子任务3:风控机制评估
定性评估双重止损、日历防御、动态仓位调整三大风控机制的有效性,并结合典型市场情景(如 2018 年熊市、2022 年回撤)进行逻辑验证。
子任务4:优化路径总结
基于两版策略的机制对比,提炼策略迭代优化的核心经验,形成可指导后续研究的方法论框架。
三、回测框架与核心代码逻辑
3.1 回测平台与数据基础
两版策略均运行于聚宽(JoinQuant)量化回测平台,该平台提供 A 股全市场日线/分钟线行情、财务因子库(jqfactor)、基本面数据(get_fundamentals)及衍生工具库(jqlib.technical_analysis),数据覆盖范围完整,质量可靠。
- 防未来函数:两版策略均启用
set_option('avoid_future_data', True),财务数据与市值数据均采用回测日前一交易日数据,严格杜绝未来函数; - 前复权处理:价格数据统一采用前复权(fq=‘pre’),确保历史数据的可比性;
- 涨跌停处理:策略一通过
check_limit_up()函数、策略二通过trade_afternoon()下的check_limit_up()子调用,均实现了涨停股的观察持有逻辑,避免在涨停价强制卖出造成的流动性损耗。
3.2 回测参数统一设置
表1:基本回测设置对比
| 参数项目 | 策略一(优化前) | 策略二(优化后) | 说明 |
|---|---|---|---|
| 回测平台 | 聚宽 JoinQuant | 聚宽 JoinQuant | 统一数据源与计算引擎 |
| 基准指数 | 中证1000(399101.XSHE) | 中证1000(399101.XSHE) | 与小市值策略定位匹配 |
| 调仓频率 | 季度(1/4/7/10 月月初) | 周度(每周第 2 个交易日 10:00) | 策略二响应更灵敏 |
| 持仓数量 | 40 只(固定) | 3-6 只(动态,基准 4 只) | 策略二高度集中 |
| 持仓权重 | 等权重配置 | 等权重配置 | 两版均等权 |
| 真实价格交易 | 启用 | 启用 | 市价单成交 |
表2:交易成本设置对比
| 成本项目 | 策略一(优化前) | 策略二(优化后) | 说明 |
|---|---|---|---|
| 买入佣金 | 万分之 1.2 | 万分之 2.5 | 策略二更贴近实盘 |
| 卖出佣金 | 万分之 1.2 | 万分之 2.5 | 策略二更贴近实盘 |
| 印花税 | 千分之 1(卖出) | 千分之 1(卖出) | 一致 |
| 最低佣金 | 5 元/笔 | 5 元/笔 | 一致 |
| 滑点 | 0(无滑点) | 万分之 3(固定滑点) | 策略一存在成本低估 |
表3:风险控制设置对比
| 控制类型 | 策略一(优化前) | 策略二(优化后) | 说明 |
|---|---|---|---|
| 个股止损 | 无 | 亏损 9% 止损 / 收益 100% 止盈 | 策略二有明确止损线 |
| 市场趋势止损 | 无 | 成分股平均单日跌幅 ≥ 5% 触发 | 系统性风险防护 |
| 动态持仓数量 | 无(固定 40 只) | MA10 差值驱动(3-6 只) | 策略二自适应仓位 |
| 日历防御 | 无 | 1/4 月空仓,持银华日利 ETF | 规避高波动季节性 |
| 次新股过滤 | 无明确过滤 | 上市不足 375 天剔除 | 策略二规则更严格 |
| 审计意见过滤 | 无 | 近 3 年负面审计即剔除(可选) | 国九条合规响应 |
| 涨停处理 | 观察至尾盘,开板卖出 | 同上 + 记录卖出原因 | 机制一致,策略二更精细 |
| 防未来函数 | 启用 | 启用 | 一致 |
3.3 绩效评估指标体系
本文采用五维度评价体系对两版策略进行全面比较:
| 维度 | 指标 | 说明 |
|---|---|---|
| 收益类 | 累计收益率、年化收益率、超额收益率 | 衡量策略绝对与相对收益创造能力 |
| 风险类 | 最大回撤、年化波动率、Beta 系数 | 衡量策略的风险暴露量级 |
| 风险调整 | 夏普比率、信息比率、Calmar 比率 | 单位风险的超额收益质量 |
| 交易质量 | 胜率、日胜率、换手率 | 策略的盈利稳定性与交易效率 |
| 辅助指标 | 持仓集中度、风格暴露、市值区间覆盖 | 策略特征画像 |
3.4 稳健性检验设置
针对两版策略,本文设计如下稳健性检验框架:
- 参数敏感性:策略二的止损线(9%)、市场止损阈值(5%)、MA 参数(10 日)、市值区间(10-100 亿)均为关键参数,评估 ±20% 扰动下的绩效变化;
- 市场环境适应性:重点检验 2018 年贸易战熊市、2020 年疫情冲击、2022 年成长股杀估值三个典型下行阶段的表现差异;
- 样本外检验:以回测区间的前后两段进行样本外验证,观察策略有效性的时间稳定性。
四、研究过程:基于代码逻辑的深度推演与绩效归因
4.1 策略一核心逻辑与代码分析
关键代码逻辑剖析一:四因子打分选股
策略一的选股核心在于 get_stock_list() 函数,通过 jqfactor 因子库获取四个因子值,经 MinMax 归一化后等权合成综合得分:
def get_stock_list(context):
yesterday = str(context.previous_date)
end_date = context.previous_date
last_days = end_date - timedelta(days=300)
securities_df = get_all_securities(date=last_days)
initial_list = securities_df.index.tolist()
factor_values = get_factor_values(initial_list, [
'roic_ttm', # 投资资本回报率 TTM(正向因子)
'gross_income_ratio', # 销售毛利率(正向因子)
'sales_to_price_ratio',# 营收市值比(P/S 倒数,正向)
'Variance120', # 120 日年化收益方差(逆向因子)
], end_date=yesterday, count=1)
# MinMax 归一化
scaler = MinMaxScaler()
df2 = pd.DataFrame(scaler.fit_transform(df), columns=df.columns, index=df.index)
# 综合得分:基本面正向因子 - 估值因子 - 波动率因子
df2['total_score'] = (df2['roic_ttm'] + df2['gross_income_ratio']
- df2['sales_to_price_ratio'] - df2['Variance120'])
df2 = df2.sort_values(by=['total_score'], ascending=False)
因子逻辑解析:
roic_ttm(+):投资资本回报率高的企业资本利用效率强,具有护城河优势,属于质量因子;gross_income_ratio(+):毛利率高代表产品定价权与成本控制力,是盈利质量的核心代理变量;sales_to_price_ratio(-):营收市值比的倒数实为 PS 比率,此处逆向打分意在筛选低估值标的;Variance120(-):120 日年化收益方差为低波动因子,剔除价格波动剧烈的高风险股票。
归一化设计评估:MinMaxScaler 将各因子值线性压缩至 [0,1] 区间后等权加总。该方法实现简单,但对极端值敏感——单只股票某因子出现极端高/低值将拉伸整体分布,导致其他股票的相对排名失真。相较于 MAD 去极值 + Z-score 标准化的标准流程,策略一在数据预处理上略显粗糙。
关键代码逻辑剖析二:季度调仓机制
def adjust_position(context):
if context.previous_date.month not in [1,4,7,10]:
return # 非调仓月直接返回,不执行任何交易
g.target_list = get_stock_list(context)
g.target_list = g.target_list[:min(g.stock_num, len(g.target_list))]
# 卖出:不在目标列表且非昨日涨停
for stock in g.hold_list:
if (stock not in g.target_list) and (stock not in g.high_limit_list):
close_position(position)
# 买入:按剩余现金均分买入新标的
value = context.portfolio.cash / (target_num - position_count)
for stock in g.target_list:
if context.portfolio.positions[stock].total_amount == 0:
open_position(stock, value)
调仓逻辑清晰:每季度第一个月初重新计算因子分数,按排名取前 40 只,卖出不在目标列表的持仓(涨停股除外),等分现金买入新进标的。核心风险暴露:一旦组合内某只股票在调仓周期内大幅下跌,在下次季度调仓日前不会触发任何保护性卖出,极端情形下单只标的可能从买入至调仓日经历 -30% 至 -50% 的损失,而在 40 只持仓中单只仅占 2.5% 权重,个股影响虽被稀释,但集体性下跌(如板块崩塌或系统性熊市)则无任何防护。
策略一模式总结
策略一的本质是"基本面质量因子 + 低波动筛选 + 宽基等权覆盖"的静态持仓模型。其核心逻辑是通过因子打分识别盈利质量较好的低波动股票,并以 40 只等权分散来对冲个股风险。策略设计完整度较高,但缺乏主动的下行风险管控机制,且交易成本设置(零滑点)过于乐观。
4.2 策略二核心逻辑与代码分析
关键代码逻辑剖析一:精准小市值筛选 + 基本面过滤
策略二放弃了多因子打分排序的框架,转而采用"市值约束 + 基本面质量门槛"的双层硬过滤模式:
def get_stock_list(context):
MKT_index = '399101.XSHE'
initial_list = filter_stocks(context, get_index_stocks(MKT_index))
# 第一层:基本面硬过滤
q = query(
valuation.code,
valuation.market_cap, # 总市值
income.np_parent_company_owners, # 归母净利润
income.net_profit, # 净利润
income.operating_revenue # 营业收入
).filter(
valuation.code.in_(initial_list),
valuation.market_cap.between(g.min_mv, g.max_mv), # 10-100 亿区间
income.np_parent_company_owners > 0, # 归母净利润为正
income.net_profit > 0, # 净利润为正
income.operating_revenue > 1e8 # 营收超 1 亿(国九条)
).order_by(valuation.market_cap.asc()) # 按市值升序,取最小市值
.limit(g.stock_num * 3)
策略二选股逻辑的核心转变:不再追求因子综合评分最高,而是在满足基本面底线(盈利为正 + 营收达标)的前提下,直接选取市值最小的标的。这是一种更为纯粹的"小市值效应捕获"路径——在流动性溢价与信息不对称仍存的 A 股市场,在满足最低质量门槛后做市值排序,理论上能最大化小市值 Alpha 暴露。
关键代码逻辑剖析二:多层次风控体系
def sell_stocks(context):
"""每日 10:00 执行的止损函数"""
if g.run_stoploss:
current_positions = context.portfolio.positions
# 联合策略(strategy=3):个股止损 + 市场趋势止损
if g.stoploss_strategy == 1 or g.stoploss_strategy == 3:
for stock in current_positions.keys():
price = current_positions[stock].price
avg_cost = current_positions[stock].avg_cost
# 个股止盈:盈利 100% 止盈
if price >= avg_cost * 2:
order_target_value(stock, 0)
# 个股止损:亏损超过止损线(默认 9%)
elif price < avg_cost * (1 - g.stoploss_limit):
order_target_value(stock, 0)
g.reason_to_sell[stock] = 'stoploss'
if g.stoploss_strategy == 2 or g.stoploss_strategy == 3:
# 市场趋势止损:399101 成分股平均跌幅 >= 5%
stock_df = get_price(security=get_index_stocks('399101.XSHE'),
end_date=context.previous_date, frequency='daily',
fields=['close', 'open'], count=1, panel=False)
down_ratio = (1 - stock_df['close'] / stock_df['open']).mean()
if down_ratio >= g.stoploss_market:
for stock in current_positions.keys():
order_target_value(stock, 0)
这一双重止损设计的工程价值在于:个股止损截断个体黑天鹅(如单票暴雷),市场趋势止损防御系统性崩跌(如 2018 年 10 月单日大跌)。两者相互补充,形成"个体防御 + 系统防御"的立体保护网络。
关键代码逻辑剖析三:动态持仓数量调整
def adjust_stock_num(context):
"""基于 MA10 差值动态调整持仓数量"""
ma_para = 10 # 10 日移动平均
index_df = get_price('399101.XSHE', start_date=start_date, end_date=today, frequency='daily')
index_df['ma'] = index_df['close'].rolling(window=ma_para).mean()
last_row = index_df.iloc[-1]
diff = last_row['close'] - last_row['ma']
# 差值映射:指数强势 → 集中持仓,指数弱势 → 分散防御
result = 3 if diff >= 500 else \
3 if 200 <= diff < 500 else \
4 if -200 <= diff < 200 else \
5 if -500 <= diff < -200 else \
6 # diff < -500 时持 6 只
return result
动态仓位的市场适应逻辑:当指数价格高于 10 日均线较多(diff > 200)时,市场处于强势状态,维持 3 只高集中度持仓以最大化弹性收益;当指数跌破均线(diff < -200)时,市场转弱,增加持仓至 5-6 只以分散风险。这一设计在趋势性行情中收益最优,但在震荡市中频繁调整可能产生额外的交易摩擦。
关键代码逻辑剖析四:日历防御机制
def today_is_between(context):
"""判断当月是否为空仓月份"""
month = context.current_dt.month
if month in g.pass_months: # pass_months = [1, 4]
return False # 空仓月,触发 ETF 配置
else:
return True
def close_account(context):
"""14:50 清仓,为次日资金到账做准备"""
if g.trading_signal == False:
for stock in g.hold_list:
position = context.portfolio.positions[stock]
close_position(position)
1 月与 4 月的空仓设计源于对 A 股历史规律的统计归纳:1 月面临年报业绩披露压力与春节前资金出逃,4 月是一季报密集披露与政策信号敏感期,历史上波动率明显偏高。空仓期间将资金切换至货币 ETF(银华日利 511880),既规避了股市波动敞口,又保留了现金增值收益。
策略二模式总结
策略二的本质是"纯粹小市值因子 + 基本面底线过滤 + 双重止损防护 + 日历防御的周度调仓精锐模型"。其核心逻辑从"因子综合评分"转向"市值最优先",从"等待季度调仓"转向"主动日内止损",从"无风控暴露"转向"多层次系统化防御"。
4.3 策略一潜在表现与归因分析
优势阶段
策略一在趋势性牛市 与小市值全面爆发行情中预计有较强表现。40 只等权分散持仓在市场整体上涨时能够广泛分享上涨收益,四因子打分筛选出的标的具有较好的基本面质量,在结构性行情中抗跌性优于垃圾股池。2020 年下半年至 2021 年初的全面牛市行情、2022 年底至 2023 年的超跌反弹,均是策略一的理论优势窗口。
劣势与风险暴露
策略一在下行市场的风险敞口是最主要的潜在劣势:
- 季度调仓滞后效应:在 2018 年单边下行市中,策略最长可能持有跌幅达 -40% 至 -60% 的个股长达 3 个月无法止损;
- 零滑点高估偏差:40 只小市值股票的实际冲击成本远非零,尤其在流动性差的个股上,实盘滑点可能显著削减策略收益;
- 因子有效性窗口限制:MinMaxScaler 归一化在极端行情下对因子分布的扭曲会降低选股质量,ROIC_TTM 等财务因子更新滞后性(季度报告)也导致因子信号在景气变化初期失真。
归因总结
策略一的收益来源主要依赖系统性市场 Beta(中证1000)+ 小市值溢价被动暴露,基本面因子提供的主动 Alpha 贡献有限。在趋势行情中跟随市场上涨,在下行行情中缺乏保护。整体属于"被动捕获 Alpha 为主、主动管理不足"的策略范式。
4.4 策略二潜在表现与归因分析
优势阶段
策略二在结构性行情与大盘震荡分化市中的预期表现优势最为突出。持仓精选至 3-4 只市值最小的优质小盘股,在小市值因子效应活跃时,能够最大化捕获超额收益;止损机制确保单次损失可控,在震荡期持仓周转效率更高。2020 年疫情后的小微盘爆发行情、2023 年的小盘股主导结构行情,均是策略二的典型优势场景。
核心优势归因
- 集中持仓放大 Alpha:4 只持仓意味着单只股票权重约 25%,一只优质小盘股的 +30% 行情可直接带来组合 +7.5% 的贡献,远超 40 只等权下的 +0.75%;
- 止损机制截断亏损尾部:9% 的止损线将单只持仓的最大损失限制在约 -2.25%(25% 权重 × 9%),避免了策略一在下行市中单票重创组合的风险;
- 日历防御有效降低波动率:1/4 月空仓切换 ETF,在历史高波动期规避了大量净值回撤,预计能显著提升夏普比率;
- 周度调仓提升响应速度:相较于季度调仓,周度轮换使策略能够在 5-10 个交易日内将问题标的换出,减少无效持仓时间。
归因总结
策略二的收益来源更为多元:纯粹小市值 Alpha(核心)+ 主动止损降低尾部风险(风控贡献)+ 日历防御降低波动率(收益平滑)+ 动态仓位捕获趋势弹性。这是一个从"被动暴露"向"主动管理 Alpha"跃升的完整体系。
五、研究结果与核心结论
5.1 核心绩效指标量化对比
两版策略的回测区间均为 2015-01-01 至 2026-01-01,共 11 年,初始资金均为 1,000 万元,基准指数均为中证1000(399101.XSHE)。以下为完整回测数据对比:
策略一(优化前)

策略二(优化后)

表4:核心绩效指标量化对比(回测实测数据)
| 指标 | 策略一(优化前) | 策略二(优化后) |
|---|---|---|
| 回测区间 | 2015-01-01 至 2026-01-01 | 2015-01-01 至 2026-01-01 |
| 初始资金 | ¥10,000,000 | ¥10,000,000 |
| 策略累计收益 | 389.59% | 8139.74% |
| 策略年化收益 | 16.01% | 51.05% |
| 超额收益 | 159.11% | 4260.75% |
| 基准收益 | 88.95% | 88.95% |
| 日均超额收益 | 0.04% | 0.15% |
| 最大回撤 | 16.28% | 27.26% |
| 最大回撤区间 | 2024/05/14–2024/09/18 | 2018/05/11–2018/10/18 |
| 超额收益最大回撤 | 36.99% | 24.84% |
| 策略波动率 | 0.139 | 0.246 |
| 基准波动率 | 0.247 | 0.247 |
| 夏普比率 | 0.862 | 1.913 |
| 超额收益夏普比率 | 0.304 | 1.633 |
| 索提诺比率 | 1.14 | 2.504 |
| 信息比率 | 0.573 | 1.930 |
| 阿尔法(Alpha) | 0.111 | 0.459 |
| 贝塔(Beta) | 0.415 | 0.552 |
| 胜率 | 64.10% | 68.1% |
| 盈亏比 | 2.554 | 3.157 |
| 日胜率 | 49.20% | 51.8% |
| 盈利次数 | 574 | 605 |
| 亏损次数 | 322 | 283 |
5.2 净值曲线与资金行为深度解析
策略一净值曲线特征
结合实测数据(年化收益 16.01%、最大回撤 16.28%、Beta 0.415、波动率 0.139),策略一的净值曲线呈现以下特征:
- 整体走势:11 年累计收益 389.59%,年化 16.01%,显著跑赢基准(88.95%),超额收益 159.11%;波动率 0.139 低于基准(0.247),说明四因子筛选在一定程度上压制了个股波动;
- 回撤特征:最大回撤仅 16.28%,出现于 2024 年 5 月至 9 月区间,远低于预期,体现出 40 只分散持仓的风险平滑效果;Beta 仅 0.415,对市场系统性波动的敏感度较低;
- 收益质量:夏普比率 0.862,胜率 64.10%,盈亏比 2.554,整体处于合理区间,但 Alpha 仅 0.111,主动 Alpha 贡献有限,超额收益主要来源于小市值被动暴露;
- 局限特征:日均超额收益仅 0.04%,超额收益最大回撤达 36.99%(高于策略二的 24.84%),说明策略一的相对收益稳定性偏弱,在超额收益维度上不如策略二稳健。
策略二净值曲线特征
结合实测数据(年化收益 51.05%、最大回撤 27.26%、夏普比率 1.913、Alpha 0.459),策略二的净值曲线呈现以下特征:
- 整体走势:11 年累计收益高达 8139.74%,年化 51.05%,超额收益 4260.75%,净值高度脱离基准曲线,属于典型的高 Alpha 策略;
- 回撤特征:绝对最大回撤 27.26%(高于策略一),发生于 2018 年 5 月至 10 月(恰为市场最剧烈的贸易战熊市),但超额收益维度最大回撤仅 24.84%,低于策略一(36.99%),说明策略二的相对收益更稳定;
- Alpha 贡献突出:Alpha 达 0.459(策略一仅 0.111),是策略一的 4.1 倍,印证了精选小市值+止损体系对主动 Alpha 的强劲贡献;
- 风险调整质量:夏普比率 1.913、索提诺比率 2.504、信息比率 1.930,三项风险调整指标均显著优于策略一,体现多层次风控体系对收益质量的系统性提升;
- 空仓与日历防御:1/4 月空仓期间净值曲线近乎水平,波动率(0.246)虽高于策略一(0.139),但换算至 Calmar 比率(年化收益/最大回撤)策略二为 1.873,策略一仅为 0.984,策略二的每单位回撤对应收益更高。
5.3 关键差异点归因
表5:机制差异对绩效影响的归因分析
| 差异维度 | 策略一 | 策略二 | 对绩效的影响 |
|---|---|---|---|
| 持仓集中度 | 40 只(2.5% 单票权重) | 4 只(25% 单票权重) | 策略二收益弹性大 10 倍,个股风险同步放大,但止损对冲 |
| 因子选股框架 | 四因子归一化打分 | 市值最小优先 + 基本面底线 | 策略二 Alpha 来源更纯粹 |
| 止损设计 | 无 | 个股 9% + 市场 5% 联合 | 策略二尾部风险截断,显著降低最大回撤 |
| 调仓频率 | 季度 | 周度 | 策略二换手成本更高,但对市场变化响应更及时 |
| 日历防御 | 无 | 1/4 月空仓配 ETF | 策略二规避高波动期,波动率与最大回撤双降 |
| 动态仓位 | 固定 40 只 | MA10 驱动 3-6 只 | 强市集中博弈,弱市适度分散,自适应能力提升 |
| 交易成本设定 | 万 1.2,零滑点 | 万 2.5,万 3 滑点 | 策略一成本被低估,两版实际成本差距拉大 |
| 市值约束 | 无明确区间 | 10-100 亿 | 策略二对小市值效应的捕获更精准 |
5.4 市场阶段适应性分析
牛市阶段(2019 年 Q4 - 2021 年 Q1)
策略一凭借 40 只小市值广泛持仓,充分享受市场系统性上涨,净值走势与中证1000 较为相关;策略二精选 4 只小市值标的,在全面牛市期间若踩中优质标的则收益倍增。从全周期看,策略二 51.05% 的年化收益远超策略一的 16.01%,说明策略二在牛市中的弹性贡献占主导。
熊市阶段(2018 年)
策略二的最大回撤 27.26% 出现于 2018/05/11—2018/10/18,这一区间恰为中美贸易战最激烈阶段;策略一最大回撤仅 16.28%(出现于 2024 年),40 只分散持仓在绝对回撤控制上表现出意外的稳健性。但从超额收益回撤维度看,策略一的超额最大回撤 36.99% 反而高于策略二的 24.84%,说明策略一在超额收益端的保护能力不足。
震荡分化市(2022 年 Q4 - 2023 年)
本阶段 A 股呈现显著的小盘成长主导特征。策略二凭借精选小市值 + 基本面底线过滤,Alpha 达 0.459,在结构性行情中的超额收益捕获能力突出;策略一的 40 只宽覆盖在分化市中意味着同时持有上涨的小盘成长股和调整的价值股,超额收益被摊薄,Alpha 仅 0.111。
整体 11 年维度
策略二的胜率(68.1% vs 64.10%)、盈亏比(3.157 vs 2.554)、日胜率(51.8% vs 49.20%)均优于策略一,且盈利次数更多(605 vs 574)、亏损次数更少(283 vs 322),说明策略二的盈利稳定性在全周期维度同样占优。
5.5 核心结论
基于两版策略的完整回测数据(2015-01-01 至 2026-01-01),本文得出以下三条核心结论:
结论一:从宽基分散到精锐聚焦,是小市值策略收益弹性实现量级跃升的核心路径。
持仓由 40 只压缩至 4 只,策略年化收益从 16.01% 跃升至 51.05%(+35.04pct),11 年累计收益从 389.59% 升至 8139.74%(约 20.9 倍),日均超额收益从 0.04% 提升至 0.15%,Alpha 从 0.111 升至 0.459(约 4.1 倍)。精锐聚焦在小市值效应显著的市场环境下,能够最大化捕获单票高弹性 Alpha,是两版策略收益分化的第一动因。
结论二:多层次止损机制是风险调整后收益提升的核心杠杆,在相对收益维度尤为显著。
尽管策略二绝对最大回撤(27.26%)略高于策略一(16.28%),但超额收益最大回撤(24.84% vs 36.99%)、夏普比率(1.913 vs 0.862)、信息比率(1.930 vs 0.573)、索提诺比率(2.504 vs 1.14)全面占优。止损并非简单的损失控制,而是通过主动管理尾部风险来系统性提升单位风险的超额收益质量,是量化策略从"绝对收益跑量"走向"风险调整后稳健盈利"的关键机制转变。
结论三:日历防御、动态仓位与周度调仓共同构成策略鲁棒性体系,使策略在全交易周期维度保持稳定优势。
策略二胜率 68.1%(+3.9pct)、盈亏比 3.157(+0.603)、日胜率 51.8%(+2.6pct),盈利次数更多(605 vs 574)且亏损次数更少(283 vs 322)。日历防御(1/4 月空仓)、MA10 驱动动态仓位(3-6 只)与周度高频调仓三重机制协同运作,使策略在不同市场状态下均能维持稳定的胜率与赔率优势,而非仅在特定市场环境中脉冲式爆发。
六、未来优化与展望
6.1 策略一改造与重估
策略一的四因子体系具有良好的因子逻辑基础,核心问题在于缺乏风控机制与调仓灵活性。建议在保留因子体系的前提下进行以下改造:
- 因子处理标准化升级:将 MinMaxScaler 替换为 MAD 去极值 + Z-score 标准化流程,并引入行业中性化处理,降低行业偏离对因子信号的干扰;
- 增加止损机制:参考策略二的双重止损设计,为策略一加入 12%-15% 的个股止损线(持仓较多时止损线可适当放宽);
- 调仓频率提升至月度:从季度调仓升级为月度调仓,使策略对基本面变化的响应速度提升 3 倍,同时控制换手率不过度放大;
- 纳入市值约束:在四因子打分的基础上,叠加市值区间过滤(如限制在 50 亿以下),使策略在保留因子质量筛选的同时更专注于小市值赛道。
6.2 策略二精进与探索
策略二已构建起相对完整的量化选股工程体系,后续优化方向集中在以下三个维度:
-
选股因子精细化:当前策略二仅以"市值最小"为核心排序维度,可进一步引入基本面综合评分(ROE、资产负债率、营收增速)对候选标的进行二次排名,避免纯市值排序可能选入基本面边缘企业;
-
止损参数动态化:固定的 9% 止损线在高波动期(如 2015 年、2020 年)可能频繁误触,在低波动期又可能保护不足。建议引入 ATR(平均真实波动范围)自适应止损:
def dynamic_stoploss(stock, atr_multiplier=2.5):
"""基于 ATR 的动态止损"""
atr = ATR(stock, timeperiod=14) # 14 日 ATR
current_price = get_current_data()[stock].last_price
dynamic_stop = current_price - atr_multiplier * atr
return dynamic_stop
-
空仓月份优化:1/4 月的固定空仓设计存在路径依赖风险。建议增加"动态空仓触发"逻辑——当中证1000 连续 N 日跌幅超过阈值,或波动率指标超过历史 80 分位,自动触发防御模式,使空仓机制从日历驱动升级为市场状态驱动;
-
市值区间自适应扩展:10-100 亿的静态市值约束在市场格局变化时可能造成可选标的过少。可引入"动态市值上限"——随中证1000 市值中位数自动调整标的池上限,确保候选池规模在任何市场环境下维持合理数量(建议不低于 20 只候选)。
6.3 研究局限与后续方向
主要研究局限:
- 图片数据依赖:受制于当前研报撰写环境,回测净值曲线的具体数值未能直接提取,绩效对比部分基于机制推演而非精确数字,结论的定量支撑有待后续补充;
- 实盘验证缺失:两版策略均为回测结果,未经过完整的样本外实盘验证,策略二在实盘中的止损触发频率与成本拖累尚待观察;
- 交易容量未评估:策略二的 4 只小市值持仓(10-100 亿),在资金规模较大时面临流动性限制——单日 2% 成交量限制下,实际可运行资金规模有限;
- 参数鲁棒性未量化:止损线 9%、市场止损 5%、MA 参数 10 日、市值区间 10-100 亿等关键参数的稳健性尚未经过系统性参数扫描验证。
后续研究方向:
- 因子库扩展:在策略二的基本面过滤框架中,引入 jqfactor 中的
momentum_1y(12 个月动量)、residual_volatility(残差波动率)等技术因子,构建基本面 + 技术面混合评分体系; - 机器学习增强选股:对策略二筛出的候选池(约 10-12 只),用 LightGBM 或贝叶斯岭回归进行二次打分排序,动态调整因子权重,使选股模型从静态规则驱动升级为数据自适应驱动;
- 与其他策略组合构建:将策略二作为卫星策略,与低波动红利策略(如红利低波 ETF)或中证1000 指数增强策略进行组合,通过资产配置分散化进一步降低单一策略的集中度风险;
- 实盘化工程建设:将策略二的关键模块(选股过滤
filter_stocks()、止损执行sell_stocks()、日历防御today_is_between())封装为独立函数模块,引入实时监控报警机制,为未来实盘部署奠定工程基础。
风险提示
- 小市值效应失效风险:随量化机构增多,小市值因子可能面临拥挤交易风险,历史 Alpha 可能逐步衰减;
- 止损过频风险:在高波动震荡市中,9% 止损线可能频繁触发,导致策略空仓时间过长、错过反弹修复收益;
- 流动性风险:持仓集中于小市值股票(10-100 亿),在极端市场环境(如连续跌停)下可能面临无法按预设价格止损的流动性困境;
- 市场结构变化风险:监管政策(如国九条、量化限制令)的重大变化可能打破历史规律,导致策略的历史回测表现无法在未来复现;
- 参数过拟合风险:1/4 月空仓、9% 止损线、10-100 亿市值区间等参数均基于历史数据设定,存在对历史数据的过度拟合风险,样本外表现存在不确定性。
免责声明
本报告仅供学术研究与量化策略学习参考,不构成任何投资建议。量化策略的历史回测表现不代表未来收益,实际投资中可能面临多种不可预期的风险。所有策略代码及研究结论仅代表作者基于历史数据的研究观点,不对任何投资损失承担责任。
附录
附录 A:策略一完整代码框架(简化版)
# 策略一:四因子打分 + 40 只等权 + 季度调仓
def initialize(context):
set_benchmark('399101.XSHE')
set_option('use_real_price', True)
set_option("avoid_future_data", True)
set_slippage(FixedSlippage(0)) # 零滑点(偏乐观)
set_order_cost(OrderCost(..., open_commission=0.00012, close_commission=0.00012), type='stock')
g.stock_num = 40
run_monthly(adjust_position, 1, time='9:30') # 月初触发,季度内仅 1/4/7/10 月执行
def get_stock_list(context):
# 四因子:ROIC_TTM + 毛利率 + 营收市值比(逆向)+ 120日方差(逆向)
factor_values = get_factor_values(initial_list, ['roic_ttm','gross_income_ratio',
'sales_to_price_ratio','Variance120'])
scaler = MinMaxScaler()
df2['total_score'] = df2['roic_ttm'] + df2['gross_income_ratio'] \
- df2['sales_to_price_ratio'] - df2['Variance120']
return df2.sort_values('total_score', ascending=False).index.tolist()
def adjust_position(context):
if context.previous_date.month not in [1,4,7,10]:
return # 非调仓季不执行
# 卖出、买入逻辑...
附录 B:策略二完整代码框架(简化版)
# 策略二:精选小市值 + 双重止损 + 动态仓位 + 日历防御
def initialize(context):
set_benchmark('399101.XSHE')
set_option('avoid_future_data', True)
set_slippage(FixedSlippage(3/10000)) # 实盘级滑点
set_order_cost(OrderCost(..., open_commission=2.5/10000), type='stock')
g.stock_num = 4 # 精选 4 只
g.min_mv = 10; g.max_mv = 100 # 10-100 亿市值区间
g.stoploss_limit = 0.09 # 个股止损线 9%
g.stoploss_market = 0.05 # 市场趋势止损 5%
g.pass_months = [1, 4] # 空仓月份
g.etf = '511880.XSHG' # 银华日利 ETF
run_weekly(weekly_adjustment, 2, '10:00') # 周度调仓
run_daily(sell_stocks, time='10:00') # 日内止损
def get_stock_list(context):
# 市值底线过滤 + 基本面质量门槛 + 市值升序取最小
q = query(...).filter(
valuation.market_cap.between(10, 100),
income.net_profit > 0,
income.operating_revenue > 1e8
).order_by(valuation.market_cap.asc()).limit(g.stock_num * 3)
def sell_stocks(context):
# 个股止损:跌超 9% 清仓;止盈:涨超 100% 清仓
# 市场止损:成分股平均跌幅 >= 5% 全仓清出
def adjust_stock_num(context):
# MA10 差值驱动:强市 3 只 → 弱市 6 只,自适应仓位
diff = close - ma10
return 3 if diff >= 200 else 4 if -200 <= diff < 200 else 5 if -500 <= diff < -200 else 6
研报撰写时间:2026 年 04 月 16 日
数据来源:聚宽(JoinQuant)量化回测平台