Advertisement

【量化金融】利用DCF估值模型实现股票价值监测

阅读量:

一、前言

在对一家上市公司开展基本面分析时,通常可以通过其财务数据进行剖析解读,利用上市公司调研等各种渠道实现进行其内在价值的评价。日常中我们常用的财务评价指标可能包括:

1)市盈率(PE) :每股市价/每股收益;也称利润收益率,是指某支个股的普通股的市价与每股盈利的比率,衡量企业利润的表现。一般说来,PE越高,说明公众对该股票的评价越高。

2)市净率(PB) :股价/每股净资产;衡量目前的股价和公司真实的每股净资产的比率,一般情况下,PB越小,安全边际越高。

3)市销率(PS) :股价/每股收入;适合衡量暂时没有盈利或者盈利实真的企业,如发展期的互联网公司、科技公司等。一般情况下,PS越小说明该公司目前的投资价值越大。

此外,在衡量上市公司价值以及股票价值是否偏离时还有一种更为复杂严谨的模型——现金流折现模型(DCF) ,即将企业未来经营生产的所有现金流折现到今天,计算其市场价格并和股价进行比较判断价格是否偏离,本文将以格力电器(SZ000651) 为例利用Python工具细致开展PE/PS指标追踪与DCF模型搭建。

二、DCF估值模型原理

现金流折现模型(DCF)的构建思路来源于债券,把企业在未来存续期内的所有现金流贴现到今日,得到企业内在价值的估计,其主要包含三个过程

2.1 模型过程

1)测算自由现金流FCFF ,企业自由现金流是DCF模型中被折现的对象,它是指企业产生的、在满足了再投资需求之后剩余的、不影响公司持续发展前提下的、可供企业资本供应者/各种利益要求人(股东、债权人)分配的现金,即基于公司资产每年能够创造出的可用于股东和债权人分配的自由现金。一般计算公式为:

经营现金流 =净利润+财务费用-投资收益-处置固定资产收益+固定资产摊销+计提资产减值准备+应收账款减少+存货减少-应付账款增加+递延所得税

自由现金流 =经营现金流-资本性支出-商誉投资增加

2)计算折现率(WACC) 测算得到自由现金流FCFF后,再根据公司所在行业特点选取合适的折现率对现金流进行贴现,一般选择为加权平均资本成本率(WACC),即按各类资本所占总资本来源的权重加权平均计算公司资本成本的方法。

加权平均资本成本(WACC)= 股权占市场价值比例股权预期收益率+债权占市场价值比例(1-税率)*公司债务成本

3)对现金流进行折现 ,一般假定企业未来现金流增长率为 g, 根据企业生命周期理论,将企业的生命周期分为了可预测阶段与永续价值阶段,按照生命周期的理论,进一步细致分为投入期,成熟期与衰退期,并赋予不同增长率 g1,g2,g3, 将未来的现金流折现到当期得到企业价值。

2.2 数学原理

由于未来每一时刻现金流的精准预测很难实现,而且股票并没有固定的生命周期,因此一般简化模型为不变增长模型、两阶段模型以及三阶段模型,以不变增长模型为例,其自由现金贴现值可以表示为:

其中TV为终值,g为永续增长率,即假定的企业未来现金流增加情况。现实中,每期的现金流是持续流入企业的,但在进行估值计算时,为简化和便于计算,需要假定每期的现金流是在一期当中的某个时点上一次性流入的。惯例上假定每期的现金流是在期中流入,这相当于假设当期现金流是均匀流入,以此来确定折现的期数。

三、基于Python的过程实现

我们选取格力电器(SZ000651) 为例对各指标依次进行分析,在分析前我们首先需要获取各维度股票数据和财务数据,这里我们采用金融量化数据接口**AKShare **开源财经数据接口库进行数据的获取。

复制代码
 import pandas as pd

    
 import datetime
    
 from matplotlib import pyplot as plt
    
 import akshare as ak
    
  
    
  #获取A股全部股票数据 存储到stock_basic.csv
    
 stock_zh=ak.stock_zh_a_spot()
    
 stock_zh.to_csv("stock_basic.csv")

首先获取A股市场总貌,得到A 股上市公司的实时行情数据,接下来在其中筛选出格力电器的数据观察其历史行情数据,这里我们对数据进行了前复权 ,保持当前价格不变,将历史价格进行增减,从而使股价连续,据此我们绘制格力电器股票**“收盘价”、“最高价”** 和**“最低价”** 数据图。

复制代码
 stock_zh.head()

    
 stock_zh[stock_zh["名称"]=="格力电器"]
    
 stock_daily = ak.stock_zh_a_hist(symbol="000651", period="daily", start_date="20200101", end_date='20211104', adjust="qfq")
    
 close_price=stock_daily[["日期","收盘","最高","最低"]]
    
 close_price.set_index("日期",inplace=True)
    
  
    
 close_price.plot()
    
 close_price.head()

接下来,我们获取格力电器的历史PE/PS数据,并绘制数据图更为直观的观察其历史走向;可以看出,格力电器的市盈率在2020年11月至2021年5月间稳定保持在15左右,在2021年9月到2021年11月区间降至9,是一个较好的投资标的。

复制代码
 #获取PE/PS和总市值

    
 geli_df = ak.stock_a_lg_indicator(stock="000651")
    
 geli_df.set_index("trade_date",inplace=True)
    
 geli_pe_ps=geli_df.iloc[0:240,[0,3]]
    
 geli_pe_ps.plot()
    
 geli_df.head()

在完成PE和PS追踪后,我们构建DCF估值模型,对格力电器的内在价值进行分析。为了避免季报、半年报部分数据的细微差异,我们选择获取格力2020年12月31日年报财务摘要和个股概况,宏观了解其2020年会计年度的经营情况。

复制代码
 import numpy as np

    
 import pandas as pd
    
 import matplotlib as plt
    
 import akshare as ak
    
  
    
 #获取个股概况
    
 dateset=["20200331", "20200630", "20200930", "20201231"]
    
 stock_em_yjkb_df = ak.stock_em_yjkb(date="20201231")
    
 geli_sheet=stock_em_yjkb_df[stock_em_yjkb_df['股票代码']=="000651"]
    
 geli_sheet
    
  
    
 #获取财务摘要
    
 stock_em_zcfz_df = ak.stock_em_zcfz(date="20201231")
    
 geli_sheet2=stock_em_zcfz_df[stock_em_zcfz_df["股票代码"]=="000651" ]
    
 geli_sheet2

接下来,我们获取三张主表,即资产负债表、利润表和现金流量表,采用的数据来源为新浪财经,其报表概况如下图

复制代码
 #获取现金流量表

    
 stock_financial_report_sina_df = ak.stock_financial_report_sina(stock="000651", symbol="现金流量表")
    
 geli_sheet1=stock_financial_report_sina_df[stock_financial_report_sina_df["报表日期"]=="20201231"]
    
 geli_sheet1
    
  
    
 #获取利润表
    
 stock_financial_report_sina_lrb = ak.stock_financial_report_sina(stock="000651", symbol="利润表")
    
 geli_sheet2=stock_financial_report_sina_lrb[stock_financial_report_sina_lrb["报表日期"]=="20201231"]
    
 geli_sheet2
    
  
    
 #获取20201231资产负债表
    
 stock_financial_report_sina_lrb = ak.stock_financial_report_sina(stock="000651", symbol="资产负债表")
    
 geli_sheet3=stock_financial_report_sina_lrb[stock_financial_report_sina_lrb["报表日期"]=="20201231"]
    
 geli_sheet3
    
 #获取20191231资产负债表
    
 stock_financial_report_sina_lrb = ak.stock_financial_report_sina(stock="000651", symbol="资产负债表")
    
 geli_sheet4=stock_financial_report_sina_lrb[stock_financial_report_sina_lrb["报表日期"]=="20191231"]
    
 geli_sheet4

利用财务报表数据,我们抓取必要会计科目数据计算WACC、实际所得税率、当年自由现金流FCF等指标状况;其中股本资本成本率=无风险收益率+BETA系数× 市场风险溢价,而BETA系数一般是由往年数据回归所得,这里采用9%作为股本资本成本率Ke。

复制代码
 ###经营现金流=净利润+财务费用-投资收益-处置固定资产收益+固定资产摊销+计提资产减值准备+应收账款减少+存货减少-应付账款增加+递延所得税

    
 ##自由现金流=经营现金流-资本性支出-商誉投资增加
    
 ##债务资本成本率=(利息费用+应付利息)/债务资本
    
  
    
  
    
 #自由现金流
    
 FCF=float(geli_sheet1["经营活动产生的现金流量净额"])-float(geli_sheet1["固定资产折旧、油气资产折耗、生产性物资折旧"])-float(geli_sheet1["无形资产摊销"])-float(geli_sheet1["长期待摊费用摊销"])-float(geli_sheet1["处置固定资产、无形资产和其他长期资产的损失"])
    
  
    
 #实际所得税税率
    
 E_Tax=1-(float(geli_sheet2["四、利润总额"])-float(geli_sheet2["减:所得税费用"]))/float(geli_sheet2["四、利润总额"])
    
  
    
 #资本成本和股本成本
    
 Kd=(float(geli_sheet2["财务费用"])+float(geli_sheet2["汇兑收益"]))/((float(geli_sheet3["负债合计"])+float(geli_sheet4["负债合计"]))/2)
    
 #Kd=(float(geli_sheet2["财务费用"])+float(geli_sheet2["汇兑收益"]))/float(geli_sheet3["负债合计"])
    
 Ke=0.09 #股本成本设定为9%
    
  
    
 #债务占比
    
 Pd=float(geli_sheet3["负债合计"])/float(geli_sheet3["负债和所有者权益(或股东权益)总计"])
    
  
    
 #少数股东权益占比
    
 Me=float(geli_sheet3["少数股东权益"])/float(geli_sheet3["所有者权益(或股东权益)合计"])
    
  
    
 #WACC计算
    
 WACC=Kd*Pd*(1-E_Tax)+Ke*(1-Pd)

在获得WACC后,我们对终值进行测算。考虑到企业经营周期情况,我们选择三阶段模型进行测算(在估值格力时三阶段模型其实并不稳妥 ,因为格力已经进入成熟期或平台期,其现金流增长率不会有显著的改变进步,三阶段模型更适合应用于初创企业等)

复制代码
 #折现因子计算:以三阶段为例

    
 g1,g2,g3=0.3,0.15,0.02 #三阶段增长率
    
 t1,t2=np.arange(1,6), np.arange(1,6) #增长期t1 五年 发展期t2 5年
    
 EV_sum1, EV_sum2 = 0, 0
    
 for _ in t1:
    
     EV1 = FCF * ((1+g1) ** _) #未来经营情况预测
    
     EV =  EV1 / ((1+WACC) ** _)
    
     EV_sum1 = EV + EV_sum1
    
  
    
 for _ in t2:
    
     EV = EV1 * ((1+g2) ** _) / ((1+WACC) ** (_+t1[-1]))
    
     EV_sum2 = EV + EV_sum2
    
     
    
 PDV = (EV1 * ((1+g2) ** t2[-1]) * (1+g3)) / ((WACC-g3)*((1+WACC)**(t1[-1]+t2[-1]))) + EV_sum1 + EV_sum2
    
 PDV_adj =PDV* (1 - Me) #进行股东权益调整

最后,我们计算格力的总股数情况,并进行股票内在价值的估计,结果表明当前格力股票价格与DCF估值模型测算价格相近,并没有偏离其实际内在价值。

复制代码
 #总股数

    
 total_mv=geli_df.loc["2020-12-31","total_mv"]*10**4
    
 close=close_price.loc["2020-12-31","收盘"]
    
 Shares=total_mv/close
    
  
    
 Value = PDV_adj / Shares
    
 print('归属于上市公司股东的价值:',PDV_adj, '\n', '内在价值:', Value)

进一步的应用过程中,我们应该对模型的折现率以及永续增长率进行更为审慎的判断,因为在不同的情况下,我们采用各种估值状态时所隐含的安全或风险程度也是大不相同的,因此我们要进行更为深入的敏感度分析,进而选择更为安全的策略投资。
DCF模型敏感度分析(图:Barrons的博客)

参考文献

[1]郭永清.财务报表分析与股票估值.[D]:机械工业出版社

[2]《一文了解DCF模型核心逻辑》

[3]《【编程】DCF自由现金流贴现模型——基于python的实现》

全部评论 (0)

还没有任何评论哟~