新浪财经

【中金固收·可转债】等的就是调整,兼论估值观测方法 20201227

中金固定收益研究

关注

市场回顾及展望

 转债市场策略展望  

几乎每一次估值调整,都伴随着所谓错杀机会但在此之前,我们要先能够明确地描述调整的幅度、结构、次序。也已经有投资者表示,在如今300余支个券的市场里,看清估值变化已经是越来越难的事情——不妨,我们在此结合近期行情,简单分享一部分我们日常观察估值变化的一些工具,然后给出我们的建议。

相对而言最容易描述的是估值变动的幅度。我们在此前的报告中已经多次用过“百元溢价率”这一指标,即百元平价品种对应的溢价率水平。实际上作用类似(纵向可比性强且不必大批量地剔除样本)的还包括隐含波动率。在早期的报告中我们曾介绍过百元溢价率的基本逻辑:首先拟合平价-溢价率曲线,得到方程f(x),其中x为平价,然后再将x=100代入。仍然沿用这个指标可以看到百元溢价率已经从月初的16.5%附近降至13.5%附近,其中小品种下滑幅度更高,而大品种似乎伴随着更大的分化。暂不谈分化,均值来讲,无论大、小盘品种,转债市场估值比201912月初高1%,相比20196月中旬高5%附近——市场相比更为绝对意义上的安全有一段距离,但相比于这轮行情的起点已经相差无几

分化程度则只是一个副产品,我们直接引用的场合也相对较少。不过,当下确实处于历史级别的分化——如果有投资者愿意拿当下市场的分化度与2018年下半年相比,那么现在的分化程度已经高过当时。我们无法从中得到更多结论,但不难理解的是,这应当是出自机构行为。

当然,前述结论都源自对转债个券截面数据的回归。实现起来很容易,对算力的依赖也比印象中更低,程序逻辑如下。难度较低,在此不赘述。

# 程序逻辑:平价、溢价率曲线拟合

defdropWird(obj, date):

'''用来算估值的合理样本'''

    codes = selByAmt(obj, date, {'ConvV':[50,150],'Ptm':[2, 6]})

    t = obj.DB['Amt'].loc[date, codes] < \

    (obj.DB['Outstanding'].loc[date, codes] * obj.DB['Close'].loc[date, codes] / 100.0)

    t *= ~((obj.DB['Close'].loc[date, codes] > 130) * (obj.DB['ConvPrem'].loc[date, codes] > 30))

return list(t[t].index)

defregressionCBVal(obj, date, codes=None):

'''输出三个变量:拟合系数(c + bx + a/x),百元溢价率以及拟合优度'''

ifnot codes:

        codes = selByAmt(obj, date)

if len(codes) >= 5:

        dfL = pd.DataFrame(index=codes)

        dfL['ones'] = 1.0

for field in ('ConvV','ConvPrem'):

            dfL[field] = obj.DB[field].loc[date, codes]

        dfL.dropna(inplace=True)

        dfL['x'] = dfL['ConvV'] / 100.0

        dfL['1_x'] = dfL['x'].apply(lambda x: 1.0/x)

        lr = LinearRegression(fit_intercept=False)

        lr.fit(dfL.loc[:,['ones','x','1_x']], dfL.loc[:,'ConvPrem'])

return list(lr.coef_), sum(lr.coef_), lr.score(dfL.loc[:,['ones','x','1_x']],dfL.loc[:,'ConvPrem'])

else:

printu'样本不足'

returnNone,None,None

有时我们还希望看到估值变化的结构和次序。原理上并不难,但难在如何直观地显示出来。这里,我们的做法是:

1、先拟合一个曲线(如前述,例如f(x) = a + bx + c/x,下称曲线C0),然后计算转债个券溢价率与曲线C0的距离(h1,即垂直高度,溢价率– f(x)),并以此来区分转债估值的相对高低(第二步要用到这个数);

2、按照估值和平价,将每个时间点的转债按照低、中、高估值,以及平价低、中、高分为9组(即3x3)。随后,我们要去处理得到这9组个券,在时间TT+1的估值变化幅度(注意此时我们已经有h1数据);

3、在T+1时间,利用此时的平价、溢价率数据,计算每只个券与曲线C0之间的距离(下称h2,注意用来计算距离的曲线仍然是C0,不是新计算的曲线)。那么对于每组个券,h2-h1即为这段时间该组转债估值上升或下滑的幅度。

下图的前两个函数为计算估值提升或压缩的幅度,后面三个则是对所涉及的个券进行分组,例如“23”意味着中等估值、高平价。

# 溢价率拉升或压缩的计量

defdistanceWithFx(obj, date, c=None,codes=None):

'''计算距离(溢价率相距曲线f(x) ),c为曲线参数'''

if codes isNone:

        codes = dropWird(obj,date)

if c isNone:

        c, _ , _ = regressionCBVal(obj, date, codes)

    srsRet = pd.Series(index=codes)

    srsConv = obj.DB["ConvV"].loc[date, codes] / 100.0

    srsRet = obj.DB['ConvPrem'].loc[date, codes] - c[0] - c[1] * srsConv - c[2] / srsConv

return srsRet

defdistanceMoving(obj, date1, date2, c=None, codes=None):

'''d1至d2的估值调整幅度 '''

if codes isNone:

        codes = dropWird(obj,date1)

        codes = list(set(codes).intersection(dropWird(obj, date2)))

if c isNone:

        c, _, _ = regressionCBVal(obj, date1, codes)

return distanceWithFx(obj, date2, c, codes) - distanceWithFx(obj, date1, c, codes)

defdistanceGroup(srsDis):

'''估值分组'''

return (3 * srsDis.rank(pct=True)).apply(pd.np.ceil).apply(lambda x: str(int(x)))

defconvGroup(srsDis, obj, date):

'''平价分组'''

    codes = srsDis.index

return (3*obj.DB['ConvV'].loc[date, codes].rank(pct=True)).apply(pd.np.ceil).apply(lambda x: str(int(x)))

deftheNineGroup(srsDis, obj, date):

'''为得到一个9分组的标签'''

    srsRet = pd.Series(index=srsDis.index)

return distanceGroup(srsDis) + convGroup(srsDis, obj, date)

# 前述函数的具体应用:得到分组估值变化的表格

cols = ['11','12','13','21','22','23','31','32','33']

dfRet = pd.DataFrame(index=list(dfWhole.index)[:-1], columns=cols)

for d1, d2 in zip(list(dfWhole.index)[:-1], list(dfWhole.index)[1:]):

    srsDis = distanceWithFx(obj, d1)

    df = pd.DataFrame(index=srsDis.index)

    df['dis'] = srsDis

    df['grp'] = theNineGroup(srsDis, obj, d1)

    df['mv'] = distanceMoving(obj, d1, d2)

    dfRet.loc[d2] = df.pivot_table(values='mv',index='grp')['mv']

dfRet.columns = ["低估值债性","低估值平衡","低估值股性",

"中估值债性","中估值平衡","中估值股性",

"高估值债性","高估值平衡","高估值股性"]

如前所述,难度在于表达形式,我们一般利用可交互的热力图来观察。下图越偏冷色调,转债估值越处于压缩的状态,反之则为拉升状态。近三年的情况如下图所示:

当然,这只是一个概览式的图表,一些筛选后我们更容易看清楚当下市场发生了什么。比如,我们暂且屏蔽所有在21日个交易日内估值下滑不超过3%的样本点。

能看到的几个结论:

1、自然高估值组比低估值组容易出现大幅的估值调整,这也是为何投资者会发现高溢价买下的“正股是好股票”的转债,最终表现甚至很难跑赢指数——当然,它们普遍来讲波动会低一些;

2、即便是低估值组里,债性品种也相对更加不可靠,同理自然适用于中等估值组。而上图如果我们保留暖色,投资者还会看到,债性品种的估值反弹能力普遍也颇为有限。因此,即便历史上估值大幅调整的时刻,我们一般也不推荐债性品种——当然,这个问题主要出在正股上

3、即便估值调整中,中低估值的股性品种也会被拖累,但一来它们的调整很短暂,二来它们的反弹能力也更强。此外,我们会将中等估值股性品种组作为一个重要的观察窗口,它们也开始受连累出现估值较快压缩时,则提示我们调整接近尾声——原理接近于股市上的“强势股补跌”当前没有这个信号,但看更具体的数值来说,差别也并不大。

此外,我们也在意转债估值的“分化机制”。例如类似下图的树状模型投资者可能已经看到我们用过多次,该图即转债估值决策树。当然这个模型上显示出的很多数据都是统计学习上的参数,投资者不必全部理解,但我们能从中看到,什么因素对转债估值产生影响。这里需要提示投资者的是:

1、以往的第一大决策因素是“转债上市时间”(也就是转债新旧的差异很大),但现在是对数流通市值,80亿元市值以内的公司很难得到高估值——最近的新券实际上估值已经够低,但这仍无法让上市时间超过市值成为第一大影响因子;

2、股权质押比例已经逐渐成为第二重要的指标——所有代表信用等级、资质的指标都未能进入这个决策树,相比之下市场开始更在意这个更加实际风险;

3、平价仍有区分度,即债性品种的估值要更高一些;

4、市场开始在意波动率。

这颗树的生成并不难,此前我们在研究分级A市场时曾手动构建了决策树,但如今sklearn库已经较为完善,我们在做好数据后直接调用即可。而在生成如上的图像时,我们利用graviz。以下是程序,投资者应注意的是其中的一些参数。(而dfFactor为一个dataframe变量,index为转债代码,columns为转债涉及的一些常用因子,如平价、规模、期限、正股市值、动量、波动率、分析师预期等等)

# 决策树生成的实现

from sklearn import tree

import graphviz

lstName = ["LOW","HIGH"]

lstFeature = ['VAL_LNFLOATMV','VAL_PEINDU_SW','VAL_PBINDU_SW','RISK_RESIDVOL252',

'ANNUALSTDEVR_24M','TECH_REVS60','TECH_REVS120','TECH_REVS250',

'ConvV','Ptm','SHARE_FROZEN','COMMEND']

clf = tree.DecisionTreeClassifier(max_depth=4, min_samples_leaf=15)

clf.fit(dfFactor[lstFeature].values, dfFactor['Grp'].values)

dot = tree.export_graphviz(clf, feature_names=lstFeature,

                           class_names=lstName,

                           filled=True, rounded=True, special_characters=True)

gr = graphviz.Source(dot.decode('utf-8'))

gr.view()

我们的结论:总地来说,我们认为虽然当下并没有看到标准的“估值调整完结”的信号,但可能已经很接近,我们建议积极地对待市场,此处应为机会。但我们仍看好债性品种(无论估值档次),以往的经验看中等估值的平衡、股性品种,以及低估值的股性品种是此时重点关注对象。

当然投资者应该已经注意到市场比过去2年都更加“讲品质”,我们在年度展望以及前周周报中都有强调,尤其前周报告中有介绍刻画指标,建议参考。

 一周市场回顾

转债/公募EB一级市场跟踪  

本周新公告了两个转债预案,为宏发股份(20亿元)与江丰电子(5.2亿元);证监会及交易所共受理两个转债预案,分别为中际旭创(30亿元)与晶科科技(30亿元);万兴科技(3.79亿元)与震安科技(2.85亿元)过会;利民股份(9.8亿元)、彤程新材(8亿元)、伯特利(9.02亿元)、星源材质(10亿元)以及弘亚数控(6亿元)拿到核准批文。目前已核准发行个券33只,合计金额986.74亿元。已过会未核准个券12只,合计金额99.58亿元。

 私募EB信息追踪 

本周新受理顾家集团私募EB申请,正股为顾家家居,拟发行规模25亿元,主承为中信证券。天壕投资集团有限公司EB(3亿元)获反馈,山东鲁信投资EB(30亿元)获通过。

报告原文请见2020年12月25日中金固定收益研究发表的研究报告

加载中...