最近几年在做量化研究时,我有一个很深的感受:A股市场正在发生一些根本性的变化。以前那种靠题材炒作、概念驱动的投资方式越来越难赚钱了,反而是一些基本面扎实的公司开始受到资金青睐。
这种变化背后有两个很重要的推手。第一个是外资的持续流入。我记得2016年刚开始关注北上资金的时候,很多人还把它当作一个短期的资金流向指标来看。但现在回头看,外资买入的逻辑其实很清晰:ROE高、现金流好、行业地位稳固的龙头公司。这些公司可能不是最sexy的,但确实是最赚钱的。
第二个推手是监管层面的变化。2020年的退市新规我觉得是一个分水岭,以前那些靠财务造假、关联交易维持上市地位的公司,生存空间被大大压缩了。市场开始真正奖励那些经营质量高的公司,惩罚那些浑水摸鱼的。
在这样的背景下,我开始思考:能不能用量化的方法,系统性地识别出这些"优质公司"?这就是我研究QQC质量因子的初衷。
理论基础:Gordon模型给我的启发
说实话,刚开始研究质量因子的时候,我有点无从下手。什么叫"质量"?怎么量化"质量"?市面上关于质量因子的研究很多,但大多数都是把一堆财务指标堆在一起,缺乏理论指导。
后来我重新翻阅了一些经典的估值理论,Gordon成长模型给了我很大启发:
这个公式虽然简单,但它把公司价值的驱动因素讲得很清楚:盈利能力、分红政策、成长性、风险水平。更重要的是,它给了我一个思考框架:一家"优质"的公司,应该在这几个维度上都有不错的表现。
但这里有个问题:分红政策(payout ratio)在A股市场的区分度不够高,很多公司要么不分红,要么分红政策变化很大。所以我对这个框架做了一些调整,最终确定了六个维度:盈利能力、成长能力、盈余质量、营运效率、安全性、公司治理。
这六个维度基本涵盖了我对"优质公司"的理解:不仅要赚钱(盈利能力),还要持续赚钱(成长能力),赚的钱要是真金白银(盈余质量),赚钱的效率要高(营运效率),财务要稳健(安全性),治理要规范(公司治理)。
因子构建:六大维度的深度挖掘
2.1 盈利能力:不只是看ROE那么简单
提到盈利能力,很多人第一反应就是ROE。ROE确实重要,但我在实际测试中发现,单纯的ROE在A股市场的预测能力并不是最强的。
经过大量测试,我发现 经营现金流/总资产(CFOA) 的表现最为出色,IC_IR高达0.47。这个发现让我很有感触:在A股这个相对不成熟的市场,会计利润和经营现金流之间的差异往往很大。那些经营现金流充沛的公司,往往代表着更真实的盈利质量。
我记得有一次路演,一个投资经理问我:"为什么不直接用净利润增长率?"我的回答是:净利润可以通过各种会计处理来调节,但现金流是骗不了人的。一家公司可以连续几年报告盈利,但如果现金流持续为负,那这种"盈利"的可持续性就很值得怀疑。
最终,我选择了CFOA、ROE、ROIC三个指标等权构建盈利能力因子。这个组合既考虑了会计利润,也考虑了现金流,还兼顾了资本配置效率。
# 主要逻辑:计算公司的基础盈利能力指标。
class ProfitabilityFactors:
def calculate_factors():
for each stock:
# 1. 经营现金流资产比
CFOA = operating_cash_flow / total_assets
# 2. 净资产收益率
ROE = net_profit / average_equity
# 3. 投资资本回报率
ROIC = NOPAT / (total_assets - current_liabilities)
return standardized_factors
关键点:
- 使用TTM(滚动12个月)数据
- 考虑行业中位数进行标准化
- 处理异常值和极端情况
2.2 成长能力:从增长率到增长质量
成长因子的构建是我花时间最多的部分,因为传统的增长率指标在A股市场有一个很大的问题:波动性太大。很多公司的季度增长率可能从100%跳到-50%,这种增长率对投资决策的指导意义不大。
所以我引入了几个创新性的指标:
加速度指标:这个想法来源于物理学。我想,如果一家公司的业绩增长不仅在加速,而且加速度还在提升,那这种增长的质量应该更高。通过对连续8个季度的业绩进行二次回归:
这里的α就是"加速度"。测试结果证明了这个想法的有效性。
稳健增速指标:这个指标解决的是另一个问题。有些公司增长很快,但增长的稳定性很差,这种增长往往不可持续。稳健增速指标就是用增长率的均值除以标准差,奖励那些增长稳定的公司。
实际测试中,营业利润稳健加速度(OP_SD) 的表现最为出色,IC_IR达到0.73。这个结果让我更加确信:在成长性评估中,增长的质量比增长的速度更重要。
# 主要逻辑:分析公司的增长轨迹和稳定性。
class GrowthFactors:
def calculate_growth():
for each stock:
# 1. 增长加速度(二次拟合)
growth_acc = quadratic_regression(earnings_series)
# 2. 增长稳定性
growth_stability = mean(growth_rates) / std(growth_rates)
# 3. 营业利润稳定性
op_stability = operating_profit.std() / operating_profit.mean()
return standardized_factors
关键点:
- 使用二次回归捕捉加速度
- 考虑增长的可持续性
- 平滑季节性波动
2.3 营运效率:挖掘隐藏的价值驱动力
营运效率这个维度,我觉得是最容易被忽视但又很重要的一个维度。很多投资者喜欢关注收入增长、利润增长,但很少有人关注资产周转效率的变化。
除了传统的周转率指标,我还构建了一个产能利用率提升因子(OCFA)。这个因子的逻辑是:如果一家公司能够在固定资产不变的情况下,提高产能利用率,那么它的营运效率就在改善。
具体的计算方法是通过营业总成本对固定资产做滚动回归:
这里的残差项ε就代表了产能利用率的变化。如果ε为负且在改善,说明公司在相同的固定资产规模下,成本控制得更好了。
这个因子在测试中表现不错,让我认识到:有时候最有价值的alpha可能隐藏在一些不太引人注意的地方。
# 主要逻辑:评估公司的资产使用效率。
class OperationalEfficiencyFactors:
def calculate_efficiency():
for each stock:
# 1. 资产周转率
asset_turnover = revenue / average_total_assets
# 2. 存货周转率
inventory_turnover = cost_of_goods / average_inventory
# 3. 应收账款周转率
receivables_turnover = revenue / average_accounts_receivable
return standardized_factors
关键点:
- 考虑行业特征差异
- 使用平均资产计算
- 处理季节性影响
2.4 盈余质量:A股市场的"照妖镜"
在A股市场做量化研究,盈余质量是一个绕不开的话题。我见过太多公司通过关联交易、资产重组来粉饰业绩,所以这个维度对我来说特别重要。
应计利润占比(APR) 是我最看重的一个指标:
APR = \frac{营业利润 - 经营现金流净额}{营业利润}这个指标的逻辑很简单:如果一家公司的利润主要来源于应计项目而不是现金流,那这种利润的质量就值得怀疑。在我的测试中,APR确实表现出了显著的负向预测能力。
有意思的是,这个因子在2018年表现特别突出。回想起来,2018年正是监管趋严、很多公司财务问题暴露的一年。这从侧面验证了盈余质量指标的有效性。
# 主要逻辑:评估盈利的真实性和可持续性。
class EarningsQualityFactors:
def calculate_quality():
for each stock:
# 1. 应计利润占比
APR = (operating_profit - operating_cash_flow) / abs(operating_profit)
# 2. 现金流稳定性
CFO_stability = 1 / cash_flow.std()
# 3. 盈利持续性
earnings_persistence = AR1_coefficient(earnings_series)
return standardized_factors
关键点:
- 关注现金流支持度
- 分析时间序列特征
- 考虑行业差异
2.5 市场反应:捕捉市场情绪的变化
市场反应因子是我在研究过程中后来加入的一个维度。最初我觉得这个维度可能和质量因子的"基本面"导向不太相符。但后来我发现,市场反应其实反映了投资者对公司质量的认知过程,这个维度可以帮助我们更好地把握投资时机。
我设计的市场反应因子主要包含三个方面:
分析师一致性(Analyst Consensus):这个指标衡量分析师对公司的评级变化趋势。我发现,相比单纯的分析师评级,评级的变化方向和一致性更有预测价值。特别是当多个分析师在短期内同向调整评级时,往往预示着公司基本面正在发生重要变化。
机构持股变化(Institutional Ownership Change):这个指标跟踪主要机构投资者的持股变动。我特别关注那些长期业绩优秀的基金经理的持仓变化,因为他们往往更注重公司的长期质量而不是短期波动。
成交特征(Trading Characteristics):这里我设计了一个特别的指标,叫做"智能成交比率(Smart Money Ratio)":
# 主要逻辑:分析市场对公司质量的认知变化。
class MarketReactionFactors:
def calculate_reaction():
for each stock:
# 1. 分析师一致性指标
analyst_consensus = weighted_sum(rating_changes)
# 2. 机构持股变化
inst_ownership_change = institutional_holdings.diff()
# 3. 智能成交比率
smart_money_ratio = large_trades / total_volume
return standardized_factors
关键点:
- 考虑事件窗口选择
- 处理市场整体影响
- 分析异常收益
2.6 估值因子:质量溢价的再发现
在构建估值因子时,我采取了一个不同于传统的思路:不是简单地看估值的高低,而是将估值与公司质量结合起来。这源于一个观察:高质量公司的估值溢价往往是可持续的,而低质量公司的低估值可能是一个"价值陷阱"。
我设计了三个核心指标:
质量调整的PE(Quality-Adjusted PE):这个指标的创新之处在于,我用ROE的稳定性来调整PE:
其中ROE_Stability是ROE的五年标准差的倒数。这样,对于那些ROE稳定的公司,我们会容忍更高的PE。
动态PEG(Dynamic PEG):传统的PEG可能会低估那些处于转型期的公司。我的改进是使用"潜在增长率"来计算PEG:
# 主要逻辑:将估值与公司质量结合评估。
class ValuationFactors:
def calculate_valuation():
for each stock:
# 1. 质量调整的PE
quality_pe = pe_ratio / (1 + roe_stability)
# 2. 动态PEG
dynamic_peg = pe_ratio / potential_growth_rate
# 3. 企业价值倍数
ev_quality = ev_to_ebitda / quality_score
return standardized_factors
关键点:
- 分行业标准化
- 处理负值情况
- 考虑成长性差异
这个估值框架在实践中表现出了很好的区分度。特别是在2019-2020年的结构性行情中,它帮助我们避开了很多看似"便宜"但实际质量堪忧的公司,同时也让我们能够坚持持有一些表面看起来"贵"但质量过硬的公司。
QQC综合因子:少即是多的哲学
在决定如何把六大类因子合成一个综合因子时,我面临一个选择:是用IC加权、IC_IR加权,还是简单的等权重?
经过反复测试和思考,我最终选择了等权重。理由有几个:
- 避免过拟合:IC加权本质上是一种样本内优化,容易导致样本外表现下降
- 逻辑直观:每个维度都代表质量的一个方面,没有理由认为某个维度天然更重要
- 稳健性更好:等权重的方法在不同市场环境下的适应性更强
实战应用:沪深300增强的血泪教训
说到沪深300指数增强,早期我试过很多技术指标、动量因子,效果都不理想。后来我意识到,沪深300的增强难度主要在于:
- 权重股的影响太大:前15大权重股占比超过30%,如果你在茅台、平安这些股票上判断错了,整个组合的表现就完蛋了
- 有效因子太少:我测试了200多个因子,在沪深300内部真正有效的不到20个
- 风格暴露难控制:稍不注意就会偏向成长或价值,一旦风格切换就亏钱
基于QQC因子的沪深300增强策略,我设计了很严格的风险控制:
- QQC因子权重强制≥50%
- 行业偏离度≤5%
- 个股权重偏离≤1%
这些约束看起来很保守,但实际效果很好。策略在2011-2020年的年化超额收益达到10.47%,更重要的是,每年都跑赢了基准,这在指数增强策略中是很难得的。
特别是2020年,策略超额收益19.37%,这一年正好是机构抱团、核心资产大涨的一年。事后看来,QQC因子很好地捕捉到了这种"质量溢价"。
一些思考和感悟
QQC因子给我最大的感触是:有时候最简单的方法反而是最有效的。
在因子构建过程中,我试过很多复杂的方法:机器学习、神经网络、遗传算法等等。但最终发现,基于扎实理论基础的简单方法,往往比那些看起来很炫酷的复杂方法更稳定、更有效。
另一个感悟是:市场在变,但基本的商业逻辑不变。无论是美股、港股还是A股,无论是成长股还是价值股,那些盈利能力强、成长性好、财务健康的公司,长期来看总是会得到市场的认可。QQC因子之所以有效,本质上是因为它抓住了这些不变的商业逻辑。
最后,我想说的是:量化研究不是纯粹的数据挖掘,更重要的是对市场和商业本质的理解。再强大的模型,如果没有逻辑支撑,也只是空中楼阁。QQC因子的成功,很大程度上得益于我们始终坚持"先有逻辑,再有模型"的研究思路。
如果需要完整代码,这个是代码仓库链接
https://gitee.com/carlo_scarpa/quant-factor-research-collection