本文使用DCF(Discounted Cash Flow)自由现金流折现法评估股票的当前价值。
我们选择贵州茅台(600519)来开展实验。
1.首先,我们获取2019、2020、2021茅台年报的财务报表,如何通过Python获取上市的财务报表可以参考《使用Python获取股票的报表数据》,从现金流表中获得经营活动产生的现金流量净额和投资活动现金流出两个财务指标,从网上查询获取股票的总股本,如下图所示。
year = [2019, 2020, 2021, 2022, 2023, 2024]
netCashFlow = [45210612632.56, 51669068693.03, 64028676147.37] # 经营活动产生的现金流量净额
investingCashOutflow = [3173044893.65, 2127304901.08, 5581832561.94] # 投资活动现金流量输出
totalShareCapital = 12.56 # 总股本
2.然后,计算自由现金流。自由现金流通常包括三种计算方式(自由现金流的三种计算方法),我们选择最简单那种:自由现金流 = 经营活动产生的现金流量净额 - 投资活动现金流出
# 已知三年的现金流
freeCashFlow = []
for i in range(0, 3):
freeCashFlow.append(netCashFlow[i] - investingCashOutflow[i])
3.接着,存在两个需要手动调整的参数:一个是折现率,一个是未来自由现金流增长率。折现率一般是10%,自由现金流增长率得看具体企业情况。实际上,我们可以算出前三年茅台的自由现金流增长率是17%左右,但是不能确保未来企业也能按照这个增长率增长,所以需要假设一个数,保守估计8%。
discountRate = 0.1 # 折现率
growthRate_ = 0.08 # 假设后三年的增长率
4.其次,根据自由现金流增长率,计算未来每年的自由现金流值和自由现金流折现值。
# 预估后三年的现金流
for i in range(3, 6):
freeCashFlow.append(freeCashFlow[i - 1] * (1 + growthRate_))
# 每年的折现现金流
discountCashFlow = []
for i in range(0, 6):
discountCashFlow.append(freeCashFlow[i] / math.pow((1 + discountRate), i + 1))
5.计算折现现金流总和
# 六年折现现金流总和
discountCashFlowSum = 0
for i in range(0, 6):
discountCashFlowSum += discountCashFlow[i]
6.计算永续价值折现值
# 永续价值折现值
discountPerpetualValue = (freeCashFlow[5] * (1 + growthRate_) / (discountRate - growthRate_)) / math.pow(1 + discountRate, 6)
7.计算所有者权益
# 所有者权益
OwnersEquity = discountCashFlowSum + discountPerpetualValue
8.最后,使用所有者权益除以总股本,得到当前股票应该具备的价格。
# 每股价值
value = OwnersEquity / 100000000 / totalShareCapital
print(value)
=========================================================
通过以上八个步骤,我们得出了600519的DCF评估值为1985.922295346798。那也就意味着,如果茅台今年年报还能以8%的增长率继续冲,那以目前1773.66的价格,茅台还能涨...
=========================================================
本次实验有很多不严谨的地方:
a) 代码计算公式直接参考自由现金流折现法,还没有验证准确性;
b) DCF评估模型通常需要预测更长的年限,本次实验只用了三年;
c) DCF评估模型对企业的选择也有讲究,需要选择能稳定增长的行业如电信、水利之类的,如科技这些受到行业发展周期影响的行业,不适合DCF模型;(不过茅台还好)
d) 折现率和未来自由现金流增长率,两个参数的调整对结果影响很大;
实验结束,谢谢观看。请各位专家批评指正!
附上完整代码
import math
if __name__ == '__main__':
year = [2019, 2020, 2021, 2022, 2023, 2024]
netCashFlow = [45210612632.56, 51669068693.03, 64028676147.37] # 经营活动产生的现金流量净额
investingCashOutflow = [3173044893.65, 2127304901.08, 5581832561.94] # 投资活动现金流量输出
totalShareCapital = 12.56 # 总股本
discountRate = 0.1 # 折现率
growthRate_ = 0.08 # 假设后三年的增长率
# 已知三年的现金流
freeCashFlow = []
for i in range(0, 3):
freeCashFlow.append(netCashFlow[i] - investingCashOutflow[i])
# 预估后三年的现金流
for i in range(3, 6):
freeCashFlow.append(freeCashFlow[i - 1] * (1 + growthRate_))
# 每年的折现现金流
discountCashFlow = []
for i in range(0, 6):
discountCashFlow.append(freeCashFlow[i] / math.pow((1 + discountRate), i + 1))
# 六年折现现金流总和
discountCashFlowSum = 0
for i in range(0, 6):
discountCashFlowSum += discountCashFlow[i]
# 永续价值折现值
discountPerpetualValue = (freeCashFlow[5] * (1 + growthRate_) / (discountRate - growthRate_)) / math.pow(1 + discountRate, 6)
# 所有者权益
OwnersEquity = discountCashFlowSum + discountPerpetualValue
# 每股价值
value = OwnersEquity / 100000000 / totalShareCapital
print(value)