一、关于季节调整:
之前是一直在用 Eviews 做 X-12
的季节调整,但是调整选项和 Stata 的相比确实有点少了,影响精度。
另外,做 BigData 的模型动则 几千个 个体不可能一个个在 Eviews 里手动调整,有人提到过用 Eviews 命令行批量执行,但是控制选项又很困难(我也没试过,命令行能不能跑起来也是个问题),总的来说用 Stata 季节调整是最优的。
二、问题:
用 Stata 最大的问题就是不好批量做季节调整,于是踩了一些坑,思考了一套最快的批量调整方案,附代码。
- 在调整前你需要具备 Stata 季节调整程序,可以在 人大经济论坛 下。
没有人大经济论坛的可以进网盘下全套程序:下载链接,提取码:2vjy
- 下完之后只需要把
x12a
文件夹里的x12a.exe
放到你的 Stata 的plus
目录就可以,下面介绍如何找plus
目录:
(1)在 Stata 里执行sysdir
,就会显示你的PLUS
目录
(2)直接把x12a.exe
放到plus
目录下即可 - 安装季节调整包,命令:
findit sax12
net install st0255.pkg
三、解决方案
注:假如你只需要调整几个变量,不需要查看本教程,直接输入命令 db sax12
调整即可,可以参考 Lee_iris 这套不错的设定方案。
-
先把大量数据导进 Stata ,我们这里假设的是 多变量 、 面板数据 ,注意变量名字统一用英文,中文
x12a.exe
不识别,建议使用var01
或者var1
这种形式的命名,为后续操作提供便利。 -
生成时间序列,确定时间区间。在 Stata 执行以下代码:
gen t=tm(2009m1)+_n-1
tsset t, monthly
这段代码的作用是先生成时间数据,之后设定,下面介绍修改项:
(1)其中 tm()
函数要根据你的时间形式来选取,如果是 2009m1
也就是只有到月度的数据(最常用的),使用 tm()
函数即可,如果是精确到 日
,请自行百度找到相应函数替换,有关函数可参考 这篇文章 。
(2)其中 tm()
函数内是数据的起始时间,这里是假定为了 2009m1
开始,可以自行替换自己的起始时间,注意 tsset
之后根据显示的确认一下你的时间区间是否正确。
- Python 批量拼接生成执行代码,拼接完成的 Stata 执行季节调整命令举例:
sax12 var01, satype(single) inpref(z1.spc) outpref(z1) transfunc(none) regpre( const td ) ammaxlag(2 1) ammaxdiff(2 1) ammaxlead(12) x11mode(add) x11seas(x11default)
注:这套调整方案是参考 Lee_iris 的,如果想自己设定调整方案,先用 db sax12
界面化执行一次你的方案,再把自动执行的代码拷贝过来即可作为方案。
Python 拼接方案代码:
import os
# 面板数据个体数 + 1
n = 35
text = 'sax12 var'
text1 = ', satype(single) inpref(z'
text2 = '.spc) outpref(z'
text3 = ') transfunc(none) \
regpre( const td ) ammaxlag(2 1) ammaxdiff(2 1) ammaxlead(12) x11mode(add) x11seas(x11default)'
stata = ''
for i in range(1,n):
stata += text
if i<=9:
stata += '0' + str(i)
else:
stata += str(i)
stata += text1 + str(i) + text2 + str(i) + text3 + '\n\n'
with open('BatchSeasonalProcessingStatementGeneration.txt', 'w') as f:
f.write(stata)
注:这里变量名假设成了 z01
、z09
这种,所以要手动在前十个补 0
,你也可以设定成不带 0
前缀的。当然你用 var01
、var1
这种类型也可以,不过后面清扫文件的时候要小心。
(1)有三个需要拼接的地方,第一个是上面 Stata 例子语句里变量 var01
部分,也是你 Stata 里给变量设定的名字,第二个是 .spc
文件,我们这里用 Python 拼接的时候,假定为了 z+序号
形式的,为了给后续操作提供便利,建议使用相同格式,第三个是输出前缀,这里同样使用 z+序号
的前缀格式。
(2)注意要修改 n
为你的面板个体数。(假定有 34
个省,那就是 35
)
如果你不熟悉 Python ,可以参考格式自行用熟悉的语言拼接生成。另外如果你只有 几十个个体
,网盘文件里还提供了生成好的 几十个
命令行,无需进行这一步。
- 将批量生成的代码在 Stata 里跑完,执行过程会不断有
控制台
窗口弹出,不要点击,否则会导致暂停。另外,还会自动打开季节调整报告
,无需理会,最后一并关掉即可。
注:如果报错,说明你的 季节调整程序
即 x12a.exe
没有放对位置,或者 sax12
库没有安装,亦或是 空格出错
,单词中断了,自行检查,可以先跑一条试试看。
- 跑完之后打开你的 Stata 安装根目录,下面会有一大堆
z+序号
格式的文件,全部复制备份起来,如果你想了解每一个文件的内容并做X-12
季节调整分析和预测
,请打开以.out
为结尾的文件查看季节调整报告
。
之后用以下代码执行这些文件的汇总和清扫工作,一劳永逸:
import os
# n 为面板数据个体数 + 1
n = 35
# t 为时间期数
t = 11 * 12
data = {}
for i in range(1,n):
data[str(i)] = []
with open('z' + str(i) + '.d11', 'r') as f:
lines = f.readlines()
for line in lines:
lineList = line.strip().split('\t')
if lineList[0] != 'date' and lineList[0] != '------':
data[str(i)].append(lineList[1])
with open('SeasonalAdjustmentDataExtraction.csv', 'w') as f:
for i in range(t):
lineData = ''
for j in range(1,n):
lineData += data[str(j)][i] + ','
lineData = lineData[:-1]
lineData += '\n'
f.write(lineData)
# 清扫
file_dir = r'./'
files = os.listdir(file_dir)
for i in range(len(files)):
if files[i].find('z') != -1:
os.remove(files[i])
for i in range(1,n):
fileName = 'var'
if i<=9:
fileName += '0' + str(i)
else:
fileName += str(i)
fileName += '.dat'
os.remove(fileName)
注:需要修改的只有 n
和 t
,按自己情况来。
- 执行完毕之后,自动清扫了冗余的
z+序号
文件,同时生成了·SeasonalAdjustmentDataExtraction.csv
汇总表格,点开即为季节调整
后的面板数据
结果,横向为时间期数,纵向为按var01
即 Stata 命名顺序排列的个体。
注:清扫的时候是把所有 z
开头的文件都清扫了,如果要自定义清扫,可以手动删除或者写别的规则,之所以用 z
开头的变量是因为 Stata 根目录没有带 z
字母的文件。
后记
虽然流程有点小复杂,但是都有相应的机械化方案,还是比较快的,Eviews 即使有最新的 X-13 解决方案, 自动化
还是问题,另外没有国内相适配的假期设定。