ddm模型公式_【PyCFA】 QM No.2 DCF 股利贴现模型及实证分析

d4ce27515c8f2d3a16435407658e4090.png

Discounted Cash Flow Application

bfe6e986c83ca7b3dc4117784d657f0b.png

当知道了时间价值的作用后,投资者便会考量若持有某金融资产,未来会产生多少时间价值,为自己的投资做出科学判断。本期笔者来给大家简单介绍DiscountedCashApplication以及股利贴现模型(DDM)python实证。

01

NPV&IRR

NPV(net present value净现值)指未来资金(现金)流入(收入)现值与未来资金(现金)流出(支出)现值的差额。CF指的是每一阶段的现金流(注:CF0是指耗费的成本,是负数,后面的CF表示每段时期带来的收益,r(discount rate)折现率)。

NPV是公司评判项目价值的重要指标,投资者会关注在这个项目上的投入能否换得更多的超额收益,也是最为实际的收益。(NPV在CFA企业理财中会有着重阐述)

NPV method:(1)Accept it if NPV>0(如果你有一个project)

(2)Choose the one with higher NPV(如果你有多个project)

5c5d1aba3ee26adeecbbe58024581cd6.png

IRR(Internal Rate of Return)内部收益率是资金流入现值总额与资金流出现值总额相等、净现值等于零时的折现率。简而言之令上式=0,算出的r值就是内部收益率。内部收益率的实质简单来说就是未来的收益的贴现率。

IRR method:(1) Accept it if IRR>r(要求回报率)(同上)

(2)choose the one with higher IRR(同上)

aed2615de1ebb2ee3a0f25fed75042b2.png

PS:当NPV methods和IRR methods出现冲突的时候,因为NPV法较IRR法更实际,所以我们以NPV法则(2)为准。

代码实现:(设收益CF为具有稳定增长率g的量,e.g. CF2=CF1(1+g))

def NPV(CF0,CF1,g,r,n):
#     CF0:耗费的成本
#     CF1:第一期带来的收益
#     g:股利分红的增长率
#     r:折现率
#     n:期数
    total=CF0
    for i in range(1,n+1):
        total=total+CF1*(1+g)**n/(1+r)**(n+1)
    return total

02

HPR&rBD&HPY&rMM&EAY&EAR

HPR(Holding Period Return持有期回报率)是指在一段时间内持有金融资产的真实收益率,计算公式为持有期股票或债券价值与起初价值的比值。

注:(1)HPR非年化收益率(2)在CFA中HPR和HPY(HoldingPeriodYield)是一样的,Y和R表示同一个意思。

93cbc3fd0aed5f662f23d2990ef683bd.png

rBD&HPY&rMM&EAY&EAR(都是年化指标)

t:持有期

F:面值

rBD:(banking discount rate)表示折扣率(年化)e.g.零息债券面值为折价发行为P,债券到期获取F,那么持有期的折扣率F-P/F,再对其进行年化之后就得到rBD

rMM:(money market yield)按照单利进行计算,持有期收益率HPY的年化

EAY:(effective annual yield)按照复利进行计算,持有期收益率HPY的年化

BEY:(bond quivalent yield)一年计息两次债券的名义利率

下图最后一个公式EAR实质上是算出了此债券的实际年利率

bbaadb642b03a09ae35a216d851e39f5.png

03

TWRR&MWRR

TWRR:几何平均收益率(若N以年为单位),知道计息的年数以及每年的持有期收益率即可求得TWRR。

e78677dc36e046aec3eabd842c8c4d4b.png

注:若N表示一年内计息的次数,则不需要开根号。

MWRR:IRR,本质是以资金作为权重的加权平均收益率,计算内部收益率得到的值即为MWRR的值。

45ab20f3fcd6419d57b78cb3950eb935.png

04

股利贴现模型简易实证

股利贴现模型(Dividend Discount Model)简称DDM模型,属于现金流折现模型(DCF),DDM以适当的贴现率将股票未来预计将派发的股息折算为现值,以评估股票的价值。

参数:D1,D2,D3为预计未来的股利

            k为每年的贴现率

            V0为股票的内在价值

75016fab73d2b61bdc82ea0f21582cc8.png

假设股利稳定增长,增长率为g

a2929eabf77834b3ef5e71dc4565ffd9.png

若k>g,则计算结果为

4c33452b79f020fe330098ec38f4be1c.png

python代码简易实现

process

根据公式,要计算出个股的内在价值,要获得D1(第一期的股利分红)k(个股的期望收益率)g(股利稳定增长的速率)

1.由于下文中选取的股票的时间与历史分红呈现一定的线性关系,我们选用线性回归来拟合数据建立预测方程,由此我们可以大概预测出D1(从绘制的两者关系图中可以看出其存在一定的线性关系)。由历史分红数据我们也可以简单计算出分红稳定增长时的分红增长率g。

2.以中证1000指数代表大盘,然后选取example_stock,用此两者的年收益率数据进行线性回归拟合线性方程(CAPM资本资产定价模型)Ri=Rf+β(Rm-Rf)简单地说就是假设个股收益率与市场收益率存在线性关系。

3.输入平均Rm计算出k,输入年份计算出D1,最后将数据带入股利贴现公式进行计算,计算出大致股价。

step1:确定时间与历史分红的预测方程。

import numpy as np
import pandas as pd#导入相关数据分析包
import tushare as ts
bonus_data=pd.read_excel(r'C:\Users\DELL\Desktop\股票历史分红数据.xlsx')#通过搜索引擎找到想要进行估值的股票的历史分红数据,然后通过pandas导入excel文件
bonus_data
3e2a6fc0f5bebf9e1c78df4b05468d06.png

简单作图,我们来看一看两者的关系。

import matplotlib.pyplot as plt 
from pylab import mpl
mpl.rcParams["font.sans-serif"]={"SimHei"}
bonus_index=bonus_data.loc[0:12,['财政年度']]#截取财政年度那一列的时间序列
bonus=bonus_data.loc[0:12,['派息额(人民币/股)']]#截取分红数据
list1=bonus_index.values.tolist()
list2=bonus.values.tolist()
plt.plot(list1,list2,"r-",lw=2.0)
plt.xlabel("财政年度",fontsize=13)
plt.ylabel("分红数据", fontsize=13)
plt.show()
4dfb412c4ea0af69a79ac6ea6bd2160c.png

由图可知选取的股票的时间与历史分红呈现一定的线性关系,所以我们选用线性回归来拟合数据建立预测方程。为了拟合方程我们要用到statsmodels模块。

statsmodels模块:statsmodels是统计建模分析的核心工具包,其包括了几乎所有常见的各种回归模型、非参数模型和估计、时间序列分析和建模以及空间面板模型等

import statsmodels.api as sm#导入statsmodels模块
bonus_index_addcons=sm.add_constant(bonus_index)#对自变量的样本值增加一列常数项
model=sm.OLS(endog=bonus.iloc[:,0],exog=bonus_index_addcons)#构建普通最小二乘法的线性回归模型
result=model.fit()#生成一个线性回归的结果对象
result.params#将得到的线性方程的截距项和斜率值
9862909ec3d2b6635143b1d953ab3b9e.png

线性方程为y=0.069670x-139.672857说明每过一年该股票的股利分红会大约会增加0.069元/股。

那么接下来我们就要来看一看这两者的线性拟合程度怎么样,这就要涉及到R方这个指标。

R方(R-squared)是线性回归结果的确定性系数,值在0-1的范围之间,这个模型的误差越小,R方越高越接近1,说明模型拟合程度越高。

调用summary方法帮助我们可以打印出一份关于本次回归的报告,其中就包括R方

result.summary()
781458e19d2336f327730a6faf434f8d.png

第一行第二个指标R方为0.930,说明模型的拟合程度较高。

step2:确定example_stock的个股收益率与市场收益率的线性方程

首先获取数据个股数据

pro=ts.pro_api("个人tushare token")#导入pro这个接口以获取更见详细,时间跨度更长的股票信息
example_stock=pro.daily(ts_code="600036.SH",start_date="20100101",end_date="20200102")#获取十年以来600036这只股票的数据
example_stock
f5472041155fb668ea9f9f29649f1d2d.png

然后获取选取的个股年涨跌幅数据

total= []#以下过程是为了大致获得这只股票十年以来年初年末的数据以便大致求得其年收益率,方法不止一种,仅供参考。

for i in range(10):
    stock=list(example_stock.iloc[242*i,:])
    total.append(stock)
total.append(list(example_stock.iloc[2410,:]))
result1=pd.DataFrame(total)
result2=result1.iloc[:,6]#截取其收盘价
example=np.log(result2.shift(1)/result2)#计算对数收益率
R_col=pd.DataFrame(example.dropna())
R_col.columns=[u"个股涨跌幅"]

获取中证1000指数的涨跌幅数据

data=pd.read_excel(r"C:\Users\DELL\Desktop\000852.xlsx")
R_index=pd.DataFrame(data.iloc[:,1])
R_index.index=list(np.arange(1,11))
R_index.columns=[u"中证1000涨跌幅"]

将两组数据进行线性回归

import statsmodels.api as sm#再进行一次线性拟合
R_index_addcons=sm.add_constant(R_index)
model=sm.OLS(endog=R_col,exog=R_index_addcons)
result_R=model.fit()
result_R.params
016215a56c1e05ab8423cb76c93725fa.png

y=0.675954x-0.06645,说明若大盘收益每增加1%,这只个股的收益大约会增加0.675954%即CAPM模型中的敏感性系数β=0.675954

step3:建模计算

经过对example_stock的历史分红增长率数据取平均值(考虑稳定增长的年份),g=0.066。用中证1000近十年的涨跌幅取均值,得到市场收益率Rmmean=0.103。CAPM模型中的无风险利率Rf用历史一年期国债利率数据的加权平均值替代 Rf=0.0427

def DDM(year,g,Rmmean):
    D1=result.params[1]*year+result.params[0]#result.params[1]可以调用出斜率数据,result.params[0]可以调用出截距
    k=0.0427+result_R.params[1]*(Rmmean-0.0427)#CAPM模型Ri=Rf+β*(Rm-Rf)
    V0=D1/(k-g)
    return V0DDM(2021,0.066,0.103)
ec299b39a9923f7f1ca1d384d2f50240.png

2020年初这只股票的实际股价大约为38-39。从结果来看,可以大致判断这可能是一只被低估的股票。

本期的小分享就到这里,希望能和大家多多交流~

本期数据文件可以在NAU Analysts公众号后台输入笔者的名字获取。

PyCFA QM负责人:郑志远 南京审计大学2018级CFA1班 邮箱:1040077852@qq.com 公众号: Start of somethingnew

47f60897ccdf1fd5281f24ce0d16346f.png

相关资源:企业估值DCF模型
表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页