[量化学堂-数学知识]数据离散状况的测量:离散度

标准差
离散度
标签: #<Tag:0x00007f5be8e9e288> #<Tag:0x00007f5be8e9e148>

(iQuant) #1

导语:本文我们将讨论如何使用离散度来描述一组数据。


克隆策略

离散度能够更好地测量一个数据分布。 这在金融方面尤其重要,因为风险的主要测量方法之一是看历史上收益率的数据分布特征。 如果收益率紧挨着平均值,那么我们就不用特别担心风险。 如果收益率很多数据点远离平均值,那风险就不小。具有低离散度的数据围绕平均值聚集,而高离散度的数据表明有许多非常大且非常小的数据点。

让我们生成一个随机整数先来看看。

In [1]:
import numpy as np
np.random.seed(121)
In [2]:
# 生成20个小于100的随机整数
X = np.random.randint(100, size=20)

# Sort them
X = np.sort(X)
print('X: %s' %(X))

mu = np.mean(X)
print('X的平均值:', mu)
X: [ 3  8 34 39 46 52 52 52 54 57 60 65 66 75 83 85 88 94 95 96]
X的平均值: 60.2

Range(范围)

Range(范围)是数据集中最大值和最小值之间的差异。 毫不奇怪,它对异常值非常敏感。 我们使用numpy的ptp的函数来计算Range。

In [3]:
print('Range of X: %s' %(np.ptp(X)))
Range of X: 93

MAD(平均绝对偏差)

平均绝对偏差是数据点距离算术平均值的偏差。 我们使用偏差的绝对值,这使得比平均值大5的数据点和比平均值小5的数据点对MAD均贡献5,否则偏差总和为0。

$$ MAD = \frac{\sum_{i=1}^n |X_i - \mu|}{n} $$

这里$n$是数据点的个数,$\mu$是其平均值。

In [4]:
abs_dispersion = [np.abs(mu - x) for x in X]
MAD = np.sum(abs_dispersion)/len(abs_dispersion)
print('X的平均绝对偏差:', MAD)
X的平均绝对偏差: 20.52

方差和标准差

关于数据离散程度的度量最常用的指标就是方差和标准差,在金融市场更是如此,诺贝尔经济学奖得主马科维茨创造性地将投资的风险定义为收益率的方差,因此为现代金融工程的大厦做了坚实奠基。量化投资更是更是如此,对于风险的度量大多时候是通过方差、标准差来完成。

方差 $\sigma^2$的定义如下: $$ \sigma^2 = \frac{\sum_{i=1}^n (X_i - \mu)^2}{n} $$

标准差的定义为方差的平方根:$\sigma$。 标准差的运用更为广泛,因为它和观测值在同一个数据维度,可以进行加减运算。

In [5]:
print('X的方差:', np.var(X))
print('X的标准差:', np.std(X))
X的方差: 670.16
X的标准差: 25.8874486962

解释标准差的一种方式是切比雪夫不等式。 它告诉我们,对于任意的值$k$($k> 1$),平均值的$k$个标准差(即,在k倍标准偏差的距离内)的样本比例至少为$1-1 / k2$。我们来检查一下这个定理是否正确。

In [6]:
k = 1.25 # 随便举的一个k值
dist = k*np.std(X)
l = [x for x in X if abs(x - mu) <= dist]
print('k值', k, '在k倍标准差距离内的样本为:', l)
print('验证', float(len(l))/len(X), '>', 1 - 1/k**2)
k值 1.25 在k倍标准差距离内的样本为: [34, 39, 46, 52, 52, 52, 54, 57, 60, 65, 66, 75, 83, 85, 88]
验证 0.75 > 0.36

半方差和半标准差

虽然方差和标准差告诉我们收益率是如何波动,但它们并不区分向上的偏差和向下的偏差。 通常情况下,在金融市场投资中,我们更加担心向下的偏差。 因此半方差更多是在金融市场上的应用。

半方差是目标导向,认为只有负的收益才是投资真正的风险。半方差的定义与方差类似,唯一的区别在于半方差仅试用低于均值的收益率样本。

半方差的定义如下:

$$\frac{\sum_{X_i < \mu} (X_i - \mu)^2}{n_{less}}$$

这里$n_{less}$表示小于均值的数据样本的数量。半标准差就是半方差的平方根。

In [7]:
# 没有现成的计算半方差的函数,因此我们手动计算:
lows = [e for e in X if e <= mu]

semivar = np.sum( (lows - mu) ** 2 ) / len(lows)

print('X的半方差:', semivar)
print('X的半标准差:', np.sqrt(semivar))
X的半方差: 689.512727273
X的半标准差: 26.2585743572

另外一个相关的是目标半方差,是仅关注低于某一目标的样本,定义如下: $$ \frac{\sum_{X_i < B} (X_i - B)^2}{n_B} $$

In [8]:
B = 19 # 目标为19
lows_B = [e for e in X if e <= B]
semivar_B = sum(map(lambda x: (x - B)**2,lows_B))/len(lows_B)

print('X的目标半方差:', semivar_B)
print('X的目标半标准差:', np.sqrt(semivar_B))
X的目标半方差: 188.5
X的目标半标准差: 13.7295302177

所有这些计算将给出样本统计,即数据的标准差。 这是否反映了目前真正的标准差呢?其实还需要做出更多的努力来确定这一点,比如绘制出数据样本直方图、概率密度图,这样更能全面了解数据分布状况。 这在金融方面尤其是,因为所有金融数据都是时间序列数据,平均值和方差可能随时间而变化。因此,金融数据方差、标准差有许多不同的技巧和微妙之处。


本文由BigQuant宽客学院推出,版权归BigQuant所有,转载请注明出处。


社区干货与精选整理(持续更新中...)
(njchenxin) #2

要说一些具体的例子就更完美了