Py学习  »  Python

中金转债|择时体系1:这些指标怎么看,及Python实现

中金固定收益研究 • 6 月前 • 216 次点击  


这些指标怎么看,及Python实现



临近年末,投资者问起“明年估值怎么看” 。以当前波动频率,谈“年度展望”不仅困难而且少见。往常提到的诸多择时指标,在近两年逐渐被碎片化地提及。在此,对这些指标的制作方法以及“怎么看”,我们一并总结。


A、百元溢价率


我们在2019年提出的一个指标,代表市场整体的溢价水平。提出时主要为消除溢价率和价格的“偏向性”——例如150元的转债往往溢价率很低,但不意味着市场很“便宜”。由于经过了曲线拟合处理,尽量消除了股债性不同带来的偏斜。计算方式无非是“拟合”,我们借助LinearRegression简单实现。唯一值得注意的是,为了避免归一化引入更多计算和不稳定,这里的x实际是“平价/100”。


图表1:百元溢价率的计算方式


def regressionCBVal(obj, date, codes):
    '''输出三个变量:拟合系数(a + bx + c/x),百元溢价率以及拟合优度'''
    if len(codes) >= 6:
        dfL = pd.DataFrame({"x": obj.ConvV.loc[date, codes] / 100.,
        "ConvPrem": obj.ConvPrem.loc[date, codes]})
        dfL.dropna(inplace=True)
        dfL['1_x'] = 1. / dfL['x']
        lr = LinearRegression()
        lr.fit(dfL.loc[:,['x','1_x']], dfL.loc[:,'ConvPrem'])
        return [lr.intercept_] + list (lr.coef_) , sum(lr.coef_) + lr.intercept_ ,
        lr.score(dfL.loc[:,['x','1_x']],dfL.loc[:,'ConvPrem'])
        
    else:
        raise ValueError('样本太少')

资料来源:Wind,中金公司研究部


这一数据的时间序列投资者可能比较熟悉,如下图:


图表2:百元溢价率

资料来源:Wind,中金公司研究部
注:数据截至2023年11月8日



在不同百元溢价率水平下,持有转债等权指数不同期限时,效果如下:


图表3:在百元溢价率的不同历史分位数下转债表现的情况

资料来源:Wind,中金公司研究部
注:数据截至2023年11月8日



择时意义上这是一个偏长期的指标。不难看出,在40日以下维度,这个指标的择时效力非常微弱。从120日维度开始显示明显而单调的效果,也就是:1、如果仅着眼于1~2个月的短期回报,这个指标的高低并无强烈的择时意义;2、但考虑半年持有、1年持有的中长期表现,这个指标的决定力很强。


一个问题是,按照这个指标:2021年及以前(甚至包括2018年),应当长期持有,而22年及以后,转债只有少量的阶段机会 —— 但这不是问题,从结果看,这是事实。实际上投资者都在近两年加大研究投入,以追求择券及在更小的窗口下择时的机会。


B、价格:


剔除异常样本("双高")后,全市场的算术平均值。这是一个更加粗糙的指标。当观测期达到120日以上时,效果近似百元溢价率(但稍弱)。不过,这个指标在短期也并非无效,120元以上的均价对任何持有期限的预期回报都有损害。


图表4:在不同历史均价下转债表现的情况

资料来源:Wind,中金公司研究部
注:数据截至2023年11月8日



相比之下,YTM等提供的信息不多,我们不在此列示。


C、弱势品种表现指标


历史更早的一个指标,衡量规模在20亿元以上、35%溢价率的转债,在过去10个交易日债底溢价率的提升情况,统计指标上,我们会在此基础上再做10日平均。原理上,这个指标衡量着那些本不容易在短期大涨的品种,出现群体异动的现象,是一个衡量过热是否发生的指标——尤其是那些“资金推动”场景下的过热。


实现方式比较简单,但效率起见我们需要矢量化计算,即下面的mat01矩阵,来避免进入长循环。滚动平均则再用到pandas的rolling机制,具体如下。


图表5:弱势品种表现指标计算


def weaknessPerformance(obj):
    dfRet = pd.DataFrame(index=obj.DB['Amt'].index, columns=['StrbPrem', 'Ten-Days Change'])
    mat01 = (obj.matNormal * # 仅保留非“双高样本”
            obj.Outstanding.applymap(lambda x: 1 if x > 2000000000.0 else np.nan) *
            obj.ConvPrem.applymap(lambda x: 1 if x > 35 else np.nan))
    
    dfRet["StrbPrem"] = (obj.StrbPrem * mat01).mean(axis=1)
    dfRet['Ten-Days Change'] = dfRet['StrbPrem'].diff(10)
    dfRet["10Days Avg"] = dfRet['Ten-Days Change'].rolling(10).mean()
    return dfRet

资料来源:Wind,中金公司研究部


可以看到,在25日~55日的全部维度下,当指标达到2.5%以上时,转债指数都有负面的预期。虽然数据显示了当数值较低时,市场回报也更高,但这并不是我们设计这个指标的初衷。因此实操中一般只关注是否触及上方的预警线(2.5%附近)。


图表6:在不同历史弱势品种指标下转债表现的情况

资料来源:Wind,中金公司研究部
注:数据截至2023年11月8日


D、债性转债的债底溢价率


这些债性样本在“寻找机会”方面也有一定意义。我们可以考察平价70元以内的品种的平均债底溢价率(当然我们剔除了异常样本),这个指标的月度、季度偏离率(距离21日、55日均线的偏差值)存在一定的统计价值。以21日为例,如下图:


图表7:债性转债21日偏离

资料来源:Wind,中金公司研究部
注:数据截至2023年11月8日


这个指标的计算非常容易,我们仅仅注意采用矢量计算即可。此外,对于是否需要剔除信用风险品种,我们认为不必:因为基本面是慢变量,风险一直都在,但在价格上的体现,本质上是对情绪的敏感表现。


图表8:债性转债21日偏离指标计算逻辑


def 债性品种债底溢价率偏离值(obj):
    srsPrem = (obj.Prem * obj.matNormal *
    obj.ConvV.applymap(lambda x: 1 if x < 70 else np.nan)).mean(axis=1)
    return srsPrem - srsPrem.rolling(21).mean()

资料来源:中金公司研究部


图表9:不同债性转债21日偏离指标下指数表现

资料来源:Wind,中金公司研究部
注:数据截至2023年11月8日


E、估值结构热图


这一指标我们常在估值快速调整时期观测“中等估值股性”转债是否发生足量调整,从而出现“跌出来的机会”。但由于使用条件并不广,计算也相对复杂,我们不在此展开,详见《几乎每一次调整都有错杀》。


F、情绪指标:


揭示短期内的情绪高、低点,相比估值指标而言更偏短期。其中有两个分量,“量”以换手率为基础,是中证1000、万得全A换手率在过去250日分位数,我们再进行10日平均。而“价”以RSI高于85的个股的比例,在过去250日的分位数衡量,同样也取10日均值。在加总时,我们不取简单等权,而是让“量”、“价”中距离0.5越远的指标权重越大,从而敏感地提示投资者。


图表10:情绪指标历史表现

资料来源:Wind,中金公司研究部
注:数据截至2023年11月8日



下图可见,有效期从10天大约延展至60天。粗略地看,底部区域大约可以定义为20%附近,顶部区域定义为90%以上较为合理(80%时还没有太明显的负面倾向)。再次提醒投资者注意,这个指标在中间区间运行时,并无参考价值。


图表11:情绪指标各值下转债的表现情况

资料来源:Wind,中金公司研究部
注:数据截至2023年11月8日


这一指标的计算主要涉及数据库调用,篇幅所限暂不在此展开,投资者可参考《这里是EasyBall的死角吗》中的过程。


G、风格轮动图:


这个指标本质上是一个结构观察,即成长价值、大盘小盘在40个交易日的涨跌幅差,在《固收+与风格轮动:规律、策略与Python实现》中我们有详细解释。但将这个指标放在这里是提醒投资者,如今结构化行情下,强势板块的过热,也是整体阶段机会的终结信号。尤其在情绪波动下,投资者可能产生“这一次不一样”或者“择券能维持绝对回报”的感受,这个指标往往提示实际这来自风格的单向偏移。


图表12:市场风格偏移指数

资料来源:Wind,中金公司研究部
注:数据截至2023年11月8日


H、甜点转债数:


在上周周报中我们也有提及,出自《被遗忘的theta》。简单看,“甜点”是期权定价的视角下,性价比较高、容易获利的品种。这个指标我们可以通过观察数量,来评价彼时转债市场的难易程度。下图摘自上周周报。


图表13:甜点转债个数情况

资料来源:Wind,中金公司研究部
注:数据截至2023年11月8日



但为何这不在“估值类”指标里?因为这里有一个关键变量是正股的波动率。实际上,个券“容易”与否主要取决于实际波动率与隐含波动率的错位。但我们无法直接预知实际波动,往往用历史值或预测值替代。下面是计算方式,虽然希腊字母会略显复杂,但我们仍有条件使用矢量计算。


图表14:甜点转债计算代码


def calculate_option_greeks(S, K, r, T, sigma):
    # Calculate d1 and d2
    d1 = (np.log(S / K) + (r + 0.5 * sigma**2) * T) / (sigma * np.sqrt(T))
    d2 = d1 - sigma * np.sqrt(T)
    # Calculate delta
    delta = norm.cdf(d1)
    # Calculate theta
    theta = - (S * norm.pdf(d1) * sigma) / (2 * np.sqrt(T)) + r * K * np.exp(-r * T) * (1 - norm.cdf(d2))
    # Calculate gamma
    gamma = norm.pdf(d1) / (S * sigma * np.sqrt(T))

    return delta, theta, gamma

def calcGreeks(df, vol, rf=0.04):
    # df包含剩余时间t,隐含波动率vol,平价ConvV和到期赎回价 maturitycallprice
    # vol为预测或历史波动率
    # 返回甜点品种数量
    delta, theta, gamma = calculate_option_greeks(df['ConvV'],
                         df['maturitycallprice'], rf, df['t'], df['vol'])
    ret = delta * rf + 0.5 * gamma * vol ** 2 + theta

    return len(ret[ret >= 0.05])

资料来源:Wind,中金公司研究部


I、混合尝试:如何结合这些指标

实践中,我们往往最关注那些处于明确信号值的指标(或者说更为极端状态的指标)。而与择券因子不同,整体择时的数据相对稀缺,我们一般不采取很复杂的模型加以混合。且即便用机器学习模型建立规则,也往往更需要“可读性”。一个推荐的方式是用决策树,下面给出一个标准范例。投资者需要考虑的是:1、模型的复杂度,这里我们限制了最深的层次为3层,避免不可读,或者结果很难理解;2、目标值y,我们建议的一个实用的口径是:未来20日最大涨幅 - 最大跌幅。


图表15:混合测试转债指标的逻辑


from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_graphviz
import graphviz
# 先划分训练集和测试集,设置随机种子以保证结果可复现
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
# 创建决策树模型,你可以设置树的深度,例如设置为3
clf = DecisionTreeClassifier(max_depth=3)
# 在训练集上训练模型
clf.fit(X_train, y_train)
# 输出训练后的模型得分 (模型精确度)
print("模型得分:", clf.score(X_test, y_test))

# 可视化决策树
class_names = [str(cls) for cls in clf.classes_]
dot_data = export_graphviz(clf, out_file=None,
                      feature_names=["Prem100", "PriceMedian" , "Weakness",
                                    "StrbPrem", "Motion", "Cookies"], # 特征名称
                     class_names=class_names, # 类别名称
                      filled=True, rounded=True,
                      special_characters=True)
graph = graphviz.Source(dot_data)
graph.render("Decision_Tree.pdf")

资料来源:Wind,中金公司研究部



以上述设定为例,根据决策树的结果,我们可以给出这样的解读:


1、如果仅考虑一个指标,百元溢价率是最关键的,26%附近为分界点;


2、在百元溢价率不超过26%的情况下,甜点券数目有较高参考价值,85个左右为分界点;


3、持有风险对中位价格、甜点数较为敏感,尤其当中位价格高于127元、甜点数低于55个时。


小结:这里介绍了一些实用的指标和背后的意义。当然它们不是全部,也不一定是最好的择时指标,每一个都有它的适用范围和局限性。但我们更希望提示转债投资者,在转债投资者更应避免的是依赖直觉、直观印象来做出判断。转债本身就是非线性的品种,线性的思维往往不奏效甚至是精准的反向指标。即便并不完美,我们也应该有基于客观可验证数据的体系。


此外,也应注意上述指标多为“左侧”指标,而右侧则是对趋势的认定,我们在《如何快速分辨趋势——Python实现趋势分析及债市中的适应性调整》也提供了一种简单的方式。实践中,左侧解决的问题是“跌出来多大机会”或“有多大安全垫”,但右侧才是对这些内容的确认,也是我们同样重视的信息。



文章来源

本文摘自:2023年11月10日已经发布的《择时体系1:这些指标怎么看,及Python实现》


杨 冰 分析员,SAC执业证书编号:S0080515120002;SFC CE Ref: BOM868

罗 凡 分析员 SAC执业证书编号:S0080522070003

陈健恒 分析员,SAC执业证书编号:S0080511030011;SFC CE Ref: BBM220




Legal Disclaimer

法律声明

特别提示

本公众号不是中国国际金融股份有限公司(下称“中金公司”)研究报告的发布平台。本公众号只是转发中金公司已发布研究报告的部分观点,订阅者若使用本公众号所载资料,有可能会因缺乏对完整报告的了解或缺乏相关的解读而对资料中的关键假设、评级、目标价等内容产生理解上的歧义。订阅者如使用本资料,须寻求专业投资顾问的指导及解读。

本公众号所载信息、意见不构成所述证券或金融工具买卖的出价或征价,评级、目标价、估值、盈利预测等分析判断亦不构成对具体证券或金融工具在具体价位、具体时点、具体市场表现的投资建议。该等信息、意见在任何时候均不构成对任何人的具有针对性的、指导具体投资的操作意见,订阅者应当对本公众号中的信息和意见进行评估,根据自身情况自主做出投资决策并自行承担投资风险。

中金公司对本公众号所载资料的准确性、可靠性、时效性及完整性不作任何明示或暗示的保证。对依据或者使用本公众号所载资料所造成的任何后果,中金公司及/或其关联人员均不承担任何形式的责任。

本公众号仅面向中金公司中国内地客户,任何不符合前述条件的订阅者,敬请订阅前自行评估接收订阅内容的适当性。订阅本公众号不构成任何合同或承诺的基础,中金公司不因任何单纯订阅本公众号的行为而将订阅人视为中金公司的客户。

一般声明

本公众号仅是转发中金公司已发布报告的部分观点,所载盈利预测、目标价格、评级、估值等观点的给予是基于一系列的假设和前提条件,订阅者只有在了解相关报告中的全部信息基础上,才可能对相关观点形成比较全面的认识。如欲了解完整观点,应参见中金研究网站(http://research.cicc.com)所载完整报告。

本资料较之中金公司正式发布的报告存在延时转发的情况,并有可能因报告发布日之后的情势或其他因素的变更而不再准确或失效。本资料所载意见、评估及预测仅为报告出具日的观点和判断。该等意见、评估及预测无需通知即可随时更改。证券或金融工具的价格或价值走势可能受各种因素影响,过往的表现不应作为日后表现的预示和担保。在不同时期,中金公司可能会发出与本资料所载意见、评估及预测不一致的研究报告。中金公司的销售人员、交易人员以及其他专业人士可能会依据不同假设和标准、采用不同的分析方法而口头或书面发表与本资料意见不一致的市场评论和/或交易观点。

在法律许可的情况下,中金公司可能与本资料中提及公司正在建立或争取建立业务关系或服务关系。因此,订阅者应当考虑到中金公司及/或其相关人员可能存在影响本资料观点客观性的潜在利益冲突。与本资料相关的披露信息请访http://research.cicc.com/disclosure_cn,亦可参见近期已发布的关于相关公司的具体研究报告。

本订阅号是由中金公司研究部建立并维护的官方订阅号。本订阅号中所有资料的版权均为中金公司所有,未经书面许可任何机构和个人不得以任何形式转发、转载、翻版、复制、刊登、发表、修改、仿制或引用本订阅号中的内容。


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/164313
 
216 次点击