clear all
* 安装爬虫俱乐部开发的Stata 命令cnstock、cnar来获取上市公司的股票代码和财务报表数据
cap ssc install cnstock
cap ssc install cnar
cap ssc install fs // 安装显示目标路径下所有文件名的命令
* 创建文件存储路径
cap mkdir D:\EM\
* 创建子路径, 用来存储每一公司的财务报表
cap mkdir D:\EM\FS\
* 获取全部上市公司的股票代码
cnstock all, path("D:\EM\")
* 删除B 股公司
drop if index(stknm," B ") | index(stknm,"B")
* 对股票代码循环, 使用cnar命令下载每一公司的财务报表
levelsof stkcd , local(stkcd)
foreach i in `stkcd'{ // 上市公司数量众多,本循环非常耗时,可酌情缩减上市公司数量
cnar `i', path("D:\EM\FS\")
disp "`i'"
* 纵向合并所有公司的财务报表
clear all
cd D:\EM\FS\
fs *.dta
foreach f in `r(files)'{
append using `f'
save D:\EM\FS.dta,replace
clear all
cd D:\EM\FS\
use SwClass.dta // 将准备好的行业数据放置于工作路径
obs: 3,927
vars: 3
size: 161,007
-------------------------------------------------------------------------------
storage display value
variable name type format label variable label
-------------------------------------------------------------------------------
stkcd str9 %9s code
stknm str20 %20s name
industry str12 %12s shenwanindustryfirst
-------------------------------------------------------------------------------
* 将行业分类数据与财务报表合并
merge 1:m stkcd using D:\EM\FS.dta ,keep(match) nogen
* 剔除金融行业样本
drop if inlist(industry, " 银行", " 非银金融")
* 保留2009-2018 年的数据
keep if year>2008 & year <2019
rename (资产总计 营业收入 固定资产 应收账款 净利润 经营活动产生的现金流量净额) ///
(Asset REV PPE REC NI CFO) // 批量重命名
xtset stkcd year
gen TA = (NI - CFO)/L.Asset // 标准化的总应计项目
gen A1 = 1/L.Asset // 总资产倒数
gen DREV = D.REV/L.Asset // 营业收入增量
gen DREC = D.REC/L.Asset // 应收账款增量
gen DS_DAR= DREV - DREC // 营业收入的增量-应收账款的增量
gen ROA=NI/((Asset+L.Asset)/2) //ROA
replace PPE = PPE/L.Asset // 固定资产净额
//数据清洗:
keep stkcd year industry TA A1 Asset REV PPE REC DREV DREC ROA
* 剔除模型中存在缺失值的样本
drop if TA + A1 + DREV + PPE == .
* 删除观测值数不足6 的上市公司
bysort stkcd:drop if _N<6
save D:\EM\AEM_Rawdata.dta, replace
3.2 数据获取方式之二:模拟一份数据
我们也可以简单地自行模拟一份数据,作为范例;
*模拟数据
clear
set obs 500 // 模拟500家上市公司
gen stkcd=_n
expand 10 // 每家公司有10年数据
bys stkcd: gen year=_n
gen TA= 3+uniform() // 财务指标均由随机数生成
gen PPE=2+rnormal()
gen A1= 0.5* rnormal()
gen DREV=rnormal()
gen DREC=rnormal()
gen industry=cond(stkcd<125,1,cond(stkcd<250,2,cond(stkcd<375,3,4)))
save D:\EM\AEM_Rawdata.dta,replace
3.3 应计盈余管理测算
最后我们采用修正 Jones 模型估计应计盈余管理:
use D:\EM\AEM_Rawdata.dta,replace
* 分行业和分年度回归,提取回归系数
statsby, by(industry year) clear: reg TA A1 DREV PPE, noconstant
* 将刚估计的系数数据合并原始数据
merge 1:m industry year using D:\EM\AEM_Rawdata.dta
gen DREV_DREC = DREV - DREC // 营业收入增量- 应收账款增量
* 计算修正后的应计盈余管理
gen DA = TA - _b_A1 * A1 - _b_DREV * DREV_DREC - _b_PPE * PPE