因子投资基础:可转债因子投资概述
做可转债量化,说白了就是找规律。
我刚开始接触这个领域时,总觉得可转债就是个「股债混合体」,用股票那套因子直接套用就行。结果呢?回测曲线漂亮得很,实盘一跑就翻车。后来我才明白——可转债有自己的脾气,你得顺着它的性子来。
什么是可转债因子投资?
因子投资,本质上就是找到那些能解释资产收益的共同特征。比如股票的「低市盈率因子」、「动量因子」,到了可转债这边,逻辑类似但细节完全不同。
我个人习惯把可转债因子投资拆成三步:
- 找因子:挖掘能预测可转债未来收益的特征
- 验因子:用历史数据检验它是不是真的有效
- 组组合:把多个有效因子组合起来,构建投资策略
你想想看,可转债有债底保护,又有转股期权,这决定了它的因子逻辑不能照搬股票。我在项目中遇到过用股票动量因子直接做可转债,结果发现大部分收益都被「回售条款」和「强赎条款」吃掉了。
核心认知:可转债因子投资 ≠ 股票因子投资 + 债券因子投资。它是独立的第三极,需要专门设计因子体系。
因子分类体系
做因子分类,我习惯按「驱动逻辑」来分,而不是按「数据来源」。为什么?因为可转债的收益来源很特殊——它既不是纯股,也不是纯债。
我自己的分类框架是这样的:
这个分类体系我用了三年,迭代了五次。最开始只有估值和动量两类,后来发现「下修条款」带来的收益太明显了,才把基本面类单独拎出来。
1. 估值类因子
这类因子衡量的是「可转债到底贵不贵」。最常用的就是转股溢价率——说白了就是转债价格相对于转股价值的溢价程度。
举个例子:某转债转股价值100元,转债价格120元,转股溢价率就是20%。溢价率越低,转债越「股性」;溢价率越高,越「债性」。
我的经验:转股溢价率低于10%的转债,走势基本跟正股同步。高于50%的,基本就是个纯债。做因子组合时,千万别把这两类混在一起——它们的收益驱动逻辑完全不同。
2. 动量类因子
动量因子在可转债上表现很特别。我做过一个测试:用过去20日收益率排序,做多前20%做空后20%,年化收益能到15%以上。但有个坑——遇到强赎公告日,动量会瞬间反转。
为什么会这样?因为强赎公告后,转债价格会快速向转股价值收敛,之前的上涨动量反而成了反向指标。
3. 基本面类因子
这类因子包括正股基本面(营收增速、ROE等)和转债条款(下修条款、回售条款、强赎条款)。
我记得有一次,某只转债正股基本面很差,但下修条款特别宽松。我当时没在意,结果三个月后公司真的下修了转股价,转债一天涨了15%。从那以后,我把「下修概率」作为基本面因子的核心指标。
因子有效性评价指标
因子好不好,不能光看回测收益。我见过太多「回测王者、实盘青铜」的因子了。评价一个因子,我一般看五个维度:
| 指标 | 计算公式 | 我的判断标准 |
|---|---|---|
| IC均值 | 因子值与未来收益的秩相关系数 | 绝对值 > 0.03 才算有效。低于这个数,基本就是噪音 |
| ICIR | IC均值 / IC标准差 | > 0.5 算合格,> 1.0 算优秀。ICIR低说明因子不稳定 |
| 分组收益单调性 | 按因子值分5组,看收益是否单调递增/递减 | 必须单调。如果第3组收益最高,第1组和第5组反而低,这因子就有问题 |
| 换手率 | 组合调仓时需更换的持仓比例 | 单边换手率 < 30% 可接受。太高的话交易成本会吃掉收益 |
| 最大回撤 | 因子多空组合的历史最大回撤 | 回撤超过20%的因子,我一般会谨慎使用 |
避坑指南:我曾经犯过一个错误——只看IC均值,不看ICIR。结果选了个IC均值0.05但ICIR只有0.2的因子,实盘时因子效果时好时坏,根本没法用。记住:稳定性比强度更重要。
实际做因子评价时,我一般会写个简单的Python脚本来计算这些指标。核心代码大概长这样:
import numpy as np
from scipy.stats import spearmanr
def evaluate_factor(factor_values, forward_returns):
"""
评价因子有效性
factor_values: 因子值序列
forward_returns: 未来N日收益序列
"""
# 计算IC
ic, _ = spearmanr(factor_values, forward_returns)
# 计算ICIR(需要滚动窗口)
ic_series = []
for i in range(20, len(factor_values)):
ic_window, _ = spearmanr(
factor_values[i-20:i],
forward_returns[i-20:i]
)
ic_series.append(ic_window)
ic_mean = np.mean(ic_series)
ic_std = np.std(ic_series)
icir = ic_mean / ic_std if ic_std != 0 else 0
return {
'ic': ic,
'ic_mean': ic_mean,
'icir': icir,
'is_valid': abs(ic_mean) > 0.03 and icir > 0.5
}
嗯,这里要注意:滚动窗口选20期是我个人的习惯。如果你做日频数据,20个交易日大概对应一个月。窗口太小噪音大,窗口太大又反应太慢。
最后说一句:因子评价不是一锤子买卖。我每个月都会重新跑一遍所有因子的评价指标,看看哪些因子「老化」了,哪些因子「觉醒」了。市场在变,因子的有效性也在变——这是量化投资的常态。
公众号:蓝海资料掘金营,微信deep3321