做年度复盘的时候翻到去年跑完的这个DID课题,还是有很多值得再抠一遍的细节。标题叫“2005-2024年上市公司受直播电商影响DID”,乍一看像是个标准实证项目,但真正上手以后你会发现:处理组怎么定义、时间窗口怎么切、交错处理下的稳健性怎么做,每一步都能把人绕晕。这篇文章不打算写成教科书式的计量经济学讲义,而是把我在这个项目里踩过的坑、最后采用的识别思路、以及整套检验框架完整拆出来。如果你正在做直播电商、数字经济或者平台经济相关的上市公司实证研究,这篇内容应该能帮你少走不少弯路。
先说结论:这类研究的核心难点不在于跑回归,而在于“受直播电商影响”这件事本身没有一个统一口径。你把它定义宽了,处理组里混进大量无关公司;定义窄了,样本量不够,显著性全靠运气。下面我从时间窗口、口径选择、模型设定、稳健性检验和数据清洗五个角度,把这个项目的完整思路过一遍。
1. 2005到2024这个跨度:对DID识别到底意味着什么
1.1 直播电商不是一次性政策,而是渐进式冲击
传统教科书里的DID通常对应一个明确的时间节点,比如某项政策在某年落地,之后所有处理组同时被“处理”。但直播电商完全不是这个逻辑。行业普遍把2016年前后看作直播电商的起步阶段,之后的几年里平台基础设施、用户习惯、商家参与度都是逐渐成熟的。这意味着每家上市公司进入“直播电商影响”的时间点并不统一:有的公司2017年就开始布局,有的直到2021年才第一次把直播纳入核心渠道。
这种渐进式冲击带来的第一个问题就是:处理时点到底怎么取。如果统一把某一年作为全局处理节点,会严重误判那些早进入或晚进入的公司。我在项目里采用的是“公司层面首次披露直播电商相关业务活动的年份”作为处理时点,而不是行业统一年份。这个口径后面会详细说,但它直接决定了模型从两期DID变成了交错DID,也决定了后续检验方法的选择。
1.2 为什么必须从2005年开始建面板
很多人会问:直播电商2016年才起来,你拉2005年的数据干什么?实际上这段时间不是用来做处理分析的,而是用来做两件重要的事:第一,构建足够长的处理前基线,让平行趋势检验有能力去排除“处理组和对照组本来就走在不同增长路径上”的替代解释;第二,为倾向得分匹配提供处理前一期或前多期的公司特征,避免用处理后的信息去预测处理状态,那会引入严重的反馈偏差。
我实测下来,如果面板只从2013年开始,处理前只有三年窗口,动态效应模型里event time在-3之前完全没有数据,平行趋势检验的说服力会打折扣。拉长到2005年之后,虽然2005到2010这段数据里很多公司还是传统零售形态,但它能为你提供5到10期不受直播电商干扰的干净基线。当然,这里有个现实约束:A股上市公司在2005年就有完整财务数据的其实只是一部分,后面会讲到非平衡面板怎么处理。
1.3 主回归窗口和处理前窗口的取舍
我的做法是把样本区间拆成两套配置来做。主回归用2013到2024年,这样处理前有大约三年窗口可以用来画平行趋势图,处理后覆盖了直播电商从起步到成熟的全过程。另一套稳健性配置用2008到2024年,处理前拉得更长,用来检验早期趋势是否也没有分化。
这里有个容易被忽略的点:2020到2022年疫情期间,线下消费场景收缩,直播电商反而承接了大量需求。如果你只用年份固定效应,那么这一年对处理组和对照组的冲击是不对等的——处理组里消费品公司占比高,疫情期间的线上替代效应强,年份固定效应只能吸收全样本共同的宏观冲击,没办法消除“行业特定时间冲击”。所以我在所有回归里都加入了行业与年份的交互固定效应,至少把行业层面的时间异质性控住。
2. 处理组与对照组:这个项目里最关键的识别口径选择
2.1 “受直播电商影响”的两种常见定义
用行业分类来划处理组是第一种思路。比如把零售、美妆、纺织服装、家用电器这些直播渗透率高的行业作为处理组,其他行业作为对照组。优点是好操作、可复现,缺点是行业和行业之间的边界本身是模糊的,而且同一行业内头部公司和尾部公司的直播参与度天差地别。用行业口径处理,等于假设同一行业所有公司受到了同等强度的冲击,这个假设太强了。
第二种思路是用公司层面的行为信息来识别处理状态。我最终采用的做法是:遍历样本期内上市公司的年报、半年报和重大公告,看是否出现“直播电商”“直播带货”“达人直播”“店铺自播”等关键词;第一次出现该关键词的年份,就是这家公司的处理时点。这个做法的逻辑很直接:公司自己披露了相关业务,说明直播电商已经实质性影响它的经营活动,而不是停留在概念层面。
2.2 行为口径下的处理组构造规则
但关键词识别本身也会踩坑。我最初直接搜“直播”两个字,结果把大量“直播抽奖”“直播股东大会”之类的噪音样本也纳入了处理组。后来把检索词限定在电商业务相关的组合词上,并剔除了仅有一次性事件披露的公司。具体筛选规则我总结成了一张表:
| 筛选环节 | 具体处理规则 | 目的 |
|---|---|---|
| 首次披露年份 | 公告中出现目标关键词的最早年度 | 确定处理时点 |
| 持续性验证 | 后续年度至少再次出现相关关键词,或电商渠道收入连续两年披露 | 排除一次性蹭热点公司 |
| 业务相关性 | 关键词上下文与销售渠道、电商收入、营销投放相关 | 排除“直播”的无关含义 |
| 退市排除 | 处理时点前已退市的公司直接剔除 | 避免处理状态无法观测 |
这个筛选规则会显著改变样本结构。我对比过,宽松口径下处理组可能有上千家公司,收紧之后剩下六百多家,但回归结果反而更干净,显著性和系数稳定性都更好。所以说处理组不是越多越好,质量比数量重要。
2.3 对照组选择与自选择问题
有了处理组,对照组也不是随便从剩余公司里抓一把就行。理论上对照组应该是在处理前与处理组有相似特征、但没有进入直播电商业务的公司。这里最大的威胁是自选择:可能并不是直播电商影响了公司业绩,而是那些本来就更有增长潜力的公司更愿意去做直播。为了缓解这个问题,我用了处理前一期或前两期的滞后变量做倾向得分匹配,匹配变量包括公司规模、资产负债率、营业收入增速、总资产收益率、上市年限和行业虚拟变量。匹配之后再跑DID,也就是常说的PSM-DID。
有人会问:既然都用了公司固定效应,为什么还要匹配?公司固定效应只能吸收不随时间变化的不可观测因素,如果处理组和对照组在处理前就处在不同的增长轨道上,固定效应救不了你。PSM的作用就是尽量把两者的处理前特征拉平,让后续DID的比较更接近“随机实验”。
3. 基准回归模型的变量设计和标准误陷阱
3.1 基准方程到底长什么样
这个项目里我用的是如下形式的双向固定效应模型:
Y_it = α + β · Treat_i × Post_it + γ · X_it + μ_i + λ_t + ε_it
其中Treat_i是公司是否属于处理组的虚拟变量,Post_it是公司i在t年是否已经处于直播电商影响期的虚拟变量,交叉项系数β就是我们要估计的处理效应。μ_i是公司固定效应,λ_t是年份固定效应,X_it是控制变量。注意这里我没有单独放Treat_i和Post_it的主效应,因为公司固定效应吸收了Treat_i,年份固定效应吸收了Post_it。
被解释变量Y我同时用了营业收入对数和总资产收益率两个口径。营业收入对数衡量规模层面的影响,总资产收益率衡量盈利能力层面的影响。跑下来你会发现,直播电商对公司收入规模的影响往往显著为正,但对盈利率的影响没那么稳定——这个结果其实很符合直觉,因为直播渠道在早期往往伴随高营销费用和低价策略,“增收不增利”是行业常态。
3.2 控制变量不是越多越好
我控制变量组里最终只留了三类:公司规模(总资产对数)、财务杠杆(资产负债率)和成长性(营业收入增速)。为什么不多放一些?因为控制变量一旦包含处理结果的前导变量,比如当年的销售费用率、当年的毛利率,就会出现“坏控制变量”问题——它们在因果路径上,放进回归会吸收掉一部分真实处理效应。
还有一类变量要特别小心:那些在直播电商兴起前就已经决定了公司线上化程度的变量。这类变量应该放进匹配方程,而不是放进结果方程。我见过很多初学者把“线上销售收入占比”当成控制变量放进基准回归,这等于把处理效应本身的一部分给控制掉了,β当然会偏低。
3.3 聚类标准误的层级选择及其影响
标准误聚类层级是容易被忽视但影响很大的决策。如果处理效应在行业层面有共同冲击,而你只是按公司聚类,标准误很可能被严重低估。我用行业加年份交互固定效应做了几轮检验,最终选择的是公司层面聚类和行业层面聚类各跑一遍,如果核心结论在两种聚类方式下方向一致、显著性不出现“只在某一层级显著”的情况,我才认为结果是可信的。
这个问题的实质是:同一行业里的公司,在直播电商冲击下受到的扰动往往是相关的。你不把这种组内相关性考虑进去,显著性只是一个幻觉。更严谨的做法是用行业聚类的同时,在回归中吸收行业和年份的交互固定效应,这时剩余的行业共同冲击已经被部分吸收,标准误会更接近真实水平。
基准模型部分的完整维度我列个表:
| 维度 | 设定 | 说明 |
|---|---|---|
| 被解释变量 | 营业收入对数、总资产收益率 | 分别衡量规模效应和盈利效应 |
| 核心解释变量 | Treat_i × Post_it | 处理组进入影响期后的增量效应 |
| 控制变量 | 总资产对数、资产负债率、营业收入增速 | 避免纳入结果路径变量 |
| 固定效应 | 公司固定效应 + 年份固定效应 | 基准设定 |
| 补充固定效应 | 行业×年份交互固定效应 | 控制行业时变冲击 |
| 聚类层级 | 公司层面 / 行业层面 | 结果需要同时稳健 |
4. 交错处理下的稳健性检验:从平行趋势到安慰剂
4.1 为什么传统的两期DID在这里不够用
如果处理时点统一,传统DID的估计量是干净的。但在我们这个项目里,每家公司的处理年份不同,如果用双向固定效应去估计一个统一的β,它实际上是多个“2×2 DID”的加权平均。这个加权平均的问题在于:较早进入处理组的公司,在较晚进入处理组的公司进入之前,会被当作后者的对照组参与比较。当处理效应存在异质性,且效应强度随时间变化时,这种“坏比较”会把一部分负权重塞进估计结果,导致β出现方向性偏误甚至符号翻转。
这就是近些年计量文献里反复讨论的交错DID偏误问题。我自己的数据就出现过类似情况:传统双向固定效应估计出的系数显著为正,但用异质性稳健估计量跑完之后,系数变小了,不过在方向上并没有翻转,显著性也保住了。可如果你的数据碰巧异质性很强,传统估计量完全可能误导你得出相反结论。
4.2 事件研究法和平行趋势检验
平行趋势检验在这个项目里不是走个过场,它是整个识别策略的基石。我把事件研究法设定为:
Y_it = α + Σ_k β_k · Treat_i × I(EventTime_it = k) + γ · X_it + μ_i + λ_t + ε_it
其中k表示相对于处理时点的第k期,基准组选在k = -1。如果β_k在k小于等于-1时不显著且系数值贴地,就说明处理组和对照组在处理前没有系统性差异;如果k大于等于0之后β_k开始明显偏离零,说明直播电商影响的确实质性存在。
用Stata跑事件研究图的时候,我的习惯是给reghdfe命令加上iv()选项或者直接构造相对时间虚拟变量。代码大致是这个样子:
* 生成相对事件时间变量 gen rel_time = year - treat_year if treat_year != . * 设定事件研究虚拟变量 forvalues k = -5(1)5 { gen D_`k' = (rel_time == `k') } * 回归时以-1期为基准 reghdfe y treat_* controls, absorb(stkcd year) cluster(stkcd)跑完之后一定要画图看,而不是只看显著性。处理前系数有些波动很正常,关键是不要出现系统性的趋势上升或下降。我遇到过一种情况:处理前系数都在零附近,但处理前的第4期、第3期存在不太大但方向一致的正值,这说明匹配后两组之间还是有一点点残余趋势,后来通过调整PSM匹配变量才压下去。
4.3 安慰剂检验和异质性稳健估计量
安慰剂检验我做了两种。第一种是随机抽取“假处理组”,打乱处理状态后重新估计β,重复500次,画出β的核密度分布,看真实β是否落在分布之外。第二种是随机打乱处理时点,把真实处理年份替换成随机年份再跑回归。这两种思路本质上是检验结果是否被某些特定公司或特定年份偶然驱动。
交错DID偏误的处理上,我在稳健性检验部分用到了Callaway and Sant’Anna提出的估计框架。这个思路可以理解为:先按处理时点分组,每组内部用“尚未处理组”或者“永不处理组”做对照,估计出该组的处理效应,再按各组规模加权得到总效应。相比传统双向固定效应,它对处理效应异质性不敏感,结果更可靠。在你自己的项目里,如果样本量允许,我非常建议至少跑一版这个估计量做对照。
5. 数据处理中那些容易让结果翻车的小细节
5.1 非平衡面板下的样本口径一致性
2005到2024年长达二十年,A股上市公司数量翻了不止一倍。这意味着你的面板必然是非平衡的:2005年的公司到2024年可能已经退市,2024年的样本包含大量2015年之后才上市的公司。处理这种非平衡面板,最忌讳的是直接删掉所有非平衡公司去做平衡面板——那会留下一个严重“幸存者偏差”的样本,因为退市公司往往是经营恶化的公司,删掉它们会让对照组被系统性截断。
我的处理方式是:保留所有能观测到处理前至少两期数据的公司,不强制要求公司必须在整个窗口期存活。同时,对那些在样本期内退市的公司,如果它在退市前已经进入了处理组,就保留其处理前和处理后的可用观测值。这样既保证了估计样本的完整性,又不会让退市公司绝对缺席。
5.2 处理时点的“回头看”问题
用公告关键词识别处理时点有一个隐性风险:公司可能在正式披露之前就已经开展了直播电商业务。比如一家公司2018年在年报里第一次写“直播电商”,但它的子公司可能2017年就开了旗舰店直播间。如果你直接按披露年份算处理时点,就把真实处理时间往后推了,导致处理前窗口里混进了一部分实际处理期数据。
我在项目里做了两件事来缓解这个问题:一是把搜索范围扩大到子公司和主要参股公司的公告,二是对每一家进入处理组的公司,人工抽查其当年及前一年的半年度报告,确认是否存在更早的业务端信号。这个方法虽然费时间,但对关键样本的处理很有效。你的样本如果太大,至少也要对头部公司和极端值做一轮这样的核查。
5.3 极端值、权重和分组异质性
直播电商对上市公司的影响有一条很现实的路径:少数头部品牌拿走了大部分流量红利。如果这些公司恰好出现在处理组里,回归系数可能会被它们单方面拉动。我用了两个手段应对:一是对连续变量做1%和99%分位的缩尾处理,二是用总资产对数做加权最小二乘作为补充回归。加权回归和普通回归如果差距过大,说明结论确实主要由大公司驱动,这个信息本身也值得写进分析。
异质性分析我分了三个维度:行业属性、公司所有制属性和区域属性。其中行业属性最重要——消费品行业的处理效应大概率显著为正,而工业制造业公司“受直播电商影响”可能更多体现在营销费用端,而不是收入端。如果基准回归不分组、直接全样本跑,结果会被行业结构稀释,甚至出现行业间的正负效应相互抵消。这时候不显著的β不代表没有影响,而是你的研究假设本身就太笼统。
另外还有一个容易被骂的细节:报告回归结果时,所有标准误都应当报告聚类层级。我在项目表格里专门加了一行注释,说明哪些结果是按公司聚类、哪些按行业聚类。这样读者能直接判断显著性是否有牌面。
做这个项目到最后,我最大的体会是:DID的项目周期里,跑代码的时间大概只占三成,剩下七成都在处理口径问题和检验假设。标题里的“2005-2024”看起来很唬人,真正决定论文质量的其实是你怎么定义处理组、怎么处理交错的进入时点、怎么对抗那些行业层面的共同冲击。数据永远不可能完美,识别策略也不可能百分之百无懈可击,但每一步都做保守、做稳健,最后的结果至少经得起同行多问几个“为什么”。