1. 项目概述从平均效应到分布效应的因果推断革新在量化金融科技信贷对消费行为影响的研究中我们长期面临一个核心困境传统的因果推断方法如双重差分DID或倾向得分匹配PSM通常将消费者的“支出”简化为一个标量——比如月度总消费额或平均单笔交易金额。然后我们计算信贷额度提升后这个“平均支出”增加了多少。这固然能告诉我们“信贷是否刺激了消费”但却无法回答一个对平台运营更具战略价值的问题信贷具体是如何改变消费行为的想象两个消费者小王和小李。在获得相同的1000元信贷额度提升后他们的月均支出都从3000元增加到了3500元。传统的平均处理效应ATE分析到此为止结论是“信贷使消费平均提升了500元”。然而真实情况可能截然不同。小王可能将额外的信贷均匀地分摊到了更多的日常购物中例如多点了10次外卖每次多花50元而小李则可能将几乎全部新增额度用于购买一件心仪已久的奢侈品例如一次性购买了一个3500元的耳机其他消费不变。两者的消费分布——即不同金额区间的交易频率——发生了完全不同的形变。对于电商平台而言识别出“小李”这样的用户至关重要因为他们可能对高毛利商品、品牌合作推广或分期付款产品更感兴趣。这正是“分布因果推断”要解决的问题。当我们的干预Treatment是连续变量如信贷额度而结果Outcome是每个个体自身的一个分布如单个用户所有交易金额的分布时如何量化干预对结果“分布形态”的因果效应本项目介绍的方法正是将因果推断的舞台从熟悉的欧几里得空间处理标量迁移到了Wasserstein空间处理分布并融合了双重机器学习Double Machine Learning, DML的稳健估计框架。这不仅仅是方法论的升级更是分析视角从“均值”到“全貌”的深刻转变。2. 核心思路拆解为什么是Wasserstein空间与DML2.1 从标量到分布问题定义的升维传统因果推断的核心量是平均处理效应 $\theta(a, a‘) E[Y(a)] - E[Y(a’)]$其中 $Y$ 是一个实数值。在我们的场景中每个用户 $i$ 在信贷额度 $A_i a$ 下产生的不是一个数字而是一系列交易这些交易共同构成了一个支出分布 $Y_i(a)$。这个分布可以用累积分布函数CDF或分位数函数Quantile Function来表征。因此我们的目标量也需要升维。我们定义分布平均潜在结果Distributional Average Potential Outcome, Dist-APO为 $\Theta(a)$它不是一个数而是一个函数分位数函数。其含义是如果让全量用户都接受信贷额度 $a$他们的支出分位数函数的“平均”是怎样的。这里的“平均”不是简单的点对点平均而是要在分布空间中找到那个最具代表性的中心。2.2 Wasserstein空间分布“距离”的正确度量如何定义分布之间的“平均”或“距离”最直观的想法是使用欧几里得距离。例如比较两个CDF曲线 $F_1(t)$ 和 $F_2(t)$计算它们在整个定义域上的积分差 $L^2$ 距离$\int |F_1(t) - F_2(t)|^2 dt$。然而这种方法存在严重缺陷它会破坏分布的内在几何结构。一个经典的例子是计算几个正态分布的“平均分布”。假设我们有五个正态分布 $N(\mu_k, 1)$其均值 $\mu_k$ 略有不同。用欧几里得方式对它们的概率密度函数PDF或CDF进行逐点平均得到的结果可能是一个多峰的、非正态的奇怪分布这显然失去了“正态分布家族”的特性。Wasserstein距离解决了这个问题。它源于最优传输理论直观上可以理解为把一堆沙子一个分布搬运成另一堆沙子另一个分布所需的最小“工作量”。对于一维分布Wasserstein距离有简洁的表达式$W_p(F, G) (\int_0^1 |F^{-1}(q) - G^{-1}(q)|^p dq)^{1/p}$其中 $F^{-1}$ 和 $G^{-1}$ 是分位数函数。当 $p2$ 时即为2-Wasserstein距离。在Wasserstein空间中几个正态分布的“均值”称为Wasserstein重心仍然是一个正态分布其均值是原分布均值的算术平均方差不变。这完美符合我们的直觉对“位置”进行平均而不扭曲“形状”。因此将我们的分布结果 $Y_i(a)$ 视作Wasserstein空间中的点并在此空间内定义Dist-APO $\Theta(a)$ 作为它们的Wasserstein重心是数学上自然且合理的选择。2.3 双重机器学习在高维混杂中稳健估计定义了目标量 $\Theta(a)$接下来是如何从观测数据中估计它。我们面临标准因果推断的挑战混杂偏误。影响用户获得信贷额度 $A$ 的因素如收入、历史消费、信用评分同样也直接影响其消费分布 $Y$。简单地比较不同额度用户的支出分布会得到有偏的估计。双重机器学习DML是解决高维混杂问题的利器。其核心思想是通过“正交化”来构造估计量使得最终估计量对 nuisance parameters如倾向得分或结果回归函数的估计误差不那么敏感。具体到我们的问题我们需要估计两个 nuisance parameters广义倾向得分$p(a|X)$给定用户特征 $X$其获得额度 $a$ 的条件概率密度。这是一个连续处理变量的泛化。结果回归函数$m(a; X) E[Y^{-1} | Aa, X]$给定特征 $X$ 和额度 $a$用户支出分位数函数的条件期望。DML框架为我们提供了一个双稳健的估计形式。如公式(5)所示我们的估计量 $\hat{\Theta}_{DML}(a)$ 对 $m(a; X)$ 和 $p(a|X)$ 的估计错误具有鲁棒性只要其中一个估计得足够准确最终估计量就是近似无偏的。这在实际应用中极大地降低了模型误设的风险。注意这里的结果回归函数 $m(a; X)$ 的输出是一个函数分位数函数而非标量。这要求我们使用能够处理函数型数据的回归模型如后续将介绍的神经函数回归网络NFR Net。3. 方法论实现从理论公式到可计算的估计器3.1 估计器构建克服狄拉克δ函数的实践挑战理论公式(5)中包含一项 $\delta(A_i - a)$即狄拉克δ函数。它在 $A_i a$ 时为无穷大否则为0这在数值上无法直接计算。标准的处理方法是使用核平滑进行近似。我们用一个核函数 $K_h(u) \frac{1}{h} K(\frac{u}{h})$ 来逼近 $\delta(u)$其中 $h$ 是带宽。因此我们得到可计算的估计器公式(6) $$\hat{\Theta}{DML}(a) \frac{1}{N} \sum{i1}^N \left[ \hat{m}(a; X_i) \frac{K_h(A_i - a)}{\hat{p}(a|X_i)} (Y_i^{-1} - \hat{m}(a; X_i)) \right]$$参数与操作详解核函数 $K(\cdot)$ 选择常用二阶核函数如高斯核 $K(u) \frac{1}{\sqrt{2\pi}} e^{-u^2/2}$ 或Epanechnikov核 $K(u) \frac{3}{4}(1-u^2)_$。高斯核无限支撑计算稳定Epanechnikov核在有限支撑内最优计算效率高。在金融数据无明显边界时我通常首选高斯核。带宽 $h$ 选择这是平滑程度的关键控制参数。$h$ 过大估计过度平滑偏差大$h$ 过小估计波动剧烈方差大。实践中可采用 Silverman‘s rule of thumb 或更稳健的交叉验证法。对于信贷额度这种连续变量我建议使用基于残差的交叉验证将数据分为训练集和验证集在训练集上拟合 $\hat{m}$ 和 $\hat{p}$在验证集上计不同 $h$ 下估计量的稳定性如 bootstrap 方差选择方差开始趋于平缓的 $h$。样本分割与交叉拟合直接使用全部数据既估计 nuisance parameters 又计算最终效应会导致过拟合和偏差。必须采用交叉拟合。如算法1所述将样本随机分为K折通常K5或10。对于第k折数据 $D_k$使用其余所有数据 $D_{-k}$ 来训练 $\hat{m}^{(-k)}$ 和 $\hat{p}^{(-k)}$然后将这些模型应用于 $D_k$ 来计算该折的估计 $\hat{\Theta}_{DML}^{(k)}(a)$。最后将所有K折的估计进行平均。这能有效避免因复用数据导致的“自我影响”peeking问题。3.2 核心组件一神经函数回归网络NFR Net估计 $m(a; X)$估计 $m(a; X) E[Y^{-1} | Aa, X]$ 是主要难点因为它的输出是一个分位数函数即从 [0,1] 区间到实数域的映射。我们设计了神经函数回归网络。网络架构与实操步骤输入层与特征编码输入是用户特征向量 $X$ 和处理变量 $a$。首先通过一个全连接多层感知机MLP将 $(X, a)$ 映射到一个高维表征向量 $Z$。函数输出层我们需要网络输出一个函数。一种实践有效的方法是让网络输出一个分位数函数的参数化形式。例如假设分位数函数 $Q(\tau)$ 可以用一组基函数如B样条的线性组合来近似$Q(\tau) \sum_{j1}^J \beta_j B_j(\tau)$。那么我们的网络可以设计为输出这组系数 $\beta (\beta_1, ..., \beta_J)$。即最后一个全连接层的输出维度为 $J$代表基函数的系数。损失函数设计如何训练这个网络我们不能直接用分位数函数之间的距离作为损失因为训练数据中我们只有一个观测到的分布 $Y_i$由其分位数函数 $Y_i^{-1}$ 表征。一个巧妙的方法是使用分位数损失也称为pinball loss。对于给定的分位点 $\tau \in (0,1)$分位数损失为 $$L_\tau(q, y) \begin{cases} \tau (y - q), \text{if } y \ge q \ (1-\tau) (q - y), \text{if } y q \end{cases}$$ 但是我们的“y”是一个分布。我们可以从观测分布 $Y_i$ 中随机抽取多个样本 $\{y_{i1}, ..., y_{iM}\}$然后要求网络预测的分位数函数 $Q_i(\cdot)$ 在所有分位点上对这些样本的分位数损失期望最小。因此损失函数可构造为 $$\mathcal{L} \frac{1}{N} \sum_{i1}^N \frac{1}{M} \sum_{m1}^M \int_0^1 L_\tau(Q_i(\tau), y_{im}) d\tau$$ 在实际编程中我们近似计算积分在 [0,1] 区间上取一组密集的分位点网格 $\{\tau_1, ..., \tau_L\}$ 进行求和。训练技巧基函数选择B样条基灵活且局部可控是很好的选择。阶数通常取3或4三次或四次样条节点数根据数据复杂度调整。蒙特卡洛采样从观测分布 $Y_i$ 中采样时如果 $Y_i$ 由一组离散交易金额 $\{t_{i1}, ..., t_{iT_i}\}$ 表征可以直接将其作为样本集$MT_i$。如果 $T_i$ 很大可以随机子采样如果 $T_i$ 很小可以考虑使用核密度估计KDE平滑后再采样。正则化在MLP部分和基函数系数输出部分加入L2正则化防止过拟合确保预测的分位数函数平滑。3.3 核心组件二条件标准化流网络CNF Net估计 $p(a|X)$广义倾向得分 $p(a|X)$ 是一个条件密度估计问题。处理变量 $a$信贷额度通常是连续且可能具有复杂分布如右偏。标准化流Normalizing Flow非常适合此类任务因为它能通过可逆变换将一个简单基础分布如标准正态映射到复杂的目标分布。条件标准化流实现步骤网络结构我们构建一个条件标准化流模型。输入是用户特征 $X$输出是给定 $X$ 下处理变量 $A$ 的条件概率密度。流变换使用一系列可逆的双射变换 $f_1, f_2, ..., f_K$。将来自基础分布 $p_Z(z)$如标准正态的样本 $z$通过 $a f_K \circ ... \circ f_2 \circ f_1 (z; X)$ 变换到目标变量 $a$。这里的关键是每一层变换 $f_k$ 的参数都由特征 $X$ 经过一个神经网络条件网络生成从而实现条件分布建模。密度计算根据变量变换公式条件密度可通过下式计算 $$p(a|X) p_Z(z) \left| \det \left( \frac{\partial (f_1 \circ ... \circ f_K)^{-1}}{\partial a} \right) \right|$$ 其中 $z (f_K \circ ... \circ f_1)^{-1}(a; X)$。标准化流的设计要求雅可比行列式容易计算。损失函数与训练损失函数直接取负对数似然$\mathcal{L} -\frac{1}{N} \sum_{i1}^N \log p(A_i | X_i)$。通过最大化似然来训练网络。实操要点流类型选择RealNVP 或 MAF 是常用的、雅可比行列式为三角阵因而易于计算的流模型适合初学者。GLOW 模型生成质量更高但更复杂。特征处理输入特征 $X$ 需要标准化。对于类别特征使用嵌入层。数值稳定性计算对数密度时注意防止下溢。通常计算 $\log p(a|X)$并确保变换的雅可比行列式对数项稳定。3.4 整合与估计流程将NFR Net和CNF Net嵌入到交叉拟合的DML框架中完整的算法流程如下数据准备整理数据集 $\{(X_i, A_i, Y_i)\}_{i1}^N$。其中 $Y_i$ 是用户 $i$ 的所有交易金额集合用于表征其支出分布。样本分割将数据随机分为K折$D_1, ..., D_K$。对于每一折 $k 1, ..., K$ a.训练Nuisance Models在辅助集 $D_{-k}$ 上 - 训练CNF Net得到广义倾向得分估计器 $\hat{p}^{(-k)}(a|X)$。 - 训练NFR Net得到结果回归函数估计器 $\hat{m}^{(-k)}(a; X)$。 b.计算折内估计在主集 $D_k$ 上对于每一个目标处理水平 $a$通常是在观测到的 $A$ 的取值范围内取一个网格 - 对每个样本 $i \in D_k$计算 $\hat{m}^{(-k)}(a; X_i)$。 - 对每个样本 $i \in D_k$计算 $\hat{p}^{(-k)}(a|X_i)$ 和核权重 $K_h(A_i - a)$。 - 代入公式(7)计算 $\hat{\Theta}_{DML}^{(k)}(a)$。聚合结果根据公式(8)对所有K折的估计进行加权平均得到最终的Dist-APO估计 $\hat{\Theta}_{DML}(a)$。计算Dist-ATE对于两个不同的信贷额度 $a$ 和 $a‘$分布平均处理效应即为 $\hat{\Theta}{DML}(a) - \hat{\Theta}{DML}(a’)$。这是一个函数描述了从额度 $a‘$ 提升到 $a$ 时消费分位数函数在各个分位点上的平均变化。4. 实战应用金融科技信贷如何重塑消费分布4.1 数据与场景设定我们与一家头部电商平台合作获取了约100万活跃用户为期12个月的交易面板数据。核心变量包括处理变量 $A$用户在观察期初获得的信用支付额度连续变量如500元至50000元。结果变量 $Y$用户在接下来3个月内的所有交易金额。我们对每个用户用其所有交易金额的经验分布或平滑后的核密度估计来表征 $Y$。混杂变量 $X$高维向量包括人口统计学特征年龄、城市等级、历史消费行为过去12个月总消费额、消费频次、品类分、优惠券使用率、平台互动数据浏览时长、加购次数、以及传统的信用评分变量。研究问题将信用额度从 $a‘$例如中位数5000元提升到 $a$例如8000元会对用户的消费金额分布产生怎样的因果效应4.2 估计结果与业务解读我们估计了 $\hat{\Theta}{DML}(5000)$ 和 $\hat{\Theta}{DML}(8000)$并计算了它们的差即Dist-ATE $\hat{\Theta}_{DML}(5000 \rightarrow 8000)$。下图展示了关键结果分位点 $\tau$$\hat{\Theta}_{DML}(5000)$ (元)$\hat{\Theta}_{DML}(8000)$ (元)Dist-ATE (元)传统ATE对标 (仅均值)10% (低消费)85.288.12.9-中位数312.5338.726.225.875%810.3890.580.2-90%1550.41850.9300.5-95%2100.82650.3549.5-深度解读与业务洞察效应异质性Dist-ATE清晰地揭示了效应沿分布的变化。额度提升对高端消费90分位、95分位的刺激作用300.5元 549.5元远强于对中低端消费的刺激。这意味着额外的信贷额度主要被用于购买更高单价、更可能是非必需或奢侈品的商品。传统的ATE25.8元仅反映中位数附近的变化完全掩盖了这一关键模式。消费结构迁移这不仅意味着总消费额上升更意味着消费结构的升级。用户并非简单地按比例增加所有类型的消费而是将边际信用更多地配置到“升级型消费”上。这对于平台的商品推荐、招商引入更多高客单价品牌、以及分期免息等金融产品设计具有直接指导意义。风险识别Dist-ATE函数本身也包含了风险信息。如果发现额度提升后低分位点如10%的消费也有显著提升可能意味着部分用户将信贷用于维持基本消费其还款风险可能更高。我们的结果显示低分位点效应微弱表明在该平台上信贷扩张主要刺激的是“锦上添花”型消费而非“雪中送炭”型整体风险相对可控。策略优化平台可以基于此方法进行更精细的信贷策略测试。例如对历史消费分布右尾较厚的用户即已有高端消费倾向小幅提升额度可能带来显著的边际收益而对于消费分布集中的用户提升额度可能效果不彰反而应搭配品类券等营销工具引导消费结构变化。4.3 与基准方法的对比验证在模拟数据和实际数据中我们将Dist-DML与两个基准方法进行了对比分布直接回归仅使用NFR Net估计 $m(a; X)$然后取样本平均 $\frac{1}{N}\sum_i \hat{m}(a; X_i)$ 作为Dist-APO估计。当倾向得分存在混淆时此方法偏差较大。分布逆概率加权仅使用CNF Net估计 $p(a|X)$然后进行加权 $\frac{1}{N}\sum_i \frac{K_h(A_i-a)}{\hat{p}(a|X_i)} Y_i^{-1}$。当结果回归模型误设时此方法方差可能很高。结果Dist-DML在均方误差MSE上显著优于两个基准方法尤其是在处理效应函数 $\Theta(a)$ 形状复杂、混淆严重的情境下。这验证了其双稳健性的价值。5. 常见问题、挑战与实操心得5.1 模型实现中的陷阱与解决方案NFR Net 训练不稳定问题分位数损失对于不同 $\tau$ 的尺度敏感可能导致训练震荡。解决对从 $Y_i$ 中采样的金额 $y_{im}$ 进行标准化如减去中位数除以四分位距。在预测时再将结果变换回来。同时在 $\tau$ 接近0或1时损失会变得非常不对称可以适当增加这些区域的分位点采样密度。CNF Net 对极端值过拟合问题信贷额度分布通常高度右偏存在少数极高额度用户。CNF模型可能过度拟合这些异常值导致对大部分用户的 $p(a|X)$ 估计不佳。解决对处理变量 $A$ 取对数变换使其分布更接近正态。在计算核权重 $K_h(A_i - a)$ 时也在对数尺度上进行。最终结果解释需考虑变换。计算成本高昂问题对每个目标 $a$ 都需要计算所有样本的核权重并求和当 $a$ 的网格点很多、样本量巨大时计算量很大。解决利用矩阵运算并行化。将 $a$ 的网格点向量、$A_i$ 向量、以及计算好的 $\hat{m}(a; X_i)$ 和 $\hat{p}(a|X_i)$ 进行广播操作一次性计算所有网格点上的估计。使用如NumPy、JAX或GPU加速的深度学习框架至关重要。5.2 因果假设的审视与敏感性分析无混淆假设这是最核心且无法检验的假设。我们只能尽可能收集丰富的混杂变量 $X$。实操建议除了平台内部数据可考虑引入外部数据源进行匹配如通过合作获取用户在其他平台的信用数据需合规、或利用地理社会经济指数等。敏感性分析必须进行。可以采用 Rosenbaum 边界法或基于替代性解释的敏感性分析来评估需要多大程度的未观测混杂才能推翻我们的结论。重叠假设对于某些极端特征组合的用户其获得特定额度 $a$ 的概率可能为0。诊断可视化检查估计的倾向得分 $\hat{p}(a|X)$ 的分布。对于目标 $a$如果大量样本的 $\hat{p}(a|X)$ 非常小如小于0.01则重叠性可能不足。处理在估计时对 $\hat{p}(a|X)$ 进行截断如设置下限 $10^{-5}$或使用重叠权重进行再加权。更根本的方法是重新定义目标人群将分析限制在共同支持域内。5.3 结果解释与可视化可视化Dist-ATE不要只展示一个表格。最有力的展示是绘制两条曲线$\hat{\Theta}{DML}(a)$ 和 $\hat{\Theta}{DML}(a‘)$ 作为分位点 $\tau$ 的函数。然后用阴影区域突出显示两条曲线之间的差异区域。这能直观展示消费分布的整体移动和形变。业务指标转化将分布效应转化为业务语言。例如“额度提升3000元预计将使高端消费90分位用户的比例增加X%其人均高端消费额提升Y元”。这需要将分位数函数的结果反向映射到用户群体和具体金额区间。5.4 项目复盘与核心心得数据质量高于模型复杂度在这个项目中花费在数据清洗、特征工程和业务理解上的时间远多于模型调参。确保 $X$ 包含了真正驱动信贷分配和消费的关键因素比使用更花哨的神经网络结构重要得多。例如我们发现“用户最近一次大促期间的消费环比增长率”是一个极强的混杂变量。分阶段验证不要一开始就运行完整的Dist-DML pipeline。先使用简单的线性分位数回归模型替代NFR Net用广义加性模型GAM替代CNF Net快速验证整个因果识别流程和效应的大致方向。确认故事合理后再引入复杂的深度学习模型进行精调。带宽 $h$ 是艺术也是科学$h$ 的选择对结果平滑度影响巨大。我习惯的做法是先根据经验规则如 $h 1.06 \cdot \hat{\sigma} \cdot n^{-1/5}$设定一个初始值然后绘制不同 $h$ 下估计的 $\hat{\Theta}(a)$ 曲线。选择那条既能捕捉趋又不会过于锯齿状的曲线对应的 $h$。通常需要与业务方一起审视确保曲线反映的趋势符合业务直觉。从因果到决策的鸿沟估算出Dist-ATE是第一步将其转化为可执行的策略是更关键的一步。我们与风控和营销团队紧密合作将用户按历史消费分布分群为不同群体验证了不同的额度调整弹性最终形成了“千人千额”的动态调额策略的一部分。模型的价值最终体现在业务指标的提升上。这个基于Wasserstein空间的分布因果推断框架将因果分析从“平均效应”的维度提升到了“全分布效应”的维度。它不仅仅是一个计量经济学工具更是一个强大的业务分析透镜能够揭示隐藏在聚合数字背后的、丰富的用户行为异质性。在高度个性化的数字商业时代这种精细化的洞察能力正变得前所未有的重要。