来源:中金固定收益研究
作者
杨 冰分析员,SAC执业证书编号:S0080515120002;SFC CE Ref: BOM868
程昱分析员,SAC执业证书编号:S0080517070005;SFC CE Ref:BON965
陈健恒分析员,SAC执业证书编号:S0080511030011;SFC CE Ref: BBM220
或许市场不够重视,但这可能也是隐藏价值的一个角落。配售和定增基金往往会持有一些流通受限的股票,而这些股票估值的方法在2017年经历了一次比较大的变化——根据《证券投资基金投资流通受限股票估值指引(试行)》,限售股适用AAP估值法(亚式看跌期权),取代此前近似摊余成本的方法。目前,主要是定增基金和配售基金涉及比较多这类问题。实事求是地说,即使在以前的简易算法下,虽然公式简单,但数据处理存在一定难度,投资者对于当时(比如2016年)定增基金的净值也存在一定疑虑。而现在公式更为复杂了,对投资者来说黑箱化的程度也自然更高了。在以前的模式下,限售股(比如定增得来的股份)的估值为:V= min(当前价,成本价+ (当前价 - 成本价)* 已持有的时间 / 总锁定期),或者表示如下图。
而新的AAP模型估值法下,估值 = 市场价* (1 -折扣系数),折扣系数为按照亚式看跌期权计算出的期权价值(LoMD)。公式如下:
可以看出,想比之前近似摊余成本法的计算模式,这里复杂程度还是要高出不少的。其中,σ为该股票波动率,q为分红率,T为以年为单位的锁定时间,其他均为字面意思。实际上,上面公式在实现时基本没有难度,更多的难点在于数据的处理。
下面,我们来一步一步拆解这个LoMD。首先自然需要引入一些常见库:
import readSql as rs
import pandas as pd
from scipy import stats
from WindPy import w
import datetime as dt
其中的readSql为我们惯用的自编库,在此前的转债报告中也曾出现过,但为了不产生太多歧义,我们只用其中的几个函数即str2yyyymmdd、yyyymmdd2str:在日期的两种字符串之间互相转换,例如“2019/1/18”转成“20190118”及其逆运算。
下面我们先展示最后的主函数,然后逐个击破涉及到的中间函数。整个主函数如下所示。第一个参数dfHeld为pandas下的DataFrame型,其中保存的是基金所持限售股的信息(参考年报、半年报以及基金临时公告整理),示例格式如下图。而后面的start和end分别为计算期的起止时间,我们最后返回了在这个期间内,一组限售股的折扣系数,形式同样是DataFrame。
defdiscRatioTable(dfHeld, start,end):
'''输入限售股table,输出这些券对应的LoMD
start: 计算首日,yyyy/mm/dd
end: 计算终日, yyyy/mm/dd'''
# 先计算这些股票的vol
lstStocks = list(dfHeld.index)
nDaysBefore, flag = backToTime(start, list(dfHeld[u'可流通日期'].apply(rs.yyyymmdd2str)))
if flag:
dfAdjClose = priceData(lstStocks, nDaysBefore, end)
dfLogPct = logPctData(dfAdjClose)
dfLogPct.to_clipboard()
else:
print u'没有限售股,不必算了'
return None
dfVol