一些统计指标

衡量分布间的差距

基于高斯核的 MMD

MMD 全称 Maximum Mean Discrepancy,用来度量两个分布之间的差异。

如果我们知道两个分布的概率密度函数,那直接用函数的范数来度量就完事了。
问题是大多数时候咱不知道,就退而求其次,如果我们分别有两个分布的无限个
简单随机抽样呢?

一个简单的想法就是用这些样本来估计分布的参数,比如一阶矩乃至无穷阶矩。
我们对两个分布分别得到一个参数估计向量:

[a1,a2,...,an,...][b1,b2,...,bn,...]\begin{align*} [a_1,a_2,...,a_n,...]\\ [b_1,b_2,...,b_n,...]\\ \end{align*}

然后对比这两个向量差的二范数,越小代表这两个分布越接近,没毛病吧?

好,那这些参数选啥啊。就选一阶矩乃至无穷阶矩。我记得有个定理说,
一定条件下,分布的各阶矩可以唯一确定分布。


我们拿到两个随机变量 X,YX,Y,它们分别服从分布 P,QP,Q。定义

φ(x)=[x,x2,...,xn,...]\varphi (x) = [x,x^2,...,x^n,...]

那么

MMD=∥E[φ(X)−φ(Y)]∥MMD = \left\| E[\varphi(X)-\varphi(Y)]\right\|

问题是:MMDMMD 咋算?Here comes the kernel trick!
支持向量机里咱见过这东西。

我们先把 MMDMMD平方了,得到

∥μX∥2+∥μY∥2−2⟨μX,μY⟩=⟨μX,μX⟩+⟨μY,μY⟩−2⟨μX,μY⟩\|\mu_X\|^2 + \|\mu_Y\|^2 - 2\langle\mu_X,\mu_Y\rangle = \langle\mu_X,\mu_X\rangle + \langle\mu_Y,\mu_Y\rangle - 2\langle\mu_X,\mu_Y\rangle

其中 μX=E[φ(X)]\mu_X = E[\varphi(X)],是无穷维向量,我们希望找到一个核函数,把两个无穷维向量的内积转化成好计算的形式。

考虑

k(x,y)=exp⁡(−∣x−y∣22σ2).k(x,y) = \exp\left( -\frac{|x-y|^2}{2\sigma^2} \right).

它就是高斯核,长得很像高斯分布的 pdf,对吧?那个 σ\sigma 随便取的,我们下面讲。

用泰勒展开,这个核函数可以写成

∑n=0∞(exp⁡(−x22σ2)xnn!σn)(exp⁡(−y22σ2)ynn!σn)=exp⁡(−x22σ2)exp⁡(−y22σ2)⟨[1xσx22!σ2⋮],[1yσy22!σ2⋮]⟩\sum_{n=0}^{\infty}\left(\exp(-\frac{x^2}{2\sigma^2})\frac{x^n}{\sqrt[]{n!}\sigma^n}\right)\left(\exp(-\frac{y^2}{2\sigma^2})\frac{y^n}{\sqrt[]{n!}\sigma^n}\right) = \exp(-\frac{x^2}{2\sigma^2})\exp(-\frac{y^2}{2\sigma^2}) \langle \begin{bmatrix} 1\\ \frac{x}{\sigma}\\ \frac{x^2}{\sqrt{2!}\sigma^2}\\ \vdots \end{bmatrix}, \begin{bmatrix} 1\\ \frac{y}{\sigma}\\ \frac{y^2}{\sqrt{2!}\sigma^2}\\ \vdots \end{bmatrix} \rangle

我们上面那个 φ(x)\varphi(x) 改成这样定义:

φ(x)=exp⁡(−x22σ2)[1,xσ,x22!σ2,...]\varphi(x) = \exp(-\frac{x^2}{2\sigma^2})[1,\frac{x}{\sigma},\frac{x^2}{\sqrt{2!}\sigma^2},...]

这样就有 ⟨φ(x),φ(y)⟩=k(x,y)\langle\varphi(x),\varphi(y)\rangle = k(x,y),⟨μX,μY⟩\langle\mu_X,\mu_Y\rangle 什么的就好算了:

⟨μX,μX⟩=⟨E[φ(X)],E[φ(X)]⟩=⟨E[φ(X)],E[φ(X′)]⟩(X,X′i.i.d.)=E[⟨φ(X),φ(X′)⟩](E[⟨A,B⟩]=⟨E(A),E(B)⟩ if A⊥B)=E[k(X,X′)]\begin{align*} \langle\mu_X,\mu_X\rangle &= \langle E[\varphi(X)],E[\varphi(X)]\rangle\\ &= \langle E[\varphi(X)],E[\varphi(X')]\rangle \qquad (X,X' i.i.d.)\\ &= E[\langle\varphi(X),\varphi(X')\rangle] \qquad (E[\langle A,B\rangle]=\langle E(A),E(B)\rangle \text{ if } A\perp B)\\ &= E[k(X,X')] \end{align*}

其他的略,于是

MMD2=E[k(X,X′)]+E[k(Y,Y′)]−2E[k(X,Y)]MMD^{2} = E[k(X,X')]+E[k(Y,Y')]-2E[k(X,Y)]

这样一来,估计量也变得很容易提出:

MMD^2=1m2∑i=1m∑j=1mk(xi,xj)+1n2∑i=1n∑i=1nk(yi,yj)−2mn∑i=1m∑j=1nk(xi,yj)\widehat{MMD}^2 = \frac{1}{m^{2}}\sum_{i=1}^m\sum_{j=1}^mk(x_{i},x_{j})+\frac{1}{n^{2}}\sum_{i=1}^n\sum_{i=1}^nk(y_{i},y_{j})-\frac{2}{mn}\sum_{i=1}^m\sum_{j=1}^nk(x_{i},y_{j})

进一步理解

对于两个分布的差异,我们没有一个放之四海皆准的描述方法,每个指标都有其侧重点,也有不同的估计难度。对于这个指标,我们应该问:

  • 它侧重体现两个分布在哪一方面的差异?
  • 它的估计难度如何?

首先我想说,要用上面的估计量,必须要两个随机变量 X,YX,Y 相互独立,且抽样也是简单随机抽样,才合法。这是一个相当苛刻的条件,试图用这玩意儿做因子,我想结果不会太好(实际上也确实不好)。

下面看看这个指标在比较分布差异的表现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
import math

def normal_mmd(mu1, var1, mu2, var2, return_squared=False):
"""
MMD between:
X ~ N(mu1, var1)
Y ~ N(mu2, var2)

Kernel:
k(x, y) = exp(-|x-y| / 2)

Parameters
----------
mu1, mu2 : float
Means.
var1, var2 : float
Variances, NOT standard deviations.
return_squared : bool
If True, return MMD^2.
Otherwise return MMD.
Returns
-------
float
"""

def expected_kernel_normal(mu, var):
# Z ~ N(mu, var)
# Compute E[exp(-|Z|/2)]
sigma = math.sqrt(var)
a = 0.5

# standard normal CDF
def Phi(x):
return 0.5 * (1.0 + math.erf(x / math.sqrt(2.0)))

return (
math.exp(0.5 * a*a*var - a*mu)
* Phi((mu - a*var) / sigma)
+
math.exp(0.5 * a*a*var + a*mu)
* Phi((-mu - a*var) / sigma)
)

# X - X' ~ N(0, 2 var1)
k_xx = expected_kernel_normal(0.0, 2.0 * var1)

# Y - Y' ~ N(0, 2 var2)
k_yy = expected_kernel_normal(0.0, 2.0 * var2)

# X - Y ~ N(mu1-mu2, var1+var2)
k_xy = expected_kernel_normal(mu1 - mu2, var1 + var2)

mmd2 = k_xx + k_yy - 2.0 * k_xy

# numerical roundoff can produce tiny negative values
mmd2 = max(mmd2, 0.0)

if return_squared:
return mmd2

return math.sqrt(mmd2)

print(normal_mmd(0,1,0.1,1))
print(normal_mmd(0,1,0,1.1))
print(normal_mmd(1,1,1.1,1))
print(normal_mmd(0,2,0,2.1))

上面的脚本的运行结果如下:

1
2
3
4
0.03578846461473315
0.015846320705190348
0.03578846461472695
0.008844676520750891

可以看出几点:

  • 对高阶矩的变化不如低阶矩敏感(这从 Gauss 核的形式能看出来,权重随阶数是越来越低的)
  • 具有平移不变性(对比输出1、3)
  • 对高阶矩差异的捕捉能力随其数值有递减趋势(对比输出2、4)

我看有研报用这个做因子,好像是用来衡量量价波动性,从这就能看出,若是直接用,效果必然不会太好。应该做些处理,抹平一阶矩的差异。

衡量分布的均匀程度

熵

随机变量的熵越大,平均而言我们观测这个随机变量的惊讶程度越高,它的概率分布得越均匀,就越难预测。

在机器学习拾遗中简单介绍过,这里再说说。熵是一个衡量概率的分布是否均匀的指标,若分布像正态分布那样呈现聚集特征,就是说大部分事件具有较高的概率密度,即信息量低,这个分布的熵就不会大,事实上,标准正态分布的熵约为 1.4189;作为对比,考虑 [0,200][0,200] 上的均匀分布,它的熵为 ln⁡200≈5.298\ln 200\approx 5.298.

本来想用 [−2,2][-2,2] 上的均匀分布来对比的,因为这覆盖了标准正态分布约 95.45% 的概率质量,但是这货的熵是 1.386,还比正态分布小。这说明正态分布还是挺均匀的,也就是说它的尾部没我想的那么薄,当然也不厚,总之就是一个薄厚适中的香香软软的分布吖(

Gemini 告诉我正态分布有同方差下最大微分熵的特性,就是说相同方差下,正态分布的概率最均匀。作为对比, [−3,3][-\sqrt{ 3 },\sqrt{ 3 }] 上均匀分布的熵约为 1.242(它跟标准正态分布同方差)。

我觉得还是一个权衡取舍的问题:给定方差,你要怎么分配概率,使得平均看来,随机变量的实现带给我们最大的惊讶?

事实上,给定区间,均匀分布的熵最大。

别把熵当作是衡量随机变量取值均匀程度的指标。举个极端的例子,常数,够平稳吧,采样值够稳定吧,它的熵是0。

还是得从信息量的角度理解:平均下来,观测这个随机变量能给我们带来多少惊讶。

从构建因子的角度来说,我觉得单纯熵特征的因子不是很能预测股票,因为惊喜和惊吓都是惊讶。

列几个熵的性质:

  • h(aX)=h(X)+ln⁡∣a∣h(aX)=h(X)+\ln |a|,说明微分熵是一个绝对信息量
  • H(aX)=H(X)H(aX)=H(X),微分熵会随尺度变化是因为取值空间的“体积”发生了缩放,离散熵则没有这个性质
  • h(X+c)=h(X)h(X+c)=h(X)

视股价为随机变量,用成交量占比作为概率,那么高熵意味着成交分散在很多价位,没有特别明确的价格共识;低熵意味着成交高度集中于少数价位,市场形成了比较强的成本中心。

注意熵与随机变量具体的值无关,还是那句话,它只看概率是怎么分配的,至于分配到哪,它不看。所以 90% 的概率被分配到 10 元档位,剩下的被分配到 10.01 元档位,和 90% 的概率被分配到 10 元档位,剩下的被分配到 11 元档位,在它看来是一样的。下面的基尼系数能捕捉到这一点。

区别一下离散熵和微分熵

两者出发点是一样的,都是信息量的期望:

H(X)=−∑piln⁡pih(X)=−∫f(x)ln⁡f(x)dx\begin{align} H(X) & = -\sum p_{i}\ln p_{i} \\ h(X) & = -\int f(x)\ln f(x)dx \end{align}

但注意概率密度可以大于 1,所以微分熵可以是负数。


下面说说它们的估计,离散熵好估计,计算频率就行。微分熵的话,不能简单靠分桶来估计。比如对于一个连续随机变量,咱有 NN 个样本,从大到小排在数轴上,分成 nn 个桶,每个桶宽度为 Δ\Delta ,然后计算落在每个桶的概率 p1,...,pnp_{1},...,p_n ,然后用估计离散熵的方法估计:

HΔ(X)=−∑piln⁡pi≈−∫f(x)dxln⁡(f(x)Δ)≈h(X)−ln⁡Δ\begin{align} H_{\Delta}(X) & = -\sum p_{i}\ln p_{i} \\ & \approx -\int f(x)dx\ln(f(x)\Delta) \\ & \approx h(X)-\ln \Delta \end{align}

如果桶分得很细(这要求大数据量)的话,这个约等于关系是合理的。这个估计量随分桶变细会趋向于无穷。实践中我们除以 ln⁡n\ln n (nn 是桶数)来压制它,获得一个经验离散熵指标。它并不是熵的估计量。

基尼系数

基尼系数越大,分布越不均等。

对于随机变量 XX ,其基尼系数定义为

G=E∣X1−X2∣2E[X]G = \frac{\mathbb{E}|X_{1}-X_{2}|}{2\mathbb{E}[X]}

其中 X1,X2X_{1},X_{2} 与 XX 独立同分布。测量差距的平均值,再除以两倍均值做标准化。

几个性质:

  • G(aX)=G(X)G(aX)=G(X)
  • G(X+c)<G(X)(c>0)G(X+c)<G(X)\quad (c>0)

可以推得,给定均值和方差 μ,σ2\mu,\sigma^{2} ,正态分布的基尼系数为 1πσμ\frac{1}{\sqrt{ \pi }}\frac{\sigma}{\mu},均匀分布的基尼系数为 13σμ\frac{1}{\sqrt{ 3 }} \frac{\sigma}{\mu} 。正态分布的小一点,说明它的平均相对差异要更小。


一些统计指标
https://wtx17.github.io/2026/08/07/一些统计指标/
作者
wtx
发布于
2026年8月7日
更新于
2026年11月6日
许可协议