熵特征:概念、估计方法与金融应用
1. 动机
价格序列传递着关于供需力量的信息。在完美市场中,价格是不可预测的,因为每个观测值都传递了关于产品或服务的所有已知信息。而在非完美市场中,价格是基于部分信息形成的,一些参与者比其他参与者拥有更多信息,他们可以利用这种信息不对称获利。因此,估计价格序列的信息含量,并形成机器学习算法可以学习可能结果的特征是很有帮助的。例如,机器学习算法可能会发现,当价格包含的信息较少时,动量交易更有利可图;而当价格包含的信息较多时,均值回归交易更有利可图。
2. 香农熵
信息论之父克劳德·香农将熵定义为平稳数据源产生的(长消息上的)平均信息量。它是用唯一可解码的方式描述消息所需的每个字符的最小比特数。对于离散随机变量 $X$,其可能取值 $x \in A$,香农定义其熵为:
[H[X] \equiv - \sum_{x \in A} p[x] \log_2 p[x]]
其中,$0 \leq H[X] \leq \log_2 [\vert\vert A \vert\vert]$,$p[x]$ 是 $x$ 的概率,$\vert\vert A \vert\vert$ 是集合 $A$ 的大小。
熵可以解释为 $X$ 中信息内容的概率加权平均值,其中信息量以 $\log_2 \frac{1}{p[x]}$ 来衡量。低概率结果比高概率结果揭示更多信息,这就是以 $\log_2 \frac{1}{p[x]}$ 衡量信息的原因。
冗余度定义为:
[R[X] \equiv 1 - \frac{H[X]}{\log_2 [\vert\vert A \vert\vert]}]
其中,$0 \leq R[X] \leq 1$。
两个变量之间的互信息定义为联合概率密度与边际概率密度乘积的 Kullback - Leibler 散度:
[MI[X, Y] = E_{f[x,y]} \left[ \log \frac{f[x, y]}{f[x]f[y]} \right] = H[X] + H[Y] - H[X, Y]]
互信息总是非负的、对称的,当且仅当 $X$ 和 $Y$ 独立时等于零。对于正态分布的变量,互信息与熟悉的皮尔逊相关系数 $\rho$ 密切相关:
[MI[X, Y] = - \frac{1}{2} \log [1 - \rho^2]]
以下是一些熵估计器的资源:
- 在 R 中:http://cran.r-project.org/web/packages/entropy/entropy.pdf
- 在 Python 中:https://code.google.com/archive/p/pyentropy/
3. 插件(或最大似然)估计器
给定一个数据序列 $x_n^1$,我们可以形成该序列中所有长度为 $w < n$ 的单词的字典 $A_w$。对于任意长度为 $w$ 的单词 $y_w^1 \in A_w$,我们用 $\hat{p}_w[y_w^1]$ 表示该单词在 $x_n^1$ 中的经验概率。
假设数据是由平稳遍历过程生成的,根据大数定律,对于固定的 $w$ 和大的 $n$,经验分布 $\hat{p}
w$ 将接近真实分布 $p_w$。在这种情况下,熵率(即每比特的平均熵)的自然估计器为:
[\hat{H}
{n,w} = - \frac{1}{w} \sum_{y_w^1 \in A_w} \hat{p}_w [y_w^1] \log_2 \hat{p}_w [y_w^1]]
由于经验分布也是真实分布的最大似然估计,这通常也被称为最大似然熵估计器。$w$ 的值应该足够大,以使 $\hat{H}_{n,w}$ 与真实熵 $H$ 足够接近。$n$ 的值需要比 $w$ 大得多,以便 $w$ 阶的经验分布接近真实分布。
以下是实现插件熵估计器的代码:
import time,numpy as np
#———————————————————————————————————————
def plugIn(msg,w):
# Compute plug-in (ML) entropy rate
pmf=pmf1(msg,w)
out=-sum([pmf[i]*np.log2(pmf[i]) for i in pmf])/w
return out,pmf
#———————————————————————————————————————
def pmf1(msg,w):
# Compute the prob mass function for a one-dim discrete rv
# len(msg)-w occurrences
lib={}
if not isinstance(msg,str):msg=''.join(map(str,msg))
for i in xrange(w,len(msg)):
msg_=msg[i-w:i]
if msg_ not in lib:lib[msg_]=[i-w]
else:lib[msg_]=lib[msg_]+[i-w]
pmf=float(len(msg)-w)
pmf={i:len(lib[i])/pmf for i in lib}
return pmf
4. 莱姆佩尔 - 齐夫估计器
熵可以解释为复杂性的度量。复杂序列比规则(可预测)序列包含更多信息。莱姆佩尔 - 齐夫(LZ)算法可以有效地将消息分解为非冗余子串。我们可以根据莱姆佩尔 - 齐夫字典中的项数相对于消息长度来估计消息的压缩率。
4.1 LZ 压缩算法实现
def lempelZiv_lib(msg):
i,lib=1,[msg[0]]
while i<len(msg):
for j in xrange(i,len(msg)):
msg_=msg[i:j+1]
if msg_ not in lib:
lib.append(msg_)
break
i=j+1
return lib
4.2 最长匹配长度计算
定义 $L_n^i$ 为 $i$ 之前的 $n$ 位中找到的最长匹配长度加 1:
[L_n^i = 1 + \max{l \vert \vert x_{i + l}^i = x_{j + l}^j \text{ 对于某些 } i - n \leq j \leq i - 1, l \in [0, n]}]
以下是计算最长匹配长度的代码:
def matchLength(msg,i,n):
# Maximum matched length+1, with overlap.
# i>=n & len(msg)>=i+n
subS=''
for l in xrange(n):
msg1=msg[i:i+l+1]
for j in xrange(i-n,i):
msg0=msg[j:j+l+1]
if msg1==msg0:
subS=msg1
break # search for higher l.
return len(subS)+1,subS # matched length + 1
4.3 LZ 熵率估计
奥恩斯坦和韦斯证明了:
[\lim_{n \to \infty} \frac{L_n^i}{\log_2 [n]} = \frac{1}{H}]
康托伊安尼斯利用这个结果来估计香农熵率。他估计 $\frac{L_n^i}{\log_2 [n]}$ 的平均值,并使用该平均值的倒数来估计 $H$。
滑动窗口 LZ 估计器 $\hat{H}
{n,k}$ 定义为:
[\hat{H}
{n,k} = \left[ \frac{1}{k} \sum_{i = 1}^{k} \frac{L_n^i}{\log_2 [n]} \right]^{-1}]
递增窗口 LZ 估计器 $\hat{H}
n$ 定义为:
[\hat{H}_n = \left[ \frac{1}{n} \sum
{i = 2}^{n} \frac{L_i^i}{\log_2 [i]} \right]^{-1}]
4.4 改进的估计器
为了避免 Doeblin 条件,可以使用以下改进的估计器:
[\tilde{H}
{n,k} = \frac{1}{k} \sum
{i = 1}^{k} \frac{\log_2 [n]}{L_n^i}]
[\tilde{H}
n = \frac{1}{n} \sum
{i = 2}^{n} \frac{\log_2 [i]}{L_i^i}]
4.5 窗口大小的确定
在估计 $\tilde{H}_{n,k}$ 时,一个实际问题是如何确定窗口大小 $n$。一般认为 $k + n$ 应近似等于消息长度。考虑到 $L_n^i$ 的偏差为 $O[1 / \log_2 [n]]$,方差为 $O[1 / k]$,偏差/方差权衡在 $k \approx O[(\log_2 [n])^2]$ 左右达到平衡。
4.6 康托伊安尼斯方法实现
def konto(msg,window=None):
'''
* Kontoyiannis’ LZ entropy estimate, 2013 version (centered window).
* Inverse of the avg length of the shortest non-redundant substring.
* If non-redundant substrings are short, the text is highly entropic.
* window==None for expanding window, in which case len(msg)%2==0
* If the end of msg is more relevant, try konto(msg[::-1])
'''
out={'num':0,'sum':0,'subS':[]}
if not isinstance(msg,str):msg=''.join(map(str,msg))
if window is None:
points=xrange(1,len(msg)/2+1)
else:
window=min(window,len(msg)/2)
points=xrange(window,len(msg)-window+1)
for i in points:
if window is None:
l,msg_=matchLength(msg,i,i)
out['sum']+=np.log2(i+1)/l # to avoid Doeblin condition
else:
l,msg_=matchLength(msg,i,window)
out['sum']+=np.log2(window+1)/l # to avoid Doeblin condition
out['subS'].append(msg_)
out['num']+=1
out['h']=out['sum']/out['num']
out['r']=1-out['h']/np.log2(len(msg)) # redundancy, 0<=r<=1
return out
#———————————————————————————————————————
if __name__=='__main__':
msg='101010'
print konto(msg*2)
print konto(msg+msg[::-1])
4.7 注意事项
- 熵率是在极限情况下定义的,当消息较短时,可以多次重复相同的消息。
- 由于匹配窗口必须对称,消息长度为偶数时最后一位才会被考虑用于匹配。对于奇数长度的消息,可以移除第一位。
- 当消息末尾有不规则序列时,一些最终位会被忽略。当消息末尾特别重要时,可以分析反转消息的熵。
5. 编码方案
估计熵需要对消息进行编码,以下是几种常见的编码方案:
5.1 二进制编码
将连续变量离散化,例如,对于收益率流 $r_t$,当 $r_t > 0$ 时编码为 1,$r_t < 0$ 时编码为 0,移除 $r_t = 0$ 的情况。在价格条采样的收益率序列中,二进制编码自然出现,因为 $\vert r_t \vert$ 近似恒定。但当 $\vert r_t \vert$ 取值范围较广时,二进制编码会丢弃潜在有用信息。可以通过按从属随机过程采样价格来部分解决异方差问题,例如交易条和成交量条。
5.2 分位数编码
根据 $r_t$ 所属的分位数为其分配一个代码。分位数边界使用样本内时期(训练集)确定。这种方法在样本内和样本外都能使每个代码分配的观测值数量大致相同,平均来说会增加熵读数。
5.3 Sigma 编码
固定离散化步长 $\sigma$,将 $r_t$ 编码为:$r_t \in [\min {r}, \min {r} + \sigma)$ 时赋值为 0,$r_t \in [\min {r} + \sigma, \min {r} + 2\sigma)$ 时赋值为 1,依此类推。与分位数编码不同,每个代码覆盖 $r_t$ 范围的相同部分。由于代码分布不均匀,平均来说熵读数会比分位数编码小,但“罕见”代码的出现会导致熵读数飙升。
以下是编码方案的比较表格:
| 编码方案 | 特点 | 适用情况 | 熵读数特点 |
| ---- | ---- | ---- | ---- |
| 二进制编码 | 简单,按符号编码 | $\vert r_t \vert$ 近似恒定 | 可能丢弃信息 |
| 分位数编码 | 按分位数分配代码,样本内外分配均匀 | 一般情况 | 平均熵读数较高 |
| Sigma 编码 | 按固定步长编码,代码覆盖范围相同 | 价格流确定字典 | 平均熵读数较低,“罕见”代码有峰值 |
6. 高斯过程的熵
独立同分布正态随机过程的熵可以推导为:
[H = \frac{1}{2} \log [2 \pi e \sigma^2]]
对于标准正态分布,$H \approx 1.42$。
这个结果有两个用途:
- 可以用来基准测试熵估计器的性能。从标准正态分布中抽取样本,找到估计器、消息长度和编码的组合,使熵估计值 $\hat{H}$ 足够接近理论值 $H$。
- 可以通过 $H$ 与 $\sigma$ 的关系,得到熵隐含的波动率估计,前提是收益率确实来自正态分布。
mermaid 流程图展示高斯过程熵的应用:
graph LR
A[抽取标准正态样本] --> B[选择估计器、消息长度和编码]
B --> C[计算熵估计值 $\hat{H}$]
C --> D{ $\hat{H}$ 是否接近理论值 $H$? }
D -- 是 --> E[基准测试通过]
D -- 否 --> B
F[已知 $H$] --> G[计算熵隐含波动率 $\sigma_H$]
综上所述,我们介绍了熵的基本概念、估计方法和编码方案,以及高斯过程熵的应用。这些知识对于理解和分析金融市场中的信息含量和复杂性具有重要意义。在后续内容中,我们将探讨熵与广义均值的关系,以及熵在金融市场建模中的一些应用。
7. 熵与广义均值
考虑一组实数 $x = {x_i}
{i = 1, \ldots, n}$ 和权重 $p = {p_i}
{i = 1, \ldots, n}$,其中 $0 \leq p_i \leq 1$ 且 $\sum_{i = 1}^{n} p_i = 1$。广义加权均值定义为:
[M_q[x, p] = \left( \sum_{i = 1}^{n} p_i x_i^q \right)^{1/q}]
对于 $q < 0$,要求 $x_i > 0$。其他常见均值可以作为特殊情况得到:
- 最小值:$\lim_{q \to -\infty} M_q[x, p] = \min_i {x_i}$
- 调和均值:$M_{-1}[x, p] = \left( \sum_{i = 1}^{n} p_i x_i^{-1} \right)^{-1}$
- 几何均值:$\lim_{q \to 0} M_q[x, p] = e^{\sum_{i = 1}^{n} p_i \log [x_i]} = \prod_{i = 1}^{n} x_i^{p_i}$
- 算术均值:$M_1[x, {n^{-1}}
{i = 1, \ldots, n}] = n^{-1} \sum
{i = 1}^{n} x_i$
- 二次均值:$M_2[x, p] = \left( \sum_{i = 1}^{n} p_i x_i^2 \right)^{1/2}$
- 最大值:$\lim_{q \to +\infty} M_q[x, p] = \max_i {x_i}$
在信息理论中,当 $x = {p_i}
{i = 1, \ldots, n}$ 时,有:
[M_q[p, p] = \left( \sum
{i = 1}^{n} p_i p_i^q \right)^{1/q}]
定义 $N_q[p] = \frac{1}{M_{q - 1}[p, p]}$,对于 $q > 1$,如果 $p_i$ 在 $k$ 个不同的索引上均匀分布,其他地方为 0,则 $N_q[p] = k$。这意味着 $N_q[p]$ 给出了 $p$ 中项目的有效数量或多样性。
通过 Jensen 不等式可以证明 $\frac{\partial M_q[p, p]}{\partial q} \geq 0$,因此 $\frac{\partial N_q[p]}{\partial q} \leq 0$。较小的 $q$ 值为分区元素分配更均匀的权重,相对更重视不太常见的元素,$\lim_{q \to 0} N_q[p]$ 就是非零 $p_i$ 的总数。
香农熵可以表示为:
[H[p] = \sum_{i = 1}^{n} -p_i \log [p_i] = - \log [\lim_{q \to 0} M_q[p]] = \log [\lim_{q \to 1} N_q[p]]]
这表明熵可以解释为列表 $p$ 中有效项目数量的对数,其中 $q \to 1$。
以下是不同均值与 $q$ 值关系的表格:
| 均值类型 | $q$ 值 | 表达式 |
| ---- | ---- | ---- |
| 最小值 | $q \to -\infty$ | $\min_i {x_i}$ |
| 调和均值 | $q = -1$ | $\left( \sum_{i = 1}^{n} p_i x_i^{-1} \right)^{-1}$ |
| 几何均值 | $q \to 0$ | $e^{\sum_{i = 1}^{n} p_i \log [x_i]}$ |
| 算术均值 | $q = 1$ | $n^{-1} \sum_{i = 1}^{n} x_i$ |
| 二次均值 | $q = 2$ | $\left( \sum_{i = 1}^{n} p_i x_i^2 \right)^{1/2}$ |
| 最大值 | $q \to +\infty$ | $\max_i {x_i}$ |
8. 熵在金融领域的应用
8.1 市场效率
当套利机制充分利用所有机会时,价格会立即反映所有可用信息,变得不可预测,市场是有效的。相反,当套利不完美时,价格包含不完整信息,会出现可预测的模式。熵可以衡量价格序列的冗余度,熵越高,冗余度越低,信息含量越大,市场效率越高。例如,泡沫通常出现在低熵(压缩)市场中。
8.2 最大熵生成
在可能的未来结果中,最大化熵的结果可能是最有利可图的,因为它最难以被频率统计模型预测。这种情况可能会触发止损,引发反馈机制,加剧价格波动。
8.3 投资组合集中度
对于一个 $N \times N$ 的协方差矩阵 $V$,计算其特征值分解 $VW = W\Lambda$,得到因子载荷向量 $f_{\omega} = W’\omega$,其中 $\omega$ 是分配向量,$\sum_{n = 1}^{N} \omega_n = 1$。每个主成分贡献的风险比例为:
[\theta_i = \frac{[f_{\omega}]
i^2 \Lambda
{i, i}}{\sum_{n = 1}^{N} [f_{\omega}]
n^2 \Lambda
{n, n}}]
其中 $\sum_{i = 1}^{N} \theta_i = 1$,且 $\theta_i \in [0, 1]$。投资组合集中度的熵启发式定义为:
[H = 1 - \frac{1}{N} e^{-\sum_{n = 1}^{N} \theta_n \log [\theta_n]}]
8.4 市场微观结构
Easley 等人的研究表明,在好坏消息概率相等的情况下,知情交易概率(PIN)可以表示为:
[PIN = \frac{\alpha \mu}{\alpha \mu + 2 \varepsilon}]
其中 $\mu$ 是知情交易者的到达率,$\varepsilon$ 是不知情交易者的到达率,$\alpha$ 是信息事件的概率。在成交量时钟下,PIN 可以简化为 VPIN:
[VPIN = \frac{\alpha \mu}{\alpha \mu + 2 \varepsilon} = \frac{\alpha \mu}{V} \approx \frac{1}{V} E[|2V_{B}^{\tau} - V|] = E[|2v_{B}^{\tau} - 1|]]
其中 $v_{B}^{\tau} = \frac{V_{B}^{\tau}}{V}$,$2v_{B}^{\tau} - 1$ 表示订单流不平衡 $OI_{\tau}$,$OI_{\tau} \in [-1, 1]$。
为了确定逆向选择的概率,需要确定订单流不平衡的不可预测性。可以通过以下步骤实现:
1. 给定一系列成交量条,确定每个条中分类为买入的成交量比例 $v_{B}^{\tau} \in [0, 1]$。
2. 计算 ${v_{B}^{\tau}}$ 的 $q$ 分位数,定义一组 $q$ 个不相交的子集 $K = {K_1, \ldots, K_q}$。
3. 将每个 $v_{B}^{\tau}$ 映射到其中一个不相交的子集,$f: v_{B}^{\tau} \to {1, \ldots, q}$。
4. 对 ${v_{B}^{\tau}}$ 进行量化,为每个值 $v_{B}^{\tau}$ 分配其所属子集的索引,得到量化消息 $X = [f[v_{B}^1], f[v_{B}^2], \ldots, f[v_{B}^N]]$。
5. 使用康托伊安尼斯的莱姆佩尔 - 齐夫算法估计熵 $H[X]$。
6. 计算累积分布函数 $F[H[X]]$,并将 ${F[H[X_{\tau}]]}_{\tau = 1, \ldots, N}$ 作为特征来预测逆向选择的概率。
mermaid 流程图展示市场微观结构中逆向选择概率的计算过程:
graph LR
A[确定 $v_{B}^{\tau}$] --> B[计算 $q$ 分位数]
B --> C[定义子集 $K$]
C --> D[映射 $v_{B}^{\tau}$ 到子集]
D --> E[量化得到消息 $X$]
E --> F[估计熵 $H[X]$]
F --> G[计算累积分布函数 $F[H[X]]$]
G --> H[预测逆向选择概率]
9. 练习
9.1 练习 1
-
对 E - mini S&P 500 期货形成美元条。
- 使用二进制方法对收益率序列进行量化。
- 使用分位数编码,使用 10 个字母对收益率序列进行量化。
- 使用 Sigma 编码,其中 $\sigma$ 是所有条收益率的标准差,对收益率序列进行量化。
- 使用插件方法计算三个编码序列的熵。
- 使用康托伊安尼斯方法,窗口大小为 100,计算三个编码序列的熵。
9.2 练习 2
-
使用练习 1 中的条。
- 计算收益率序列 ${r_t}$。
- 按以下方式编码序列:如果 $r_t r_{t - 1} < 0$ 编码为 0,如果 $r_t r_{t - 1} \geq 0$ 编码为 1。
- 将序列划分为 1000 个不重叠的等大小子集(可能需要丢弃开头的一些观测值)。
- 使用插件方法计算 1000 个编码子集的熵。
- 使用康托伊安尼斯方法,窗口大小为 100,计算 1000 个编码子集的熵。
- 计算步骤 4 和步骤 5 结果的相关性。
9.3 练习 3
-
从标准正态分布中抽取 1000 个观测值。
- 这个过程的真实熵是多少?
- 根据 8 个分位数对观测值进行标记。
- 使用插件方法估计熵。
-
使用康托伊安尼斯方法估计熵:
- 使用窗口大小为 10。
- 使用窗口大小为 100。
9.4 练习 4
-
使用练习 3 中的抽取值 ${x_t}_{t = 1, \ldots, 1000}$。
- 计算 $y_t = \rho y_{t - 1} + x_t$,其中 $\rho = 0.5$,$y_0 = 0$。
- 根据 8 个分位数对 ${y_t}$ 观测值进行标记。
- 使用插件方法估计熵。
-
使用康托伊安尼斯方法估计熵:
- 使用窗口大小为 10。
- 使用窗口大小为 100。
9.5 练习 5
-
假设一个包含 10 个持仓的投资组合,美元分配相等。
- 第 $i$ 个主成分贡献的总风险比例为 $\frac{1}{10}$,$i = 1, \ldots, 10$,投资组合的熵是多少?
- 第 $i$ 个主成分贡献的总风险比例为 $1 - \frac{i}{55}$,$i = 1, \ldots, 10$,投资组合的熵是多少?
- 第 $i$ 个主成分贡献的总风险比例为 $\alpha \frac{1}{10} + (1 - \alpha)(1 - \frac{i}{55})$,$i = 1, \ldots, 10$,$\alpha \in [0, 1]$,绘制投资组合熵作为 $\alpha$ 的函数。
通过这些练习,可以进一步加深对熵概念、估计方法和金融应用的理解和掌握。总之,熵在金融领域有着广泛的应用,从市场效率分析到投资组合管理,再到市场微观结构的研究,都可以借助熵的理论和方法来进行更深入的分析和决策。
超级会员免费看
1076

被折叠的 条评论
为什么被折叠?



