11  资产定价文献复现

11.1 面板数据和时间序列数据文件的命令与函数

11.1.1 设置面板数据、时间序列数据

一个典型的面板数据是个股月收益率文件。下图下图展示了CSMAR数据库个股月度交易数据的结构(参见群内文件Trd_Mnth.xlsx):

在所有的面板数据中,有两个变量:个体变量和时间变量。在上述个股月度交易文件中,个体变量是证券代码变量Stkcd,时间变量是交易月份变量Trdmnt。

我们通过如下代码可以将excel文件转存为Stata的dta数据文件:

clear all
set more off 
set excelxlsxlargefile on 

cd "C:\StataClass\week11"
import excel using "${PATH}\TRD_Mnth.xlsx", clear firstrow 
foreach var of varlist *{
    local varlabel = `var'[1] + "|" + `var'[2]
    local variable `var' "`varlabel'"
}
drop in 1/2
destring *, replace 
gen temp = ym(real(substr(Trdmnt,1,4)),real(substr(Trdmnt,6,2)))
destring Trdmnt, replace force 
replace Trdmnt = temp 
format Trdmnt %tmCY-N 
drop temp 
codebook Trdmnt // 查看Trdmnt的取值范围(整数)
compress
save "${PATH}\TRD_Mnth.dta", replace 

codebook命令可以看出Trdmnt的取值是整数,通过format命令我们实现了将整数显示为日期格式。

接下来我们通过xtset命令将数据设定为面板结构(通过 help xtset 查看该命令的帮助文档):

use "TRD_Mnth.dta", clear 
xtset Stkcd Trdmnt 
save "TRD_Mnth.dta", replace 

可以看到Result Window中的提示显示,Panel variable (对应我们提到的个体变量)为Stkcd,括号里的unbalanced意为非平衡面板(就是Stkcd的取值不是连续的整数);而time variable(对应我们提到的时间变量)为Trdmnt,而且显示了时间的范围从1990-12到2022-11;detla是指时间变量的间隔,这里提示我们间隔时一个月(是因为我们将Trdmnt的显示格式调整为年月(%tm)形式,你可以试试生成一个新变量例如temp=Trdmnt,你会发现temp的取值是整数,此时xtset Stkcd temp后的提示会显示delata: 1 unit)。

对于xtset后接的个体变量和时间变量求是:1.必须是数值型变量。2. 两个变量联立必须能够唯一的识别每一条观测值。

时间序列数据可以视作退化的面板数据,即不存在个体变量,仅存在时间变量的数据形式。常见的时间序列数据如:单支股票的月收益率文件、我国的月度CPI指标等。

我们从TRD_Mnth.dta中提取股票代码为1的股票的所有月度数据,并通过tsset将该数据设定为时间序列数据。

use "TRD_Mnth.dta", clear 
keep if Stkcd == 1
tsset Trdmnt 
save "000001_TRD_Mnth.dta", replace 

与面板数据对xtset后接的两个变量类似,tsset对后接的时间变量的要求同样是:1.必须是数值型变量。2. 两个变量联立必须能够唯一的识别每一条观测值。

有了面板数据之后我们接下来介绍几个运算和函数

11.1.2 计算滞后值和未来值

对于面板数据和时序数据,我们可以通过算子运算方便的计算过去和未来某期的变量取值:

时序数据:

use "000001_TRD_Mnth.dta",clear 
sort Trdmnt 
gen l1_Mretnd = l1.Mretnd 
gen l2_Mretnd = l2.Mretnd 
gen f1_Mretnd =f1.Mretnd 
gen f2_Mretnd =f2.Mretnd 
list Trdmnt Mretnd l1_Mretnd l2_Mretnd f1_Mretnd f2_Mretnd in 1/20

面板数据:

use "${PATH}\TRD_Mnth.dta", clear 
gen l1_Mretnd = l1.Mretnd 
gen l2_Mretnd = l2.Mretnd 
gen f1_Mretnd =f1.Mretnd 
gen f2_Mretnd =f2.Mretnd 
list Trdmnt Mretnd l1_Mretnd l2_Mretnd f1_Mretnd f2_Mretnd if Stkcd == 2 in 1/20

11.1.3 tsfill()函数

tsfill()函数的功能是扩展填充已有的时间序列数据(也适用于面板数据),ts是time-series的简写。这是当时间序列数据和面板数据存在缺失的情况。

例如所有的个股交易数据都不能发生在周末和节假日,因此这些日期的数据是缺失的。其次,股票可能存在停牌的情况,也会导致某些日期的数据缺失。tsfill()函数可以将这些缺失的个体、时间变量自动填充,但除此之外的数据变量则以缺失值(missing value)填充。

use "TRD_Mnth.dta", clear 
keep Stkcd Trdmnt Mretnd 
keep if Stkcd == 1|Stkcd == 2
drop if mod(_n,10)==3
list in 1/20
tsfill 
list in 1/20