请 [注册] 或 [登录]  | 返回主站

量化交易吧 /  量化平台 帖子:3365825 新帖:0

如何使用jqdata获取上市公司自由现金流

我们棒棒哒发表于:5 月 10 日 06:22回复(1)

By 陈鹏

自由现金流有很多著名的拥护者,其中最著名的莫过于巴菲特和贝索斯了。巴菲特认为企业所能够产生的自由现金流,才是投资者真正拥有的财富。与此同时,贝索斯认为,一个公司的核心能力是自由现金流,投资者有多少钱能够支付到对未来的投资上去,才是决定公司价值的核心指标。

那么,如何才能追随两位大师的步伐,以及在实际应用中将自由现金流模型贯彻落实呢?首先来看一下下面的模型。

?DCF模型,即贴现自由现金流模型,全称为Discounted Cash Flow,这个模型是由美国的John Burr Williams在1937年哈佛大学的博士论文中首次提出,并于1938年发表于《The Theory of Investment Value》一书中。它是巴菲特、贝索斯自由现金流模型的理论版,具体做法就是把企业在未来持续经营期间内的所有自由现金流贴现到今日,最终得到的数值就是企业的价值。DCF模型公式如下:

p=nt=1CFt(1r)t
<br>p=nt=1CFt(1r)t<br>
其中:P为企业价值;CFt为企业第t年的自由现金流;r为折现率;t为预测期间

我们先对其中的CF因素进行探讨。理解自由现金流,需从如下两个方面入手:

? 1.自由现金流的定义是什么?

? 2.自由现金流的公式如何计算?

第一个问题,自由现金流就是企业日常经营活动中产生的,减去各种税费,扣除企业相关投资需求后,能够分配给股东和债权人的最大现金流量。

第二个问题,我们考证了金融学领域的经典教材,由美国MIT斯隆管理学院斯蒂芬·A·罗斯撰写的《公司理财》一书,书中给出了完整的自由现金流的计算方法,即自由现金流=经营性现金流-资本性支出-净营运资本的增加。本文通过实例来验证自由现金流数据,所采用的数据取自于聚宽数据出品的JQData本地量化金融数据,测试对象为贵州茅台("600519.XSHG")2017年年报,以上公式中用到的数据在JQData中都可以直接获取,测试代码如下:

计算上市公司的FCFF,自由现金流=经营性现金流-资本性支出-净营运资本的增加

from jqdatasdk import *
auth('用户名','密码')
#经营性现金流=息税前利润 折旧-当期税款
#计算息税前利润(息税前利润=净利润 所得税 利息费用)
def EBIT(code,report_date):
    #从合并利润表中获取净利润、所得税、利息费用数据
    df = finance.run_query(query(finance.STK_INCOME_STATEMENT.code,
                                 finance.STK_INCOME_STATEMENT.report_type,
                                 finance.STK_INCOME_STATEMENT.net_profit,
                                 finance.STK_INCOME_STATEMENT.income_tax,
                                 finance.STK_INCOME_STATEMENT.interest_expense).filter(
                                 finance.STK_INCOME_STATEMENT.code==code,
                                 finance.STK_INCOME_STATEMENT.report_date==report_date))
    df = df.fillna(0)
    df = df[df['report_type']==0]   
    df['EBIT'] = df['net_profit']   df['income_tax']   df['interest_expense']  #息税前利润=净利润 所得税 利息费用
    return df['EBIT'][1]
    
#计算本期折旧(本期折旧=本期累计折旧-上期累计折旧)
def depreciation(code,report_date):
    #从合并现金流量表中获取折旧数据
    df_depreciation = finance.run_query(query(finance.STK_CASHFLOW_STATEMENT.code,
                                              finance.STK_CASHFLOW_STATEMENT.report_type,
                                              finance.STK_CASHFLOW_STATEMENT.fixed_assets_depreciation).filter(
                                              finance.STK_CASHFLOW_STATEMENT.code==code,
                                              finance.STK_CASHFLOW_STATEMENT.report_date==report_date))
    df_depreciation = df_depreciation.fillna(0)
    #本期折旧=本期累计折旧-上期累计折旧
    depreciation = df_depreciation[(df_depreciation.report_type==0)]['fixed_assets_depreciation'][1]-df_depreciation[(df_depreciation.report_type==1)]['fixed_assets_depreciation'][0]
    return depreciation

#计算当期税款(当期税款=所得税-递延所得税)
def current_tax(code,report_date):
    #从合并利润表中获取所得税数据
    df = finance.run_query(query(finance.STK_INCOME_STATEMENT.code,
                                 finance.STK_INCOME_STATEMENT.report_type,
                                 finance.STK_INCOME_STATEMENT.income_tax).filter(
                                 finance.STK_INCOME_STATEMENT.code==code,
                                 finance.STK_INCOME_STATEMENT.report_date==report_date))
    df = df.fillna(0)
    df = df[df['report_type']==0]
    current_tax = df['income_tax'][1]-deferred_income_taxes(code,report_date)  #当期税款=所得税-递延所得税
    return current_tax

#计算递延所得税(递延所得税=递延所得税资产的减少 递延所得税负债的增加)
def deferred_income_taxes(code,report_date):
    #从合并现金流量表中获取递延所得税资产的减少、递延所得税负债的增加数据
    df = finance.run_query(query(finance.STK_CASHFLOW_STATEMENT.code,
                                 finance.STK_CASHFLOW_STATEMENT.report_type,
                                 finance.STK_CASHFLOW_STATEMENT.deffered_tax_asset_decrease,
                                 finance.STK_CASHFLOW_STATEMENT.deffered_tax_liability_increase).filter(
                                 finance.STK_CASHFLOW_STATEMENT.code==code,
                                 finance.STK_CASHFLOW_STATEMENT.report_date==report_date))
    df = df.fillna(0)
    df = df[df['report_type']==0]
    df['deferred_income_taxes'] = df['deffered_tax_asset_decrease'] df['deffered_tax_liability_increase']  #递延所得税=递延所得税资产的减少 递延所得税负债的增加
    return df['deferred_income_taxes'][1]
    
#计算资本性支出(资本性支出=期末固定资产净额-期初固定资产净额 折旧)
def capital_expenditure(code,report_date):
    #从合并资产负债表中获取固定资产净额数据
    df_fixed_assets = finance.run_query(query(finance.STK_BALANCE_SHEET.code,
                                              finance.STK_BALANCE_SHEET.report_type,
                                              finance.STK_BALANCE_SHEET.fixed_assets).filter(
                                              finance.STK_BALANCE_SHEET.code==code,
                                              finance.STK_BALANCE_SHEET.report_date==report_date))
    df_fixed_assets = df_fixed_assets.fillna(0)
    fix_assets = df_fixed_assets[(df_fixed_assets.report_type==0)]['fixed_assets'][1]-df_fixed_assets[(df_fixed_assets.report_type==1)]['fixed_assets'][0]
    depreciation_ = depreciation(code,report_date)
    capital_expenditure = fix_assets depreciation_  #资本性支出=期末固定资产净额-期初固定资产净额 本期折旧
    return capital_expenditure

#计算净营运资本增加额(期末净营运资本-期初净营运资本     其中:净营运资本=流动资产-流动负债)
def net_working_capital_increment(code,report_date):
    #从合并资产负债表中获取本期和上期的流动资产&流动负债数据
    df = finance.run_query(query(finance.STK_BALANCE_SHEET.code,
                                 finance.STK_BALANCE_SHEET.report_type,
                                 finance.STK_BALANCE_SHEET.total_current_assets,
                                 finance.STK_BALANCE_SHEET.total_current_liability).filter(
                                 finance.STK_BALANCE_SHEET.code==code,
                                 finance.STK_BALANCE_SHEET.report_date==report_date))
    df = df.fillna(0)
    end_working_capital = df[(df.report_type==0)]['total_current_assets'][1]-df[(df.report_type==0)]['total_current_liability'][1]
    begin_working_capital = df[(df.report_type==1)]['total_current_assets'][0]-df[(df.report_type==1)]['total_current_liability'][0]
    net_working_capital_increment = end_working_capital-begin_working_capital  #净营运资本增加额=期末净营运资本-期初净营运资本
    return net_working_capital_increment

#计算FCFF自由现金流(自由现金流=息税前利润-当期税款-资本性支出-净营运资本增加额 折旧)
def FCFF(code,report_date):
    #自由现金流=息税前利润-当期税款-资本性支出-净营运资本增加额 折旧
    FCFF = EBIT(code,report_date)-current_tax(code,report_date)-capital_expenditure(code,report_date)-net_working_capital_increment(code,report_date) depreciation(code,report_date)
    return FCFF

FCFF中传入code和report_date 形如 FCFF('600519.XSHG','2017-12-31')

其中:report_date可以是"XXXX-03-31","XXXX-06-30","XXXX-09-30","XXXX-12-31"

分别表示XXXX年的一季报、半年报、三季报以及年报

print(FCFF('600519.XSHG','2017-12-31'))

代码运行结果为8180290417.57,为了验证数据的准确性,我们对比了几个主流平台的相应的数据。

数据来源 贵州茅台2017年年报企业自由现金流(亿元)
jqdata 81.80
Wind 296.07
i问财 84.48

最后可以看出,jqdata的数据和i问财的数据之间是比较接近的,而Wind和我们的计算差异较大。

全部回复

0/140

量化课程

    移动端课程