金融投资中的概率机器学习(二)
原文:
annas-archive.org/md5/a512fa05e8238761ba4fe8e26e1fac3d译者:飞龙
第六章:传统人工智能系统的危险
一个人必须知道自己的限制。
——《铁证悬案》中的侦探“脏哈利”,他目睹一个自信过度的犯罪头目的汽车爆炸
一个模型必须知道自己的限制。这点很重要,因为这是金融和投资模型特性的重要性所在。其推论是,一个人工智能必须知道自己的限制。所有人工智能系统最严重的限制是它们缺乏常识。这源于它们无法理解因果关系。人工智能系统在训练期间只学习了难以推广到新情况的统计关系,而没有理解因果关系。
在 第一章 中,我们探讨了金融市场如何在你谨慎和深思熟虑地应用最佳模型时,仍然可能使你感到羞辱的三种方式。当你的模型基于有缺陷的金融和统计理论(例如本书上半部分讨论的内容)时,市场几乎肯定会让你感到羞辱。实际上,这并不是那么糟糕的结果,因为羞辱性的财务损失通常会带来个人的洞察和成长。更糟糕的结果是被解雇或者职业生涯以不光彩的方式结束。最糟糕的结果是个人财务破产,这种经历带来的智慧可能来不及发挥作用。
当传统的机器学习模型(如深度学习网络和逻辑回归)被训练时,它们通常使用最大似然估计(MLE)方法从样本数据中学习模型参数。因此,这些机器学习系统有三个严重缺陷,严重限制了它们在金融和投资领域的应用。首先,在使用小数据集时,尤其是在学习嘈杂的金融数据时,它们的模型参数估计是错误的。其次,这些机器学习模型在超出它们已经训练和测试过的数据范围和类别时,表现糟糕。第三,MLE 模型的概率分数必须通过使用 Sigmoid 或 Softmax 等函数进行校准,以将其校准为有效的概率。然而,这些校准不能保证准确地表示潜在的概率,导致了糟糕的不确定性量化。
所有这些缺陷的严重性在于,这些机器学习系统所依赖的传统统计模型在错误估计和预测时表现出令人震惊的高置信度,使它们在不确定的世界中变得非常危险。就像电影《铁证悬案》中一样,这些自信过满的人工智能模型有潜力引爆投资账户、公司、金融机构和经济,如果在不了解它们严重限制的情况下实施。
在第四章中,我们揭示了流行统计方法如 NHST、p 值和置信区间的错误推理推断。在本章中,我们检视了流行的 MLE 方法的严重限制和缺陷,以及其在金融和投资领域的失败原因。我们通过研究一个案例,试图预测我们投资的新上市公司是否能超过其季度盈利预期,基于一个短期记录。通过比较传统 MLE 模型与概率模型的结果,我们展示了为什么概率模型更适合于金融和投资,特别是在数据稀缺时。
正如之前讨论的,由于边缘概率分布中求和/积分的复杂性无法解析解决大多数现实世界的概率推断问题。与 MLE 模型使用的有缺陷的概率校准方法不同,我们只能采用近似数值解来解决概率推断问题。即使通过基本微积分可以解析解决盈利预期问题,我们也应用网格近似来解决它,以展示这种简单而强大的技术是如何运作的,使概率推断更容易理解。
马尔可夫链蒙特卡洛(MCMC)模拟是一种突破性的数值方法,通过估计解析上难以处理的高维后验概率分布,改变了概率推断的可用性。MCMC 使用依赖随机抽样算法模拟复杂的概率分布。我们探索了支持这种强大、可扩展模拟方法的基本概念。作为 MCMC 方法的概念验证,我们使用著名的 Metropolis 抽样算法模拟具有重尾的学生 t 分布。
AI 系统:一个危险的缺乏常识
人类天生具有一种非常重要的质量,迄今为止没有任何 AI 能够学会:一种具有常识的能力,合理地将我们的学习推广到未见过的、样本外的相关类别或范围,即使我们没有专门接受过这些训练。与 AI 系统不同的是,几乎所有人类都能够轻松推断、推理,并根据常识调整自己的知识以应对新的情况。例如,一个训练用于在荒野中识别活象的深度神经网络无法识别展览馆中展示的一只标本象。[¹] 一个幼儿只需运用他们的常识就能轻松完成这项任务。正如其他人指出的那样,AI 系统实际上无法看到房间里的大象!
这种常见失败的主要原因是 AI 模型只计算相关性,而没有工具来理解因果关系。此外,人类能够从具体例子中抽象概念,并以对象的泛化和它们之间的因果关系来思考,而 AI 系统却无法做到这一点。当处理嘈杂的大数据集时,这是一个主要问题,因为它们提供了丰富的机会,可以关联那些没有合理物理或因果关系的变量。在大数据集中,变量之间的虚假关联是常规,而不是例外。
例如,图 6-1 显示在 1999 年至 2009 年期间,美国在科学、太空和技术上的支出与自杀(包括绞刑、勒颈和窒息)之间存在 99.8%的相关性。²
图 6-1. 大数据集中常见的虚假关联³
显然,这种关系是荒谬的,并且强调了相关性并不意味着因果关系的格言。人类可以很容易理解这种虚假关联的荒谬之处,但 AI 系统却无法做到。这也使得那些理解这些弱点并能利用它们的人可以轻易愚弄 AI 系统。
虽然人工神经网络灵感来自人脑的结构和功能,但我们对人类神经元如何学习和工作的理解仍然不完整。因此,人工神经网络并非生物神经元的精确复制品,人类大脑运作的许多未解之谜仍然存在。术语“深度神经网络”是一个误导性的营销术语,用于描述在输入层和输出层之间具有两个以上隐藏层的人工神经网络。对于一个缺乏幼儿通识的深度神经网络来说,并没有什么“深刻”的含义。⁴
为什么 MLE 模型在金融领域失败
所有传统的参数化 ML 系统都使用 MLE 统计方法,从简单的线性模型到复杂的深度学习神经网络。MLE 方法用于计算最优参数,以最佳拟合假定统计分布的数据。当模型只处理具有时间不变统计分布的大数据集的随机不确定性时,MLE 算法是有用的。
当统计分布被点估计总结时,尽管这是最优估计,但会丢失许多有价值的信息和不确定性评估。根据定义和设计,点估计不能捕捉模型参数的认知不确定性,因为它们不是概率分布。在金融和投资领域,这会带来严重后果,因为我们正在处理的是深陷于三种不确定性维度的复杂、动态社会系统:偶然性、认知性和本体论性。在第一章中,我们讨论了在金融和投资中使用点估计是危险和愚蠢的原因,因为我们持续处理错误的测量、不完整的信息和三维不确定性。换句话说,基于 MLE 的传统机器学习系统仅在不确定性三维空间的一个维度上运行,如图 2-7 所示。更令人担忧的是,许多这些机器学习系统通常是黑匣子,以高速自信地运行,但概率校准有缺陷。
此外,MLE 忽略了基于先验领域知识的基础率或先验概率,这可能导致基础率谬误,正如第四章所讨论的那样。当 MLE 应用于小数据集时,这一点尤为真实。我们实际上可以通过将 MLE 方法应用于一个估计公司实际是否能超过市场预期其收益估计的真实问题来看看为何如此。此示例受到参考文献中描述的硬币投掷示例的启发。⁵
用于收益预期的 MLE 模型
假设你已经换了工作,现在作为股票分析师在一家共同基金公司工作。去年,你的基金在高增长技术公司 ZYX 的首次公开募股(IPO)中分配了股权。尽管 ZYX 在其整个初创生涯中从未盈利过,但由于其侵略性营销活动得到大量风险投资的支持,其品牌已经成为家喻户晓的名字。显然,私募和公募股权投资者买入了其迷人的增长故事,由其富有魅力的首席执行官叙述。
在其 IPO 以来的最后三个季度中,ZYX 的负盈利甚至超过了市场对更大亏损的预期。在金融市场中,较差即好。ZYX 的股价持续不断地上涨,并且目前正在创下历史新高,让每个人受益。您的投资组合经理(PM)已要求您估计 ZYX 在即将到来的第四季度收益将超过市场预期的概率。根据您的概率估计,您的 PM 将在他们的收益公告前增加或减少基金对 ZYX 的权益投资。
在接受传统统计方法教育后,我们决定建立一个标准的 MLE 模型来计算所需的概率。收益公告事件只有两个我们感兴趣的结果:要么收益超过市场预期,要么低于市场预期。我们不关心收益仅达到市场预期的结果。像许多其他投资者一样,您的投资组合经理(PM)已经决定这样的结果相当于收益低于市场预期。众所周知,公司管理层在一年中与华尔街分析师打一场游戏,他们降低他们的盈利预期,以便在实际盈利公告时更容易超过这些预期。
让我们设计我们的季度收益最大似然估计(MLE)模型,并指定支撑它的假设:
-
在单个事件或试验中,模型的输出变量 y 只能假定两种可能的结果之一,y = 1 或 y = 0。
-
这两个结果是互斥的且完全穷尽的。
-
将 y = 1 分配给 ZYX 超过市场对其季度收益的预期的结果。
-
将 y = 0 分配给 ZYX 没有超过或仅达到市场对其季度收益的预期的结果。
我们现在必须为我们的似然函数选择一个最能模拟收益公告这一二元事件的统计分布。伯努利分布模拟了具有二元结果的单个事件或试验。参见 图 6-2。
图 6-2. 伯努利变量⁶,其结果 x = 1 的发生概率为 p,结果 x = 0 的发生概率为 1-p
回想一下,在 第一章 中,我们使用二项分布来模拟美联储在几次会议或试验中利率上涨的总次数。当用于单次试验时,伯努利分布是二项分布的特例,因为它们在用于单次试验时具有相同的概率分布。
-
假设变量 y 服从一个未知参数 p 的伯努利分布,这给了我们收益超预期的概率(y = 1)。
-
由于两个概率必须加起来等于 1,这意味着未能超过收益预期(y = 0)的概率是其补集,即 1-p。
我们的目标是找到参数 p 的 MLE,即 ZYX 基于其短期设定市场预期并超过市场预期的季度收益的概率。
变量 y 的伯努利过程是独立同分布(i.i.d.)伯努利试验的离散时间序列,由 y[i]表示。
-
i.i.d.假设意味着每次收益公告都与之前的所有收益独立,并且都从具有常数参数 p 的相同伯努利分布中抽取。
-
在其最后三个季度,ZYX 超过了收益预期,因此我们对参数 p 的训练数据是 D = (y[1] = 1, y[2] = 1, y[3] = 1)。
让我们称 p′为伯努利变量 y 参数 p 的 MLE。可以数学地证明,p′是时间序列数据 D 样本的期望值或算术平均值。它是最优参数,当插入伯努利似然函数中时,最适合时间序列数据 D。这意味着在数据集 D 上训练的 p′是:
-
p′(D) = (y[1]+y[2]+y[3]) / 3 = (1 + 1 + 1) / 3 = 3 / 3 = 1
-
因此,ZYX 在其第四季度超过市场对其收益预期的概率是 P(y[4] = 1 | p′) = p′ = 1 或 100%。
由于 MLE 模型仅允许由数据随机抽样引起的随机不确定性,让我们计算 y 的方差。具有参数 p′的伯努利变量 y 的方差由以下给出:
-
随机不确定性或方差(y | p′) = (p′) × (1 – p′) = 1 × (1 – 1) = 1 × 0 = 0.
-
由于 p′是一个最优点估计,认知不确定性= 0。
-
由于 p′被认为是一个“真实”的常数,而且假设伯努利分布是时间不变的,本体不确定性= 0。
因此,我们的 MLE 模型分配了一个 100%的概率,没有抽样误差,y[4] = 1。换句话说,我们的模型绝对确定 ZYX 将在即将到来的第四季度打破市场对其收益预期的期望。我们模型对 ZYX 收益超过市场预期的英雄式预测基于一家新兴的亏损技术公司仅有三个数据点。此外,我们当前的 MLE 模型将继续预测 ZYX 在其余生命周期内每个季度的收益超出预期。不仅仅是死亡和税收是确定的。我们需要将我们的 MLE 模型的预测添加到列表中。
任何具有常识的财务分析师都不会向其投资组合经理呈现这个 MLE 模型及其预测。然而,在金融和投资中拥有稀疏数据集是非常普遍的。例如,我们仅有两次全球大流行的财务数据。早期科技初创公司或战略/特别项目几乎没有相关数据可供作出具体决策。自大萧条于 1933 年结束以来,美国经济只经历了 13 次衰退。自 1942 年以来,标准普尔 500 指数仅有一次连续三年的负总回报(2000 年至 2003 年)。这些是一些明显的例子。金融和投资中稀疏数据集的列表确实很长。
显然,在金融和投资中常见的稀疏数据集上应用 MLE 模型是危险的。它们真的不了解它们的局限性,并毫不掩饰地显示他们的无知。基于 MLE 模型构建复杂的金融机器学习系统只会更早或更晚导致财务灾难。
关于收益预期的概率模型
现在让我们删除无用的 MLE 模型,并停下来思考这个问题。仅有三个数据点可供参考,对于任何对参数 p 的点估计都绝对不应该抱有确定性,即 ZYX 第四季度收益超过市场预期的概率。为什么?在过去一个季度可能发生了很多可能的问题,只有一些公司内部人员可能意识到。考虑到公司管理层和股东之间信息的持久不对称性,这种情况总是可能发生。这是我们对参数 p 的认识不确定性的一个主要来源。
最重要的是,眼前有太多因素——公司特定、政治、监管、法律、货币和经济——可能在 ZYX 公布其收益之前出现问题,并改变市场的预期。这些是我们本体不确定性的一些来源。当然,没有人知道未来会发生什么,但未来更有可能反映最近的过去。
因此,基于我们对我们生活的现实世界三个不确定性维度的理解以及我们目前掌握的信息,我们可以合理地打赌,ZYX 将超过市场对其第四季度收益的预期。然而,这并不是确定的。这意味着我们的模型参数 p 应能够取 0 到 1 之间的任何值,越接近 1 越有可能。换句话说,我们对 p 的估计最好用概率分布而不是任何特定点估计来表达。特别是在看到数据集 D 后,我们对 p 的估计最好表达为一个正偏态概率分布。
请注意,MLE 是最能复制观察数据的 p 值。但并没有普遍的自然法则表明 MLE 就是产生样本数据的 p 值的确证。参数 p 的其他值也很容易生成数据集 D。我们处理情感体的复杂社会系统,这些体系的行为往往是次优的。更重要的是,我们不受约束地选择一个 p 值。
让我们通过构建一个概率模型来更加精确地量化和可视化参数 p 的统计分布。回想一下,一个概率模型要求我们指定两个概率分布:
-
第一个是先验概率分布 P(p),它概括了我们在观察任何数据之前对模型参数的知识或假设。假设您对 ZYX 公司没有任何先验知识或对参数 p 的任何概念。这使得一个均匀分布 U(0, 1),我们在蒙提霍尔问题中学到的,成为我们先验分布的一个良好选择。这个分布将所有介于 0 到 1 之间的 p 值赋予相等的概率。因此,P(p)
U (0, 1),其中波浪号()是“统计分布为”的缩写。 -
第二个是似然函数 P(D | p),它给出了观察我们样本数据 D 的可能性,假设参数 p 介于 0 到 1 之间的任何值。我们将继续使用伯努利概率分布及其相关过程作为我们概率模型中的似然函数。因此,我们概率模型的似然函数是 P(D | p) ~Bernoulli (p)。
我们的目标是估计我们的模型参数 p 在样本数据 D 和我们对 p 的先验知识或假设给定情况下的后验概率分布。这将为我们提供结果 y = 1 的概率分布,即盈利超预期的概率。我们将使用逆概率规则计算给定数据 D 的 p 的概率分布。我们的概率模型可以规定如下:
-
P( p | D) = P(D | p) ✕ P(p) / P(D) 其中
-
P(p) ~U (0, 1)
-
P(D | p) ~ Bernoulli (p)
-
D = (y[1] = 1, y[2] = 1, y[3] = 1)
这个后验分布足够简单,可以用基本的微积分解析求解。⁷ 然而,这涉及到对概率密度函数的积分,这对许多读者来说可能不容易理解。因此,我们将使用一种称为网格逼近的简单数值方法来计算后验分布。这种方法将把我们的积分微积分问题转化为描述性统计问题,这有助于我们建立对概率模型基本机制的直觉理解。
由于我们的先验分布是离散且均匀分布的,我们可以将 0 到 1 之间的区间分成 9 个等距点,相隔 0.1,如图 6-3 所示。
图 6-3。在 a 和 b 之间均匀分布的 n 个网格点,每个点的概率均为 1/n⁸
因此,我们的网格点是 {p[1] = 0.1, p[2] = 0.2, .., p[9] = 0.9}。由于 n 个网格点均匀分布,它们都具有相同的概率,即 P(p) = 1/n,其中 n 是网格点的数量。在我们的近似中,我们有 n = 9 个网格点。
- 对于我们一维网格上的每个参数 p[1],...p[9],先验概率为 P(p) = 1/9 = 0.111。
对于每个参数 p[i],我们从九个网格点集合中抽样,以模拟一个具有 p[i] 值的收益事件,伯努利似然函数生成 y = 1 的概率为 pi,y = 0 的概率为 1-p[i]。ZYX 的收益事件最后三个季度的伯努利过程由我们的训练数据 D = (y[1] = 1, y[2] = 1, y[3] = 1) 给出。因此,伯努利过程的似然性为:
- P(D | p[i]) = p[i] × p[i] × p[i] = p[i]³
对于每个参数 p[i],我们使用一个网格点 {p[1],...p[9]} 计算未归一化后验分布 P*(p | D),使用逆概率法则。为了计算归一化后验 P(p | D),我们首先将所有未归一化后验值相加,然后将每个未归一化后验值除以该总和,如下所示:
-
P * ( p i | D ) ∝ P ( D | p i ) P ( p i ) = p i 3 × 0 . 111
-
P(p[i] | D) = P ( p i | D ) / ∑ i P ( p i | D )
让我们使用 Python 代码开发解决方案的网格近似:
# Import the relevant Python libraries
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
# Create 9 grid points for the model parameter, from 0.1 to 0.9 spaced 0.1 apart
p = np.arange(0.1, 1, 0.1)
# Since all parameters are uniformly distributed and equally likely, the
# probability for each parameter = 1/n = 1/9
prior = 1/len(p)
# Create a pandas DataFrame with the relevant columns to store
# individual calculations
earnings_beat = pd.DataFrame(columns = ['parameter', 'prior', 'likelihood',
'posterior*', 'posterior'])
# Store each parameter value
earnings_beat['parameter'] = p
# Loop computes the unnormalized posterior probability distribution
# for each value of the parameter
for i in range(0,len(p)):
earnings_beat.iloc[i,1] = prior
# Since our training data has three earnings beats in a row,
# each having a probability of p
earnings_beat.iloc[i,2] = p[i]**3
# Use the unnormalized inverse probability rule
earnings_beat.iloc[i,3] = prior * (p[i]**3)
# Normalize the probability distribution so that all values add up to 1
earnings_beat['posterior'] = earnings_beat['posterior*']
/sum(earnings_beat['posterior*'])
# Display the data frame to show each calculation
earnings_beat
# Plot the prior and posterior probability distribution for the model parameter
plt.figure(figsize=(16,6)), plt.subplot(1,2,1), plt.ylim([0,0.5])
plt.stem(earnings_beat['parameter'],earnings_beat['prior'],
use_line_collection=True)
plt.xlabel('Model parameter p'), plt.ylabel('Probability of parameter P(p)'),
plt.title('Prior distribution of our model parameter')
plt.subplot(1,2,2), plt.ylim([0,0.5])
plt.stem(earnings_beat['parameter'],earnings_beat['posterior'],
use_line_collection=True)
plt.xlabel('Model parameter p'), plt.ylabel('Probability of parameter P(p)'),
plt.title('Posterior distribution of our model parameter')
plt.show()
本图清楚地显示,我们的概率模型在训练模型之前和之后计算了模型参数 p 的概率分布。考虑到我们总是对任何事件都有不完整的信息,这是一个更加现实的解决方案。
我们的模型从先验知识和数据中学习了参数 p。这只是解决方案的一半。我们需要使用我们的模型来预测 ZYX 将超越市场对其第四季度盈利预期的概率。换句话说,我们需要开发我们模型的预测分布。让我们继续编写代码:
# Since P(yi=1|pi) = pi, we compute the probability weighted average of
# observing y=1 using our prior probabilities as the weights
# This probability weighted average gives us the prior predictive probability of
# observing y=1 before observing any data
prior_predictive_1=sum(earnings_beat['parameter']*earnings_beat['prior'])
# The prior predictive probability of observing outcome y=0 is the complement of
# P(y=1) calculated above
prior_predictive_0 = 1 - prior_predictive_1
# Since we have picked a uniform distribution for our parameter, our model
# predicts that both outcomes are equally likely prior to observing any data
print(prior_predictive_0, prior_predictive_1)
(0.5, 0.5)
# Since P(yi=1|pi) = pi, we compute the probability weighted average of
# observing y=1 but now we use the posterior probabilities as the weights
# This probability weighted average gives us the posterior predictive
# probability of observing y=1 after observing in-sample data
D={y1=1, y2=1, y3=1}
posterior_predictive_1 =
sum(earnings_beat['parameter'] * earnings_beat['posterior'])
# The posterior predictive probability of observing outcome y=0 is the
# complement of P(y=1|D) calculated above
posterior_predictive_0 = 1- posterior_predictive_1
# After observing data D, our model predicts that observing y=1 is
# about 3 times more likely than observing y=0
round(posterior_predictive_0,2), round(posterior_predictive_1,2)
(0.24, 0.76)
# Plot the prior and posterior predictive probability distribution
# for the event outcomes
plt.figure(figsize=(16,6)), plt.subplot(1,2,1), plt.ylim([0,1])
plt.stem([0,1],[prior_predictive_0, prior_predictive_1],
use_line_collection=True)
plt.xlabel('Binary outcome for variable y'), plt.ylabel('Probability P(y)'),
plt.title('Prior predictive distribution of an earnings beat')
plt.subplot(1,2,2), plt.ylim([0,1])
plt.stem([0,1],[posterior_predictive_0, posterior_predictive_1],
use_line_collection=True)
plt.xlabel('Binary outcome for variable y'), plt.ylabel('Probability P(y)'),
plt.title('Posterior predictive distribution of an earnings beat')
plt.show()
预期值或后验预测均值为 76%,接近理论值 75%。尽管如此,我们的概率模型并不百分之百确定 ZYX 在第四季度将超过市场预期,即使在过去三个季度它已成功这样做。我们的模型预测,超过市场预期的可能性是不超过市场预期的三倍。这是一个更为现实的概率分布,也是我们可以用来做投资决策的东西。
不幸的是,我们用来解决收益预期问题的数值网格逼近技术在模型具有多个参数时无法扩展。因此,我们剩下的最可扩展和最健壮的数值方法是用于估计概率推理问题近似解的随机抽样方法。
马尔可夫链蒙特卡洛模拟
一般来说,有两种类型的随机抽样方法:独立抽样和依赖抽样。我们在第三章学到的标准蒙特卡洛模拟(MCS)方法是一种独立随机抽样方法。然而,当样本彼此依赖或相关时,随机抽样效果不佳。
此外,当独立抽样算法试图模拟具有多个参数或维度的目标概率分布时,效率低下。当模拟复杂的后验概率分布时,我们通常会遇到这两个问题。因此,我们需要能够处理相互依赖或相关样本的随机抽样算法。⁹ 马尔可夫链是生成依赖随机样本的流行方法。马尔可夫链的最重要特点是下一个生成的样本仅依赖于前一个样本,与其他所有因素无关。
马尔可夫链
马尔可夫链用于建模由一系列离散且相互依赖状态组成的随机过程,这些状态通过链式结构相互链接。它是一个顺序过程,在链中以离散时间概率转移从一个状态过渡到另一个状态。马尔可夫状态的最重要特点是它是无记忆的。对于任何状态,它的未来状态仅依赖于当前状态的转移概率,与所有过去状态和到达当前状态的路径无关。就像马尔可夫链编码了电影《功夫熊猫》中大师乌龟的禅宗名言:“昨日已成为历史,明日仍是个迷,今日则是馈赠,因此称为现在。”
同样重要的是,这种简化的无记忆特性使得马尔可夫链易于理解和实现。无论是算术还是几何的随机游走过程都是马尔可夫链的特定类型,并广泛用于模拟资产价格、回报率、利率和波动性。图 6-4 中展示了一个马尔可夫链的图形表示,描绘了金融市场的三种基本离散状态及其假设的过渡概率。
图 6-4. 描绘了金融市场三种基本状态及其假设过渡概率的马尔可夫链¹⁰
根据这个状态转移图,如果金融市场当前处于熊市状态,则有 80%的概率它将保持在熊市状态。然而,有 15%的概率市场将转移到牛市状态,而 5%的概率将转移到停滞市场状态。
假设市场随时间从熊市状态转移到停滞市场状态,然后再转移到牛市状态。一旦进入牛市状态,它将不会依赖或记忆停滞市场状态或熊市状态。关于其转移到未来状态的概率将仅依赖于其当前的牛市状态。因此,例如,无论它是从停滞市场状态还是熊市状态或两者的任何排列转移过来,有 90%的概率它将保持在牛市状态。换句话说,任何马尔可夫链的未来状态在给定当前状态时是条件独立于所有过去状态的。
尽管随机过程在马尔可夫链状态空间中进行随机游走,如果它可以在有限步数内从一个状态转移到任何其他状态,则该马尔可夫链被称为平稳遍历的。根据这个定义,在图 6-3 中描绘的假想金融市场过程的马尔可夫链是平稳遍历的,因为市场将在足够的时间内最终达到马尔可夫链中的任何状态。这样一个假设的平稳遍历金融市场将意味着所有投资者的集成平均价格回报预期将等于集成中任何单个投资者采取的每条随机轨迹的价格回报,在足够长的时间段内。
然而,正如前面讨论过的,真实的金融市场既不是稳态的,也不是遍历性的。例如,作为投资者,在持续的熊市状态下可能会遭受重大损失,或者在泡沫化的牛市状态下进行愚蠢的投资,或者被迫清算投资以支付昂贵的离婚律师费用,在停滞的市场状态下永远无法再进入另一个市场状态。然后,你将被放逐到一个特殊的马尔可夫状态,称为吸收状态,从中无法逃脱。这种特殊状态吸收了鹰乐队歌曲《加州旅馆》中的歌词精髓:“你可以随时退房,但你永远不能离开。”我们将在第八章中讨论金融和投资中的遍历性问题。
Metropolis 抽样
Metropolis 算法生成一个马尔可夫链来模拟任何离散或连续的目标概率分布。Metropolis 算法基于三个关键元素迭代生成依赖随机样本:
提议概率分布
这是一个概率分布,通过提议马尔可夫链中的下一个状态,有效地探索目标概率分布。根据问题的不同,可以使用不同的提议分布。
提议接受率
这是提议移动的相对概率的度量。在概率推断问题中,接受率是目标分布的后验概率在马尔可夫链中提议状态和当前状态处评估的比率。回想一下上一章中,在两个不同点处取后验概率的比率消除了解析上难以处理的边际概率分布。
提议状态的决策规则
这些是确定是否接受或拒绝链中提议状态的概率决策规则。如果接受率大于或等于 1,则接受提议状态并使马尔可夫链移动到下一个状态。如果接受率小于 1,则算法生成介于 0 和 1 之间的随机数。如果随机数小于接受率,则接受提议状态。否则拒绝。
Metropolis 算法通过迭代构建其马尔可夫链,在接受所需数量的样本后停止。接受的样本然后用于模拟目标概率分布。
作为 MCMC 模拟的概念验证,我们将使用 Metropolis 算法模拟自由度为 6 的 Student's t 分布。这个分布在金融和投资领域广泛用于建模具有重尾分布的资产价格回报分布。Student's t 分布是一个概率分布家族,每个特定分布由其自由度参数控制。该值越低,分布尾部越厚。我们将在下一章中应用该分布并进一步讨论。
在以下 Python 代码中,我们使用均匀分布作为提议分布,并使用自由度为 6 的 Student's t 分布作为我们的目标分布进行模拟。它将马尔可夫链在 x = 0 处任意初始化,并运行 Metropolis 抽样算法 10000 次。结果样本存储在一个列表中,用于可视化马尔可夫链的样本路径。最后,代码绘制直方图显示样本收敛到实际目标分布:
#Import Python libraries
import numpy as np
import scipy.stats as stats
import matplotlib.pyplot as plt
# Define the target distribution - Student's t-distribution
# with 6 degrees of freedom.
# Use location=0 and scale=1 parameters which are the default
# values of the Student's t-distribution
# x is any continuous variable
def target(x):
return stats.t.pdf(x, df=6)
# Define the proposal distribution (uniform distribution)
def proposal(x):
# Returns random sample between x-0.5 and x+0.5 of the current value
return stats.uniform.rvs(loc=x-0.5, scale=1)
# Set the initial state arbitrarily at 0 and set the number of
# iterations to 10,000
x0 = 0
n_iter = 10000
# Initialize the Markov chain and the samples list
x = x0
samples = [x]
# Run the Metropolis algorithm to generate new samples and store them in
# the 'samples' list
for i in range(n_iter):
# Generate a proposed state from the proposal distribution
x_proposed = proposal(x)
# Calculate the acceptance ratio
acceptance_ratio = target(x_proposed) / target(x)
# Accept or reject the proposed state
if acceptance_ratio >= 1:
# Accept new sample
x = x_proposed
else:
u = np.random.rand()
# Reject new sample
if u < acceptance_ratio:
x = x_proposed
# Add the current state to the list of samples
samples.append(x)
# Plot the sample path of the Markov chain
plt.plot(samples)
plt.xlabel('Sample Number')
plt.ylabel('Sample Value')
plt.title('Sample Path of the Markov Chain')
plt.show()
# Plot the histogram of the samples and compare it with the target distribution
plt.hist(samples, bins=50, density=True, alpha=0.5, label='MCMC Samples')
x_range = np.linspace(-5, 5, 1000)
plt.plot(x_range, target(x_range), 'r-', label='Target Distribution')
plt.xlabel('Sample Value')
plt.ylabel('Probability Density')
plt.title('MCMC Simulation of Students-T Distribution')
plt.legend()
plt.show()
1970 年,William Hastings 推广了 Metropolis 抽样算法,使得可以应用非对称提议分布和更灵活的接受标准。由此产生的 Metropolis-Hastings MCMC 算法可以渐近地模拟任何目标概率分布,即在足够的样本下,模拟将会收敛到目标概率分布。然而,对于高维复杂的目标分布,这种算法可能效率低下且成本高昂。
Metropolis-Hastings 算法依赖于马尔可夫链的任意初始值。在此期间收集的初始样本称为 burn-in 期间,通常会被丢弃。由于可能多次访问相同区域,状态空间的随机遍历可能会浪费时间。此外,算法可能会陷入多维空间的狭窄区域。
现代相关抽样算法已经发展出来,用以解决这种通用 MCMC 抽样算法的缺点。哈密尔顿蒙特卡罗(HMC)算法利用任意连续目标分布的几何结构在高维空间中高效移动。它是 PyMC 库中的默认 MCMC 抽样算法,我们使用它不需要任何专门的知识。在下一章中,我们将使用这些 MCMC 算法模拟模型参数的后验概率分布。
概要
大多数传统 ML 系统基于的传统统计 MLE 模型在能力上存在局限性。 它们仅设计用于处理偶然不确定性,并且对其局限性毫不知情。 正如我们在本章中展示的那样,基于 MLE 的模型会自信地进行愚蠢的预测。 在我们这个三维不确定性世界中,这使得它们在金融和投资的复杂世界中具有危险性。 由于这些自信、简单和仓促的 ML 模型的预测性能差和灾难性的风险管理几乎是不可避免的。
在设计概率模型时,我们承认只有死亡是肯定的事情 — — 其他事情,包括税收,都有可能分布。 概率模型旨在管理由嘈杂的样本数据和不准确的模型参数生成的不确定性。 这些模型使我们能够从偶然不确定性的一维世界进入包含偶然和认识不确定性的二维世界。 这使得它们更适合金融和投资的世界。 然而,这是以更高的计算复杂性为代价的。
要将概率机器学习应用于复杂的金融和投资问题,我们必须使用相关随机抽样,因为其他数值方法无法工作或无法扩展。 MCMC 模拟方法具有变革性。 它们使用相关随机抽样算法来模拟难以直接抽样的复杂概率分布。 我们将在下一章中应用 MCMC 方法,使用流行的概率 ML Python 库。
本体论不确定性源自复杂的社会系统,有时可能会造成混乱。 除其他事项外,它还涉及从头重新思考和重新设计概率模型,并使其更适合新的市场环境。 这通常最好由具有常识、判断力和经验的人类来管理。 在 AI 的大胆新世界中,我们仍然非常重要,实际上,这是最困难的工作。
References
Dürr, Oliver, 和 Beate Sick. Probabilistic Deep Learning with Python, Keras, and TensorFlow Probability. Manning Publications,2020 年。
Guo, Chuan, Geoff Pleiss, Yu Sun, 和 Kilian Q. Weinberger. “On Calibration of Modern Neural Networks.” 最后修订于 2017 年 8 月 3 日。arxiv.org/abs/1706.04….
Lambert, Ben. A Student’s Guide to Bayesian Statistics. 伦敦,英国:Sage Publications,2018 年。
Mitchell, Melanie. Artificial Intelligence: A Guide for Thinking Humans. 纽约:Farrar, Straus and Giroux,2020 年。
Vigen, Tyler. Spurious Correlations. 纽约:Hachette Books,2015 年。
¹ Oliver Dürr 和 Beate Sick,《贝叶斯统计学学生指南》(Manning Publications,2020 年),197–228 页。
² Tyler Vigen,《虚假相关性》(纽约:Hachette Books,2015 年)。
³ 改编自维基共享资源上的一幅图像。
⁴ 梅兰妮·米切尔,“人工智能中的知识、抽象和类比”,收录于《人工智能:智慧人类的指南》(纽约:法拉尔、斯特劳斯和吉鲁出版社,2019 年),247–65 页。
⁵ 杜尔和希克,“贝叶斯学习”。
⁶ 改编自维基共享资源上的一幅图像。
⁷ 杜尔和希克,“贝叶斯学习”。
⁸ 改编自维基共享资源上的一幅图像。
⁹ 本·兰伯特,“告别共轭:马尔可夫链蒙特卡洛”,收录于《贝叶斯统计学指南》(伦敦,英国:Sage 出版社,2018 年),263–90 页。
¹⁰ 改编自维基共享资源上的一幅图像。
第七章:生成集成的概率机器学习
不要在干草堆里找针。直接买下整个干草堆!
— 约翰·博格尔,指数基金发明者及先锋集团创始人
大多数人可能不知道,在高中时,我们学习到了最强大和最稳健的机器学习算法之一,即通过找到数据点的最佳拟合直线来进行普通最小二乘(OLS)算法的估计。这一算法是由阿德里安-玛丽·勒让德和卡尔·高斯在两百多年前开发的,用于估计线性回归模型的参数。这类模型拥有最悠久的历史,并被视为通用机器学习模型的基准。线性回归和分类模型被认为是最基础的人工神经网络模型。正因如此,线性模型被称为“所有参数模型的鼻祖”。
线性回归模型在现代金融实践、学术界和研究中发挥着至关重要的作用。金融理论的两个基础模型都是线性回归模型:资本资产定价模型(CAPM)是一个简单的线性回归模型;而套利定价理论模型(APT)是一个多重回归模型。投资经理广泛使用的因子模型只是带有公共和专有因子的多重回归模型。因子是金融特征,如通货膨胀率。线性模型也是许多高频交易者(HFT)的首选模型,后者是行业中最复杂的算法交易者之一。
线性回归模型之所以如此受欢迎有很多原因。这些模型有坚实的数学基础,并在过去两个多世纪中在各个领域广泛应用——从天文学到医学再到经济学。它们被视为基础模型和任何解决方案的第一近似。线性回归模型有一个封闭的解析解,大多数人在高中就学过。这些模型易于构建和解释。大多数电子表格软件包都已经内置了这种算法及相关的统计分析。线性回归模型可以快速训练,并能很好地处理嘈杂的金融数据。它们在大数据集上高度可伸缩,并在更高维度的空间中变得更加强大。
在本章中,我们探讨了概率线性回归模型与基于最大似然估计(MLE)参数的传统/频率线性回归模型在本质上的区别。概率模型比 MLE 模型更有用,因为它们在对金融现实建模时更少出错。通常情况下,概率模型通过包含关于模型参数的认知不确定性的附加维度,以及明确包含我们的先验知识或无知来展示其有用性。
在模型中加入认知不确定性将概率机器学习转变为集成机器学习的一种形式,因为每组可能的参数生成不同的回归模型。这还具有当集成需要在训练数据或测试数据之外进行外推时增加模型预测不确定性的理想效果。如 第六章 中所讨论的,我们希望我们的 ML 系统能够意识到它的无知。一个模型应该了解自己的局限性。
我们通过开发一个概率市场模型(MM)来展示这些方法论上的基本差异,该模型转变了我们在 第四章 中使用的基于 MLE 的市场模型。我们还使用可信区间而不是有缺陷的置信区间。此外,我们的概率模型可以在内部数据训练之前和之后无缝地模拟数据。
在将概率模型应用于现实世界问题时,概率模型的数值计算提出了重大挑战。我们在上一章中使用的网格逼近方法在参数数量增加时并不适用。在前一章中,我们介绍了马尔可夫链蒙特卡洛(MCMC)采样方法。在本章中,我们将使用 PyMC 库构建我们的 PML 模型,这是 Python 中最流行的开源概率机器学习库。PyMC 的语法接近实际开发中概率模型的方式。它具有几种高级的 MCMC 和其他概率算法,如汉密尔顿蒙特卡洛(HMC)和自动微分变分推断(ADVI),可以说是机器学习中一些最复杂的算法。这些高级 MCMC 采样算法可以应用于具有基本理解复杂数学支持的问题,如 第六章 中所讨论的。
MLE 回归模型
确定性线性模型,如物理学和工程学中的模型,提供了令市场参与者们为其财务模型所梦寐以求的极其精确的估计和预测。另一方面,所有的非确定性或统计线性模型都包含一个随机成分,该成分捕捉了模型预测(Y)与观察值(Y')之间的差异。这种差异称为残差,并且在 图 7-1 中通过从最佳拟合线到观测数据点的垂直线来表示。训练模型的目标是学习最优参数,以最小化残差的某种平均值。
图 7-1. 线性回归模型的最佳拟合线。残差是观测数据与拟合线之间的垂直线。¹
如图 7-1 所示,简单线性回归模型的目标(Y)只有一个特征(X),表达为:
- Y = a + b × X + e,其中 a 和 b 是通过最小化残差 e = Y − Y′ 从训练数据中学习的常数。
多元线性回归模型使用多个特征的线性组合来预测目标。线性回归的一般形式表达为:
- Y = b[0] + b[1] × X[1] + b[2] × X[2] + …+ b[n] × X[n] + e,其中 b[0] − b[n] 是从训练数据中学习的常数,通过最小化残差 e = Y − Y′。
需要注意的是,在线性模型中,必须使得系数(b[0] – b[n])是线性的,而不是特征本身。回想一下第四章中提到的,一个依赖于现代投资组合理论和频率统计方法的金融分析师错误地假设,存在一个潜在的、时间不变的、随机过程来生成像股票这样的资产的价格数据。
市场模型
这个随机过程可以被建模为一个 MM,基本上是一个简单线性回归模型,股票的实现超额收益(目标)回归到整体市场的实现超额收益(特征),如下所示:
-
(R − F) = a + b (M − F) + e (方程 7.1)
-
Y = (R – F) 是目标,X = (M − F) 是特征。
-
R 是股票的实现收益。
-
F 是无风险资产的回报(如 10 年期美国国债)。
-
M 是市场投资组合(如标准普尔 500 指数)的实现收益。
-
a(alpha)是预期的特定股票收益。
-
b(贝塔)是对市场系统风险敞口的水平。
-
e(残差)是未预期的特定股票收益。
尽管这个潜在随机过程的 alpha 和 beta 参数可能是未知的或无法得知的,但分析师被误导认为这些参数是恒定的并且具有“真实”值。这个隐含的时间不变性随机过程的假设意味着,模型参数可以从涉及的各种证券的价格数据的任意随机样本中估计出来,这些数据跨越了相当长的时间。这个隐含假设被称为静态遍历条件。根据频率主义者的观点,样本到样本数据的随机性创造了真实固定参数估计的不确定性,这种参数的随机不确定性被残差 e = (Y – Y′) 所捕捉。
模型假设
许多分析师通常没有意识到,为了对模型参数做出合理的推断,他们必须基于高斯-马尔可夫定理对残差做进一步假设,即:
-
残差是独立同分布的。
-
残差的期望均值为零。
-
残差的方差是恒定的且有限。
使用 MLE 学习参数
如果分析人员假设残差服从正态分布,那么可以用基本的微积分证明,最大似然估计(MLE)的α和β两个参数与我们在高中学到并在第四章应用 Statsmodels 库中使用的 OLS 算法得到的值相同。这是因为这两种算法都在最小化均方误差或残差平方的期望值 E[(Y − Y′)²)]。然而,MLE 算法优于 OLS 算法,因为它可以适用于许多不同类型的似然函数。²
众所周知,尽管财务数据丰富,但它们的信噪比非常低。金融机器学习中最大的风险之一是数据的方差或过拟合。当模型在数据上训练时,算法学习的是噪声而不是信号。这导致模型参数估计在样本之间变化非常大。因此,模型在样本外测试中表现不佳。
在多元线性回归中,数据的过拟合也会发生,因为模型可能具有高度相关的特征。这也称为多重共线性,在金融和商业世界中很常见,特别是在金融困境时期,大多数特征都相互关联。
传统统计学家开发了两种临时方法称为正则化,通过在优化算法中创建惩罚项来减少噪声数据的过拟合,减少任何一个参数的影响。别管这是让“只让数据自己说话”的频率学派法则的反义。
有两种惩罚模型复杂性的正则化方法:
Lasso 或 L1 正则化
惩罚参数的绝对值之和。在 Lasso 回归中,许多参数都会被收缩到零。Lasso 也用于消除相关特征并改善复杂模型的解释性。
岭回归或 L2 正则化
惩罚参数系数的平方和。在岭回归中,所有参数都会被收缩到接近零,这减少了任何一个特征对目标变量的影响。
换句话说,L2 正则化不仅“让数据自己说话”,而且让所有声音都变得沉默,而 L1 正则化则让许多声音静音。当然,模型被正则化是为了使其在金融和投资中有用,那里的数据极其嘈杂,而以下的 Fisher 法则导致回归模型惨败并且亏损。
用置信区间量化参数不确定性
从训练数据估计模型参数后,分析师计算 alpha 和 beta 的置信区间,以量化它们的随机不确定性。大多数分析师不了解使用置信区间的三种错误类型,并不理解它们的缺陷,正如在第四章中所讨论的那样。如果他们了解的话,他们在金融分析中除了在中心极限定理适用的特殊情况下,将不会使用置信区间。
预测和模拟模型输出
现在线性模型已经建立,可以在未见数据上进行测试,以评估其用于估计和预测的实用性。与评估模型在训练数据上表现的评分算法相同,也会用于测试数据,计算其实用性。然而,要模拟数据,分析师将不得不建立一个单独的蒙特卡罗模拟(MCS)模型,如在第三章中讨论的那样。这是因为 MLE 模型不是生成模型。它们不会学习数据的潜在统计结构,因此无法模拟数据。
概率线性集成
在极大似然估计(MLE)建模中,财务分析师试图构建预计能够模拟“真实”模型的模型,这种模型被认为是最优的、优雅的和永恒的。在概率建模中,财务分析师摆脱了这种意识形态的负担。他们无需为其金融模型仅仅是近似、混乱和短暂而道歉,因为这些模型仅仅反映了数学和市场的现实。我们知道,所有模型都是错误的,无论它们是被视为预言还是可悲的。我们仅仅根据它们在实现我们的财务目标方面的有用性来评估它们。
使用概率框架的财务分析师不仅应用逆概率规则,还颠覆了 MLE 建模范式。他们摒弃了正统统计学的意识形态教条,转而采用常识和科学方法的原则,他们颠覆了数据和参数的传统处理方式:
-
超额回报的训练数据,如 Y = (R − F)和 X = (M − F),被视为常数,因为它们的值已经实现和记录,永远不会改变。这就是常数意味着什么的典范。
-
模型参数,如 alpha(α)、beta(β)和残差(e),被视为具有概率分布的变量,因为它们的值是未知和不确定的。金融模型参数存在随机性、认知性和本体性不确定性。它们的估计值会随着使用的样本、应用的假设和涉及的时间段而变化。这就是变量意味着什么的本质。
分析师明白,寻找金融模型的任何“真实”恒定参数值是一件愚蠢的事情。这是因为市场的动态随机性及其参与者确保概率分布从不是静态遍历的。这些分析师痛苦地意识到,有创造力、自由意志、情感丰富的人类几乎每天都在嘲笑理论上基于 MLE 的“绝对主义”金融模型。频率主义者声称金融模型参数具有“真实”值简直是不科学、意识形态的废话。
我们将使用概率框架明确陈述我们的假设,并为到目前为止讨论过的概率框架中的所有术语分配具体的概率分布。每个概率分布都有额外的参数,分析师将必须估计这些参数。分析师必须指明他们选择的理由。如果在测试阶段模型失败,分析师将改变所有概率分布,包括它们的参数。所有的金融模型都是基于最基本的试错技术开发的。
在概率框架中,我们应用逆概率规则来估计我们的模型参数,如在 第五章 中发展的那样。设计完模型后,我们将使用 Python 和 PyMC 库开发它。基于 MM 定义的术语,概率线性集成(PLE)被表述为:
-
P(a, b, e| X, Y) = P(Y| a, b, e, X) P(a, b, e) / P(Y|X),其中
-
Y = a + b × X + e,如 MLE 线性模型中所述,但不包括其明示或暗示的假设。这些将在 PLE 中明确指定。
-
P(a, b, e) 是在观察训练数据 (X, Y) 之前所有模型参数的先验概率。
-
P(Y| a, b, e, X) 是在给定参数 a, b, e 和特征训练数据 X 的情况下观察目标训练数据 Y 的似然性。
-
P(Y|X) 是观察到特征 X 的训练值的目标 Y 的边际似然性,平均值为所有可能先验参数 (a, b, e)。
-
P(a, b, e| X, Y) 是在观察训练数据 (X,Y) 后参数 a, b, e 的后验概率。
我们现在详细讨论 PLE 模型的每个组成部分。
先验概率分布 P(a, b, e)
在分析员看到任何训练数据(X, Y)之前,他们可以指定 PLE 参数(a, b, e)的先验概率分布,并量化其认识上的不确定性。所有先验分布假定彼此独立。这些先验分布可以基于个人、机构、经验或常识。如果分析员对参数没有任何先验知识,他们可以用均匀分布表达他们的无知,认为每个值在上限和下限之间是等可能的。请记住,除非您绝对确定参数可以取这些值,否则应避免设置上限和下限为 0 和 1。主要目标是明确和定量化最重要的模型假设之一。
鉴于模型易于过度拟合嘈杂的金融数据,这些数据没有任何持久的结构统一性,分析员意识到盲目遵循“只让数据说话”的正统格言是愚蠢的。在 MLE 模型中的正则化方法的特设使用仅仅是伪装的先验概率分布。可以数学上证明,L1 正则化等同于使用拉普拉斯先验,而 L2 正则化等同于使用高斯先验。³
分析员系统地遵循概率框架,并明确量化他们关于模型参数的知识或无知,使用先验概率分布。这使得模型透明,可以被任何人,尤其是投资组合经理,改变和批评。例如,分析员可以假设:
-
alpha 服从正态分布:a ~Normal()
-
beta 服从正态分布:b ~Normal()
-
残差是半学生 t 分布的:e ~HalfStudentT()
似然函数 P(Y| a, b, e, X)
分析员观察训练数据(X, Y)后,需要制定一个最适合该数据的似然函数,并量化模型参数(a, b, e)的随机不确定性。这与 MLE 线性模型中使用的似然函数相同。在标准线性回归中,假定残差(e)的似然函数是高斯或正态分布。然而,分析员使用学生 t 分布来模拟尾部肥厚的资产价格回报的金融实际情况。此外,如果似然函数能够像学生 t 分布一样容纳离群值,线性回归被称为健壮线性回归。
学生 t 分布是一类分布,可以根据其自由度参数 v 来逼近一系列其他概率分布,该参数是一个实数,可以从 0 到无穷大。对于较小的 v 值,学生 t 分布尾部肥厚,随着 v 的增大,趋于正态分布。重要的是要注意:
-
当 v ≤ 1 时,t-分布没有定义的均值和方差。
-
当 1 < v ≤ 2 时,t-分布具有定义的均值但没有定义的方差。
-
当 v > 30 时,t-分布近似正态分布。
假设分析员将 v = 6 分配给似然函数的学生 t-分布。为什么是 v = 6?金融研究和实践表明,这种 t-分布很好地描述了尾部股票价格回报。因此,我们将先前的共同知识应用于似然函数的选择。具体的似然函数可以数学表达为:
- Y ~StudentT(u, e, v = 6),其中 u = a + b × X,而 (a, b, e) 则由它们的先验概率分布定义。
边缘似然函数 P(Y|X)
这是最难计算的函数,因为它是在所有模型参数的似然函数上取平均。随着概率分布类型和参数数量的增加,复杂性也会增加。正如前面提到的,我们需要开创性的算法来数值近似这个函数。
后验概率分布 P(a, b, e| X, Y)
现在我们已经确定了我们的模型,我们可以计算所有模型参数 (a, b, e) 在给定训练数据 (X,Y) 的后验概率。总结一下,我们的模型规定如下:
-
Y ~StudentT(u, e, v = 6)
-
u = a + b × X
-
a ~Normal(),b ~Normal(),e ~HalfStudentT()
-
X,Y 是一个样本时间段内反映当前市场情况的训练数据对。
模型参数及其概率分布以及它们之间的关系显示在 图 7-2 中。
图 7-2. 概率市场模型显示用于参数的先验分布及用于拟合训练数据的似然函数。
由于任何现实模型的复杂性,尤其是边缘似然函数,我们只能近似计算其每个参数的后验分布。PyMC 使用先进的 MCMC 算法来模拟后验分布,通过从中抽样,正如第六章所讨论的那样。然后我们使用 ArviZ 库来探索这些样本,从而能够从中得出推断和预测。
使用 PyMC 和 ArviZ 组装 PLEs
现在让我们通过利用其强大的库生态系统在 Python 中构建我们的 PLE。除了 NumPy、pandas 和 Matplotlib 的标准 Python 栈之外,我们还将使用 PyMC、ArviZ 和 Xarray 库。正如之前提到的,PyMC 是 Python 中最流行的概率机器学习库。ArviZ 是一种概率语言无关的用于分析和可视化概率集合的工具。它将概率集合的推断数据转换为 Xarray 对象,这些对象是标记的、多维的数组。您可以搜索网络以获取先前提到的库的相关文档链接。
构建任何类型的集成都需要一个系统化的过程,我们的 PLE 也不例外。我们将按照 图 7-3 中概述的高层次集成构建过程。每个阶段及其组成部分将与相关代码一起解释。需要注意的是,即使我们将按顺序进行集成构建过程,但在实践中这是一个迭代的、非线性的过程。例如,您可以轻松地在训练阶段和分析特征和目标数据阶段之间来回切换。有了这种非线性性质,让我们开始第一个阶段。
图 7-3. 用于组装概率学习集合的高级过程
定义集成性能指标
我们的金融目标和活动应该推动我们构建 PLE 的努力。因此,这影响了我们用来评估其性能的度量标准。我们的金融任务通常是估计金融模型的参数或预测其输出或两者兼而有之。正如您现在所知,概率机器学习系统非常适合这两项任务,因为它们无缝地进行逆传播和正向传播。更重要的是,这些生成集合引导我们考虑我们正在解决的问题及其可能解决方案的不确定性。
金融活动
方程式 7.1 中回归参数 alpha 和 beta 的合理估计是行业中几种金融活动所必需的:
詹森的 alpha
通过将基金的回报与其基准投资组合的回报进行回归,投资者通过估计回归的 alpha 参数来评估基金经理的技能。这个度量标准在行业中被称为詹森的 alpha。
市场中性策略
Alpha 也可以被视为与市场动态无关的特定资产预期收益率。如果基金经理发现这种回报率非常吸引人,他们可以尝试通过对冲资产市场波动的暴露来孤立并捕捉它。这还涉及估计资产的贝塔(beta),或对市场敏感性的评估。包含该资产和对冲的投资组合变得对市场的变化不敏感或中性。
交叉对冲
假设方程式 7.1 中残差的方差恒定不变,可以数学上显示贝塔参数与一个资产(Y)的波动性和另一个相关资产(X)的波动性相关。企业财务部门的交叉对冲计划利用这种与贝塔相关的相关性,通过另一个相关商品(例如石油)对公司所需的商品(例如喷气燃料)进行对冲。财务部门在开放市场购买或出售期货等金融工具,以对冲其输入成本。
股本成本
公司财务分析师通过估计回归方程式 7.1 中的实现回报率 R 来估算其公司股本的成本。这被认为是公众股东要求的其股票的预期收益率。许多分析师仍然使用其股票的 CAPM 模型,并通过在方程式 7.1 中使 alpha = 0 来估计 R。
在本章中,我们将通过使用其 MM 而不是 CAPM 来估计苹果公司的股本回报率,原因详见第四章。我们将估计给定当前市场制度的苹果公司超额回报(R - F)的后验概率分布。这种生成线性合奏可以应用于前述的所有财务活动中。
目标函数
一个旨在衡量模型或合奏性能的规则被称为目标函数。这个函数通常衡量合奏的估计或预测与相应实现或观察值之间的差异。在机器学习回归模型中,用于衡量预测值与观察值之间差异的常见目标函数包括均方误差(MSE)和中位绝对误差(MAE)。选择目标函数取决于我们试图解决的业务问题。减少损失/成本的目标函数称为损失/成本函数。
另一个回归目标函数是 R 平方。在频率统计学中,它被定义为预测值的方差除以数据的总方差。请注意,R 平方可以数学上解释为需要最大化的标准化 MSE 目标函数:
- R 平方(Y) = 1 - MSE(Y) / Var(Y)
由于我们在概率模型中处理的是偶然性和认知不确定性,因此必须修改此 R 平方公式,以便其值不超过 1。概率版本的 R 平方被修改为等于预测值的方差除以预测值的方差加上误差的预期方差。 它可以解释为方差分解。 我们将称这个版本的 R 平方目标函数为概率 R 平方。
性能指标
正如前面提到的,金融数据非常嘈杂,这意味着我们需要对每个开发阶段建立的性能指标保持现实。 至少,我们希望我们的模型比随机猜测做得更好,即,我们希望性能得分大于 50%。 我们希望我们的 PLE 达到或超过以下性能指标:
-
概率 R 平方先验分数 > 55%
-
概率 R 平方训练得分 > 60%
-
概率 R 平方测试得分 > 65%
-
最高密度区间(HDIs):90% HDI 包含几乎所有训练和测试数据(HDI 将很快解释)
请记住,所有这些度量标准将基于个人和组织的偏好,并且是不完美的,就像用于生成它们的模型一样。 这需要判断力和领域专业知识。 尽管如此,我们将使用这些指标作为另一个输入来帮助我们评估我们的 PLE,批评它,并修订它。 在实践中,我们修改我们的 PLE,直到我们确信它将为我们想要应用它的金融活动提供足够高的预期正值。 只有在那之后我们才会将我们的 PLE 部署到实验室之外。
分析数据和工程特征
我们已经对目标和特征进行了数据分析,在第四章和重新编写方程 7.1 中进行了分析。
数据探索
一般来说,在这个阶段,您将定义您感兴趣的目标,例如预测资产价格回报或估计波动性。 这些目标变量是实值数字,被称为回归目标。 或者,感兴趣的目标也可以是基于预测公司是否会违约的预测的分类。 这些是取值为离散数字(如 0 或 1)的分类目标。
接下来,您将确定各种数据源,这些数据源将使您能够对您的目标和特征进行足够详细的分析。 数据源可能很昂贵,您将不得不想出如何以成本有效的方式获得它们。 清理和处理来自各种来源的数据通常非常耗时。
特征工程
记住,特征是作为独立变量的数据表示,使模型的目标变量推断或预测成为可能。特征工程是选择、设计和开发一组有用的特征的实践,这些特征共同作用,使得在样本外数据上能够可靠地推断或预测目标变量。
要预测目标变量(例如价格回报),模型可以拥有许多不同类型的特征。以下是各种类型特征的例子:
基本面
公司销售,利率,汇率,GDP 增长率
技术
动量指标,资金流动,流动性
情绪
消费者情绪,投资者情绪
其他
专有的数学或统计指标
在选择和开发了一组可能的特征之后,通常建议使用特征级别的相对变化,而不是绝对水平,作为输入到您的特征数据框架中。这减少了金融时间序列中普遍存在的串行自相关。串行相关发生在一个变量在时间上与其自身的过去值相关联的时候。交易员和投资者通常有兴趣了解一个好的或坏的条件是变好还是变差。因此,市场参与者通常在百分比或差异的相对变化上持续反应水平。
如果我们有多个特征,我们需要检查它们是否彼此高度相关。回顾一下,这个问题被称为多重共线性。高度相关的特征可以在数据中过度放大相同的信号,导致无效的推断和预测。理想情况下,特征之间应该没有相关性或者没有多重共线性。不幸的是,这在实践中几乎从不发生。确定一个阈值方差,高于这个阈值的特征应该被移除,这是基于业务背景的判断调用。
特征工程对所有机器学习系统的性能至关重要。它需要领域专业知识、判断力、经验、常识以及大量的试错。这些是使人类智慧能够区分相关性和因果关系的特质,而目前 AI 能力仍无法做到。
在本篇介绍中,我们将保持特征工程的简单性,并利用市场模型上的广泛金融知识和经验。我们的 PLE(预测建模环境)只有一个特征:由标准普尔 500 指数代表的市场。
数据分析
PLEs 在我们拥有小数据集时展现出其优势,这样弱或平坦的先验就不会被似然函数所压倒。在过去的去年的最后两个月,即从 11/15/2022 到 12/31/22,我们将观察 31 天的数据。这个时期涵盖了两次联邦储备委员会会议,并且异常波动。我们将在前 21 天的数据上训练我们的 PLE,并在最后 10 天的数据上进行测试。这被称为时间序列拆分的交叉验证方法。由于金融时间序列具有较强的串行相关性,我们不能使用标准的交叉验证方法,因为它假设每个数据样本都是独立且同分布的。
让我们实际下载苹果公司、标准普尔 500 指数和 10 年期国库券的价格数据,并像我们对线性 MM 所做的那样计算每日价格回报率:第四章。
# Import standard Python libraries.
import numpy as np
import pandas as pd
from datetime import datetime
import xarray as xr
import matplotlib.pyplot as plt
# Install and import PyMC and Arviz libraries.
!pip install pymc -q
import pymc as pm
import arviz as az
az.style.use('arviz-darkgrid')
# Install and import Yahoo Finance web scraper.
!pip install yfinance -q
import yfinance as yf
# Fix random seed so that numerical results can be reproduced.
np.random.seed(101)
# Import financial data.
start = datetime(2022, 11, 15)
end = datetime(2022, 12, 31)
# S&P 500 index is a proxy for the market factor.
market = yf.Ticker('SPY').history(start=start, end=end)
# Ticker symbol for Apple, the largest company in the world
# by market capitalization.
stock = yf.Ticker('AAPL').history(start=start, end=end)
# 10 year US treasury note is the proxy for risk free rate.
riskfree_rate = yf.Ticker('^TNX').history(start=start, end=end)
# Create a dataframe to hold the daily returns of securities.
daily_returns = pd.DataFrame()
# Compute daily percentage returns based on closing prices for Apple and
# S&P 500 index.
daily_returns['market'] = market['Close'].pct_change(1)*100
daily_returns['stock'] = stock['Close'].pct_change(1)*100
# Compounded daily risk free rate based on 360 days for the calendar year
# used in the bond market.
daily_returns['riskfree'] = (1 + riskfree_rate['Close']) ** (1/360) - 1
# Check for missing data in the dataframe.
market.index.difference(riskfree_rate.index)
# Fill rows with previous day's risk-free rate since
# daily rates are generally stable.
daily_returns = daily_returns.ffill()
# Drop NaNs in first row because of percentage calculations
# are based on previous day's closing price.
daily_returns = daily_returns.dropna()
# Check dataframe for null values.
daily_returns.isnull().sum()
# Check first five rows of dataframe.
daily_returns.head()
# Daily excess returns of AAPL are returns in excess of
# the daily risk free rate.
y = daily_returns['stock'] - daily_returns['riskfree']
# Daily excess returns of the market are returns in excess of
# the daily risk free rate.
x = daily_returns['market'] - daily_returns['riskfree']
# Plot the excess returns of Apple and S&P 500.
plt.scatter(x,y)
plt.ylabel('Excess returns of Apple'),
plt.xlabel('Excess returns of S&P 500');
# Plot histogram of Apple's excess returns during the period.
plt.hist(y, density=True, color='blue')
plt.ylabel('Probability density'), plt.xlabel('Excess returns of Apple');
# Analyze daily returns of all securities.
daily_returns.describe()
# Split time series sequentially because of serial correlation
# in financial data.
test_size = 10
x_train = x[:-test_size]
y_train = y[:-test_size]
x_test = x[-test_size:]
y_test = y[-test_size:]
开发和反推先验集合
让我们开始使用 PyMC 库开发我们的 PLE。在这一点上,我们明确陈述了我们集合的假设,即参数的先验概率分布和似然函数。这还包括我们关于底层数据生成过程的功能形式的假设,即线性加上一些噪声。
之后,我们检查集合的先验预测分布是否生成了可能发生在过去的、现在在我们的训练数据样本中的数据。对过去事件的预测称为反推,并用作模型检查,在训练之前和之后。如果由先验集合生成的数据不合理,因为它们不在我们的最高密度区间内,我们会修正我们所有的模型假设。
指定分布及其参数
我们通过指定其参数的先验概率分布 P(a)、P(b) 和 P(e) 将我们的先验知识纳入集合中。之后,我们指定了在给定参数时观察数据的似然性,即 P(D | a, b, e)。
在下面的 Python 代码块中,我们选择了学生 t 分布,其自由度为 6,作为我们集合的似然函数。当然,我们也可以将 nu 添加为另一个需要推断的未知参数。然而,这只会增加复杂性,而不会增加对开发过程的理解。
# Create a probabilistic model by instantiating the PyMC model class.
model = pm.Model()
# The with statement creates a context manager for the model object.
# All variables and constants inside the with-block are part of the model.
with model:
# Define the prior probability distributions of the model's parameters.
# Use prior domain knowledge.
# Alpha quantifies the idiosyncratic, daily excess return of Apple
# unaffected by market movements.
# Assume that alpha is normally distributed. The values of mu and
# sigma are based on previous data analysis and trial and error.
alpha = pm.Normal('alpha', mu=0.02, sigma=0.10)
# Beta quantifies the sensitivity of Apple to the movements
# of the market/S&P 500.
# Assume that beta is normally distributed. The values of mu and
# sigma are based on previous data analysis and trial and error.
beta = pm.Normal('beta', mu=1.2, sigma=0.15)
# Residual quantifies the unexpected returns of Apple
# i.e returns not predicted by the linear model.
# Assume residuals are Half Student's t-distribution with nu=6\.
# Value of nu=6 is based on research studies and trial and error.
residual = pm.HalfStudentT('residual', sigma=0.20, nu=6)
# Mutatable data containers are used so that we can swap out
# training data for test data later.
feature = pm.MutableData('feature', x_train, dims='feature_data')
target = pm.MutableData('target', y_train, dims='target_data')
# Expected daily excess returns of Apple are approximately
# linearly related to daily excess returns of S&P 500.
# The function specifies the linear model and the expected return.
# It creates a deterministic variable in the trace object.
target_expected = pm.Deterministic('target_expected',
alpha + beta * feature, dims='feature_data')
# Assign the training data sample to the likelihood function.
# Daily excess stock price returns are assumed to be T-distributed, nu=6.
target_likelihood = pm.StudentT('target_likelihood', mu=target_expected,
sigma=residual, nu=6, observed=target, dims='target_data')
图 7-2 是通过以下代码中所示的 graphviz 方法生成的:
# Use the graphviz method to visualize the probabilistic model's data,
# parameters, distributions and dependencies
pm.model_to_graphviz(model)
采样分布并模拟数据
在我们训练模型之前,我们应该检查先验集合假设的有效性。目标是确保集合对训练阶段足够好。通过进行所谓的先验预测检查来完成这一点。我们使用集合的先验预测分布来模拟可能在过去实现的数据分布。回顾这被称为回测,与预测相对应,后者模拟未来最可能发生的数据分布。
在以下代码块中,我们从先验预测分布中模拟了 21,000 个数据样本。我们让 ArviZ 返回InferenceData对象,以便我们可以可视化和分析生成的数据样本。在推断对象返回后展开显示以检查各组的结构。我们将需要它们进行分析和推断:
# Sample from the prior distributions and the likelihood function
# to generate prior predictive distribution of the model.
# Take 1000 draws from the prior predictive distribution
# to simulate (1000*21) target values based on our prior assumptions.
idata = pm.sample_prior_predictive(samples=1000, model=model,
return_inferencedata=True, random_seed=101)
# PyMC/Arviz returns an xarray - a labeled, multidimensional array
# containing inference data samples structured into groups. Note the
# dimensions of the prior predictive group to see how we got (1*1000*21)
# simulated target data of the prior predictive distribution.
idata
让我们在进行先验预测检查之前,绘制每个参数的边际先验分布。请注意,核密度估计是连续变量的平滑直方图:
# Subplots on the left show the kernel density estimates (KDE) of
# the marginal prior probability distributions of model parameters
# from the 1000 samples drawn. Subplots on the right show the parameter
# values from a single Markov chain that were sampled sequentially
# by the NUTS sampler, the default regression sampler.
az.plot_trace(idata.prior, kind='trace',
var_names = ['alpha', 'beta', 'residual'], legend=True);
# Plot the marginal prior distributions of each parameter with 94%
# highest density intervals (HDI).
# Note the residual subplot shows the majority of probability density function
# within 3 percentage points and the rest extending out into a long tail.
# In Arviz, there is no method to plot the prior marginal distributions but we
# can hack the plot posterior method and use the prior group instead.
az.plot_posterior(idata.prior,
var_names = ['alpha', 'beta', 'residual'], round_to=2);
# Plot the joint prior probability distribution of alpha and beta with their
# respective means and marginal distributions on the side.
# Hexabin plot below shows little or no linear correlation with the high
# concentration areas in the heat map forming a cloud.
az.plot_pair(idata.prior, var_names=['alpha', 'beta'], kind='hexbin',
marginals=True, point_estimate='mean', colorbar=True);
让我们创建一个包含 1000 条回归线的先验集合,每条线对应集合参数(a, b)的一个取样自其先验分布的值,并绘制未经训练的线性集合的先验均值周围的认知不确定性。我们还使用集合的先验预测分布来模拟数据。这显示了数据分布的认知和偶然不确定性。请注意,训练数据被绘制以便为我们提供一些背景和集合回测的基准:
# Plot the retrodictions of prior predictive ensemble.
# Retrieve feature and target training data from the constant_data group.
# Feature is now an Xarray instead of a panda's series,
# a requirement for ArviZ data analysis.
feature_train = idata.constant_data['feature']
target_train = idata.constant_data['target']
# Generate 1000 linear regression lines based on 1000 draws from one
# Markov chain of the prior distributions of alpha and beta.
# Prior target values are in 1000 arrays with each array having 21 samples,
# the same number of samples as our training data set.
prior_target = idata.prior["alpha"] + idata.prior["beta"] * feature_train
# Prior_predictive is the data generating distribution of the untrained ensemble.
prior_predictive = idata.prior_predictive['target_likelihood']
# Create figure of subplots
fig, ax = plt.subplots()
# Plot epistemic and aleatory uncertainties of untrained
# ensemble's retrodictions.
az.plot_lm(idata=idata, x=feature_train, y=target_train,
num_samples=1000, y_model = prior_target,
y_hat = prior_predictive, axes=ax)
#Label the figure.
ax.set_xlabel("Excess returns of S&
P 500")
ax.set_ylabel("Excess returns of Apple")
ax.set_title("Retrodictions of untrained linear ensemble")
ax.legend(loc='upper left');
非常重要的是观察到,随着我们远离图的中心,线性集合的认知不确定性增加。承认对任何模型的无知是我们所追求的:随着其移动到没有数据且必须外推的区域,预期值的不确定性应该增加。我们的集合知道它的局限性。
这在下一个图中更清楚地显示出来,我们将先验预测数据样本生成并分布到 90%高密度区间(HDI),然后进行先验预测检查:
# Plot 90% HDI of untrained ensemble.
# This will show the aleatory (data related) and epistemic
# (parameter related) uncertainty of model output before it is trained.
# Create figure of subplots.
fig, ax = plt.subplots()
# Plot the ensemble of 1000 regression lines to show the
# epistemic uncertainty around the mean regression line.
az.plot_lm(idata=idata, x=feature_train, y=target_train,
num_samples=1000, y_model = prior_target, axes=ax)
# Plot the prior predictive data within the 90% HDI band to
# show both epistemic and aleatory uncertainties.
az.plot_hdi(feature_train, prior_predictive, hdi_prob=0.90, smooth=False)
# Label figure.
ax.set_xlabel("Excess returns of S&P 500")
ax.set_ylabel("Excess returns of Apple")
ax.set_title("90% HDI for simulated samples of untrained linear ensemble")
ax.legend();
# Conduct a prior predictive check of the untrained linear ensemble.
# Create figure of subplots.
fig, ax = plt.subplots()
# Plot the prior predictive check
az.plot_ppc(idata, group='prior', kind='cumulative',
num_pp_samples=1000, alpha=0.1, ax=ax)
# Label the figure.
ax.set_xlabel("Simulated Apple excess returns")
ax.set_ylabel("Cumulative Probability")
ax.set_title("Prior predictive check of untrained linear ensemble");
评估和修订未训练的模型
指定概率模型从未容易,需要多次修订。让我们使用定性和定量的先验预测检查来看看我们的先验模型是否合理并准备好进行训练。从最近的图表可以看出,我们的集合在 90% HDI 带内模拟了所有训练数据。然而,先验预测检查显示了一些低概率的极端回报,在最近的过去并未发生。现在让我们计算概率 R 平方度量来评估集合在训练之前的回测:
# Evaluate untrained ensemble's retrodictions by comparing simulated
# data with training data.
# Extract target values of our training data.
target_actual = target_train.values
# Sample the prior predictive distribution to simulate
# expected target training values.
target_predicted = idata.prior_predictive.stack(sample=("chain", "draw"))
['target_likelihood'].values.T
# Use the probabilistic R-squared metric.
prior_score = az.r2_score(target_actual, target_predicted)
prior_score.round(2)
先验整体的概率 R 平方指标为 61%,标准偏差为 10%。这超过了我们对先验模型的 55%的性能基准。
请注意,这种表现是通过对先验模型的多次修订而实现的,我改变了先验分布的各种参数值。我还尝试了不同的分布,包括 alpha 参数的均匀先验。所有先验分数均大于 55%,而您在此处看到的接近中位数分数。请随意对先验模型进行修改,直到您满意为止,确保您的整体模型是合理的并且可以通过内样本数据进行训练。
训练和回溯后验模型
现在我们有一个准备好进行训练的整体模型,我们对其反映了先验知识的信心,包括其参数的认知不确定性和可能生成的数据的不确定性。让我们使用实际的内样本数据对其进行训练,计算后验分布。
训练和采样后验
我们执行 PyMC 的默认采样器,即 Hamiltonian Monte Carlo (HMC)算法,这是第二代 MCMC 算法。PyMC 指示 HMC 从所有参数的联合后验分布中生成依赖性随机样本:
# Draw 1000 samples from two Markov chains resulting in 2000 values of each
# parameter to analyze the joint posterior distribution.
# Check for any divergences in the progress bar. We want 0 divergences for a
# reliable sampling of the posterior distribution.
idata.extend(pm.sample(draws=1000, chains=2, model=model, random_seed=101))
评估 MCMC 采样质量是一个高级主题,不在本入门指南的讨论范围内。由于马尔可夫链中没有发散,让我们分析每个参数的边际分布并对其进行推断:
# Subplots on the left show the kernel density estimates (KDE)
# of the marginal posterior probability distributions of each parameter.
# Subplots on the right show the parameter values
# that were sampled sequentially in two chains by the NUTS sampler
with model:
az.plot_trace(idata.posterior, kind='trace',
var_names = ['alpha', 'beta', 'residual'], legend=True)
# Plot the joint posterior probability distribution of alpha and beta
# with their respective means and marginal distributions on the side.
# Hexabin plot below shows little or no linear correlation with the
# high concentration areas in the heat map forming a cloud.
az.plot_pair(idata.posterior, var_names=['alpha', 'beta'], kind='hexbin',
marginals=True, point_estimate='mean', colorbar=True);
我们可以将后验分布总结为一个 pandas DataFrame 如下:
# Examine sample statistics of each parameter's posterior marginal distribution,
# including it's 94% highest density interval (HDI).
display(az.summary(idata, kind='stats',
var_names = ['alpha', 'beta', 'residual'], round_to=2, hdi_prob=0.94))
这个统计摘要为所有参数提供了平均值、标准差和 94%可信区间。请注意,94%可信区间是通过最高密度区间(HDI)计算得出的:hdi_97% – hdi_3% = hdi_94%。
与讨论第四章中频繁主义置信区间的把戏不同,可信区间正是置信区间所假装的但实际上并非如此。可信区间是一种后数据方法,用于从单个实验中进行有效的统计推断。这正是我们作为研究人员、科学家和从业者所需要的。例如,总结表中 beta 的 94%可信区间意味着以下内容:
-
beta 在*特定区间[1.12 和 1.55]*内的概率为 94%。就是这么简单。与置信区间不同,我们不必处理一些扭曲的定义,这些定义无法解释任何常识的影响。
-
没有任何分布的渐近正态性假设。
-
没有不诚实地引用中心极限定理。
-
Beta 不是仅具有偶然不确定性的点估计。
-
我们对 beta 的确切值一无所知。在社会和经济科学的实际场景中,我们几乎不可能知道任何模型参数的确切值。
-
像 beta 这样的参数最好解释为具有偶然和认识不确定性的概率分布。
-
将像 beta 这样的参数建模和解释为不可知变量,而不是不可知常数,更符合实际。
需要注意的是,在后验分布中,可信区间并不唯一。我们的首选方法是在后验分布中选择概率密度最高的最窄区间。这样的区间也被称为最高密度区间(HDI),这是本章节中我们一直在遵循的方法。
PyMC/ArviZ 开发者为何选择默认的可信区间为 94% 或许让你感到疑惑。这是一个提醒,没有物理或社会经济法律规定我们必须选择 95% 或其他特定百分比。我认为这是对传统统计界的微妙讽刺,因为社会和经济科学中神化了 95% 显著水平。无论如何,ArviZ 提供了更改默认区间的方法,如下面的代码块所示:
# Change the default highest density interval to 90%
az.rcParams['stats.hdi_prob'] = 0.90
有助于可视化我们模型参数的后验分布,以评估不同概率下的可信区间。以下图表展示了三个参数的 70% 可信区间:
# Plot the marginal posterior distribution of each parameter displaying
# the above statistics but now within a 70% HDI
az.plot_posterior(idata, var_names = ['alpha', 'beta', 'residual'],
hdi_prob=0.70, round_to=3);
大多数情况下,我们必须评估点估计以做出我们的金融和投资决策。我们可以根据参数后验概率分布的位置来评估任何参数的点估计 = 1.15 的可信度。例如,如果我们想评估 beta 的点估计 = 1.15,我们可以将其作为参考值与 HDI 进行比较,如下所示的代码:
# Evaluate a point estimate for a single parameter using its
# posterior distribution.
az.plot_posterior(idata, 'beta', ref_val=1.15, hdi_prob=0.80,
point_estimate='mode', round_to=3);
这个图表表明,分布的 94.5% 在 beta = 1.15 以上。由于只有 5.5% 的分布在其下方,所以 beta = 1.15 位于分布的左尾部。请注意,这两个百分比可能因为四舍五入误差而不加总为 100%。因此,合理推断 beta = 1.15 不是最佳估计。
逆推和模拟训练数据
现在我们使用后验预测分布(PPD)来模拟训练集中的数据,并遵循我们在先验预测分布中所做的相同步骤。这将帮助我们评估集合训练的效果:
# Draw 1000 samples each from two Markov chains of the
# posterior predictive distribution.
with model:
pm.sample_posterior_predictive(idata, extend_inferencedata=True,
random_seed=101)
# Generate 2000 linear regression lines based on 1000 draws each from
# two chains of the posterior distributions of alpha and beta.
# Posterior target values are in 2000 arrays, each with 21 samples,
# the same number of samples as our training data set.
posterior = idata.posterior
posterior_target = posterior["alpha"] + posterior["beta"] * feature_train
# Posterior_predictive is the data generating distribution of the
# trained ensemble.
posterior_predictive = idata.posterior_predictive['target_likelihood']
# Create figure of subplots.
fig, ax = plt.subplots()
# Plot epistemic and aleatory uncertainties of trained
# ensemble's retrodictions.
az.plot_lm(idata=idata, x=feature_train, y=target_train, num_samples=2000,
y_model = posterior_target, y_hat=posterior_predictive, axes=ax)
# Label the figure.
ax.set_xlabel("Excess returns of S&P 500")
ax.set_ylabel("Excess returns of Apple")
ax.set_title("Retrodictions of the trained linear ensemble")
ax.legend(loc='upper left');
# Plot 90% HDI of trained ensemble.
# This will show the aleatory (data related) and epistemic
# (parameter related) uncertainty of model output after it is trained.
# Create figure of subplots.
fig, ax = plt.subplots()
# Plot the ensemble of 2000 regression lines to show the epistemic
# uncertainty around the mean regression line.
az.plot_lm(idata=idata, x=feature_train, y=target_train, num_samples=1000,
y_model = posterior_target, axes=ax)
# Plot the posterior predictive data within the 90% HDI band to show both
# epistemic and aleatory uncertainties.
az.plot_hdi(feature_train, posterior_predictive, hdi_prob=0.90, smooth=False)
# Label the figure
ax.set_xlabel("Excess returns of S&P 500")
ax.set_ylabel("Excess returns of Apple")
ax.set_title("90% HDI for simulated samples of trained linear ensemble");
# Conduct a posterior predictive check of the trained linear ensemble.
# Create a figure of subplots.
fig, ax = plt.subplots()
# Plot the posterior predictive check.
az.plot_ppc(idata, group='posterior', kind='cumulative',
num_pp_samples=2000, alpha=0.1, ax=ax)
# Label the figure.
ax.set_xlabel("Simulated Apple excess returns given training data")
ax.set_ylabel("Cumulative Probability")
ax.set_title("Posterior predictive check of trained ensemble");
评估和修订训练模型
正如我们之前所做的,让我们使用定性和定量检查来查看我们的后验模型是否合理,并准备好进行测试。后验预测检查向我们展示了一系列与苹果最近的历史回报更一致的回报范围。从其追溯预测中,我们可以看到我们的集成已在 90% HDI 带内模拟了大部分它所训练的训练数据。现在让我们计算概率 R 平方指标来评估训练集成的性能:
# Evaluate trained ensemble's retrodictions by comparing
# simulated data with training data.
# Get target values of our training data
target_actual = target_train.values
# Sample the posterior predictive distribution
# conditioned on training data.
target_predicted = idata.posterior_predictive.stack(sample=("chain", "draw"))
['target_likelihood'].values.T
# Compute probabilistic R-squared performance metric.
training_score = az.r2_score(target_actual, target_predicted)
training_score.round(2)
后验集成的概率 R 平方指标为 65%,标准差为 8%。与未训练的集成相比,这是一个性能改进。我们可以进行这种比较,因为我们使用相同的数据集进行性能比较。它还超过了 60%的训练分数基准。我们的集成已准备好进行其主要测试:基于样本外或未见过的测试数据的预测。
测试和评估集成预测
我们现在确信,我们训练的集成反映了我们的先验知识和从样本内数据中获得的新学习。此外,集成已经根据训练数据更新了其参数概率分布,包括它们的认识不确定性。因此,集成生成的数据分布也已更新,包括它们的偶然不确定性。
带我们到这里的各种步骤都是必要的,但不足以决定我们是否要将我们的集成预测的硬赚资本承诺下去。对于任何 ML 系统来说,最重要的测试之一是它在先前未见的样本外测试数据上的表现。
交换数据并重新采样后验预测分布
PyMC 提供了可变数据容器,使得在不对集成做任何其他更改的情况下可以交换训练数据和测试数据。现在,我们必须使用新的测试数据重新对后验预测分布进行重采样,以用于我们的目标和特征。
# Now we use our trained model to make predictions based on test data.
# This is the reason we created mutable data containers earlier.
with model:
#Swap feature and target training data for their respective test data.
pm.set_data({'feature': x_test, 'target': y_test})
#Create two new inference groups, predictions and predictions_constant_data
#for making predictions based on features in the test data.
pm.sample_posterior_predictive(idata, return_inferencedata=True,
predictions=True, extend_inferencedata=True, random_seed=101)
预测和模拟测试数据
这创建了一个名为预测的新推断组。我们重复了在训练阶段所做的相同步骤,但使用测试数据:
# Get feature and target test data.
feature_test = idata.predictions_constant_data['feature']
target_test = idata.predictions_constant_data['target']
# Prediction target values are in 2000 arrays, each with 10 samples,
# the same number of samples as our test data set. Predict target values
# based on posterior values of regression parameters and feature test data.
prediction_target = posterior["alpha"] + posterior["beta"] * feature_test
# Predictions is the data generating posterior predictive distribution
# of the trained ensemble based on test data.
simulate_predictions = idata.predictions['target_likelihood']
# Create figure of subplots.
fig, ax = plt.subplots()
# Plot the 2000 regression lines showing the epistemic and
# aleatory uncertainties of out-of-sample predictions.
az.plot_lm(idata=idata, x=feature_test, y=target_test, num_samples=2000,
y_model = prediction_target, y_hat=simulate_predictions, axes=ax)
# Label figure
ax.set_xlabel("Excess returns of S&P 500")
ax.set_ylabel("Excess returns of Apple")
ax.set_title("Predictions of trained linear ensemble")
ax.legend(loc='upper left');
# Plot 90% HDI of trained ensemble. This will show the aleatory
# (data related) and epistemic (parameter related) uncertainty
# of trained model's predictions based on test data.
# Create figure of subplots.
fig, ax = plt.subplots()
# Plot the ensemble of 2000 regression lines to show the epistemic uncertainty
# around the mean regression line.
az.plot_lm(idata=idata, x=feature_test, y=target_test,
num_samples=2000, y_model = prediction_target, axes=ax)
# Plot the posterior predictive data within the 90% HDI band
# to show both epistemic and aleatory uncertainties.
az.plot_hdi(feature_test, simulate_predictions,
hdi_prob=0.90, smooth=False)
# Label the figure.
ax.set_xlabel("Excess returns of S&P 500")
ax.set_ylabel("Excess returns of Apple")
ax.set_title("90% HDI for predictions of trained linear ensemble")
ax.legend();
评估、修订或部署集成
从最近的图中,我们可以看到我们的集成在 90% HDI 带内模拟了所有的测试数据。让我们计算概率 R 平方指标来评估集成的预测性能:
# Evaluate out-of-sample predictions of trained
# ensemble by comparing simulated data with test data.
# Get target values of the test data.
target_actual = target_test.values
# Sample ensemble's predictions based on test data.
target_predicted = idata.predictions.stack(sample=("chain", "draw"))
['target_likelihood'].values.T
# Compute the probabilistic R-squared performance metric.
test_score = az.r2_score(target_actual, target_predicted)
test_score.round(2)
经过测试的集成的概率 R 平方指标为 69%,标准差为 13%。它优于我们的训练分数,并超过了 65%的测试分数基准。我们已准备将经过测试的集成部署到我们的模拟交易系统或其他使用实时数据源和虚拟资本的模拟金融系统中。这使我们能够在准备将其投入生产并将真正的资本投入到我们的系统之前,在实时环境中评估我们的集成表现。
摘要
在本章中,我们看到概率线性回归(PLE)建模与传统的最大似然估计(MLE)建模有根本的区别。概率框架为一般情况下的物理现象建模和特定的金融现实提供了系统化方法。
传统的金融模型使用 MLE 方法计算适合数据的参数的最优值。如果我们处理的是时间不变的统计分布,那将是合适的。但在金融领域,这是不适当的,因为我们没有这样的时间不变分布。从嘈杂的金融数据中学习最优参数值是次优的和风险的。在这种情况下,我们不应该依赖一个专家,而是依赖于一群专家,他们可以为多种可能的情景提供合理的综合意见。这正是概率集合为我们所做的。它为我们提供了模型参数所有估计的加权平均值。
在概率回归建模中,与传统的线性建模相反,数据被视为固定的,而参数被视为变量,因为常识和事实支持这种方法。不需要像 L1 和 L2 正则化那样的常规使用临时方法,这些方法仅仅是伪装成先验概率分布。最重要的是,在概率范式中,我们摆脱了“让数据自己说话”的意识形态口号以及存在“真实模型”或“真实参数”的非科学主张。
概率集合并不对分析优雅性做任何假设。它们不会用点估计和仅适用于玩具问题的伪分析解决方案让我们对我们的金融活动产生虚假的安全感。概率集合是量化无规和认知不确定性的数值模型。这些模型适用于金融和投资的固有不确定性。最重要的是,它提醒我们关于我们知识、推论和预测的不确定性。
在接下来的章节中,我们将探讨如何在面对三维不确定性和不完整信息的情况下,应用我们的概率估计和预测进行决策。
参考文献
Dürr, Oliver, and Beate Sick. Probabilistic Deep Learning with Python, Keras, and TensorFlow Probability. Manning Publications, 2020.
Gelman Andrew, Ben Goodrich, Jonah Gabry, and Aki Vehtari. “R-Squared for Bayesian Regression Models.” The American Statistician 73, no. 3 (2019): 307–309. https://doi.org/10.1080/00031305.2018.1549100.
Murphy, Kevin P. Machine Learning: A Probabilistic Perspective. Cambridge, MA: The MIT Press, 2012.
进一步阅读
Martin, Osvaldo A., Ravin Kumar, and Junpeng Lao. Bayesian Modeling and Computation in Python. 1st ed. Boca Raton, FL: CRC Press, 2021.
¹ 改编自维基共享资源上的一幅图像。
² Oliver Dürr 和 Beate Sick,《使用似然方法构建损失函数》,收录于《Python、Keras 和 TensorFlow Probability 的概率深度学习》(Manning Publications, 2020),第 93–127 页。
³ Kevin P. Murphy,《稀疏线性模型》,收录于《机器学习:概率视角》(The MIT Press, 2012),第 421–78 页。
⁴ Andrew Gelman 等,《贝叶斯回归模型的 R 平方》,《The American Statistician》73 卷 3 期(2019 年):第 307–309 页,https://doi.org/10.1080/00031305.2018.1549100。
第八章:利用生成式集成进行概率决策
但我意识到,随着游戏的进行,胜率实际上取决于剩余牌堆中还有哪些牌,并且随着游戏的进行,这一优势会发生变化,有时候更有利于赌场,有时候则更有利于玩家。
——Edward O. Thorp 博士,有史以来最伟大的量化赌徒和交易员
在前一章中,我们设计、开发、训练和测试了一个生成式线性回归线集合。概率线性回归与频率主义或传统线性回归有根本区别,如第四章所介绍的。首先,频率主义线性回归生成单一回归线,其参数经过优化以适应由既非平稳又非遍历的随机过程生成的嘈杂金融数据集。而概率线性回归生成多条回归线,每条对应不同的参数组合,能够以不同的可能性拟合观察到的数据分布,同时与先验知识和模型假设保持一致。
生成式集成具有不断学习和修订模型参数的良好特性,同时明确陈述从数据和显式陈述的过去知识中得出的模型参数。真正区分生成式集成与传统对手的是,它们能够无缝地模拟新数据和以观察数据和模型假设为条件的反事实知识,而不管数据集的大小或数据的顺序如何。
生成式集成在透明的模型假设和概率计算的严谨性下进行所有这些活动,同时适当地缩放此类预测和反事实知识中固有的偶然性和认知不确定性。概率模型了解其局限性,并通过在其外推中扩展其最高密度区间来诚实地表达其无知。
在前三章中,我们主要专注于推断我们集成参数的分布。在本章中,我们将注意力集中在使用我们训练和测试的生成式集成的模拟输出来在面对三维不确定性和不完整信息时做出财务和投资决策上。换句话说,我们的重点将放在我们模型的数据生成后验预测分布上,而不是其参数的后验分布。总体而言,集成的输出对于决策者来说更为重要和必需,例如,股价回报的分布对高级管理人员和客户比使用模型生成它们的α和β参数的分布更有意义。
在回顾本书中使用的概率推断和预测框架后,我们通过使用客观函数系统化我们的决策方法。在概率决策制定的第一个示例中,我们探讨了如何使用框架将主观人类行为与数据客观性和概率计算的严谨性结合起来。金融与投资涉及人而不是粒子或摆锤,一个不能整合人类内在主观性的决策框架是毫无用处的。这也强调了决策制定既是一门艺术又是一门科学,其中人类的常识和判断至关重要。
风险管理和企业财务主管常用的两个损失函数是风险价值(VaR)和预期缺口(ES)。我介绍了计算这些风险度量的新方法,作为生成集成的一个组成部分。为了正确使用集成平均数及其模拟数据,我们探讨了遍历性的统计概念,以理解为什么预期值或集成平均数存在严重局限,不像传统经济理论所说的那样有效。
最后,我们探讨了如何在不会有任何财务破产风险的情况下,将我们辛苦赚来的资本分配到有利的投资机会上的复杂问题。我们研究了赌博和投资之间的区别,做出关于一次性投资和一系列投资的决策。我们应用了马尔科维茨的均值方差和凯利的资本增长投资标准这两个最重要的资本分配算法,并分析了它们的优势和劣势。
概率推断与预测框架
让我们回顾并总结本书下半部分使用的框架,以推断模型参数、逆推样本训练数据分布以及预测样本外测试数据分布。我们将通过使用来自第五章的债务违约示例来说明这一框架——在您作为投资高收益债务或“垃圾”债券的对冲基金分析师时:
-
指定在样本空间中可能发生的所有场景或事件结果。场景 S[1] 和 S[2] 是我们想要估计的模型参数:
-
S[1] 是 XYZ 投资组合公司违约其债务义务的场景。S[2] 是它不违约的场景。
-
场景 S[1] 和 S[2] 是互斥且完全穷尽的,这意味着 P(违约) + P(不违约) = 1。
-
-
研究并利用与问题领域相关的任何个人、机构、科学和常识,这些可能有助于您设计模型并在观察任何新数据之前为样本空间中的各种参数分配先验概率。这是模型的先验概率分布。
-
您的对冲基金管理团队利用其经验、专业知识和机构知识来估计参数 S[1] 和 S[2] 的以下先验概率:
- P(default) = 0.10 和 P(No default) = 0.90
-
-
应用类似的先验知识和领域专业知识来为每个模型参数指定似然函数。了解从您的参数模型可能生成哪些数据。
-
您使用了基金专有的 ML 分类系统,利用了有关债务违约者和非违约者的宝贵数据库的特征。特别是,您基金的分析师发现最终违约的公司会积累 70% 的负面评价。然而,最终未违约的公司只会积累 40% 的负面评价。
-
模型的似然函数为:P(negative | default) = 0.70 和 P(negative | no default) = 0.40
-
-
使用模型的先验预测分布生成数据 D′。该模型通过在其参数的先验概率分布上平均似然函数来生成尚未见过的数据。先验预测分布作为一个初始模型检查,通过模拟我们可能过去观察到的数据来进行。先验预测分布是对过去数据的逆向预测。通常,我们可以将数据分布与我们的先验知识进行比较。特别是,我们可以将其模拟数据与训练数据进行比较。
-
基于您模型的所有假设编码在您的先验概率分布和似然函数中,您可以期望 XYZ 投资组合公司以以下概率生成负面和正面评级:
-
P(negative) = P(negative | default) P(default) + P(negative | no default) P( no default) = (0.70 × 0.10) + (0.40 × 0.90) = 0.43
-
P(positive) = P(positive | default) P(default) + P(positive | no default) P( no default) = (0.30 × 0.10) + (0.60 × 0.90) = 0.57
-
-
通过观察样本内数据 D 进行先验预测检查,并将其与上一步生成的模拟数据进行比较。
-
如果数据的逆向预测符合您的要求,则模型已准备好进行训练,您应该进入下一步。
-
否则,请审查参数以及先验概率分布和似然函数的函数形式。
-
重复步骤 2–4,直到模型通过您的先验预测检查并准备好进行训练。
-
-
将逆概率规则应用于更新模型参数的分布。我们模型的后验概率分布根据实际训练数据更新我们的先验参数估计。
-
您观察到一个负面评级,并将 XYZ 公司的违约后验概率更新如下:
-
P(default | negative) = P(negative | default) P(default) / P(negative) = (0.70 × 0.10)/0.43 = 0.16
-
-
使用模型的后验预测分布生成数据 D″。训练模型通过在更新参数的后验概率分布上对似然函数进行平均,模拟尚未见到的数据。后验预测分布充当第二个模型检查,通过回推训练过的样本数据并预测我们可能在后续测试中观察到的样本外或测试数据分布。
-
基于模型先验概率分布中编码的所有模型假设、似然函数和新观察到的负面评级,您可以预期 XYZ 投资组合公司将以以下更新的概率生成新的正面评级“positive″和负面评级“negative″:
-
P(negative″ | negative) = P(negative″ | default) P(default | negative) + P(negative″ | no default) P( no default | negative) = (0.70 × 0.16) + (0.40 × 0.84) = 0.35
-
P(positive″) = 1 − P(negative″) = 0.65
-
现在我们面临着关于我们推断结果的输出中最重要的决策之一:我们将如何应用其结果来做出决策,以便在不完全信息和三维不确定性面前增加实现我们目标的几率?
概率决策框架
为了在面对不完全信息和不确定性时做出系统化决策,我们需要指定一个客观函数。损失函数是一种特定类型的客观函数,其目标是最小化我们根据推理和预测所做每个决策的预期值或加权平均损失¹。简单来说,损失函数量化我们基于我们所做推断和预测的每个决策的损失。
让我们继续通过我们的债务违约示例来理解损失函数的作用以及如何将其应用于由我们的生成集成模拟的结果。然后我们将其推广,以便我们可以应用于任何使用任何类型的客观函数进行的决策活动。
集成主观性
最困难的决策是涉及情况的客观逻辑和涉及的各种人的同样理性的主观自我利益之间复杂相互作用的决策。当然,我们为不同决策分配的损失数值可以是主观的。在这种情况下,损失的绝对数值并不重要。重要的是我们一致地校准损失,以反映从我们所做各种决策中逻辑上产生的后果的重要性。
假设您正在上述对冲基金中担任分析师。基本上,您的工作是在数据分析方面表现出色,并遵循您的投资组合经理的指示,特别是关于任何投资组合公司债券的风险限制。在您的工作中面临的最大风险是被解雇并失去主要收入来源。以下是您在投资管理初期职业生涯中可能面临的情景:
-
由于连续两次负面评级,XYZ 公司债券的违约概率现在为 25%。
-
你的投资组合经理已指示你在 XYZ 投资组合公司的违约概率超过 30% 时召开风险管理会议,这是她根据自己的经验和专业知识立下的风险限制。
-
你渴望在不久的将来成为一名投资组合经理,并向你的经理和同事展示判断力和承担风险的能力。
你的机器学习系统为 XYZ 债券分配的下一个评级几乎肯定不会决定 XYZ 债券违约的命运。但在你看来,下一个评级将对你的生活产生巨大影响,可能媲美任何一部莎士比亚悲剧。结果可能会从你被解雇到你被提升为投资组合经理。在下一个评级之前是否与你的投资组合经理开会,这是一个问题。为了帮助你解决困境,我们需要指定下一个评级的概率分布、XYZ 的违约概率突破风险限制以及你在观察评级前召开或不召开与投资组合经理的会议可能遭受的损失。
让我们计算一下,如果你观察到的下一个评级是负面的(这将使连续三次负面评级),XYZ 公司债券的违约概率是多少:
-
P(3 negatives | 默认) = 0.70 × 0.70 × 0.70 = 0.343
-
P(3 negatives | 无默认) = 0.40 × 0.40 × 0.40 = 0.064
-
P(3 negatives) = P(3 negatives | 默认) P(默认) + P(3 negatives | 无默认) P(无默认) = 0.343 × 0.10 + 0.064 × 0.90 = 0.0343 + 0.0576 = 0.0919
-
P(默认 | 3 negatives) = P(3 negatives | 默认) P(默认) / P(3 negatives) = 0.0343/0.0919 = 0.37
因此,如果下一个评级是负面的,你对 XYZ 公司违约概率的估计将约为 37%,并且将超过你的投资组合经理设定的 30% 的风险限制。但是,如果我们已经观察到了 2 个负面评级,那么 XYZ 公司下一个评级是负面评级的概率是多少?我们已经计算了给定 XYZ 公司连续两次负面评级的后验预测分布:
-
P(negative′ | 2 negatives) = P(negative′ | 默认) P(默认 | 2 negatives) + P(negative′ | 无默认) P(无默认 | 2 negatives) = (0.7 × 0.25) + (0.4 × 0.75) = 0.475
-
P(positive′ | 2 negatives) = 1 – P(negative′ | 2 negatives) = 0.525
看来情况不利于与你的投资组合经理开会,因为 XYZ 公司的下一个评级只有 47.5% 的可能性是负面的。然而,这些可能性并未考虑到你的决定对你的职业生涯和同事的影响。更具体地说,我们需要弄清楚你和你的投资组合经理根据你召开或不召开与她预先的风险管理会议可能面临的损失。
估算损失
让我们定义一个损失函数,L(R, D″),来量化你可能因为基于样本外数据预测 D″而做出的决策 R 而经历的损失。
现在我们列举我们的结果数据和决策空间。
- XYZ 债券的可能评级为 D[1]″ = 负″和 D[2]″ = 正″。请注意,这些数据预测是相互排斥且互相穷尽的。
基于这个未来的预测,即样本外数据,给定观察到的数据 D,你可能的决策(R,D″),在此列举如下:
(R[1],D[1]″)
根据你对 XYZ 债券下一次评级将为负且公司违约概率将突破她的风险限制 30%的预测与你的投资组合经理开会。
(R[2],D[2]″)
不要根据你对 XYZ 债券下一次评级将为正且公司的违约概率将远低于她的风险限制的预测与你的投资组合经理开会。
(R[3],D[2]″)
根据你对 XYZ 公司下一次评级将为正的预测,与你的投资组合经理开会。说服你的经理利用当前折价的市场价格购买 XYZ 债券,以增加她的头寸规模。
(R[4],D[1]″)
不要根据你对 XYZ 债券下一次评级将为负的预测与你的投资组合经理开会。显然,这将是愚蠢的,也不是你曾经考虑过的选项。我们仅仅是为了完整性而列出它。
决策(R[1],D[1]″)、(R[2],D[2]″)和(R[3],D[2]″)是你唯一能做出的可行决策,它们是相互排斥且互相穷尽的。我们需要给这些决策分配损失,以反映它们对你生活的影响。
决策(R[1], D[1]″)的可能损失——你与你的投资组合经理开会告知她基于你的预测下一次评级将为负的 XYZ 债券即将违约她的风险限制——如下:
-
一个可能的结果是 XYZ 公司的下一次评级为负。这对你和你的投资组合经理来说是一个很好的结果。你将展现出明智的判断、预见力和风险管理——这是投资经理最重要的品质之一。你的投资组合经理将会由于你的出色表现而积极地管理她的头寸风险。因此,你将朝着成为投资组合经理的职业目标取得重大进展。
- 你的损失函数通过给你奖励或负损失来反映这个有利的结果。让我们将其赋予一个值+100 点:L(R[1],D[1]″ | 负″) = +100
-
另一种可能的结果是,XYZ 公司的下一个评级结果为正面。这对你来说不是一个好结果。你的投资组合经理将对她为保护她的 XYZ 债券而进行的对冲产生一些损失,这些对冲是基于你之前的预测。她可能会怀疑你惊慌失措,因为负面评级的概率为 47.5%,低于抛硬币的概率。她可能会得出结论,你可能没有成为投资组合经理所需的魄力和果断。你近期成为投资组合经理的梦想将逐渐消失。但让我们看看这种可能情景的好的一面:你仍然有工作,这可能会成为你的一个很好的学习经验。
- 你的损失函数将通过给你一个小的损失,比如-100 点,来反映这一点:L(R[1],D[1]″ | positive″) = −100
对于决策(R[2], D[2]″),你不会根据对 XYZ 债券的评级为正的预测而召开会议,你可能会有以下损失:
-
一个可能的结果是,XYZ 公司的下一个评级结果为负。这是你的噩梦情景。现在,XYZ 公司违约的概率将超过你的投资组合经理的风险限制。XYZ 公司债券的市场价格将受到打击。你的经理的投资组合将开始表现不佳,她的年终奖金将受到威胁。很可能,她会和你召开一次会议。你将被祝愿未来一切顺利,并受到安保人员的礼貌护送离开。
- 这种糟糕的结果通过在损失函数中分配一个大的损失来进行编码,比如给它分配
-1000 points的损失:L(R[2], D[2]″ |negative″) = −1000
- 这种糟糕的结果通过在损失函数中分配一个大的损失来进行编码,比如给它分配
-
另一种可能的结果是 XYZ 公司的下一个评级可能是正面的。这对你来说是一个好结果。然而,对于你的经理来说,不清楚是好判断还是运气在你的决策和预测中发挥了作用。毕竟,下一个评级为正面的概率只有 52.5%,略高于抛硬币。她可能会得出结论,你做得太危险了。与她对(R[1], D[1]″|positive″)的反应形成鲜明对比。两者都是不一致但基于随时会因任何原因而改变的主观风险态度的理性观点。但这正是人们和市场可以并且确实会表现出的方式。我们只能尽力应对。
- 你的损失函数将反映这种中性结果,没有损失或 0 分:L(R[2], D[2]″ | positive″) = 0
最后,决策(R[1], D[2]″)的可能损失情况是:你根据对 XYZ 债券评级为正的预测召开会议,并说服你的投资组合经理增加她的头寸:
-
与您的投资组合经理会议后的一个可能结果是 XYZ 债券的下一个评级正如预期的那样为 positive″。这对您来说是最好的结果。基于您的建议,您的投资组合经理可能已经以折价的市场价格购买了更多 XYZ 债券。她很可能已经抓住机会利用 XYZ 债券价格在新的积极信息上涨时获得快速利润。您已经展示了预测能力和赚钱的智慧。这将令基金的所有人印象深刻,尤其是您的基金经理,她的奖金支票肯定会增加。现在似乎只是时间问题,您将管理一个数百万美元的投资组合。
- 损失函数将通过给予您更大的奖励或负损失来校准这个积极的奖励。让我们将其赋予 +500 分的值:L(R[1],D[2]″ | positive″) = +500
-
与您的投资组合经理会议后的另一种结果是 XYZ 公司的下一个评级结果为负面。这对您来说将是最糟糕的结果。现在 XYZ 公司违约的概率已经超过了您的投资组合经理的风险限制。XYZ 公司债券的市场价格将大幅下跌,而她的头寸规模却增大了。您经理的投资组合表现将在基金中排名垫底,她的工作将受到威胁。将没有什么可以讨论的,您将被保安人员护送出门。
- 损失函数通过指定一个巨大的损失值 –2000 分来校准这种灾难性的结果:L(R[2], D[2]″ |negative″) = −2000
最小化损失
现在我们可以计算每个决策(R[1], D[1]″)、(R[2], D[2]″)、(R[3], D[2]″)的预期损失,通过对后验预测概率分布 P(D″ | D) 进行平均,对于 XYZ 债券的下一个评级,假设我们已经观察到了 2 个负面评级:
-
E[L(R[1], D[1]″)] = P(negative″ | 2 negatives) L(R[1], D[1]″ | negative″) + P(positive″ | 2 negatives) L( R[1],D[1]″ | negative″) = 0.475 × +100 + 0.525 × –100 = –5 分
-
E[L(R[2], D[2]″)] = P(negative″ | 2 negatives) L(R[2], D[2]″ | negative″) + P(positive″ | 2 negatives) L( R[2], D[2]″ | positive″) = 0.475 × –1000 + 0.525 × 0 = –475 分
-
E[L(R[3], D[2]″)] = P(negative″ | 2 negatives) L(R[3], D[2]″ | negative″) + P(positive″ | 2 negatives) L( R[3], D[2]″ | positive″) = 0.475 × –2000 + 0.525 × +500 = –687.5 分
在概率决策中,你能做出的最佳决策是使得你特定决策后的预期损失的平均值最小化。在最小化损失的公式中,我们对模拟数据的后验预测分布进行了损失函数的平均。由于 E[L(R[1], D[1]″)] > E[L(R[2], D[2]″)] > E[L(R[3], D[2]″)],因此你应该决定选择 (R[1], D[1]″)。你最好的选择是尽快与我们的投资组合经理会面,并告知她 XYZ 债券可能会超出她的风险限制,她需要适当管理她的头寸。这个选择最小化了你的职业风险。
众所周知,现实生活中的决策是一门艺术和一门科学。职业风险、高管自我、自相矛盾的利益、贪婪和对人们的恐惧是全世界金融交易最强大的驱动因素之一——从平凡的日常交易到最大公司的兼并重组,再到美联储加息。你若忽视这些主观决策驱动因素,可能会面临风险,并错失盈利,甚至是改变生活的机会。
无论如何,基于我们最小化职业风险的实践,我们可以假设,对于离散分布,通过后验预测分布 P(D″|D) 和损失函数 L(R, D″),最佳决策是通过最小化所有可能行动 R 的预期损失 E[L(R)],如下所示:
- E [ L ( R ) ] = arg min R ∑ i L ( R , D i '' ) × P ( D i '' | D )
对于连续函数,可以通过将求和替换为积分来扩展这个离散函数的预期损失公式。我们现在可以将损失函数应用于我们在回归集成中遇到的连续分布。与之前一样,我们通过最小化所有可能行动 R 的预期损失来达到目的,如下所示:
- E [ L ( R ) ] = arg min R ∫ L ( R , D '' ) × P ( D '' | D ) d D ''
这些公式使得我们的决策框架在应用时看起来比实际上更困难。真正困难的是理解和应用我们集成的预期值,正如我们将在下一节讨论的那样。
风险管理
投资者、交易员和企业高管的目标是从高风险的事业中获利,这些投资不仅预期会出现财务损失,而且在投资持有期内是不可避免的。在这些概率性事业中取得成功的关键是积极和系统地管理损失,以防它们在任何有限的时间段内超过利润或损害资本基础。在第三章中,我们探讨了用于风险管理的波动率的不足之处。价值-at-risk(VaR)和预期缺失(ES)是两种风险测量方法,几乎所有金融机构、政府监管机构和非金融机构的公司财务主管广泛使用。² 实践者对计算这些测量方法使用的方法有深入的理解非常重要,因为它们也存在严重的缺陷,可能导致对金融风险的灾难性错误定价。在本节中,我们总结了风险管理的一般原则以及如何特别应用上述风险测量方法于生成性集合。
资本保值
沃伦·巴菲特,有史以来最伟大的自由股票投资者,对投资股票等高风险资产有两条着名的规则:
-
规则一:不要亏钱。
-
规则二:不要忘记规则一。
巴菲特的智慧建议是,在进行高风险投资时,我们必须更加关注影响投资的常见风险的管理,而不是它未来潜在的回报。最重要的是,我们不能忘记,投资的主要目标是保证资本的回报;资本的回报只是次要目标。在投资的未来回报可能是有利可图的情况下,我们不应在投资机会变得有利之前就破产。此外,即使当前的投资不如预期那样成功,只要我们保持资本基础,总会有未来的其他投资机会。巴菲特所强调的主要原则背后—凭借几十年的卓越投资经验获得—是重要的统计学概念递进性,接下来我们将探讨这个概念。
递进性
让我们回到上一章中的线性集合,并分析我们的模型假设和观察数据所生成的 20,000 个后验预测样本。重要的是要注意,后验预测分布生成了一系列可能的未来结果,每个结果都可能由我们的集合中任何与其模型假设和用于训练和测试的数据一致的参数值组合生成。
尽管我们可以像后来那样轻松计算后验预测样本的描述性统计,但我们不能直接将任何样本结果与模型参数的具体值关联起来。当然,我们始终可以推断每个参数的可信区间,这些参数可能是从其边际后验分布生成样本,就像我们在前一章中所做的那样。让我们使用以下 Python 代码总结苹果股票假设头寸的预测超额回报:
# Flatten posterior predictive xdarray into one numpy array of
# 20,000 simulated samples.
simulated_data = target_predicted.flatten()
# Create a pandas dataframe to analyze the simulated data.
generated_data = pd.DataFrame(simulated_data, columns=["Values"])
# Print the summary statistics.
print(generated_data.describe().round(2))
# Plot the predicted samples of Apple's excess returns generated by
# tested linear ensemble.
plt.hist(simulated_data, bins='auto', density=True)
plt.title("Apple's excess returns predicted by linear ensemble")
plt.ylabel('Probability density'),
plt.xlabel('Simulated excess returns of Apple');
更重要的是,这些后验预测分布中的每日超额回报并不预测这些回报的具体时间或持续时间,只是基于我们集成模型假设和训练及测试期间观察到的数据,预测未来可能回报的分布。我们的集成平均值是我们假设投资于苹果股票的预期价值。让我们看看它是否能帮助我们决定是否持有、增加或减少我们的头寸规模。
简单的损失函数,L(R, D″),即我们头寸规模的市场价值乘以后验预测分布中每个模拟数据点的苹果公司的每日超额回报:
-
L(R, D″) = R × D″
-
R 是我们投资于苹果股票的市场价值。
-
D″ 是我们线性集成生成的模拟每日超额回报。
-
在下面的 Python 代码中,我们假设我们对苹果股票的假设投资价值为$100,000,并计算所有模拟超额回报的集成平均值:
#Market value of position size in the portfolio
position_size = 100000
#The loss function is position size * excess returns of Apple
#for each prediction.
losses = simulated_data/100*position_size
#Expected loss is probability weighted arithmetic mean of all the losses
#and profits
expected_loss = np.mean(losses)
#Range of losses predicted by tested linear ensemble.
print("Expected loss on investment of $100,000 is ${:.0f}, with max possible
loss of ${:.0f} and max possible profit of ${:.0f}"
.format(expected_loss, np.min(losses), np.max(losses)))
Expected loss on investment of $100,000 is $-237, with max possible loss of
$-10253 and max possible profit of $8286
–$237 的预期值几乎是基于$100,000 投资的四舍五入误差。这表明,如果我们保持我们的头寸,假设市场条件保持与我们模型编码和观察到的数据大致相同,我们可以预期几乎没有损失或损失很小。考虑到我们的头寸可能随时间发生的广泛损失和利润的大范围,从–10.25% 到+8.29%,–0.24% 的预期值是否具有误导性和风险性?看起来,集成平均值或预期值对风险管理决策是一个无用且危险的统计量。让我们深入了解预期值的统计概念,以理解为什么以及如何适当地应用它。³
回想一下,当我们估计任何变量(如投资)的期望值时,我们计算所有可能结果及其相应回报的概率加权平均值。我们还假设这些结果彼此独立且同分布,即它们是从同一随机过程中抽取的。换句话说,投资的期望值是概率加权的算术平均值。值得注意的是,期望值不依赖于时间,并且也被称为随机过程或系统的集合平均值。如果您有一组独立同分布的投资或交易同时进行,期望值是决策的有用工具。或者,如果您经营赌场业务,您可以计算在任何给定时间所有赌徒的预期收益。
然而,作为投资者和交易者,我们只观察到我们的投资随时间变化的特定路径或轨迹。我们按时间顺序测量我们投资的结果和回报,作为有限时间内的时间平均值。特别地,随着时间的推移,我们可能只观察到所有可能结果及其相应回报的子集。在我们的投资轨迹在时间上实现每一个可能的预测结果和回报的不太可能的情况下,轨迹的时间平均值几乎肯定会收敛到集合平均值。这样的随机过程被称为遍历的。我们在第六章中简要讨论了这一点,在马尔可夫链部分。
一个遍历投资过程的特殊之处在于,投资的期望值总结了任何投资者在足够长的时间内持有该投资所观察到的回报。当然,正如在第六章中提到的,这假设在马尔可夫链中没有截断投资者财富轨迹的吸收状态。正如我们将在本节和下一节看到的,投资过程是非遍历的,依赖期望值来管理风险或回报可能导致巨大损失,甚至是财务破产。
即使假设一个过程是遍历的,我们的投资的时间平均值也不考虑结果和回报序列的实际顺序。为什么要考虑呢?毕竟,这只是另一个算术平均值。值得注意的是,这也假设投资者是被动的、买入并持有的投资者。投资在市场上遵循的回报具体顺序是至关重要的,因为这会导致不同类型投资者的不同后果和决策。一个例子将有助于阐明这一点。
一个股票轨迹,先是亏损了–10.25%,然后是获利+8.29%,对于投资者来说与另一个轨迹(先是获利+8.29%,然后是亏损–10.25%)带来了不同的决策和后果。尽管在这两个两步序列中股票最终都以–2.81%的买入和持有投资者的方式结束。这种上涨和下跌的回报序列被称为波动性拖累,因为它将预期回报(算术平均值)拖至几何平均值或复合回报。如果波动性拖累是恒定的,复合回报 = 平均回报 - 回报方差的 1/2。但是对于投资者来说,波动性拖累的风险可能因其投资策略而大不相同。让我们看看为什么。
假设对于投资组合中的任何股票头寸,投资者有每日亏损限制–10%和每日盈利限制+5%。前一股票序列(–10.25%,+8.29%)将会触及投资者的止损限价单,使其退出持仓。更加令人不快的是,第二天股票强劲反弹+8.29%,而投资者已经在他们的投资中遭受了–10%的实现损失。现在,与持有其头寸的同行或具有–10.26%或更低风险限制的其他投资者相比,投资者将下跌–7.19%。谈论在我们投资者的伤口上撒盐!现在,投资者很难决定在如此惨痛的猛烈抽打之后是否重新进入他们的持仓。
现在让我们考虑一下如果股票遵循后一种序列(+8.29%,–10.25%)会发生什么。当股票飙升+8.29%时,投资者将获利+5%。他们会对未在最近的高价位卖出自己的持仓感到一些遗憾。但没有人能够完美地时间市场或者能够持续做到。然而,第二天,当股票下跌–10.25%时,投资者会感到非常聪明和满意。他们将通过+7.81%超额表现而超过同行,如果愿意的话可以炫耀一番。现在投资者可以相当轻松地重新进入股票持仓,因为他们的平均成本已经降低了+5%。
这个例子展示了波动性(或回报标准偏差)作为风险度量的另一个无意义之处,正如第三章中所讨论的那样。波动性只是另一种集成平均值,并非遍历性。在第一个轨迹中,波动性损害了投资者的回报,在第二个轨迹中却帮助了他们。
尽管这些数字是特定于我们的概率集合,但任何时间段内的投资轨迹对大多数积极的投资者和一般交易者来说都可能产生深远的影响。回报序列的特定排序影响了投资者的决策、经验和投资成功。关于“平均投资者”在投资上体验回报的概念只是另一个金融童话故事。
生成价值风险
与依赖集成平均值不同,一种称为价值风险 (VaR) 的流行损失函数可以帮助我们在任何时间段做出更好的风险管理决策。VaR 是回报分布的百分位数度量,代表了某个百分比的回报 (或损失) 位于其下方的值。换句话说,VaR 是在给定概率下在指定时间段内预期的最大损失。参见图 8-1,显示了 VaR 和条件 VaR (CVaR),下一小节将对其进行解释。
图 8-1. 价值风险 (VaR) 和条件 VaR (CVaR),也称为预期损失 (ES),以 alpha 概率显示的一个假想投资回报分布⁴
与波动性不同,这一指标基于对风险的常识性理解。例如,假设投资组合的每日 VaR 为 $100,000,概率为 99%。这意味着我们估计有:
-
99% 的概率,投资组合的每日损失不会超过 $100,000。
-
每日损失超过$100,000 的概率为 1%。
一般来说,VaR 的时间跨度通常与决策者认为需要采取行动的时间有关,例如清算股票头寸的时间。时间跨度越长,产生的 VaR 值通常越大,因为未来的不确定性越多。
在第三章中,我们使用蒙特卡罗模拟揭示了将波动性作为风险度量的深刻缺陷。在行业中,通常使用蒙特卡罗模拟来使用理论或经验模型估算复杂投资或投资组合的 VaR。风险估计称为蒙特卡罗 VaR。在概率机器学习中,使用后验预测分布无缝地进行此模拟,并在认识上保持一致。我使用后验预测样本来估算 VaR,我称之为生成 VaR 或 GVaR,如下所示:
-
将 N 个模拟过的超额收益按损失降序排列。
-
取这些损失中的前 M 个,使得 1 - M/N 是所需的概率阈值。
-
M 个损失子集中的最小损失是你的 GVaR。
现在让我们使用 Python 计算线性集成的 GVaR,其损失来自其后验预测分布的尾部:
#Generate a list the 20 worst daily losses predicted
# by tested linear ensemble.
sorted_returns = generated['Values'].sort_values()
sorted_returns.head(20).round(2)
# Compute the first percentile of returns.
probability = 0.99
gvar = sorted_returns.quantile(1-probability)
print(f"The daily Generative VaR at {probability}% probability is
{gvar/100:.2%} implying a dollar loss of ${gvar/100*position_size:.0f} ")
The daily Generative VaR at 0.99% probability is -3.79% implying a dollar
loss of $-3789
生成期望损失
在大规模金融危机之后,人们普遍认识到金融机构使用的 VaR 指标存在严重缺陷。它不能估计超出 VaR 截断点的尾部分布中可能发生的巨大损失。预期缺失(ES),也称为条件 VaR,是一种常用的损失函数,用于估计可能发生在收益分布尾部的罕见但极端损失。请参考图 8-1 来看看 VaR 和 ES 之间的关系。顾名思义,ES 是一个期望值,并且被估计为 VaR 截断点后所有损失的加权平均值。让我们计算我们线性集成的生成 ES,并将其与后验预测分布尾部的所有最差收益进行比较:
# Filter the returns that fall below the first percentile
generated_tail = sorted_returns[sorted_returns <= gvar]
# Expected shortfall is the mean of the tail returns.
ges = generated_tail.mean()
# Generated tail risk is the worst possible loss predicted
# by the linear ensemble
gtr = generated_tail.min()
# Plot a histogram of the worst returns or generated tail risk (GTR)
plt.hist(generated_tail, bins=50)
plt.axvline(x=gvar, color='green', linestyle='solid',
label='Generative Value at Risk')
plt.axvline(x=ges, color='black', linestyle='dashed',
label='Generative expected shortfall')
plt.axvline(x=gtr, color='red', linestyle='dotted',
label='Generative tail risk')
plt.xlabel('Simulated excess returns of Apple')
plt.ylabel('Frequency of excess returns')
plt.title('Simulation of the bottom 1% excess returns of Apple')
plt.legend(loc=0)
plt.show()
print(f"The daily Generative VaR at {probability}% probability is
{gvar/100:.2%} implying a dollar loss of ${gvar/100*position_size:.0f} ")
print(f"The daily Generative expected shortfall at
{1-probability:.2}% probability is {ges/100:.2%} implying a dollar loss
of ${ges/100*position_size:.0f}")
print(f"The daily Generative tail risk is {gtr/100:.2%}
implying a dollar loss of ${gtr/100*position_size:.0f}")
从 VaR 和 ES 的损失函数中,我们可以看到我们在苹果股票的假设投资中的每日损失有 99%的概率不会低于–3.79%。如果损失超过该 GVaR 阈值,则 GES 或在 1%的情景中每日损失不会低于–4.50%。
生成尾部风险
ES 的主要缺陷在于它是另一个期望值或集成平均值,低估了由极端事件引起的风险。它甚至更危险,因为它是在我们回归集成的最坏损失子集上进行平均,而这一区域的分布如前所示,在后验预测分布的尾部中更加非遍历和厚尾。对于我们特定的集成,最糟糕的损失是 GES 的两倍多。如果极端损失损害了你的资本基础,那么你将无法观察到预期缺失。作为一个经常做空波动率的波动性交易者,我使用后验预测分布生成的最坏损失—–10.25%作为我的缺失,并相应地对冲我的交易。我称之为集成的生成尾部风险(GTR)。
如果你拥有股票,就像大多数人一样,本质上你是在做空波动率,并且正在进行一种高概率的赌注,即股票未来不会出现意外波动。根据你的风险偏好、头寸规模和对回归集成的信心,你可能会选择尾部收益分布中不同百分位作为参考点来管理尾部风险。因此,你可以决定持有你的股票头寸、减少头寸,或者用期权或期货或两者对冲。无论如何,你应该继续监控你的投资和整个市场,不断根据更近期的数据更新你的回归集成。正如我们在本书的后半部分讨论的那样,持续的概率机器学习是生成集成的标志。
资本配置
资本保值或资本的回报是我们的主要目标。在前一节中,我们探讨了可以用来管理我们的高风险投资以实现这一目标的工具。现在让我们将注意力集中在第二个目标上:资本增值。作为投资者和交易者,在面对在三维不确定性和信息不完全的环境中投资高风险资产时,我们有两个相关的基本决策:
-
评估并决定投资是否会在合理的时间段内升值。
-
决定将我们辛苦赚来的资本的哪一部分分配到这个机会上。
预期价值广泛用于评估投资机会的吸引力。它几乎在金融和投资的每个情况中都有应用,从估算公司资本项目的自由现金流到估值其债务和未偿债务股权。然而,像所有概念和工具一样,预期价值有其优势、劣势和局限性。正如我们在前一节中已经讨论过的那样,作为一个整体平均值,预期价值是一个复杂的概念。在本节中,我们继续深化我们对整体平均值的理解,以看看投资者在寻求分配他们的资本以增加财富的同时,在任何时候都不会冒着财务毁灭风险的地方,是否可以适当地应用。
Gambler’s Ruin
直到 17 世纪,著名数学家和物理学家布莱兹·帕斯卡与法国贵族合作,以提高其赌博技能,数学上证明了几千年来已知的一个真理:最终所有赌徒都会破产。赌博是有用的概率模型,在概率论和决策理论的发展中发挥了关键作用。⁶ 赌徒毁灭的经典问题对投资者具有教育意义,因为它强调了正期望值对于进行投资的必要条件。
假设您决定玩以下抛硬币游戏。您从N 开始。每个人在硬币抛掷上押注1;如果是反面,您失去$1 给对手。游戏结束时,其中一名玩家破产(即被 Ruined)。这不是个儿戏。这是一个被称为算术随机漫步的随机过程,可用于模拟股票价格和尘埃颗粒的碰撞。它也是一个马尔可夫链,因为其未来状态仅依赖于当前状态,而不依赖于到达该状态的路径。
赌徒的毁灭是一个两部分问题,其中赌徒进行一系列预期价值为负或零的赌注。使用算术随机漫步模型,可以数学上证明,在以下两种情况下,任何赌徒几乎肯定会破产:
-
一个赌徒进行一系列赌注,每次成功的概率都低于 50%,并且回报等于押注金额。在这样的游戏中,不论赌徒如何制定他们的投注策略,他们最终都会破产,因为他们的赌注始终具有负期望。甚至赌徒的资金规模与对手相比有多大都不重要。赌徒破产的概率 P(ruin) 是:
- P(ruin)=[1−(pq)^N]/[1−(pq)^(N+M)]ifp<q
-
一个赌徒面临一系列赌注,每次成功的概率为 50%,回报等于押注金额。这些是公平的赔率,但如果赌徒的对手拥有更大的资金规模,那么令人惊讶的是,即使在这种情况下,赌徒最终也会破产。如果他们的对手拥有更大的资金,例如赌场的经销商,那么通向破产的坎坷之路将变成一条没有限速的高速公路。破产的概率 P(ruin) 是:
- P(ruin)=N(M+N)ifP=qandM<N
请注意,在第一个场景中,我们假设赌徒不能或不允许计算卡片或利用赌博机的物理特性,例如 1960 年代伟大的埃德·索普在拉斯维加斯击败经销商所做的那样。⁷
数学非常清楚。无论你如何努力或发明什么样的投注系统,由于赌注的负期望,赌博对于所有赌徒来说都是一种愚蠢的事业。赌徒将采取各种随机行走,会在盈利和亏损之间曲折变化,但最终所有道路都将通向破产。涉及等概率和等资金规模的游戏对大多数赌徒来说是不现实的情况。因此,为了避免破产,赌徒需要进行具有正期望值的投注。
但是,一个具有正期望值的赌局通常被称为投资。根据约翰·凯利(John Kelly),最优资本增长算法的发明者,期望值的符号是每个赌注的预期值和投资之间的主要区别。通过进行具有正期望的赌注,一个堕落的赌徒变成了一个值得尊敬的投资者,现在可以追求一个在避免财务破产的同时增加财富的统计上可行的路径。但是,我们应该把多少资本分配给具有正期望的投资?当我们面临非常有利的赔率时,全力以赴是否有意义?
期望值的破产者
假设你面对一个富有且强大的对手,他拥有一个有 76%概率出现正面的有偏向性的硬币。假设所有人都准确地知道这个有偏向性硬币的概率,但是任何一次投硬币的物理学都是未知的。你的对手向你提出了一个具有法律约束力的提议——一个你可以拒绝的提议。
如果你把你的整个净资产押在一次投币上,如果硬币正面朝上,他会支付你三倍于你净资产价值的金额。但如果硬币反面朝上,你将失去你的全部净资产,除了你穿的衣服——这并不是私人问题,这只是商业行为。这看起来像一生中的赌注,因为它给了你一种机会,在眨眼之间将你的净资产增加一倍:
-
投注的期望值 = (3 × 净资产值 × 0.76) - (净资产值 × 0.24)= 2.04 × 净资产值。
-
支付是按你的净资产的倍数计算的,这将在法律诉讼中(或者不会)被估算,所以虚报你的净资产是没有用的。
你会接受这个明显具有高期望值的提议吗?有 76%的成功概率,但也有一个非常实质的 24%的破产风险?扔一次硬币实际上并不涉及时间,所以期望值作为一个集合平均值能帮助我们评估这个机会吗?
我们的常识本能地对于依赖任何最大化期望值的金融规则来进行如此高风险的决策有所警惕。就好像我们自己正面对着“脏”哈利警官著名的.44 马格南手枪,想知道里面是否还有子弹,而他警告我们:“你得问问自己一个问题:‘我感觉幸运吗?’那么,混蛋,你感觉到了吗?”
任何负责任的人、经验丰富的投资者、交易员或企业高管(总体上来说,他们都不是骗子)都会拒绝这个提议,因为任何甚至暗示可能导致财务破产的投资机会都是不可接受的。这在市场的一则至理名言中表达得很简洁:“有老交易员,有胆大的交易员,但没有又老又胆大的交易员。”或者另一句名言说,“牛市赚钱,熊市赚钱,但贪婪会导致屠杀。”这两个谚语的一个基本统计洞见,经过几个世纪的集体观察和生活经验,是:最大化投资的预期价值几乎肯定会导致巨大损失,甚至是财务破产,即使赔率对你有利。
对于一系列有利的赌注,你如何通过在每一次押注中最大化预期价值来投入所有资本?即使你的对手给了你一系列独立同分布的正期望押注,每次连续押注都会对你造成毁灭性打击。你不需要数学证明来弄清楚,只需一次输掉的赌注就足以清空所有累积利润和任何一位预期价值最大化投资者的初始资本。
那么在不涉及押注整个净资产的正期望二进制机会中,你应该如何做出决策?让我们回到我们在第六章中描述的情况,关于 ZYX 科技公司及其盈利预期。回想一下,在观察到 ZYX 在过去三个季度成功超过其盈利预期后,你的模型预测下个季度 ZYX 有 76%的概率会超过其盈利预期。假设你继续认为概率模型有用,并且 ZYX 将在今天交易结束后宣布其收益。
根据在 ZYX 股票期权价格,市场似乎在定价股票价格上涨 5% 如果 ZYX 超过其盈利预期。然而,如果不是这样,市场也在定价 ZYX 股票价格下跌 15%。就本次讨论而言,假设这些是在盈利事件后股票价格波动的准确预测。你如何利用这些市场信息和你模型的预测,在今天盈利公告前配置资金到 ZYX 股票?
让我们创建一个目标函数 V(F, Y″),其中 F 是你想投资于 ZYX 的总资本的比例,Y″ 是盈利超预期的预测结果。考虑到你要避免破产的目标,F 必须在区间 [0, 1) 内:
-
由于 F 不能等于 1,所以我们避免了预期价值最大化策略和前文讨论过的赌徒困境。
-
此外,由于 F < 1,不能使用杠杆,这意味着你不能向经纪人借钱投资超过账户中现金的资本。当你从经纪人那里借钱投资股票时,最终可能欠债超过你的初始资本支出,这比破产账户更糟糕。
-
由于 F 不能为负数,你不能做空股票。做空股票是一种高级的交易技术,你从经纪人那里借股票卖出,期望以更低的价格买回。这相当于反向的买低卖高。请注意,由于公司所有权的有限责任,股票价格的下限为 0。然而,股票没有理论上限,这是许多不幸投资者在泡沫和狂热中意识到的。这就是为什么做空股票可能会很危险,需要专业技能和纪律的风险管理。股票可以因为最微弱的原因而爆发强劲的涨势,称为做空回补涨。这些涨势可能是两倍强劲,因为有来自买家的买单和来自做空者的买单,他们急于回补之前卖空的股票。我曾多次处于这种做空回补涨的错误一方,而“撕脸涨势”这个词组恰如其分地描述了这些经历。
回忆一下,Y″ 是我们的概率模型对 ZYX 公司的收益预测,基于观察到的样本数据 D,其中当 ZYX 超出盈利预期时,P(Y[1]″ = 1 | D) = 76%,当没有超出预期时,P(Y[0]″ = 0 | D) = 24%。因此,我们目标函数的期望值 E[V(F)] 是一个盈利(W)为 5% 和亏损(L)为 -15% 的概率加权平均:
-
E[V(F)] = W × F × P(Y[1]″ = 1 | D) + L × F × P(Y[0]″ = 0 | D)
-
E[V(F)] = 0.05 × F × 0.76 – 0.15 × F × 0.24 = 0.002 × F
-
这笔交易的优势或正期望约为 0.2%。
用常识来看,可以看到没有任何单一投资者会在 ZYX 的股票价值增长 0.2% 或者他们可能估计的任何其他预期值之后观察到。根据 ZYX 的实际收益结果,每个持有该股票的投资者将会有一个 5% 的盈利或者 -15% 的亏损,或者如果他们对该股票做空,情况会反过来。我们计算的期望值是所有 ZYX 股东所有盈利和亏损的集成平均值。这很难估计,并且可能不在你估计范围内是合理的。
但在这种情况下,我们为什么要关心集合平均值呢?正如您所看到的,对于单个投资者在这样的一次性二元事件中做决策,它是一个完全无用的工具。ZYX 的盈利事件的正期望值听起来很棒,直到您在一个高频微秒内遭受到-15%的损失,比您的眨眼速度还快。前重量级拳击冠军迈克·泰森(Mike Tyson)在概括这种充满希望的正期望时说得非常出色:“每个人都有计划,直到他们被打在嘴巴上。”
那么,无论您打算为赌注分配多少资本,什么资本分配算法可以帮助您在一次性二元交易中做出决策呢?不幸的是,没有。只有您能够承受您决策的最坏已知结果的能力,这在定义上是主观的,可以帮助您做出这样的一次性二元决策。我们已经讨论过如何将主观性整合到概率决策中去。假设您的每日亏损限制为-10%,每日利润限制为+5%,适用于您投资组合中的任何头寸。这使得决策系统化,尤其对于自动化系统而言更易实施:
-
在收益公告之前不要投资 ZYX,因为有非常大的可能性在一天内损失-10%,这与您的目标函数的风险限制相冲突。
-
不要做空 ZYX 股票,因为这与您的目标函数相冲突。
-
如果您已经投资于 ZYX 股票,则需要重新调整您的仓位大小,并用期权或期货进行对冲,以确保每日损失不超过-10%。当然,对冲成本会降低 5%的预期收益,因此您需要重新计算预期值,以确保它仍然是正的。
寻找在合理时间范围内具有正期望值的投资机会通常是任何投资策略的难点。但在本节中,我们已经了解到,做出具有正期望的投资是必要的,但不是充分条件。因此,投资者面临着一个困境:
-
如果他们将太多资本投入到这样一个有利机会中,他们会面临破产或造成毁灭性的损失的风险。
-
如果他们分配的资本太少,他们会冒着浪费有利机会的风险。
这意味着投资者需要一个资本分配算法,计算他们总资本的一部分投向一系列具有正期望的投资机会,以便平衡两个基本目标:
-
避免在任何时候陷入财务灾难。
-
在有限的时间内增加他们的财富。
一些投资者有额外的目标,这些目标需要在特定时间段内管理的资本上实现,通常是一年:
-
百分比利润必须超过一个定义的阈值
-
百分比损失不得超过一个定义的阈值
这些目标可以编码在投资者的目标函数中,这将影响和限制他们的资本配置算法。正如我们在本章中到目前为止已经学到的,将期望值应用于投资和金融中既不直观也不简单,因为投资过程是非遍历的。让我们探讨一种在学术界和工业界广泛使用的资本配置算法。
现代投资组合理论
现代投资组合理论(MPT),由哈里·马科维茨在 1952 年开发,着重于通过投资组合中不同资产回报的相关性来量化分散化的益处。它在单个时间段内最大化资产组合的预期回报的同时,利用波动率(方差的平方根)作为预期值优化算法的约束条件。MPT 假设资产价格回报是稳态遍历和正态分布的。
正如我们已经学到的那样,这些是不切实际和危险的假设,原因如下:
-
它们忽视了资产价格回报的偏度和峰度,即使是学术界也知道它们是不对称的、厚尾的。
-
在市场极端压力期间,如我们最近在 2020 年和之前在 2008 年所见到的那样,投资组合分散化会减少或消失。
-
在正常期间,厚尾分布可能会在投资组合中引入大的相关性误差。
-
投资组合权重对于回报、方差和协方差的估计非常敏感。对回报估计的微小变化可以完全改变最优投资组合的构成。
MPT 投资组合比宣传的要风险更大,并提供次优的回报——分散化导致“非优化”。巴菲特称 MPT 是“一大堆胡说八道”,自那时以来一直在他的巨额银行笑得开怀。
在一次采访中,马科维茨承认并未将他那个“诺贝尔奖获得的”均值-方差算法用于自己的退休基金!如果这不是对均值-方差算法的控诉,我不知道还有什么能够是。⁹ 相反,马科维茨采用了 1/N 启发式或者说天真的分散化策略。这是一种投资策略,你将资本均匀分配给 N 个投资项目。已经证明,这种天真的分散化投资组合策略表现优于均值方差和其他复杂的投资组合策略。¹⁰
我们将注意力集中在另一种更简单但同样无用的 MPT 模型上,以突显将波动性用作总体风险度量的概念错误。由其学生威廉·夏普从马科维茨的投资组合理论推导出来的资本资产定价模型(CAPM),在第四章中讨论。它简化了 MPT,用于思考任何风险投资的预期回报。根据 CAPM,资产具有两种类型的风险:非系统性风险和系统性风险。非系统性风险是特定资产特有的特异风险,是可分散的。系统性风险是影响所有资产的市场风险,不可分散。
CAPM 建立在 MPT 的英雄假设之上,即所有投资者都是理性且风险厌恶的,他们在同一时间给定相同信息时有相同的预期,从而市场总是处于均衡状态。这样的金融童话不亚于迪士尼乐园中的任何童话故事。无论如何,这些马科维茨投资者被认为会创造高度有效的市场,只持有能够减少资产相关性和消除任何特定资产特异风险的多样化投资组合。统计上来说,这意味着在一个充分多样化的投资组合中,任何特定资产的特异风险和回归线中的任何误差项的期望值都将为零。因此,马科维茨投资者只会为资产的系统风险支付溢价,因为这种风险无法通过分散化消除。
在这样高效的市场中,所有定价合理的投资将在一个称为安全市场线的回归线上绘制,其截距等于无风险利率,斜率等于β或系统风险。资产的β确定了资产相对于市场运动的幅度和方向。参见图 8-2(M 是具有β = 1 的市场组合)。
资产的市场模型(MM)的系统风险项β与其 CAPM 计算的相同。但是请注意,资产的市场模型(MM)与其 CAPM 在三个重要方面有所不同:
-
CAPM 制定了资产的预期回报,而其 MM 则制定了实现回报。
-
MM 在其制定中既有特异风险项(α),也有误差项。
-
基于 MPT,α的期望值为零,因为它已经被理性投资者通过分散化抵消掉了。这就是它不出现在 CAPM 中的原因。
图 8-2. CAPM 声称,随着您增加投资的系统风险(或β),其预期回报将线性增加。 Beta 与投资回报的波动性成正比¹¹
在简单线性回归中,beta 量化了与关联特征的单位变化相关的目标的平均变化。根据简单线性回归的假设,特别是残差恒定方差的假设,beta 有一个等于的解析公式:
-
Beta = Rxy × Sy / Sx 其中:
-
Sy = 目标或投资的标准差
-
Sx = 特征或市场投资组合的标准差
-
Rxy = 特征与目标之间的相关系数
-
Beta 也可以解释为将高风险投资的波动性与市场波动性相关联的参数。
马科维茨投资者的破产
正如您可以从图 8-2 中看到的,CAPM 声称,只要您愿意接受资产价格回报的伴随波动性,通过选择高风险投资或使用杠杆或两者兼而有之,您可以增加期望收益的价值。
让我们通过生成一个与 ZYX 盈利事件具有相同概率、结果和回报的非常大的假设交易样本来测试关于收益期望的这些假设。在以下 Python 代码中,我们从后验预测分布生成了 20,000 个样本。这应该足够大,使大数定律(LLN)生效,并能使随机过程的任何渐近性质收敛。
特别地,我们将通过计算 20,000 个模拟样本中的后验预测均值来计算我们的集合平均值。这些样本模拟了 ZYX 盈利事件的两个结果。然后,我们按时间序列将相同的 20,000 个结果顺序地提供给 100 名模拟投资者。每个模拟投资者在其投资过程中应用 MPT/CAPM 理论。他们将其初始资本 100,000 美元的 1%到 100%分配给 ZYX 股票。对于特定投资者/总资本的每个模拟结果产生的利润或损失进行计算。我们的代码迭代地跟踪每个特定部分/投资者的终端财富。最后,我们绘制每个部分/投资者的终端财富,并检查典型投资者的时间平均值是否等于前面计算的集合平均值:
#Fix the random seed so numbers can be reproduced
np.random.seed(114)
#Number of posterior predictive samples to simulate
N = 20000
#Draw 100,000 samples from the model's posterior distribution
#of parameter p
#Random.choice() selects 100,000 values of p from the
#earnings_beat['parameter'] column using the probabilities in the
#earnings_beat['posterior'] column.
posterior_samples = np.random.choice(earnings_beat['parameter'],
size=100000, p=earnings_beat['posterior'])
#Draw a smaller subset of N random samples from the
#posterior samples of parameter p
posterior_samples_n = np.random.choice(posterior_samples, size=N)
#Generate N random simulated outcomes by using the model's likelihood
#function and posterior samples of the parameter p
#Likelihood function is the Bernoulli distribution, a special case
#of the binomial distribution where number of trials n=1
#Simulated data are the data generated from the posterior
#predictive distribution of the model
simulated_data = np.random.binomial(n=1, p=posterior_samples_n)
#Plot the simulated data of earnings outcomes y=0 and y=1
plt.figure(figsize=(8,6))
plt.hist(simulated_data)
plt.xticks([0,1])
plt.xlabel('Predicted outcomes')
plt.ylabel('Count')
plt.title('Simulated outcomes of ZYX beating earnings expectations')
plt.show()
#Count the number of data points for each outcome
y_0 = np.sum(simulated_data == 0)
y_1 = np.sum(simulated_data == 1)
#Compute the posterior predictive distribution
print(f"Probability that ZYX will not beat earnings expectations (y=0) is:
{y_0/(y_0+y_1):.3f}")
print(f"Probability that ZYX will beat earnings expectations (y=1) is:
{y_1/(y_0+y_1):.3f}")
注意,基于我们的后验预测分布的结果变量的概率几乎等于 y = 0 和 y = 1 的理论概率。这验证了我们的样本大小足够大,以实现渐近收敛,LLN 按预期工作。现在我们继续根据我们模型生成的 20,000 个可能结果序列来计算我们的利润和损失,以计算所有投资者的终端财富:
#Percentage losses when y=0 and earnings don't beat expectations
loss = -0.15
#Percentage profits when y=1 and earnings beat expectations
profit = 0.05
#Set the starting capital
start_capital = 100000
#Create a list of values for position_size or percentage of total capital
#invested in ZYX by an investor
position_size = np.arange(0.00, 1.00, 0.01)
#Create an empty list to store the final capital values for
#each position_size of an investor
final_capital_values = []
#Loop over each value of position_size f to calculate
#terminal wealth for each investor
for f in position_size:
#Set the initial capital for this simulation
capital = start_capital
#Loop over each simulated data point and calculate the P&L based on y=0 or y=1
for y in simulated_data:
if y == 0:
capital += capital * loss * f
else:
capital += capital * profit * f
# Append the final capital value to the list
final_capital_values.append(capital)
#Find the value of f that maximizes the final capital of each investor
optimal_index = np.argmax(final_capital_values)
optimal_f = f_values[optimal_index]
max_capital = final_capital_values[optimal_index]
#Plot the final capital values as a function of position size, f
plt.figure(figsize=(8,6))
plt.plot(position_size, final_capital_values)
plt.xlabel('Position size as a fraction of total capital')
plt.ylabel('Final capital values')
plt.title('Growth of total capital as a function of position size in ZYX')
# Plot a vertical line at the optimal value of f
plt.axvline(x=optimal_f, color='red', linestyle='--')
plt.show()
#Print the optimal value of f and the corresponding final capital
print(f"The optimal fraction of total capital is {optimal_f:.2f}")
print(f"Initial capital of ${start_capital:.0f} grows to a
final capital of ${max_capital:.0f}")
根据我们的模拟,我们可以得出一些明显的观察:
-
投资者根据在这一系列假设正期望赌注中投资的初始资本的比例经历不同的财富轨迹(总计 20,000 次独立同分布赌注)。
-
如果投资者投资超过其资本的 26%,则会开始亏损。
-
所有投资者中超过其资本的 40%投资者都破产。
-
所有投资者,投资其资本的 1% 到 26% 的人都增加了他们的财富。
-
只投资其资本的 13% 的投资者获得了最多的终端财富。在这种投资情境中,13% 的总资本是 Kelly 最优头寸大小,用于增长个人财富。
-
需要注意的是,投资者的破产风险与其初始资本的头寸大小密切相关,而不是随机过程回报的波动性,这对每位投资者都是相同的。
-
更重要的是,即使您愿意接受相关投资的波动性,也有一个限度,应该分配到一个投资中。这是 MPT/CAPM 的致命缺陷,并揭示了使用波动性作为风险度量的愚蠢。
正如我们的模拟所示,假设投资是一个遗传过程,并且优化预期价值会导致大多数应用 MPT/CAPM 原则的投资者陷入财务灾难,这些原则使用波动率作为风险的代理,并忽略头寸大小。这就是 LTCM 为什么可以合理高杠杆化其头寸并忽略财务灾难可能性的理由。
凯利准则
1956 年,贝尔实验室的物理学家约翰·凯利提出了解决如何在非遗传性随机过程中投资正期望机会的棘手问题的突破性解决方案。他的解决方案,通常称为凯利准则,是最大化资本预期复利增长率或财富对数预期值的方法。¹² 凯利头寸大小是分配给一系列正期望赌注或投资的最优资本量,以在最短时间内获得最大的终端财富而不会冒财务灾难的风险。
假设您富有的对手给了您另一个加权硬币,有 55%的概率正面朝上。他向您提供了一系列赔率相等的无限交易:
-
正面时,您的投注金额翻倍。反面时,您失去整个投注金额。
-
为了长期最大化您的资本,您应该分配多少资金?
让我们在 Python 中运行一个简单的二元赌注系列模拟,固定赔率,以说明 Kelly 准则在最大化财富方面的威力:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(101)
# Weighted coin in your favor
p = 0.55
# The Kelly position size (edge/odds) for odds 1:1
f_star = p - (1 - p)
# Number of series in Monte Carlo simulation
n_series = 50
# Number of trials per series
n_trials = 500
def run_simulation(f):
#Runs a Monte Carlo simulation of a betting strategy with
#the given Kelly fraction.
#Takes f, The Kelly fraction, as the argument and returns a NumPy array
#of the terminal wealths of the simulation.
# Array for storing results
c = np.zeros((n_trials, n_series))
# Initial capital of $100
c[0] = 100
for i in range(n_series):
for t in range(1, n_trials):
# Use binomial random variable because we are tossing
# a weighted coin
outcome = np.random.binomial(1, p)
# If we win, we add the Kelly fraction to our accumulated capital
if outcome > 0:
c[t, i] = (1 + f) * c[t - 1, i]
# If we lose, we subtract the Kelly fraction from
# our accumulated capital
else:
c[t, i] = (1 - f) * c[t - 1, i]
return c
# Run simulations for different position sizes
# The Kelly position size is our optimal betting size
c_kelly = run_simulation(f_star)
# Half Kelly size reduces the volatility while keeping the gains
c_half_kelly = run_simulation(f_star / 2)
# Anything more than twice Kelly leads to ruin in the long run
c_3_kelly = run_simulation(f_star * 3)
# Betting all your capital leads to ruin very quickly
c_all_in = run_simulation(1)
# Plot the expected value/arithmetic mean of terminal wealth
# over all the iterations of 500 trials each
fig, ax = plt.subplots(figsize=(10, 6))
# Overlay multiple plots with different line styles and markers
ax.plot(c_kelly.mean(axis=1), 'b-', lw=2, label='Kelly')
ax.plot(c_half_kelly.mean(axis=1), 'g--', lw=2, label='Half Kelly')
ax.plot(c_3_kelly.mean(axis=1), 'm:', lw=2, label='Three Kelly')
ax.plot(c_all_in.mean(axis=1), 'r-.', lw=2, label='All In')
ax.legend(loc=0)
ax.set_title('Expected Wealth of Bettor With Different Position Sizes')
ax.set_ylabel('Terminal wealth')
ax.set_xlabel('Number of Bets')
plt.show()
对于二元结果,投资者可以计算资本的百分比 F,以在非遍历投资过程的现实世界中将资金分配给正期望的机会。然而,关于凯利准则的流行文献并没有提供适用于你在其中失去赌注的一部分而不是你的整个赌注的一般凯利仓位大小公式。最优分数 F′ 是:
-
F′ = (W × p – L × q) / (W × L) 其中
-
p 是获利的概率,q = 1 – p 是损失的概率。
-
W 是百分比收益,L 是百分比损失。
-
-
当 L = 1 时,请注意,你将失去你的整个赌注,并且你会得到这个流行的公式:
-
F′ = (W × p – q) / W,或者众所周知的优势赔率。
-
此公式用于体育博彩,您可以失去整个赌注。
-
重要的是要注意,凯利公式将整体平均值与单个轨迹的时间平均值联系起来。投资的预期值,或者优势,在其分子中。但分母通过包含在时间平均值中将依次产生的乘法损失和利润来修改由整体平均值暗示的头寸大小。这就是我们早期在遍历性子节中讨论过的波动性拖曳。
凯利公式相当优雅地解决了多元动力学中的赌徒毁灭问题。回想一下,赌徒毁灭问题涉及一系列的加法赌注。相反,凯利准则用于一系列的乘法赌注。当机会的预期值或优势为零时,凯利公式给出了零头寸大小。此外,当预期为负时,头寸大小也为负。这意味着你应该押注另一边。在赌博中,这意味着反对赌徒,与赌场荷官一起下注。在市场上,这意味着押注市场将下跌,并在投资中建立空头头寸。
凯利准则对于投资于正期望投资机会有许多理想的特性:¹³
-
数学上无可争议,凯利仓位最大化了在最短时间内的终端财富而没有破产的风险。
-
它产生指数增长,因为利润被再投资。
-
它涉及多期,近视交易策略,您可以专注于当前的机会,而无需长期计划。
-
-
它在公式中内置了风险管理:
-
凯利仓位大小是你资本的一个分数。
-
当损失累积时,仓位大小变小。
-
凯利准则在数学上表达为,评估投资机会的期望值是必要的但不够的。调整我们的投资仓位以考虑投资的非遗传过程是非常重要的,并且是我们需要的充分条件。不幸的是,在金融市场中进行资本配置并不那么简单,应用凯利准则是具有挑战性的,因为市场并不稳定。
凯利投资者的毁灭
正如我们在第一章中提到的,金融市场不仅不符合遗传性,而且还不是稳态的。潜在的数据生成随机过程随时间变化。这使得估计这些过程的不断变化的统计特性变得危险,特别是当市场的基本结构突然发生变化时。
请注意,由于其参数和数据抽样的不确定性,事件变量 Y″ 的后验预测分布具有概率分布。76%的概率只是其后验预测分布的均值。如果我们的估计值低于 75%,我们的目标函数的期望值就会变负。这里没有太多的错误余地,这应该引起警觉。根据理论公式和超过 75%的盈利概率,凯利仓位大小应为零。然而,我们已经超出了凯利仓位,我们的资本增长是次优但对于这个模拟是正的。很可能在另一个具有更多样本的模拟中,仓位大小会发生变化,当前仓位大小为 13%可能会导致破产。
凯利仓位大小公式对期望值(“边缘”)和盈亏概率(“赔率”)的估计非常敏感。在应用凯利公式时犯的致命错误是过度投注或仓位大小大于凯利大小。随着投资者的仓位大小超过凯利最优值,他们的财富增长率会降低,并不可避免地将他们推向财务破产。¹⁴
凯利准则的实践者使用凯利最优大小的一部分,如半凯利,以避免过度投注,因为它对抗:
-
高估自己的优势
-
事件概率的错误估计
-
改变边缘和赔率
分数凯利分配策略还可以减少伴随全凯利仓位大小可能出现的回报波动性。将凯利标准完全应用于一系列投资涉及非线性规划,超出了本入门指南的范围。¹⁵
摘要
现实世界中的复杂决策是一门艺术和科学。我们的概率决策框架为我们提供了将先验知识和主观原因与观察数据的客观性以及概率计算的严苛要求整合起来的视角和工具。它使我们能够在面对不确定性和不完整信息的情况下做出最佳决策,以优化我们的目标。为了做出可以信赖机器的系统决策,我们需要指定一个目标函数,并根据从生成集合的后验预测分布中产生的所有可能结果评估该函数。
预期值,也被称为集合平均,需要谨慎应用,因为金融和投资过程是非遍历的。由于每位投资者的财富轨迹是独特的,不同于计算所有市场参与者所有可能轨迹的集合平均,他们的时间平均值与集合的预期值不同。此外,不同的事件序列导致不同的决策和结果,即使时间平均值可能是等效的。在风险管理中,使用风险值而不是波动性更为谨慎,因为风险值是从可能回报的分布中估计出来的。此外,最好使用尾部风险值而不是预期缺失,因为后者也是集合平均值。在本章中,我演示了这些风险度量的生成版本,这些版本无缝地由概率集合生成。
投资的预期值是一种有用的评估工具,因为它将赌博与投资区分开来。然而,在非遍历的世界中,尽管正期望是投资的必要条件,但它并不足够。您需要一种资本配置算法,适当地调整您的投资规模,以便在您的投资财富轨迹上不破产,并且有实现财富增长的现实机会。
如果您希望最大化资本的增长,您可能希望考虑凯利投资策略,这种策略优于任何其他资本配置策略,尤其是次优的马尔科维茨均值-方差投资策略。凯利准则投资策略已被有史以来最成功的投资者使用,包括沃伦·巴菲特、埃德·索普和詹姆斯·西蒙斯。凯利准则不在学术界或专业课程中教授是一种悲剧。然而,凯利公式并非灵丹妙药,在非平稳世界中实施起来很困难。这就是为什么像我这样的大多数从业者使用分数凯利交易策略来避免过度投注和破产风险。
不幸的是,对于在交易、投资和金融中获得成功而言,没有任何可以编码在任何 AI 系统中的简易公式或算法,因为市场不是静态的遗传群体。符号 AI 和概率机器学习系统需要人类的常识和专业知识,以区分相关性和因果关系,从而成功地应对由市场参与者的创造性、情感和自由意志产生的变量性、认知性和本体论性不确定性。现在这是一个几乎可以肯定地将几率放在你这边的生成整体。
参考文献
Bhide, A. V. “Compulsive Gambling in Ancient Indian Texts.” Indian Journal of Psychiatry 49, no. 4 (2007): 294–95.
Bower, Bruce “Simple Heresy: Rules of Thumb Challenge Complex Financial Analyses.” Science News 179, no. 12 (2011): 26–29.
DeMiguel, Victor, Lorenzo Garlappi, and Raman Uppal. “Optimal Versus Naïve Diversification: How Inefficient is the 1/N Portfolio Strategy?” Review of Financial Studies 22, no. 5 (2009): 1915–53.
Karasan, Abdullah. Machine Learning for Financial Risk Management with Python. O’Reilly Media, 2021.
Kelly Jr., J. L. “A New Interpretation of Information Rate.” The Bell System Technical Journal 35, no. 4 (1956): 917–26.
MacLean, L. C., E. O. Thorp, and W. T. Ziemba. “Long-Term Capital Growth: Good and Bad Properties of the Kelly Criterion.” Quantitative Finance 10, no. 7 (2010): 681–687.
MacLean, L. C., E. O. Thorp, and W. T. Ziemba. “Medium Term Simulations of the Full Kelly and Fractional Kelly Investment Strategies.” 在The Kelly Capital Growth Investment Criterion: Theory and Practice,由 L. C. MacLean, E. O. Thorp, and W. T. Ziemba 编辑,543–61 (Hackensack, NJ: World Scientific Publishing Company, 2011).
Peters, Ole. “The Ergodicity Problem in Economics.” Nature Physics 15 (2019): 1216–21.
Peters, Ole, and A. Adamou. “The Time Interpretation of Expected Utility Theory.” arXiv.org, February 28, 2021. https://arxiv.org/abs/1801.03680.
Peters, Ole, and Murray Gell-Mann. “Evaluating Gambles Using Dynamics,” arXiv.org, June 5, 2015. https://arxiv.org/abs/1405.0585.
Poundstone, William. Fortune’s Formula: The Untold Story of the Scientific Betting System That Beat the Casinos and Wall Street. New York: Hill and Wang, 2006.
Robert, Christian P. The Bayesian Choice: From Decision-Theoretic Foundations to Computational Implementation. New York: Springer Science+Business Media, 2007.
Thorp, Edward O. A Man for All Markets: From Las Vegas to Wall Street, How I Beat the Dealer and the Market. New York: Random House, 2017.
进一步阅读
MacLean, L.C., E. O. Thorp, and W. T. Ziemba (eds.). The Kelly Capital Growth Investment Criterion: Theory and Practice. World Scientific Publishing Company, 2011.
¹ Christian P. Robert,《贝叶斯选择:从决策理论基础到计算实施》(纽约:斯普林格科学+商业媒体,2007)。
² Abdullah Karasan,《Python 金融风险管理中的机器学习》(O’Reilly Media, 2021)。
³ Ole Peters,《经济学中的遍历性问题》,自然物理学 15(2019 年):1216–1221;Ole Peters 和 A. Adamou,《预期效用理论的时间解释》,arXiv.org,2021 年 2 月 28 日,https://arxiv.org/abs/1801.03680。
⁴ 自 Wikimedia Commons 的一幅图像改编。
⁵ A.V. Bhide,《古代印度文本中的强迫赌博》,印度精神病学杂志 49, no. 4(2007):294–95。
⁶ Ole Peters 和 Murray Gell-Mann,《使用动力学评估赌注》,arXiv.org,2015 年 6 月 5 日,https://arxiv.org/abs/1405.0585。
⁷ Edward O. Thorp,《一个适合所有市场的人:从拉斯维加斯到华尔街,我如何击败庄家和市场》(纽约:随机之家,2017)。
⁸ William Poundstone,《财富的公式:科学赌博系统打败赌场和华尔街的未被讲述的故事》(纽约:希尔和旺,2006)。
⁹ Bruce Bower,《简单的异端:经验法则挑战复杂的金融分析》,科学新闻 179, no. 12(2011):26–29。
¹⁰ Victor DeMiguel, Lorenzo Garlappi, 和 Raman Uppal,《最优与天真的多样化:1/N 投资组合策略有多低效?》,金融研究评论 22, no. 5(2009):1915–53。
¹¹ 自 Wikimedia Commons 的一幅图像改编。
¹² J.L. Kelly Jr.,《信息速率的新解释》,贝尔系统技术期刊 35, no. 4(1956):917–26。
¹³ L.C. MacLean, E.O. Thorp, 和 W.T. Ziemba,《凯利准则的长期资本增长:准则的优缺点》,量化金融 10, no. 7(2010):681–687。
¹⁴ L.C. MacLean, E.O. Thorp, Yonggan Zhao, 和 W.T. Ziemba,《完全凯利和分数凯利投资策略的中期模拟》,在凯利资本增长投资准则:理论与实践中,eds. L.C. MacLean, E.O. Thorp, 和 W.T. Ziemba(Hackensack, NJ: World Scientific Publishing Company, 2011),543–61。
¹⁵ 凯利资本增长投资准则:理论与实践,eds. L.C. MacLean, E.O. Thorp, 和 W.T. Ziemba(Hackensack, NJ: World Scientific Publishing Company, 2011)。