发布时间:2022-12-18 21:04:38 文章来源:互联网
微博 微信 QQ空间

自由现金流模型-Python实现

自由现金流模型-Python实现

如何估算一家公司或一只股票的内在价值,一直是投资中的核心问题。针对这个问题,我们在《股票如何估值-知乎》一文中重点介绍了“自由现金流折现法”,这也是格雷厄姆、巴菲特等价值投资从业者最推荐的估值方法。但是,上市公司有几万家,要一一核对他们的财报,用这种方法来估价,是非常费力的。本文介绍如何使用Python实现自由现金流贴现法对股票进行估值。

自由现金流模型

让我们简要回顾一下自由现金流模型。

自由现金流量:是企业在满足再投资需要后产生的剩余现金流量。这部分现金流量是在不影响公司可持续发展的情况下,可以分配给股东的最大现金数额。

简单地说,自由现金流量(FCF)等于经营活动产生的现金流量与资本支出(Capital Expenditures,CE)之差。即:FCF=OCF-CE。

自由现金流量折现法:企业的价值是企业未来能最大程度地向股东分配多少现金。另外,未来的现金不如现在的现金,所以需要一定的折扣。

资本支出

自由现金流的计算公式为:FCF=OCF-CE,其中企业的经营现金流(OCF)一般可以直接在财务报告的现金流量表中查到,但资本支出(CE)需要自己核对汇总,很难准确计算。

资本支出(CE)是指企业为持续发展而购置固定资产、无形资产等所发生的费用。此类支出通常可以资本化,并且资产的使用寿命跨越多个会计期间。为简单起见,通常考虑以下三类主要支出:

查询企业现金流

我们通过baostock的query_cash_flow_data接口获取季报中的经营现金流与利润的比例,然后通过query_profit_data接口获取季报中的利润数据,将两者相乘得到经营现金流。此外,第四季度一般记录的是整个会计年度的数据,因此可以用来计算全年的经营现金流。

import baostock as bs
import pandas as pd
# 登陆系统
lg = bs.login()
# 显示登陆返回信息
print('login respond error_code:'+lg.error_code)
print('login respond  error_msg:'+lg.error_msg)
def query_anual_cf(stock_code, year, qt=4):
    cash_flow_list = []
    rs_cash_flow = bs.query_cash_flow_data(code=stock_code, year=year, quarter=qt)
    while (rs_cash_flow.error_code == '0') & rs_cash_flow.next():
        cash_flow_list.append(rs_cash_flow.get_row_data())
    result_cash_flow = pd.DataFrame(cash_flow_list, columns=rs_cash_flow.fields)
    profit_list = []
    rs_profit = bs.query_profit_data(code=stock_code, year=year, quarter=qt)
    while (rs_profit.error_code == '0') & rs_profit.next():
        profit_list.append(rs_profit.get_row_data())
    result_profit = pd.DataFrame(profit_list, columns=rs_profit.fields)
    result = float(result_cash_flow["CFOToNP"]) * float(result_profit["netProfit"])/100000000
    return result

若当年年报尚未出具,可先计算已出具季度的经营性现金流量,并计算相对于上年的同比,其余按值计算上年乘以今年同比。

def estimate_current_year_cf(stock_code, year, qt):
    previos_cf = query_anual_cf(stock_code, year-1, 4)
    previos_cf_p = query_anual_cf(stock_code, year-1, qt)
    cf_p = query_anual_cf(stock_code, year, qt)
    return cf_p + (previos_cf - previos_cf_p) * (cf_p/previos_cf_p)

资本支出项目的计算需要参考详细的利润表。这个项目暂时没有找到好的数据源,所以暂时不考虑这个项目,以后再找数据源。

估值

根据How to Value Stocks - Zhihu(知乎),计算未来自由现金流需要估计年增长率。这里用过去一段时间的平均增长率来估算,如下。

def estimate_increasing_rate(stock_code, start_year, end_year):
    start_fcf = query_anual_fcf(stock_code, start_year)
    end_fcf = query_anual_fcf(stock_code, end_year)
    if end_fcf/start_fcf < 0:
        return 0
    return (end_fcf/start_fcf)**(1/(end_year-start_year)) -1

为了方便与当前股价进行比较,我们需要将估计的企业价值除以总股数,可以使用利润数据中的“totalShare”字段获得。

def query_stock_count(stock_code, year, quarter):
    profit_list = []
    rs_profit = bs.query_profit_data(code=stock_code, year=2020, quarter=4)
    while (rs_profit.error_code == '0') & rs_profit.next():
        profit_list.append(rs_profit.get_row_data())
    result_profit = pd.DataFrame(profit_list, columns=rs_profit.fields)
    return float(result_profit["totalShare"])/100000000

最后哪能查到股票的自由现金流,可以根据预估增长率、持续增长持续时间、贴现系数和可持续增长率来估算股票的内在价值。

def estimate_price(fcf_init, stock_count, increase_rate=0.1, increase_year=10, R=0.08, g=0.03):
    ###
    # increase_rate 预估增长率
    # increase_year 预估增长年数
    # g 永续增长率
    # R 折现系数
    ###
    total_fcf = 0
    for n in range(1, increase_year+1):
        cfn = fcf_init * (1+increase_rate)**n
        total_fcf += cfn/((1+R)**n)
    total_fcf += cfn * (1+g)/(R-g)/((1+R)**increase_year)
    return total_fcf/stock_count

以茅台股份为例,整个计算过程如下

stock_code = "sh.600519"
incre_rate = estimate_increasing_rate(stock_code, 2012, 2020)
print(incre_rate)
# 0.2011945941597566
init_fcf = query_anual_cf(stock_code, 2020)
stock_cnt=query_stock_count(stock_code, 2020, 4)
estimate_price(init_fcf, stock_cnt, incre_rate, 10, 0.08, 0.03)
# 3227.5443645346045

总结

企业的内在价值等于未来创造的自由现金流的贴现值。本文使用baostock提供的Python API,提供了一个快速计算这个值的代码,可以很方便的针对大量的股票哪能查到股票的自由现金流,根据这个值进行计算。选股。

相关文章推荐

另一视角

换一换