为了更准确反映公司的经营活动情况,重构后的资产不再按照流动性分类,而是按照带来经济利益的方式及分类。
这类重复的工作利用python来简化,写好代码以后,后续的只需要输入股票代码,需要的报表日期,即可直接获得数据,数据接口用的tushare。
① 计算出金融资产:
def get_finacial_data(code, start, end):
finacial = pro.balancesheet(ts_code=code, start_date=start, end_date=end,
fields='end_date,money_cap,trad_asset,hfs_assets,nca_within_1y,'
'decr_in_disbur,fa_avail_for_sale,htm_invest,invest_real_estate,'
'div_receiv,pur_resale_fa,int_receiv')\
.rename(columns={'end_date': '项目', 'money_cap': '货币资金', 'trad_asset': '交易性金融资产',
'hfs_assets': '持有待售的资产', 'nca_within_1y': '一年内到期的非流动资产',
'decr_in_disbur': '发放贷款及垫款', 'fa_avail_for_sale': '可供出售金融资产',
'htm_invest': '持有至到期投资', 'invest_real_estate': '投资性房地产',
'div_receiv': '应收股利', 'pur_resale_fa': '买入返售金融资产',
'int_receiv': '应收利息'})
finacial2 = finacial.drop_duplicates().set_index('项目') # 去掉完全重复行,并且将日期设置为索引行
finacial3 = finacial2.T.fillna(0) # 将空值替换为0
row_sum = finacial3.sum(axis=0)
finacial3.loc['金融资产合计'] = row_sum # 将列的求和加入到原DataFrame
return finacial3
② 计算出长期股权投资
def get_long_term_equity_data(code, start, end):
long_term_equity = pro.balancesheet(ts_code=code, start_date=start, end_date=end,
fields='end_date,lt_eqt_invest') \
.rename(columns={'end_date': '项目', 'lt_eqt_invest': '长期股权投资'})
long_term_equity2 = long_term_equity.drop_duplicates().set_index('项目') # 去掉完全重复行,并且将日期设置为索引行
long_term_equity3 = long_term_equity2.T.fillna(0) # 将空值替换为0
return long_term_equity3
③ 计算出周转性经营投入 = 营运资产 - 营运负债
def get_turnover_operating_data(code, start, end):
# 营运资产小计 属于资产,相加
turnover_add = pro.balancesheet(ts_code=code, start_date=start, end_date=end,
fields='end_date,notes_receiv,accounts_receiv,prepayment,oth_receiv,inventories,'
'oth_cur_assets,lt_rec')\
.rename(columns={'end_date': '项目', 'notes_receiv': '应收票据', 'accounts_receiv': '应收账款',
'prepayment': '预付款项', 'oth_receiv': '其他应收款',
'inventories': '存货', 'oth_cur_assets': '其他流动资产',
'lt_rec': '长期应收款'})
turnover_add2 = turnover_add.drop_duplicates().set_index('项目') # 去掉完全重复行,并且将日期设置为索引行
turnover_add3 = turnover_add2.T.fillna(0) # 将空值替换为0
row_sum = turnover_add3.sum(axis=0)
turnover_add3.loc['营运资产小计'] = row_sum # 将列的求和加入到原DataFrame
# 营运负债小计
turnover_reduce = pro.balancesheet(ts_code=code, start_date=start, end_date=end,
fields='end_date,notes_payable,acct_payable,adv_receipts,comm_payable,'
'payroll_payable,taxes_payable,oth_payable,lt_payroll_payable,'
'estimated_liab,deferred_inc,defer_inc_non_cur_liab,'
'specific_payables,oth_cur_liab,oth_ncl') \
.rename(columns={'end_date': '项目', 'notes_payable': '应付票据', 'acct_payable': '应付账款',
'adv_receipts': '预收款项', 'comm_payable': '应付手续费及佣金',
'payroll_payable': '应付职工薪酬', 'taxes_payable': '应交税费',
'oth_payable': '其他应付款', 'lt_payroll_payable': '长期应付职工薪酬',
'estimated_liab': '预计负债', 'deferred_inc': '递延收益-流动负债',
'defer_inc_non_cur_liab': '递延收益-非流动负债','specific_payables': '专项应付款',
'oth_cur_liab': '其他流动负债', 'oth_ncl': '其他非流动负债'})
turnover_reduce2 = turnover_reduce.drop_duplicates().set_index('项目') # 去掉完全重复行,并且将日期设置为索引行
turnover_reduce3 = turnover_reduce2.T.fillna(0) # 将空值替换为0
row_sum1 = turnover_reduce3.sum(axis=0)
turnover_reduce3.loc['营运负债小计'] = row_sum1 # 将列的求和加入到原DataFrame
# 计算:周转性经营投入 = 营运资产 - 营运负债
turnover_operating = pd.concat([turnover_add3, turnover_reduce3])
turnover_operating.loc['周转性经营投入合计'] = turnover_operating.loc['营运资产小计'] - turnover_operating.loc['营运负债小计']
return turnover_operating
④ 计算出长期经营资产:
def get_long_turnove_data(code, start, end):
long_turnove = pro.balancesheet(ts_code=code, start_date=start, end_date=end,
fields='end_date,fix_assets,cip,const_materials,fixed_assets_disp,'
'produc_bio_assets,oil_and_gas_assets,intan_assets,'
'r_and_d,goodwill,lt_amor_exp,defer_tax_assets,defer_tax_liab,'
'oth_nca') \
.rename(columns={'end_date': '项目', 'fix_assets': '固定资产', 'cip': '在建工程',
'const_materials': '工程物资', 'fixed_assets_disp': '固定资产清理',
'produc_bio_assets': '生产性生物资产', 'oil_and_gas_assets': '油气资产',
'intan_assets': '无形资产', 'r_and_d': '研发支出', 'goodwill': '商誉',
'lt_amor_exp': '长期待摊费用', 'defer_tax_assets': '递延所得税资产',
'defer_tax_liab': '减:递延所得税负债', 'oth_nca': '其他非流动资产'})
long_turnove2 = long_turnove.drop_duplicates().set_index('项目') # 去掉完全重复行,并且将日期设置为索引行
long_turnove3 = long_turnove2.T.fillna(0) # 将空值替换为0
row_sum = long_turnove3.sum(axis=0)
long_turnove3.loc['长期经营资产合计'] = row_sum - long_turnove3.loc['减:递延所得税负债'] * 2 # 将列的求和加入到原DataFrame
return long_turnove3
⑤ 计算出经营资产 = 周转性经营投入 + 长期经营资产
⑥ 计算出资产总额 = 金融资产 + 长期股权投资 + 经营资产
def get_sum_assets_result_data(code, start, end):
# 获取 金融资产 数据
result_finacial = get_finacial_data(code, start, end)
# result_finacial.to_csv('../data/金融资产.csv')
# 获得周转性经营资产数据
result_turnover = get_turnover_operating_data(code, start, end)
# result_turnover.to_csv('../data/周转性经营投入.csv')
# 获得 长期经营资产 数据
result_long_turnove = get_long_turnove_data(code, start, end)
# result_long_turnove.to_csv('../data/长期经营资产.csv')
# 计算 经营资产 = 周转性经营资产 + 长期经营资产
operating_assets = pd.concat([result_turnover, result_long_turnove])
operating_assets.loc['经营资产合计'] = operating_assets.loc['周转性经营投入合计'] + operating_assets.loc['长期经营资产合计']
# operating_assets.to_csv('../data/经营资产.csv')
# 获得 长期股权投资 数据
result_long_term = get_long_term_equity_data(code, start, end)
# 计算 资本总额 数据
sum_assets_result = pd.concat([result_finacial, result_long_term, operating_assets])
sum_assets_result.loc['资产总额'] = sum_assets_result.loc['金融资产合计'] + \
sum_assets_result.loc['长期股权投资'] + sum_assets_result.loc['经营资产合计']
sum_assets_result.to_csv('../data/' + code +'资本总额.csv')
return sum_assets_result
案例:以德赛西威的2019年~2022年的年报编制资产表
欢迎喜欢财务分析的小伙伴一起讨论,一起学习~