自动获取和展示中国宏观杠杆率数据


这是 TidyFriday 社区推出的第一篇 Stata 的教程,为了吸引大家对 Stata 的兴趣,先不从最基础的讲,而是讲述一个使用 Stata 提高研究效率的案例。
国家资产负债表研究中心 CNBS 会在他们的服务器上定期推出 中国宏观杠杆率数据[1],是下面这个样子的:

在左下角有个数据下载按钮,点击就可以下载数据了,下载链接为:http://114.115.232.154:8080/handler/download.ashx ,下载之后会得到这个 xlsx 文件,这个文件的内容是这样的:

如果我们经常需要用这个数据,然后每次要用的时候都要打开这个网站下载,而且这个网站的网址还是个 IP 地址,谁记得住啊!所以如果我们能写个小程序自动获取然后整理好这个数据,最好再配个画图的功能。
那么我们先用 Stata 完成下载数据、整理数据、图表绘制这三个操作:
下载和整理数据
注意这个年份实际上是个月份变量:
/* 清空内存 */clear all/* copy 命令可以用于文件下载、复制粘贴 */copy "http://114.115.232.154:8080/handler/download.ashx" "CNBS中国杠杆率数据.xlsx", replace/* import excel 命令用于导入 EXCEL 数据 */import excel "CNBS中国杠杆率数据.xlsx", sheet("Data") firstrow clear/* 删除没用的列 */drop J K L/* 删除第一行:英文变量名 */drop in 1/* 把所有能转换成数值型变量的变量都转换成数值型变量 */destring, replace/* 把年份转换成日期型变量,date() 函数生成的数是从 1960 年 1 月 1 日开始计算的天数 */gen date = date(年份, "DMY")/* 把 date 变量放在第一列 */order date/* 把 date 变量转换成 年-月-日 的格式 */format date %tdCY-N-D/* 删除没用的年份变量 */drop 年份/* 生成一个月份变量 */gen 月份 = mofd(date)/* 月份变量的格式:年-月 */format 月份 %tmCY-N/* 把月份放在第一列 */order 月份/* 删除没有用的 date 变量 */drop date/* 给月份变量添加一个赋值标签 */label var 月份 "数据月份"
整理好的数据是这样的:

然后我们在画个图把这些数据展示出来:
/* 安装绘图主题 */ssc install blindschemes, replace all/* 设定 plotplain 为默认绘图主题 */set scheme plotplain, permanently/* 绘图 */tw ///line 居民部门 非金融企业部门 政府部门 中央政府 ///地方政府 实体经济部门 金融部门资产方 金融部门负债方 月份, ///lp(solid solid solid solid solid solid solid solid) ///lc("166 206 227" "031 120 180" "178 223 138" ///"051 160 044" "251 154 153" "227 026 028" ///"253 191 111" "255 127 000") xti(日期) ///note("数据来源:国家资产负债表研究中心(CNBS)") ///ti(中国各部门宏观杠杆率趋势)

这样我们就完成了刚刚设想的整个流程,下面就是本文的重点了,就是如何编写一个 Stata 命令,把上面这个流程整合进去,让以后我们想调用这个数据的时候,一条命令就完成!
我们先写一个最简单的 Stata 命令:
program def myprog di "Hello, World!"end
把这个程序保存为一个 myprog.ado 文件,然后放在当前工作目录下,然后就可以调用了:
myprog*> Hello, World!
那么对于本案例,我们可以编写一个这样的 ado 文件:
*! 自动获取和展示中国宏观杠杆率数据*! 程振兴 2019年4月1日*! 中国宏观杠杆率数据:http://114.115.232.154:8080/*! 示例:cmlrd*! cmlrd, plotcap program drop cmlrdprogram define cmlrd syntax [, plot] di "获取数据中···" qui copy "http://114.115.232.154:8080/handler/download.ashx" "CNBS中国杠杆率数据.xlsx", replace di "数据来源:国家资产负债表研究中心(CNBS)" qui{ import excel "CNBS中国杠杆率数据.xlsx", sheet("Data") firstrow clear drop J K L drop in 1 destring, replace gen date = date(年份, "DMY") order date format date %tdCY-N-D drop 年份 gen 月份 = mofd(date) format 月份 %tmCY-N order 月份 drop date label var 月份 "数据月份" } if "`plot'" != ""{ tw line 居民部门 非金融企业部门 政府部门 中央政府 /// 地方政府 实体经济部门 金融部门资产方 金融部门负债方 月份, /// lp(solid solid solid solid solid solid solid solid) /// lc("166 206 227" "031 120 180" "178 223 138" "051 160 044" "251 154 153" "227 026 028" "253 191 111" "255 127 000") xti(日期) /// note("数据来源:国家资产负债表研究中心(CNBS)") /// ti(中国各部门宏观杠杆率趋势) }end // end of program cmlrd这里涉及了一些 Stata 编程的 Tips:
1.*! 是一种特殊的注释,当你运行 which cmlrd 查找 cmlrd 命令的时候,这些注释会同时被打印出来,例如:
which cmlrd/Users/czx/Library/Application Support/Stata/ado/personal/c/cmlrd.ado *!
自动获取和展示中国宏观杠杆率数据 *! 程振兴 2019年4月1日 *! 中国宏观杠杆率数据:http://114.115.232.154:8080/ *! 示例:cmlrd *! cmlrd, plot
2.qui 是 quietly 的缩写,可以隐藏程序运行过程中的输出信息;
3.cap 是 capture 的缩写,可以在运行出错的时候自动跳过该程序;
4.syntax [, plot] 里面 plot 是我设定的选项,用 syntax [, PLOT] 的效果也是一样的,大写部分表示可以缩写。如果我这里使用的是 syntax [, Plot],那就表明 plot 选项可以缩写为 p。
使用 cmlrd
这个命令只有两个用法:
1.cmlrd:获取数据但是不绘图;2.cmlrd, plot:获取数据然后绘图。
全局使用 cmlrd
为了以后能够直接使用 cmlrd 命令,我们可以把这个 ado 文件放在系统文件夹里,运行下面的命令查看系统文件夹的位置:
sysdir*> STATA: /Applications/Stata/*> BASE: /Applications/Stata/ado/base/*> SITE: /Applications/Stata/ado/site/*> PLUS: /Users/czx/Library/Application Support/Stata/ado/plus/*> PERSONAL: /Users/czx/Library/Application Support/Stata/ado/personal/*> OLDPLACE: ~/ado/
推荐放在 PERSONAL 文件夹里。Windows 用户可以按 Win + R 键将 PERSONAL 的路径粘贴进去回车打开这个文件夹,Mac 用户可以直接运行下面的命令打开 PERSONAL 文件夹:
!open '/Users/czx/Library/Application Support/Stata/ado/personal/'
打开这个文件夹之后,把 cmlrd.ado 文件放在名为 c 的子文件夹里。Windows 用户也这样。
然后你就可以随时使用 cmlrd 命令了!
是不是觉得 Stata 也蛮有趣的!
References
[1] 中国宏观杠杆率数据: http://114.115.232.154:8080/
