基于因子分析法分析新冠肺炎疫情对房地产业上市公司财务的影响

tushare ID:469868

tushare官网:https://tushare.pro

这是我的多元统计大作业。因为做了两个因子分析,内容太多,思路一样,我就放了一个因子分析的分析过程,最后结果还是两个季度进行比较。

1. 问题背景

受新冠肺炎疫情的影响,我国经济发展出现一定减缓,作为国家支柱产业的房地产业更是影响严重,为客观评价该行业上市公司的经营状况,本文应用因子分析法对沪深上市的87家房地产公司2019年第四季度和2020年第二季度财务指标进行实证分析,通过衡量评分与比较发现房地产业上市公司在新冠肺炎疫情下显露的财务问题,为投资者和决策者提供可行性建议。

本文选取了沪深上市的87家房地产公司作为研究对象,利用python从tushare接口调取了其2019年第四季度和2020年第二季度共11项财务指标,操作SAS软件对房地产业上市公司财务指标进行因子分析。

2.数据来源

Tushare接口

3.描述性统计分析

为了解新冠肺炎疫情对我国房地产业上市公司财务的影响,首先应用描述性统计分析对其进行分析,利用SAS软件完成统计分析任务。 

表2 

由表2可知,2019年第四季度财务数据中,x9(现金对利息的保障倍数)的数据离散程度比较大。x9(现金对利息的保障倍数)的均值为19.016,最小值和最大值分别为-224.545%、590.947%,说明我国89个房地产业上市公司的现金对利息的保障倍数差异较大。而且x9(现金对利息的保障倍数)偏度和峰度分别为4.854和33.047,说明x9(现金对利息的保障倍数)的数据呈右偏形态,数据分布是中间比标准正态分布顶峰更陡,两尾更重。其他变量的数据也有与x9(现金对利息的保障倍数)类似的特征:最小值和最大值的差异大、右偏,数据分布是中间比标准正态顶峰更陡、两尾更重。值得注意的是,x10(存货周转率)变量的偏度和峰度偏大。

4.基于因子分析法分析

(1)对数据标准化处理

本文先将数据标准化,利用标准化后的数据进行数据分析。本文采用的数据标准化的方法为“Z-score标准化”,经过上述标准化处理,原始数据均转换为无量纲化指标测评值,即各指标值都处于同一个数量级别上,可以进行综合测评分析。

(2)判断是否适合进行因子分析

表4 

表5 

由表4可知,13个变量之间的相关系数较大,说明数据适合作因子分析;由表5可知,KMO值为0.72959268,说明数据比较适合作因子分析。综上所述,数据适合作因子分析。 

(3)判断提取因子个数

表8 

 由表8可知,通过主成分法提取公因子后有3个特征值大于1,且对应的累积贡献率达到了84.46%,所以这里提取3个公因子是比较合适的。这里的提取3个公因子提取了原始变量的大多数信息,损失的信息比例约占15%。

(4)作因子旋转,以便对公因子进行解释

表10

由表10可知,对因子载荷矩阵进行最大方差正交旋转,很明显旋转后的2019年第四季度财务指标的因子模型中的载荷系数已明显向两极分化了,对公因子的解释更容易了。

第一公因子Factor1在x4(流动比率)、x5(速动比率)、x6(现金比率)、x7(股东权益比率)上有较大的载荷,因此可以认为Factor1是反映企业偿还债务能力的综合指标;

第二公因子Factor2在x1(总资产报酬率)、x2(总资产净利润率)、x3(成本费用利润率)、x8(净资产增长率)上有较大的载荷,因此可以认为Factor2是反映企业盈利能力和成长能力的综合指标;

第三公因子Factor3在x19(现金对利息的保障倍数)和x10(存货周转率)、x11(流动资产周转率)上有较大的载荷,因此可以认为Factor3是反映企业营运能力的综合指标。

表11

2019年第四季度财务指标成分得分系数矩阵的估计方法是回归法,由表11可得因子得分表达式为:

Factor1 = -0.03192x1-0.02979x2+0.00173x3+0.28655x4+0.29595x5+0.28755x6+0.23662x7

-0.07197x8-0.01979x9+0.02897x10-0.02323x11

Factor2 = 0.31180x1+0.32606x2+ 0.31691x3 -0.0242x4-0.03826x5-0.01423x6-0.05389x7

+0.17628x8-0.08212x9 -0.08049x10-0.00926x11

Factor3 = -0.05209x1-0.07117x2-0.09562x3 -0.0762x4 -0.00972x5 -0.0229x6+ 0.09733x7

+0.12139x8+0.34402x9+0.37251x10+0.3262x11

在各公因子得分后进行综合评价,依据表8的方差贡献率比率为权数计算综合得分:

Z = 0.4089/0.8446*Factor1 + 0.2549/0. 8446*Factor2 + 0.1808/0. 8446*Factor3 

  =48.41% * Factor1 + 30.17%*Factor2 + 21.41%*Factor3 

由上式可以计算出2019年第四季度各公因子的权数。偿债能力Factor1的权数为48.41%、企业盈利能力和成长能力Factor2的权数为30.17%、营运能力Factor3的权数为21.41%。由此可计算出各公司综合能力Z,并对综合能力Z进行排序,结果见下表。

(5)房地产业上市公司财务绩效评价

疫情前房地产业上市公司的偿债能力的权数为48.41%,经过新冠肺炎疫情后所占权数上升为49.89% ;企业盈利能力和成长能力的权数经过新冠肺炎疫情后从30.17%上升为30.92%;而营运能力的权数从21.41%下降到19.4%。疫情没有大幅度改变房地产业上市公司的综合能力评价标准,只是疫情后更加侧重企业的偿债能力。

从表14可知,*ST松江在2019年第四季度排名在沪深上市的房地产业里位居末位,但在疫情后名次排名前位。与此对应的是新能泰山疫情前排名靠前,而疫情后位居末位。*ST松江最初是房地产开发,在2015年后开始加码优质项目的投资,如自贸区的商业、餐饮及办公等综合体项目;借政策东风,加速布局融资租赁业务,优质企业获得成长的同时*ST松江也从中获得投资收益,固定周期的投资收益能增加利润,就是*ST松江在疫情后主营业务收入下降的同时保持较好的偿债能力的原因。与之对比的是新能泰山的主营业务收入来自于房屋销售,房屋租赁只约占1%,所以在疫情期间受到冲击,导致主营业务收入和偿债能力下降原因。

5.结论与建议

运用因子分析方法不难看出房地产业上市公司的财务还是受到疫情的影响,财务综合评价把运营能力转移到了对偿债能力、盈利能力和成长能力。由于疫情的影响,房地产市场成交量骤降,对于财务杠杆高的房地产企业来说无疑是寒冬,不少偿债能力差的房地产商因为资金无法回笼而破产,融资问题成为房地产企业的头等大事。

除了依靠政府政策等方式注重解决筹资问题,或者开发线上销售等策略提升偿债能力、盈利能力和成长能力,转换商业模式也是一条出路。本次疫情既引起房地产企业优胜劣汰重新布局!同时又启发了整个行业的思考!有利于推动房地产行业的改革和健康发展。

附录: 

python通过tushare获取数据的代码: 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif']=['SimHei']
mpl.rcParams['axes.unicode_minus']=False
import tushare as ts
token='26cb4010be6689129318b0742d630fe10139585364bdfe0afcab9f96'
pro=ts.pro_api(token)
pd.set_option('Display.max_rows',None)#展示全部行
pd.set_option('Display.max_columns',None)#展示全部列

房地产公司

data_L = pro.stock_basic(exchange='', list_status='L', fields='ts_code,symbol,name,exchange,area,industry,list_date')
data_L

 这是获取2019年第四季度的数据。因为我还是新手,代码写的也很繁琐,多多包涵。

industry_list = set(list(data_L['industry']))
data_L = data_L[(data_L['industry']=='全国地产' )| (data_L['industry']=='区域地产')]
data_L.reset_index(drop=True,inplace=True)

company_code_list = list(data_L['ts_code'])
total_df = pd.DataFrame()
for i in company_code_list:
    df = pro.fina_indicator(ts_code=i, period='20191231', fields='ts_code, roa, npta, q_roe, ar_turn, inv_turn,ca_turn,op_yoy,q_netprofit_yoy,current_ratio, quick_ratio,cash_to_liqdebt, assets_to_eqt,equity_yoy,ebit_to_interest,current_exint')
    total_df = pd.concat([total_df,df], axis=0)
total_df = total_df.drop_duplicates(subset='ts_code', keep='first')
#去掉A_ID和B_ID列中重复的行,并保留重复出现的行中第一次出现的行
total_df.reset_index(drop=True,inplace=True)

df_z = pd.DataFrame()
for i in company_code_list:
    dfz = pro.income(ts_code=i, period='20191231', end_type='4', fields='ts_code, total_profit, total_cogs, ebitda,int_income,fin_exp_int_exp,fin_exp_int_inc')
    df_z = pd.concat([df_z,dfz], axis=0)
result = pd.merge(total_df, df_z, on='ts_code', how='outer')
result = result.drop_duplicates(subset='ts_code', keep='first')

df_c = pd.DataFrame()
for i in company_code_list:
    dfc = pro.cashflow(ts_code=i, period='20191231', end_type='4', fields='ts_code, n_cashflow_act')
    df_c = pd.concat([df_c,dfc], axis=0)
result = pd.merge(result, df_c, on='ts_code', how='outer')
result_all = result.drop_duplicates(subset='ts_code', keep='first')

result1 = result_all.drop_duplicates(subset='ts_code', keep='first')
#去掉A_ID和B_ID列中重复的行,并保留重复出现的行中第一次出现的行

result1['int_income']=result1['fin_exp_int_exp'] - result1['fin_exp_int_inc']
result1['profit_to_cogs']=result1['total_profit'] / result1['total_cogs']
result1['eqt_to_assets']=1 / result1['assets_to_eqt']
result1['ocf_to_shortdebt']=result1['n_cashflow_act'] / result1['current_exint']

result1['ebitda_to_int_income']=result1['ebitda'] / result1['int_income']


result1 = result1.reindex(columns=['ts_code','roa','npta', 'profit_to_cogs', 'current_ratio', 'quick_ratio', 'cash_to_liqdebt','eqt_to_assets', 'equity_yoy', 'op_yoy', 'q_netprofit_yoy','ocf_to_shortdebt', 'ebitda_to_int_income', 'ar_turn', 'inv_turn','ca_turn']).dropna(axis=0,how='any')
result1.index = range(1,len(result1)+1)
#,'fin_exp_int_exp', 'fin_exp_int_inc'
data_L_1 = data_L[['ts_code', 'name']]
result1 = pd.merge(result1, data_L_1, on='ts_code', how='outer').dropna(axis=0,how='any')
result1.to_csv('./data/房地产业20191231.csv')

这是2020年第二季度的数据,其实我也不确定是半年报数据,还是第二季度的。 先这么做,反正是疫情前后的数据对比。

total_df21 = pd.DataFrame()
for i in company_code_list:
    df = pro.fina_indicator(ts_code=i, period='20200630', fields='ts_code, roa, npta, q_roe, ar_turn, inv_turn,ca_turn,op_yoy,q_netprofit_yoy,current_ratio, quick_ratio,cash_to_liqdebt, assets_to_eqt,equity_yoy,ebit_to_interest,current_exint')
    total_df21 = pd.concat([total_df21,df], axis=0)
total_df21 = total_df21.drop_duplicates(subset='ts_code', keep='first')
#去掉A_ID和B_ID列中重复的行,并保留重复出现的行中第一次出现的行
total_df21.reset_index(drop=True,inplace=True)

df_z21 = pd.DataFrame()
for i in company_code_list:
    dfz21 = pro.income(ts_code=i, period='20200630', end_type='2', fields='ts_code, total_profit, total_cogs, ebitda,int_income,fin_exp_int_exp,fin_exp_int_inc')
    df_z21 = pd.concat([df_z21,dfz21], axis=0)
result21 = pd.merge(total_df21, df_z21, on='ts_code', how='outer')
result21 = result21.drop_duplicates(subset='ts_code', keep='first')
#去掉A_ID和B_ID列中重复的行,并保留重复出现的行中第一次出现的行

df_c21 = pd.DataFrame()
for i in company_code_list:
    dfc21 = pro.cashflow(ts_code=i, period='20200630', end_type='2', fields='ts_code, n_cashflow_act')
    df_c21 = pd.concat([df_c21,dfc21], axis=0)
result21 = pd.merge(result21, df_c21, on='ts_code', how='outer')
result21 = result21.drop_duplicates(subset='ts_code', keep='first')
#去掉A_ID和B_ID列中重复的行,并保留重复出现的行中第一次出现的行

result2 = result21.drop_duplicates(subset='ts_code', keep='first')
#去掉A_ID和B_ID列中重复的行,并保留重复出现的行中第一次出现的行

result2['int_income']=result2['fin_exp_int_exp'] - result2['fin_exp_int_inc']
result2['profit_to_cogs']=result2['total_profit'] / result2['total_cogs']
result2['eqt_to_assets']=1 / result2['assets_to_eqt']
result2['ocf_to_shortdebt']=result2['n_cashflow_act'] / result2['current_exint']

result2['ebitda_to_int_income']=result2['ebitda'] / result2['int_income']


result2 = result2.reindex(columns=['ts_code','roa','npta', 'profit_to_cogs', 'current_ratio', 'quick_ratio', 'cash_to_liqdebt','eqt_to_assets', 'equity_yoy', 'op_yoy', 'q_netprofit_yoy','ocf_to_shortdebt', 'ebitda_to_int_income', 'ar_turn', 'inv_turn','ca_turn']).dropna(axis=0,how='any')
result2.index = range(1,len(result2)+1)
#,'fin_exp_int_exp', 'fin_exp_int_inc' .dropna(axis=0,how='any')
data_L_2 = data_L[['ts_code', 'name']]
result2 = pd.merge(result2, data_L_2, on='ts_code', how='outer').dropna(axis=0,how='any')
result2.to_csv('./data/房地产业20200630.csv')

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值