Stata:CSMAR数据库API介绍

发布时间:2022-03-11 阅读 1107

Stata连享会   主页 || 视频 || 推文 || 知乎 || Bilibili 站

温馨提示: 定期 清理浏览器缓存,可以获得最佳浏览体验。

New! lianxh 命令发布了:
随时搜索推文、Stata 资源。安装:
. ssc install lianxh
详情参见帮助文件 (有惊喜):
. help lianxh
连享会新命令:cnssc, ihelp, rdbalance, gitee, installpkg

课程详情 https://gitee.com/lianxh/Course

课程主页 https://gitee.com/lianxh/Course

⛳ Stata 系列推文:

PDF下载 - 推文合集

作者:初虹 (微信公众号-虹鹄山庄)
邮箱chuhong@mail.sdufe.edu.cn


目录


这段时间在用上市公司数据,常苦于各类财务指标繁杂且分散,下载起来也颇费周章。CSMAR API 的出现在很大程度上简化了数据的下载过程——基本不用在 CSMAR 网站点点选选,数据下载也能纳入代码管理的范畴。

CSMAR 数据库 (China Stock Market & Accounting Research Database) 作为经济金融领域的知名数据库,对于公司和宏观经济研究者而言,是重要的数据来源。到目前为止,CSMAR 涵盖 18 大系列,包含 160+个数据库、4000 多张表、5 万多个字段,支持导出 Excel、CSV、TXT 等多种文件格式。

运行文中代码需要事先安装的软件及相关第三方命令:

  • 软件:Stata 16+;
  • 插件:CSMAR-STATA;
  • 命令:cdcopyshelleraselocalglobalunzipfileustrregexracapturesubinstrsubstrmergerealmvfilesdelfsfilesearch 等。

1. CSMAR Stata API

CSMAR API 提供了 Python、R、MATLAB 和 Stata 四种接口,为我们从 CSMAR 上下载数据提供了极大的便利性。在本文中,笔者将以 Stata 为例、介绍 CSMAR API 的使用,其他软件的 API 调用方法请移步 CSMAR 官网。CSMAR Stata API 是基于 Java 语言开发的 Stata 插件 (目前仅支持 Windows 系统),通过调用插件相关方法来实现 CSMAR 数据库的数据查询、筛选、下载等功能。

1.1 初始配置

软件前提:Windows 系统和 Stata 16+

插件安装:CSMAR-STATA

  • 首先,下载「CSMAR-STATA」压缩包,并将解压得到的所有文件复制到 personal 文件夹 (具体位置可通过 sysdir 命令查看);
  • 然后,运行 run.bat 文件。

1.2 CSMAR-STATA

用户登录login "account" "pwd"

  • account:用户名/已验证电话/已验证邮箱;
  • pwd:密码。

注意:这里登录的账号,必须是个人账号,不能使用机构账号。

设置语言setLanguage "lang"

  • 中文 CH,英文 EN
  • 如不设置语言则默认中文。

查看已购买的数据库名称getDbs

查看已购买的数据表名称getTables "databaseName"

  • databaseName:数据库名称,可通过 getDbs 获得。

查看已购买数据表中所有的字段getFields "tableName"

  • tableName:表名称,可通过 getTables "databaseName" 获得。

预览数据preview "tableName"

  • tableName:表名称,可通过 getTables "databaseName" 获得。

查询已购买的数据表记录条数getDataCount "columns" "condition" "tableName" "startTime" "endTime"

  • columns:字段列表;
  • condition:条件,类似 SQL 条件语句;
  • tableName:表名称,可通过 getTables "databaseName" 查看;
  • startTimeendTime:下载数据时间区间的开始时间和结束时间。

查询已购买的数据表数据getData "columns" "condition" "tableName" "startTime" "endTime"

  • 一次最多只能加载 20 万条记录;
  • condition:如超过 20 万记录的数据可使用 limit 进行分页查询。假设是 40 万条,需分两次进行条件设置:
    • 第一次:"Stkcd like'3%' limit 0, 200000"
    • 第二次:"Stkcd like'3%' limit 200000, 200000"

打包数据pack "columns" "condition" "tableName" "startTime" "endTime"

  • 该命令返回一个唯一标识:signCode。

获取 Stata 下载记录详情getRecord "signCode"

  • signCode 是通过调用 pack 命令获取,非必填,为空时返回所有通过 Stata 下载的记录。

下载数据copy "sourcePath""targetPath"

  • sourcePath:文件来源路径通过 getRecord "signCode" 中的 filepath 获得;
  • targetPath:文件存放路径。

2. 下载财务报表数据

登录个人账号,进入财务报表数据库,查看要下载的数据表名称。

. clear all
. login "account" "pwd" // 登录个人账号和密码
. getDbs                // 查看学校已购的数据库列表
. getTables "财务报表"   // 查看财务报表数据库里的所有数据表

打包下载资产负债表 2007-2021 年度合并报表中的部分变量。

. * 资产负债表
. getFields "FS_Combas" 
. pack "Stkcd,Accper,Typrep,A0b1103000,A001101000,A001111000,A001123000,A001212000,A001000000,A002108000,A002000000" ///
>    "Typrep = 'A' AND Accper like '20%-12-31'" "FS_Combas" "2007-12-31" "2021-12-31"
In the process of packaging, you can check the packaging progress through the identification code, 
which is  [948722605518524416]

. getRecord "948722605518524416" // 需要替换成最新的 identification code 
. list filePath
   +---------------------------------------------------------------------------+
   |                                                                  filePath |
   |---------------------------------------------------------------------------|
   | http://file.csmar.com/group1/M00/31/E4/CuIKV2IfkEOAeevrACBAoTd_hEM170.zip |
   +---------------------------------------------------------------------------+

由上表可知,filePath 变量就是数据的下载路径,通过 copy 命令下载即可。

. local filePath = filePath[1]
. copy "`filePath'" "资产负债表.zip", replace

同样的方式,下载利润表和现金流量表 (间接法) 2007-2021 年度合并报表中的部分变量。

. * 利润表
. getFields "FS_Comins"
. pack "Stkcd,Accper,Typrep,B001101000,Bbd1102101,Bbd1102203,B001211000, B001300000,B001000000,B002000000" ///
>     "Typrep = 'A' AND Accper like '20%-12-31'" "FS_Comins" "2007-12-31" "2021-12-31"
In the process of packaging, you can check the packaging progress through the identification code, 
which is  [948727703359492096]

. getRecord "948727544793829376"
. local filePath  = filePath[1]
. copy "`filePath'" "利润表.zip", replace

. * 现金流量表
. getFields "FS_Comscfi"
. pack "Stkcd,Accper,Typrep,D000101000,D000117000,D000102000,D000103000,D000104000,D000105000,D000106000" ///
>     "Typrep = 'A' AND Accper like '20%-12-31'" "FS_Comscfi" "2007-12-31" "2021-12-31"
In the process of packaging, you can check the packaging progress through the identification code, 
which is  [948727707524435968]

. getRecord "948727659394797568"
. local filePath  = filePath[1]
. copy "`filePath'" "现金流量表间接法.zip", replace

3. 循环解压缩

. fs *.zip
. foreach i in `r(files)' {
  2.     unzipfile "`i'", replace 
  3. }

4. Stata 读取数据并加标签

通过 API 下载的 CSV 文件里没有标签信息,可以根据同名 TXT 文件里的信息为变量加标签。在这里,我们将 TXT 文件里括号中的信息作为变量标签,并使用正则表达式将每行字段批量改成 label var varName "varlabel" 的形式。

. filesearch "*].txt", local(txtfiles)
. foreach txt of local txtfiles {
  2.     import delimited using "`txt'", clear
         // 去掉部分标签里的括号,其括号里有双引号
  3.     replace v1 = ustrregexra(v1, "\(.*\)", "", .)
  4.     replace v1 = ustrregexra(v1, "\(.*\)", "", .)
         // 在每行最前面加入 "label var "
  4.     replace v1 = ustrregexra(v1, "^", "label var ", .)
         // 将每行的 "[" 去掉
  6.     replace v1 = ustrregexra(v1, "\[", "", .)
         // 将每行的 "]" 及后面所有的字符去掉
  7.     replace v1 = ustrregexra(v1, "\].*", "", .)     
  8.     local txt: subinstr local txt ".txt" ".do", all
  9.     export delimited using "`txt'", replace novarnames
 10. }

接下来,将 CSV 文件循环导入 Stata 并加标签,下图是对应结果。

. filesearch "*.csv", local(csvfiles)
. foreach csv of local csvfiles {
        // CSV 文件批量导入 Stata 
  2.    import delimited using "`csv'", case(preserve) clear
  3.    cap local csv: subinstr local csv ".csv" "", all
        // 批量加标签
  4.    quietly{
  5.         cap do "`csv'[DES][csv]".do
  6.    }    
  7.    save "`csv'.dta", replace  
  8. }

接下来,删除临时文件 (CSV、TXT、DO),保留 DTA 文件。

. filesearch "*.csv", local(csvfiles)
. foreach csv of local csvfiles {
  2.    !del `csv'
  3. }
  
. filesearch "*.txt", local(txtfiles)
. foreach txt of local txtfiles {
  2.     !del `txt'
  3. }
  
. filesearch "*.do", local(dofiles)
. foreach do of local dofiles {
  2.     !del `do'
  3. }

常出现的问题/注意点:

  • 使用时,浏览器必须保持登录个人账号,否则会出现 No permission to access.r(5100); 的问题;
  • getFields "FS_Combas" 查询资产负债表所有字段的时,会出现 r(198) 的错误,但是并不影响 packgetData,可以忽略此错误,接着运行即可。

5. 相关推文

Note:产生如下推文列表的 Stata 命令为:
lianxh api csmar, m
安装最新版 lianxh 命令:
ssc install lianxh, replace

相关课程

免费公开课

最新课程-直播课

专题 嘉宾 直播/回看视频
最新专题 文本分析、机器学习、效率专题、生存分析等
研究设计 连玉君 我的特斯拉-实证研究设计-幻灯片-
面板模型 连玉君 动态面板模型-幻灯片-
面板模型 连玉君 直击面板数据模型 [免费公开课,2小时]
  • Note: 部分课程的资料,PPT 等可以前往 连享会-直播课 主页查看,下载。

课程主页

课程主页

关于我们

  • Stata连享会 由中山大学连玉君老师团队创办,定期分享实证分析经验。
  • 连享会-主页知乎专栏,700+ 推文,实证分析不再抓狂。直播间 有很多视频课程,可以随时观看。
  • 公众号关键词搜索/回复 功能已经上线。大家可以在公众号左下角点击键盘图标,输入简要关键词,以便快速呈现历史推文,获取工具软件和数据下载。常见关键词:课程, 直播, 视频, 客服, 模型设定, 研究设计, stata, plus, 绘图, 编程, 面板, 论文重现, 可视化, RDD, DID, PSM, 合成控制法

连享会小程序:扫一扫,看推文,看视频……

扫码加入连享会微信群,提问交流更方便

✏ 连享会-常见问题解答:
https://gitee.com/lianxh/Course/wikis

New! lianxhsongbl 命令发布了:
随时搜索连享会推文、Stata 资源,安装命令如下:
. ssc install lianxh
使用详情参见帮助文件 (有惊喜):
. help lianxh