先把这个数据集说清楚:城市破产法庭DID数据(2016—2025年),拆开看就是三样东西——城市层级的面板、破产法庭设立这个政策冲击、双重差分的处理组/对照组构造。它之所以被当成工具变量来用,是因为破产法庭的挂牌时间和覆盖城市存在明显的“先后差异”,这种差异天然适合做准自然实验。
这篇文章写给两类人。一类是正在做企业退出、资源配置、营商环境方向实证论文的同学,需要一套能直接跑回归的底层数据;另一类是审稿人视角下想复现结果的研究者,想搞清楚这套数据的构造逻辑到底站不站得住。我会从变量设计、收集过程、模型设定、稳健性检验到踩坑实录,把这条完整链路讲透。
1. 整体设计思路:为什么用破产法庭做工具变量
1.1 破产法庭这个“政策冲击”的识别优势
先回答一个最基础的问题:为什么偏偏是破产法庭,而不是企业破产数量本身?
直接拿破产数量做解释变量,内生化问题非常严重。经济越差的地区,企业破产越多,这是常识;而企业破产又反过来影响当地经济。你根本没有办法分清楚是“经济差导致破产”还是“破产导致经济差”。但法院的设立不一样。某个城市在2019年成立了破产法庭,还是2021年才成立,对单个企业来说基本是外生事件,不太可能因为某家企业的经营状况而倒推影响法院的挂牌时间。这就是工具变量“排他性”的来源。
更关键的是,破产法庭的设立具有很强的“局部性”。它不是全国统一铺开,而是分批、分城市推进的。有的城市早就有了,有的城市到现在仍然是普通商事庭代管。这种时空上的交错,正好构成多期DID的识别条件:有法庭的城市是处理组,没有或尚未设立的城市是对照组。
1.2 为什么选择城市面板而不是企业微观面板
很多人会觉得,既然研究的是企业破产,那当然应该用企业层面数据。这个想法本身没错,但实际操作中会遇到三个麻烦。
第一,企业层面的破产记录高度不完整,尤其是中小企业的破产信息散落在各级法院的公告里,数据清洗成本极高。第二,企业层面的面板很难和法院管辖范围精确匹配,跨区域经营的企业会让你分不清它到底算哪个“处理组”。第三,工具变量法对第一阶段的解释力要求很高,企业层面的噪声太大,反而会弱化工具变量的相关性。
城市面板的优势就在于:一个城市有没有破产法庭、哪一年设立的,这是行政区划级别的硬事实,几乎不可能记错;企业加总层面的指标波动也能被城市固定效应和时间固定效应吸收掉很大一部分。哪怕你后续想下沉到企业层面做异质性分析,城市层面的处理变量依然可以做上层的分组依据。
1.3 时间窗口为什么定在2016—2025年
这个时间窗口是有讲究的。2016年以前,大量城市连“破产审判庭”的概念都没有,数据里的处理组几乎全是0,对照组和实验组没有区分度。而2025年作为截止点,既能覆盖破产法庭集中设立的几年,又能留出至少两到三年的政策消化期,方便做动态效应分析。
更重要的是,2016年之后法院系统的裁判文书上网率明显提升,企业破产案件的案号、受理日期、审理法院都能查到公开记录。也就是说,这个窗口既保证了政策的变异度,又保证了数据可追溯性。你要是把起点拉到2010年,很多控制变量和经济指标反而会缺失得更严重。
2. 变量体系与DID核心变量构造
2.1 最核心的虚拟变量:法院是否已设立
整个数据集里最重要的变量就三个:城市代码、年份、破产法庭是否已设立。
先说“设立”的定义。我建议以首次受理破产案件的日期为准,而不是挂牌仪式日期或者法院编制批复日期。原因很简单:挂牌仪式可以提前举办,编制批复也可以先下文件,但真正对企业和市场产生影响的,是这家法院开始实际审案的那一天。我在核对数据时就发现过,有个城市批复文件和首案受理时间差了半年,如果按批复时间定义处理组,前几期的效果会被系统性低估。
虚拟变量的赋值规则是:城市i在t年首次受理破产案件,则当年及以后取1,否则取0。这一条写进论文的变量说明里其实就一句话,但真正构造起来要命的是那些“从未设立破产法庭”的城市,它们在整个样本期内都必须取0,这部分城市数量还不少,是天然的对照组。
2.2 从DID视角设计clear的分组
标准DID需要两个虚拟变量的交互项:处理组虚拟变量(treat_city)和政策后虚拟变量(post_t)。前者是“这个城市在样本期间内是否设立过破产法庭”,后者是“该年份是否已经达到设立时点”。两者相乘就是你回归方程里的核心解释变量。
这里有一个很容易被忽略的设计细节:那些“在样本期内从来没设立过破产法庭”的城市,treat_city取0,post_t没有意义;而设立过法庭的城市,在设立前treat_city取1、post_t取0,设立后两者同时取1。这样分组的逻辑才干净。
我在整理数据时还顺手构造了一个“设立前一年”的变量,用于事件研究法中的动态效应检验。它的作用是验证平行趋势假设,而不是直接放进基准回归。如果你发现设立前两年的交互项就显著异于0,说明处理组和对照组之间本来就存在趋势差异,你的DID结果就值得怀疑。
2.3 协变量和结局变量的选择
被解释变量方面,我用过最常见的几个:规模以上工业企业数量、新增企业注册量、亏损企业占比、规模以上工业企业资产负债率。如果是做微观机制,更精细的指标包括“破产案件受理数量”“破产重整案件数量”和“破产清算案件占比”。需要注意,破产案件受理数量这类变量受到法院收案口径的影响,同一城市前后年份可能有变化,必须看法院年度工作报告来校准口径。
控制变量组我固定放这几类:经济发展水平(人均GDP)、产业结构(第二产业占比)、地方财政压力(财政赤字率)、金融深化程度(年末金融机构贷款余额/GDP)。这些变量在城市面板里获取难度都不高,但它们的滞后项往往比当期项更稳定,我通常默认滞后一期。
3. 数据来源和整理过程的实录
3.1 每条变量都是怎么来的
城市破产法庭的设立时间,第一手来源是法院系统的对外公告。某市中级人民法院官网的“内设机构”或者该院发布的破产审判白皮书里,通常会写清楚破产审判庭(破产法庭)成立时间、开始受理案件的时间。
但只靠法院官网会漏,我这里推荐三个补充渠道:第一个是全国企业破产重整案件信息网,上面有案号、法院名称、受理时间,能直接用来反推实务中“首次受理”的时间节点;第二个是地方新闻媒体报道,很多城市在破产法庭挂牌时会发通稿,这类信息胜在准确,但需要逐条人工核查;第三个是学术论文的数据附录,已经有不少文章整理了城市破产法庭名单,虽然口径不统一,但做交叉验证效率很高。
3.2 Excel和Stata里的数据清洗细节
收集完原始信息后,我习惯先用Excel完成一版“事件时间表”,格式是:城市代码、城市名称、设立日期、首批案件受理日期、数据来源、备注。这个表格是整个数据集的骨架,之后所有的面板变量都是从它展开的。
把事件表展开成面板时有一个坑:城市的行政区划会调整。有个别城市在样本期内经历了代管关系调整或者行政区划合并,这会导致城市代码和名称对不上。我的处理办法是:以2025年初的行政区划为准,对历史数据做归并处理,并在Notes变量里记录调整前后的对应关系。千万不要用“城市名称”做主键,一定要用稳定的行政区划代码。
3.3 处理“从未设立”的城市还是有讲究的
全样本里如果直接对比“有法庭”和“没法庭”的城市,很可能出现系统性偏差——能设破产法庭的城市通常经济规模更大、企业基数更大、司法资源更充足。如果把这些城市和弱小城市放在一起比,平行趋势基本不可能通过。
所以我在整理数据时专门做了“有效对照”的操作:用倾向得分匹配(PSM)把处理组匹配到经济结构类似的对照组城市。匹配的协变量就用人均GDP、第二产业占比、常住人口这三个,卡尺取0.05。这步做完之后,处理组和对照组的样本量会下降,但回归结果的可靠性会显著上升。
4. 模型设定与实现:从DID到工具变量
4.1 基线DID的回归方程与Stata实现
如果只是想回答“破产法庭设立是否改善了什么”,基线模型可以写成:
$$Y_{it} = \alpha_i + \lambda_t + \beta (Treat_i \times Post_{it}) + \gamma X_{it} + \varepsilon_{it}$$
其中$\alpha_i$是城市固定效应,$\lambda_t$是年份固定效应,$X_{it}$是控制变量。核心系数是$\beta$。
用Stata跑这组回归时,我的标准操作长这样:
xtset city year xtreg y treat_after controls i.year, fe vce(cluster city) est store fe_base聚类标准误一定聚类到城市层面,这一点比怀特稳健标准误更被审稿人接受。另外,treat_after这个交互项不用手工生成,用xtreg加交互写法也可以,但在事件研究图里手工生成的变量更灵活。
如果你用的是R,feols函数更简洁:
library(fixest) model_base <- feols(y ~ treat_after + controls | city + year, data = df, cluster = ~city) summary(model_base)4.2 多期DID的动态效应和事件研究图
当处理时点不一致时,传统两期DID只适合做粗糙的平均处理效应,我更推荐画事件研究图。基本原理是把相对政策时点(event time)的每一期都生成一个虚拟变量,t为负表示设立前,为正表示设立后。
Stata里的实现思路:
- 生成相对年数:
gen event_time = year - first_case_year。 - 剔除event_time < -4或> 4的极端样本,避免少量样本影响估计。
- 以event_time = -1为基准期,生成其他各期的相对时点虚拟变量。
- 回归后绘制各期系数的置信区间图。
如果图中政策前的系数都落在0附近且不显著,支撑你使用DID的证据就比较扎实。政策后的系数如果逐渐变大,还能进一步说明破产法庭的效果存在“逐步显现”的特征。
4.3 破产法庭作为工具变量的第一、二阶段
当要做“破产法庭数量→企业破产退出→经济绩效”这个机制链条时,DID本身不够用,因为它只识别了法庭设立的总效应,你还想剥离出到底是不是“破产退出”这个渠道在起作用。这时候工具变量就上场了。
第一阶段是把内生变量(比如破产案件受理数)对工具变量(破产法庭是否设立)回归:
$$Bankruptcy_{it} = \delta_0 + \delta_1 Court_{it} + \eta X_{it} + \mu_i + \nu_t + u_{it}$$
第二阶段:
$$Y_{it} = \rho_0 + \rho_1 \widehat{Bankruptcy}{it} + \theta X{it} + \phi_i + \pi_t + e_{it}$$
在Stata里直接用ivreghdfe:
ivreghdfe Y (Bankruptcy = Court) controls, absorb(city year) cluster(city)注意第一阶段的F统计量要超过10,这是Staiger-Stock经验法则。如果F值太低,说明“破产法庭”这个工具变量和内生变量之间相关性偏弱,必须改用其他的机制变量。
4.4 排除法和安慰剂检验
工具变量的排他性最难解释清楚。审稿人最爱问的一句话是:破产法庭设立还可能通过什么渠道影响Y,不仅仅是破产退出吧?
我的做法是做出三层排除。第一层,把那些也可能受到法庭设立影响的变量(比如司法支出、企业诉讼率)作为被解释变量跑一遍,如果显著,说明法庭确实通过这些渠道发挥了作用,那“破产退出”这个渠道就站不住。第二层,只保留“调解结案率”“执行结案率”这类理论上不受破产法庭影响的指标做安慰剂检验。第三层,随机打乱政策时间,重复500次,画出系数的核密度分布图,如果真实估计值落在随机分布的外侧,说明结果不是偶然。
5. 常见问题与排查技巧实录
5.1 同一城市不同来源的设立时间不一致
这是最容易遇到的问题。比如A官网说2019年挂牌,B公告上首个案号却是2020年。我排查的思路是:把“挂牌时间”和“首次实际受理时间”区分开,然后以首个案号年份作为面板变量。因为行政行为有时滞,研究经济效应时要看实际发生的时间,而不是纸面文件的时间。
如果两个来源的首案受理日期仍然不同,就翻法院季报或审判白皮书,以公开出版物正式记载的日期为准。实在对不上的,在附录里注明“该城市设立日期存在口径争议,已取较早时间做稳健性检验”。
5.2 破产案件数据断崖式下滑
有些城市在某个年份改了收案口径,或者开始推广破产预重整制度,导致数据出现断崖。遇到这种情况,先别急着扔掉异常值,要把这个突变和当地法院的工作报告对照。如果是收案口径调整,我一般直接删掉该城市这一年的样本,并在论文里说明。如果是制度性变化,比如预重整制度引入,反而可以做一个“法庭设立前后、新旧制度交叠”的异质性分析。
5.3 平行趋势检验不过怎么办
平行趋势检验不过,是DID实证中最头疼的问题。我遇到这种情况会分三步走。
第一步,检查是不是对照组选择偏差。尝试缩小样本范围,只保留规模类似、地理相邻的对照城市。第二步,做合成控制法(Synthetic Control),给每个处理城市合成一个虚拟对照,用均方误差最小化来确定权重。这相当于把不满足平行趋势的部分“硬掰”过来。第三步,如果前面都救不回来,那就老老实实承认只做机制分析,不做因果识别,把论文从政策评估改成相关性研究框架。
5.4 面板数据里的零值问题
城市面板里经常出现破产案件数为0的情况。这种数据不能直接取对数,常规做法是加一个极小值取对数,但我更建议直接保留线性形式。破产案件数为0到底意味着“没有”还是“数据缺失”,要结合法院是否已经设立来判断。政策前为0、政策后大量为正,这是合理的;如果政策后仍然为0,那有可能是数据漏录,得查一下该市的年度审判白皮书。
6. 实操体感:这份数据的适用范围和边界
数据用了两年多,最大的体感是:它的核心价值不在资产负债表型的企业绩效指标上,而在企业进入退出和资源配置类指标上更能出效果。
做企业绩效(如利润率、杠杆率)时,法庭设立的影响信号会被太多因素淹没,显著性和经济解释都很难落地;但做企业退出、僵尸企业出清、新增企业注册时,效果非常明显——法庭把“能退”和“不能退”的企业切得更干净了,市场主体的新陈代谢速度被政策加速了。
另外,一份工具变量数据的说服力并不在数据本身,而在你后续处理细节里的“小心思”。比如有没有排除直辖市样本做稳健性检验,比如有没有单独看“虽然设立了法庭但实际上很少审案”的弱工具城市,这些细节都会直接影响实证结果的置信度。
我最想提醒的一点:这套数据适合做减法,不适合做加法。它的识别逻辑干净,就意味着不能往里塞太多控制变量,否则会吸收掉工具变量的外生变异。我自己被审稿人问倒过一次,原因就是控制变量里放了一个“区域司法支出”,这个变量和破产法庭设立高度相关,直接让第二阶段结果大幅缩水。
如果你也在做破产制度、营商环境或者资源配置类的研究,城市破产法庭DID数据是一个值得反复打磨的基础资产。建议拿到基础表之后,第一步先画出处理组和对照组的核心结果变量时间趋势图,确认有没有肉眼可见的“断裂”,再决定下一步往哪走。这个习惯能帮你省下后面大量的返工时间。