因子投资基础:可转债因子投资概述

做可转债量化,说白了就是找规律。

我刚开始接触这个领域时,总觉得可转债就是个「股债混合体」,用股票那套因子直接套用就行。结果呢?回测曲线漂亮得很,实盘一跑就翻车。后来我才明白——可转债有自己的脾气,你得顺着它的性子来。

什么是可转债因子投资?

因子投资,本质上就是找到那些能解释资产收益的共同特征。比如股票的「低市盈率因子」、「动量因子」,到了可转债这边,逻辑类似但细节完全不同。

我个人习惯把可转债因子投资拆成三步:

  1. 找因子:挖掘能预测可转债未来收益的特征
  2. 验因子:用历史数据检验它是不是真的有效
  3. 组组合:把多个有效因子组合起来,构建投资策略

你想想看,可转债有债底保护,又有转股期权,这决定了它的因子逻辑不能照搬股票。我在项目中遇到过用股票动量因子直接做可转债,结果发现大部分收益都被「回售条款」和「强赎条款」吃掉了。

核心认知:可转债因子投资 ≠ 股票因子投资 + 债券因子投资。它是独立的第三极,需要专门设计因子体系。

因子分类体系

做因子分类,我习惯按「驱动逻辑」来分,而不是按「数据来源」。为什么?因为可转债的收益来源很特殊——它既不是纯股,也不是纯债。

我自己的分类框架是这样的:

可转债因子分类体系 估值类因子 动量类因子 基本面类因子 转股溢价率 纯债溢价率 隐含波动率 价格动量 换手率变化 资金流向 正股基本面 转债条款 下修概率 低估值 → 安全边际高 适合防守型策略 强趋势 → 短期爆发力 适合进攻型策略 好条款 → 超额收益来源 适合事件驱动策略

这个分类体系我用了三年,迭代了五次。最开始只有估值和动量两类,后来发现「下修条款」带来的收益太明显了,才把基本面类单独拎出来。

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