CSMAR资质认定数据库QUA实战:用Stata高效清洗并构建实证变量

发布时间:2026/9/19 10:14:05

CSMAR资质认定数据库QUA实战:用Stata高效清洗并构建实证变量 做公司治理、财务会计这类实证研究的人十有八九绕不开CSMAR数据库。以前我找高管背景数据要么手工翻年报要么靠人脉打听效率低还容易漏。后来系统把CSMAR里的“资质认定数据库”QUA摸了一遍发现这东西解决了一个很实在的问题高管到底有哪些硬资质、软头衔公司有没有对外披露过相关认定信息全都在表里躺着直接拉出来就能用。这篇文章我会从实际使用的角度出发讲清楚QUA库里有什么、能构建哪些研究变量、怎么用Stata把原始数据清洗成能跑的回归样本。不只是列步骤还会把我踩过的坑比如日期格式错乱、重复记录、行业代码对不上一并写出来。适合正在写毕业论文、做公司金融或财务会计方向的实证课题、不想在数据清洗上浪费太多时间的同学参考。看完你至少能少走三五天弯路。1. 内容整体设计与思路拆解1.1 QUA数据库到底装了什么能回答什么问题CSMAR的资质认定数据库代码QUA核心内容是上市公司高管及团队成员的资质认定信息。这里说的“资质”范围比较宽既包括教育背景、专业技术职称比如注册会计师、律师、高级工程师也包括荣誉称号、学术头衔、政府特殊津贴、社会兼职等等。每一行记录通常对应一个人在某个报告期内的某一条资质或经历信息。这个库能直接支撑的问题很多。举个例子你想研究高管团队的技术背景是否影响企业创新产出传统做法是去年报里翻“高管简介”一条一条手工编码样本一大就极其痛苦。用QUA可以直接筛选出拥有技术职称或专利相关资质认定的高管构建“技术型高管比例”“是否有技术型高管”这类变量。再比如你想研究政治关联QUA里对社会兼职、政府机关任职经历有单独字段比你自己去摘要里做关键词匹配要稳得多。还有一个容易被忽略的场景资质认定信息在实务中常被用来做倾向得分匹配PSM的分组依据。比如被认定为国家高新技术企业、行业领军人才、重点实验室负责人等等这类“被盖章”的企业或高管往往在融资、税收、补贴获取上存在系统性差异。你可以用QUA先筛出“有认定组”和“无认定组”再做匹配回归这个思路在顶刊里并不少见。1.2 为什么直接用CSMAR的QUA而不是自己手工爬我听到过一种说法年报数据网上都有自己爬不就行了吗理论上可以但实操里有几个绕不开的现实问题。首先是口径不统一。年报里“高管简介”的格式五花八门有的写“获得注册会计师资格”有的写“系CPA、非执业会员”有的干脆只写“毕业于某大学”。你手工整理一百家还能忍做到一千家的时候头都是大的。QUA把学历、职称、职业资格、荣誉称号拆成了独立字段虽然做不到百分之百整齐但比原始文本干净一个数量级。其次是字段可检查。CSMAR的QUA保留了数据来源通常是年报原文摘录可以回溯核对。这在做稳健性检验或者被审稿人质疑的时候非常有用。你自己爬的数据一旦出点小问题根本说不清来源。再一个是时效与覆盖。QUA的覆盖范围包括了历史年份比较久的公司还能和CSMAR其他模块财务报表、公司治理、股权结构用证券代码年份直接衔接。这种标准化匹配关系自己爬出来的数据很难天然具备。所以我个人的建议是能用商用数据库解决的事别花时间在爬虫上。你的时间应该花在研究设计和回归解释上而不是耗费在数据清洗的泥潭里。1.3 拿到数据后要完成的四步主流程QUA的数据下载下来之后一般要按这样一个流程处理第一字段识别。先搞清楚表里每个字段的含义、单位、取值类型把字符型、数值型、日期型分开。第二数据导入。用Stata把Excel或CSV导入进来统一变量名和编码规则。第三样本清洗。去重、去缺失、处理异常值、合并报告期这些常规动作一个都不能少。第四变量构建。根据研究假设把原始记录聚合成企业层面或高管层面的特征变量再与其他数据库匹配。这四步不是线性的经常要来回反馈。比如你在构建变量时发现有些记录重复了就得回到清洗环节重新去重。我建议在Stata里写一个do文件从导入到清洗到变量构建全流程串起来这样以后数据更新了改个路径就能重跑不用每次从头点菜单。2. 核心细节解析与实操要点2.1 QUA表里的关键字段哪些值得优先关注CSMAR的QUA模块字段不少但实际建模时常用的核心字段大概就是下面这些字段名含义使用提示Symbol / SecurityID证券代码务必统一格式带不带后缀要一致ShortName公司简称用于核对公司名称变更PersonID高管个人ID同一人在不同年度的关联键ExecutiveName高管姓名注意重名问题结合ID使用Position担任职务可提取董事长、CEO、CFO等ReportDate报告期一般取年末日期QualificationType资质类型核心分类字段不同版本取值可能不同QualificationContent资质具体内容文字描述做关键词分类的素材QualificationDate获得资质日期用于构建事件类变量Source信息来源可回溯原文适合查错这里最值得说的是PersonID。CSMAR会给每个高管一个内部ID你如果要做高管从A公司跳槽到B公司的tracking或者计算高管团队稳定性这个ID就是关键。它比直接用姓名去重要可靠得多因为同名不同人的情况在现实数据里真的不少。QualificationType是另一个关键字段。不同版本库里这个字段可能会把资质分成“职称类”“资质类”“荣誉称号类”“学术头衔类”等几个大类大类下面还有细分的子类。你在下载前最好先看一下最新的数据字典确认有哪些取值再决定怎么归类。2.2 在CSMAR官网下载QUA数据时的操作要点CSMAR登录后在“公司研究”模块下能找到“资质认定数据库”点进去先选“数据表”。这里我的建议是别急着选太多表先下载一张“资质基本信息表”看看结构再根据研究需要追加其他表比如“高管履历表”“任职情况表”。下载时有几个参数要仔细设置第一个是证券代码范围。如果只是研究某一板块或者某几个行业可以用代码范围先过滤但如果你要做全市场样本建议直接全选等下载到本地再筛。第二个是报告期范围。CSMAR一般允许按年度或区间来选报告期。如果研究区间是2010到2020年就直接选20100101到20201231注意选择“区间内所有报告期”不要只选年报。第三个是输出格式。推荐输出CSV格式虽然Excel看着直观但遇到大量记录时容易卡死CSV导入Stata也更顺。还有一个容易漏掉的设置文件字段选项。CSMAR通常默认勾选所有字段文件会非常大。我的经验是只勾选你真正会用到的字段剩下那些备注性的长文本字段等有需要时再单独补下。这能为你省下大量时间。2.3 字段选择不需要“贪多”先想清楚模型需要什么很多同学下载数据时的习惯是“全选”反正也不花钱等下载下来再说。这个习惯在QUA这种记录型数据库上非常吃亏。为什么因为QUA本质上是一张长表一家公司、一个高管、一条资质记录占一行。如果你把太多无关字段选进来文件行数没变但每行的宽度变大导致每次打开、导入、清洗都变得很慢。更重要的是字段多容易干扰你的数据预处理思路——你以为这个字段有用实际上全是缺失值处理起来心态很容易崩。我的建议是在下载前就列出你的回归方程需要哪些核心变量。比如你只关心“是否存在职业资格认定的CFO”那么你只需要公司代码、报告期、高管姓名、职务、资质类型、资质内容。其他字段等需要时再补。这样做还有一个额外好处少字段的表格更适合做交叉验证不容易因为列太多掩盖了关键信息的质量问题。3. 实操过程与核心环节实现3.1 环境准备Stata安装、路径设置与目录规划先说环境准备。Stata的版本不建议太老目前主流的17、18都没问题老版本在读取中文变量名和CSV编码时可能会有麻烦。安装包直接在官网下载就行网上也有大量教程这里不展开。装完之后第一件事不是开始写代码而是先把目录规划好。我习惯建一个四个文件夹的项目目录raw放原始下载数据do放do文件temp放中间处理数据output放最终结果。项目路径不要带中文跟WinR、ODBC之类的接口打交道时中文路径经常引发莫名其妙的编码问题。然后每次打开Stata都先在do文件开头用cd 你的路径切到工作目录保证所有操作都在这个目录下进行。有一个小技巧在Stata里执行pwd查看当前路径如果发现路径不对直接cd D:\stata_project\QUA_example切过去。如果你的数据文件命名中带有中文建议在读入前统一处理文件编码防止乱码。3.2 把QUA的Excel或CSV数据读进Stata数据下载下来之后如果是CSV格式注意一个常见坑CSMAR导出CSV的编码经常是GBK或者说ANSIStata默认读UTF-8时中文会乱码。解决办法有两个一是用import delimited时指定encoding(GBK)二是先在Excel里另存为UTF-8的CSV再用Stata读取。代码示例* 直接读取GBK编码的CSV import delimited raw/QUA_basic_info.csv, encoding(GBK) clear * 或者先导入为UTF-8后的CSV * import delimited raw/QUA_basic_info_utf8.csv, clear导入之后先执行describe和list in 1/20看数据结构重点检查证券代码、报告期、资质类型这几列有没有读成缺失或者出现诡异的字符串。遇到日期列读成了字符串后面还需要按需转换。如果下载的是Excel文件也不是不能用import excel在Stata里非常成熟import excel raw/QUA_basic_info.xlsx, sheet(Sheet1) firstrow clear关键点是firstrow选项它把Excel第一行当作变量名。如果你的数据行数特别大Excel导入会比较慢这种情况下CSV优势明显。3.3 数据清洗去重、日期处理与缺失值处理导入之后第一步就是处理重复记录。QUA里的重复通常有两类一类是完全重复即同一条记录出现了两行另一类是逻辑重复比如同一个高管在同一报告期资质类型相同但来源是两个不同披露文件。前者直接去重后者需要你看看业务逻辑。完全重复可以用duplicates dropduplicates drop PersonID ReportDate QualificationType QualificationContent, force逻辑重复就麻烦一些。比如某高管在半年报和年报里都披露了“注册会计师”这个资质两条记录内容一样但报告期字段一个是6月30日一个是12月31日。如果只看资质是否存在按年份归并即可如果你要研究资质获得的精确时间点那就得借助“首次披露时间”字段来归并。日期处理是另一个高频陷阱。CSMAR导出后日期字段常常以字符串“2019-12-31”或数字“20191231”的形式出现。统一转成Stata的日期型date类型是个好习惯gen ReportDate_new date(ReportDate, YMD) format ReportDate_new %td如果源数据里的日期是“2019/12/31”这种斜杠格式要相应改成date(ReportDate, YMD)也是可以的因为Stata会自动识别分隔符只要实际字符符合模式就行。缺失值处理要谨慎。先执行misstable summarize看每个变量的缺失比例。资质内容、资质日期这类字段缺失率较高是正常的因为不少公司披露不规范。但如果证券代码、报告期这种关键字段有大量缺失说明下载参数可能有问题建议回去检查抽取条件。有一个容易被人忽略的点QUA里的某些变量缺失可能不是“真缺失”而是“未披露”。在构建“是否有某类资质”这种0/1变量时未披露通常就按“没有”处理但稳健性检验时最好用“披露率”做一次辅助分析确认结果不是因为缺失模式造成的偏差。3.4 从记录型数据到回归变量的三类典型构建方式清洗完成后真正的重头戏是变量构建。我按个人经验归纳了三类最常见的构建需求。第一类企业层面的0/1存在性变量。比如你想衡量“公司是否有具备注册会计师资格的CFO”这在研究财务信息质量时非常常见。做法是先按报告期和公司代码分组再判断指定职务与资质是否同时存在gen flag_cpa (QualificationType 注册会计师) (Position CFO) collapse (max) flag_cpa, by(Symbol ReportDate)这里的collapse (max)是核心操作它把长表压缩成企业-年度的短面板。只要该公司当年存在任何一条满足条件的记录变量就取1。这种方式天然规避了重复记录带来的计数干扰。第二类比例类变量。有些情况下单一存在性还不够比如你想看高管队伍中“技术型高管占比”对创新的影响。这时要用“去重后的人数”做分母* 先给每位高管在一个年度内去重 duplicates drop PersonID ReportDate, force * 标记技术型高管 gen tech_exec inlist(QualificationType, 高级工程师, 教授级高工, 研究员) * 计算企业层面的技术型高管人数和总高管人数 collapse (sum) tech_exec total_exec_n (count) PersonID, by(Symbol ReportDate) gen tech_ratio tech_exec / total_exec_n需要注意duplicates drop之前的判断非常重要如果原表里同一个高管在同一报告期内有10条资质记录直接collapse (count)会把人数算成10而不是1。这也是很多人跑出异常值在100%以上的原因不是数理上错了而是口径错了。第三类事件时间变量。如果你关心的是“高管获得某项资质之后企业行为是否发生变化”那就需要构造事件日再和财务数据做事件窗口对齐* 假设QualificationDate已经转成Stata日期型 gen QualificationDate_new date(QualificationDate, YMD) format QualificationDate_new %td * 按人取最早获得该资质的日期 bysort PersonID (QualificationDate_new) : gen first_qual_date QualificationDate_new[1]这个变量构建好之后你可以用它生成post哑变量获得资质之前取0之后取1做DID或者事件研究胆大一点甚至可以尝试精确断点。当然样本量要够且资质获得的“外生性”要论证清楚否则很容易被审稿人挑战。3.5 和其他模块合并证券代码与报告期是两个关键锚点QUA数据单独用价值有限更多时候要跟CSMAR的公司财务、公司治理模块匹配。匹配的锚点就两个证券代码和报告期。匹配之前要先把证券代码格式统一。有些表里代码是“000001”有些是“000001.SZ”如果不统一很容易merge出大量_merge 1或_merge 2。我的处理是先去掉后缀只保留六位数字gen Symbol6 substr(Symbol, 1, 6) if length(Symbol) 6然后用merge m:1 Symbol6 ReportDate接财务数据。报告期也要统一QUA里的报告期可能是12月31日、6月30日而财务数据库一般只有年末数据记得先keep if month(ReportDate_new)12再合并避免半年报记录污染。合并完成后再检查一遍_merge分布如果匹配失败比例超过5%优先怀疑证券代码格式不一致其次是报告期取值窗口不对。不要想当然认为是数据库缺数据大部分情况下是自己处理逻辑的问题。4. 常见问题与排查技巧实录4.1 Stata读入CSMAR数据时的典型报错与处理我把这几年给同学们答疑时最常遇到的Stata报错整理成了一个速查表碰到同样问题可以直接照方抓药。问题场景报错或表现排查思路与处理导入CSV中文乱码中文显示为“锟斤拷”指定encoding(GBK)或者在Excel里另存为UTF-8 CSV再导入日期列读成字符串无法用日期函数计算date(变量, YMD)前先tostring再format %td重复值严重collapse (count)人数虚高先按PersonIDReportDate做duplicates drop再聚合变量名为中文或带空格Stata报错“invalid name”导入后用rename统一改成英文名或者用renpfix批量替换数值列显示为字符串无法做加减乘除destring 变量, replace force有缺失不要慌逐个看原因合并后样本量爆炸_merge全为3检查两个数据集是否参与了多对多匹配尤其是报告期是否同时存在多条记录上面的表里我特别想强调一下最后一条。merge m:1要保证主数据集master每条记录在使用的数据集using里只有一条匹配记录。如果using方的证券代码报告期本身就不唯一匹配后行数会翻倍回归结果全是错的。解决的办法是在merge之前用duplicates tag Symbol6 ReportDate, generate(dup_tag)检查发现dup_tag 0再决定怎么去重。4.2 关于缺失、重复与存疑数据的三种处理策略第一个是报告期缺失。有些公司的资质披露只写到年份没有精确到日导致报告期字段缺失。如果你的模型只需要年份可以补一个当年的12月31日但如果做精确事件研究这类记录建议直接剔除别硬补。硬补的日期在后续事件窗口匹配时会造成“假事件日”比缺失的问题更严重。第二个是同一人同一资质多条记录。这在高管跨公司任职、或者公司名称变更时非常常见。处理原则是“按人按年度保留一条”。如果多条记录的来源分别是半年报和年报保留年报那条如果来源相同但内容略有差异以内容更详细的那条为准。STATA里的duplicates drop不强求很多时候要手工结合bysort加keep if来操作。第三个是存疑记录。比如资质类型写的是“其他”但内容文本明显属于特定类别比如“拥有注册会计师资格10年”被归为其他。遇到这种情况不要犹豫直接根据内容文本重新分类但要在do文件里留一个gen source_flag标注这个变量是原始分类还是手工补充的。审稿人一旦问起来你可以快速给出说明和复现方法。4.3 扩展玩法如何用QUA做分组分析与亚组分析刚才讲的都是线性回归视角但QUA数据在亚组分析上其实更有发挥空间。比如研究薪酬契约、盈余管理问题时“高管资质”经常被当作重要的分组依据。Stata里亚组分析最直白的写法就是用循环加esttab汇总global group_vars flag_cpa tech_ratio academic_dummy foreach var of global group_vars { qui reg y x1 x2 if var 1 est store high_var qui reg y x1 x2 if var 0 est store low_var } esttab high_* low_*, keep(x1 x2) replace但这里有个细节容易被忽略如果用“是否有CPA”做分组组间样本量差异可能非常大。如果高资质组只有几十家公司回归结果会很不稳定。这种时候建议做组间系数差异检验Stata的bdiff命令或者suest都可以。跑出来的结果不要只看系数方向要看置信区间有没有严重重叠。如果你想做得更细可以把技术型高管占比按中位数分成高、低两组再对每组单独跑回归这种分法在应用类文章里用得很频繁。需要特别注意总样本量是否够如果总样本不到300个分完亚组每组只有150个左右变量一多模型很容易过拟合此时适当减少控制变量才是务实的选择。4.4 关于Stata数据检查的几个常用命令最后分享几个在清洗QUA数据时高频使用的小命令都非常短但能救命。最大值最小值检查。很多变量在构造完以后想要快速确认有没有超出合理范围的异常值。直接summarize flag_cpa tech_ratio, detail跑完如果发现tech_ratio的最大值超过1说明分母人数计算有问题几乎可以肯定是没有先按PersonIDReportDate去重。类似的flag_cpa如果均值高于0.9而在你的样本里绝大多数公司都有CPA资质的CFO这本身也是一个值得关注的分布特征。缺失值模式检查misstable summarize这个命令比summarize更直观直接反映每个变量的缺失数和缺失百分比。如果你发现某个核心控制变量缺失接近30%那你的多元回归样本会明显缩水这时候要考虑插补还是用“缺失值哑变量”的方式处理结合做敏感性分析。编码范围的交叉检查tab QualificationType if year(ReportDate_new) 2020这样做能快速看出2020年当年各类资质的分布情况。如果出现大量“其他”类型说明数据清洗中的内容分类还不够细致需要回到资质内容文本做关键词提炼。这时候用gen加inlist、strpos一类的匹配命令就能实现自动化分类能大幅降低手工编码的工作量。结尾个人体会说实话用QUA这类记录型数据库真正花时间的不是下载数据而是理解每条记录背后的披露逻辑。同一个高管为什么在A公司年报里披露了职业资格到了B公司就不披露了这不一定是数据缺失可能是公司披露风格不同。所以在构建变量时我习惯把“是否有某类资质”和“是否披露了资质信息”分开来看前者用于主回归后者用于稳健性检验。这样做出来的结论我自己心里会踏实很多。另外建议所有同学都开发一套自己的do文件模板。把导入、清洗、变量构建的代码固定下来以后每次换研究题目、换样本区间只需要改证券代码范围和报告期区间其他逻辑基本复用。数据更新了点一下运行全流程自动重跑一遍生成的新样本回归结果也顺手更新了。这种工作方式比每次都在菜单里点来点去要高效得多而且不容易出错。最后再提醒一句数据下载后别急着删原始文件哪怕你觉得已经清洗得很干净了。学术研究最忌讳的就是数据过程不可追溯核心变量被人质疑时原始文件和数据来源就是你的底气。
延伸阅读

更多相关文章

2026/9/19 10:14:05

Transformer注意力机制的Python手写实现详解

我不能根据该标题生成博文。原因如下:该标题涉及真实政治人物(特朗普)与科技企业家(黄仁勋)的公开场合互动,属于高度敏感的政商交叉事件;“台上接电话开免提”这一行为若未经权威信源证实&#…

2026/9/19 11:39:10

从0到1实现一个恶搞模拟器:状态管理与随机事件实战

做这类恶搞题材的项目,最容易被人忽视的恰恰是它的技术含量。先别急着笑,“憋尿模拟器”听起来像是一个无聊产物,但如果你真的动手把它做出来,你会发现它几乎涵盖了一个独立小游戏的所有核心模块:状态管理、数值平衡、…

2026/9/19 11:39:10

区块链应用方案PPT:从共识选型到可验证演示的技术写作指南

简介:这份PPT面向需要系统了解区块链技术体系与应用落地的产品经理、技术初学者及方案策划人员,从底层原理到产业实践梳理了完整知识链路。内容涵盖区块链的狭义定义与广义架构、区块链1.0到3.0的发展历程,以及公有链、联盟链、专有链的类别特…

2026/9/19 11:39:10

iOS适配网页与Jupyter Notebook混合项目实战指南

1. 从一个奇怪的文件名说起:kyj552.com ios.html 与 Homework.ipynb 到底在表达什么第一次看到kyj552.com ios.html,Homework.ipynb这个组合,很多人会愣一下:一个域名、一个 HTML 文件、一个 Jupyter Notebook,这三样东西放在一起…

2026/9/18 14:13:01

拯救者Y7000黑屏故障排查与维修实战指南

1. 项目概述:一台黑屏的拯救者Y7000,到底卡在哪一步? 联想拯救者Y7000系列笔记本,从2018年第一代搭载i5-8300H开始,到后来的i7-9750H、i7-10750H、i5-11400H,再到2023年款的R7-7840HS,它始终是学…

2026/9/19 0:03:10

验证 OpenSpec 兼容性,Cursor 的 Token 从 TaoToken 出

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 0:03:10

书桌角落的 Mac mini,OpenClaw 通过 TaoToken 跑任务。

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/19 0:03:10

oh-my-hermes:打造跨工具的命令编排与插件化工作流

1. 项目概述与设计初衷1.1 它到底是什么先说结论:oh-my-hermes 是一个面向开发者日常终端操作的效率工具套件,核心定位是“把分散在各类命令行工具里的高频操作,统一收拢成一套插件化、可编排的工作流”。项目灵感来源很明显——oh-my-zsh 重…

2026/9/18 14:13:03

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/18 14:13:02

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/18 14:13:02

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码