金融中的深度学习-一-

208 阅读40分钟

金融中的深度学习(一)

原文:annas-archive.org/md5/1d10c05a97f5e0702eda83b77eec256b

译者:飞龙

协议:CC BY-NC-SA 4.0

前言

学习永不使人心智衰竭。

列奥纳多·达·芬奇

机器学习和深度学习近年来彻底改变了金融行业。不同的学习模型非常适合数据丰富且持续增长的世界。数据是新的黄金,其价值随着适当的分析导致关键业务决策而不断上升,这些决策是经济变革的驱动力。

量化基金的崛起证明了数据科学在交易世界中有很多可供提供的内容。在基本和技术交易员之后,新一代宇宙领袖正在崛起。这些是依靠具有极其复杂操作的基于机器的算法的量化交易员,旨在预测和超越市场。

本书详细介绍了金融深度学习主题。

为什么选择这本书?

我的职业生涯专注于研究交易策略、技术和与金融世界相关的所有事物。多年来,我熟悉了几种可能增加交易框架价值的算法模型。在本书中,我讨论了不同的学习模型及其在交易世界中的应用,重点介绍了深度学习和神经网络。我的主要目标是以使每个人都能理解其功能的方式来涵盖它们。

凭借客观性,机器可以在许多方面执行和检测操作,比人类做得更好。这意味着您将学习如何使用 Python 创建所需的算法来执行这些操作之一。

如前所述,我的目标是全面介绍深度学习在金融中的应用。我通过讨论广泛的主题来实现这一目标,包括数据科学、交易、机器和深度学习模型,以及交易中的强化学习应用。

本书从概述数据科学在金融界中的角色开始。然后深入探讨了统计学、数学和 Python 等知识要求,然后专注于如何在交易策略中使用机器和深度学习。

适合读者

本书适合广泛的读者群体,包括金融界的专业人士和学术界人士、数据科学家、量化交易员以及任何级别的金融学生。它为想要理解和应用这些强大技术的任何人提供了全面的介绍。

本书假设您具备 Python 编程(专业 Python 用户会发现代码非常简单)和金融交易方面的基本背景知识。我采用清晰简单的方法,重点关注关键概念,以便您理解每个想法的目的。

本书中使用的约定

本书中使用以下排版约定:

斜体

指示新术语、网址、电子邮件地址、文件名和文件扩展名。

Constant width

用于程序清单,以及在段落内引用程序元素,如变量或函数名称、数据库、数据类型、环境变量、语句和关键字。

Constant width bold

显示用户应该按字面输入的命令或其他文本。

Constant width italic

显示应由用户提供值或由上下文确定值替换的文本。

提示

此元素表示提示或建议。

注意

此元素表示一般提示。

警告

此元素表示警告或注意事项。

使用代码示例

可以在https://github.com/sofienkaabar/deep-learning-for-finance下载补充材料(代码示例、练习等)。

如果您有技术问题或使用代码示例时遇到问题,请发送电子邮件至bookquestions@oreilly.com

本书旨在帮助您完成工作。通常情况下,如果本书提供示例代码,您可以在自己的程序和文档中使用它。除非您复制了代码的大部分,否则不需要联系我们请求许可。例如,编写一个使用本书多个代码片段的程序不需要许可。出售或分发来自 O’Reilly 书籍的示例需要许可。引用本书并引用示例代码回答问题不需要许可。将本书的大量示例代码合并到产品文档中需要许可。

我们感谢您的使用,但通常不需要署名,署名通常包括标题、作者、出版商和 ISBN。例如:“深度学习在金融领域 by Sofien Kaabar (O’Reilly)。版权所有 2024 Sofien Kaabar,978-1-098-14839-3。”

如果您觉得您对代码示例的使用超出了合理使用范围或上述许可,请随时通过permissions@oreilly.com与我们联系。

O’Reilly Online Learning

注意

40 多年来,O’Reilly Media已经提供技术和商业培训、知识和洞察,以帮助公司取得成功。

我们独特的专家和创新者网络通过书籍、文章和我们的在线学习平台分享他们的知识和专长。O’Reilly 的在线学习平台为您提供按需访问实时培训课程、深入学习路径、交互式编码环境以及来自 O’Reilly 和 200 多家其他出版商的大量文本和视频内容。更多信息,请访问https://oreilly.com

如何联系我们

请将有关本书的评论和问题发送给出版商:

我们为这本书创建了一个网页,其中列出了勘误、示例以及任何额外信息。您可以访问此页面,网址为https://oreil.ly/deep-learning-for-finance

获取关于我们的书籍和课程的新闻和信息,请访问https://oreilly.com

在 LinkedIn 上找到我们:https://linkedin.com/company/oreilly-media

在 Twitter 上关注我们:https://twitter.com/oreillymedia

在 YouTube 上观看我们:https://youtube.com/oreillymedia

致谢

没有父母的支持,一切都不会一样,这也是我必须承认他们对这本书直接和间接的影响的原因。

我还要感谢编辑 Michelle Smith 和 Corbin Collins,以及制作编辑 Elizabeth Faerm,感谢他们的持续支持、出色的工作以及耐心。同样,我要感谢所有参与这本书制作的 O’Reilly 的每一个人。

此外,我特别感谢那些出色的技术审阅者,他们对本书的巨大贡献产生了深远影响。他们在使这本书易读、有用和直接方面做出了重要贡献。我再也找不到比他们更合适的审阅人选了。

最后,我深深感谢您,读者,花时间阅读我的作品并信任我的研究。希望您能觉得它有用。

第一章:介绍数据科学和交易

开始学习复杂主题的最佳方式是将其分解为较小的部分并先理解这些部分。要理解面向金融的深度学习,需要了解数据科学和金融市场。

本章奠定了彻底理解数据科学及其用途所需的基础,以及理解金融市场以及如何利用数据科学从事交易和预测的基础。

在本章结束时,您应该知道数据科学是什么,它的应用是什么,以及您如何在金融中利用它来提取价值。

理解数据

要理解数据科学领域,首先要了解数据的类型和结构。毕竟,这个广阔领域的名称中的第一个词就是数据。那么,数据是什么?更重要的是,您能用它做什么?

数据 在其最简单和最纯粹的形式中是各种类型(数值、文本、布尔值等)的原始信息集合。

收集数据的最终目的是决策制定。这是一个复杂的过程,涵盖从收集和处理数据到解释数据并利用结果做出决策的各个环节。

让我们举个使用数据做决策的例子。假设您的投资组合由五种不同的等权重股息支付股票组成,详见表 1-1。

表 1-1. 股票及其股息收益率

股票股息收益率
A5.20%
B3.99%
C4.12%
D6.94%
E5.55%

股息 是从公司利润中支付给股东的款项。股息收益率 是分配给股东的货币单位金额与公司当前股价的比率。

分析这些数据可以帮助您了解从投资组合中获得的平均股息收益率。平均值基本上是总和除以数量,它快速展示了投资组合的整体股息收益率情况:

Average dividend yield = 5.20%+3.99%+4.12%+6.94%+5.55% 5 = 5 . 16 %

因此,您的投资组合的平均股息收益率为 5.16%。这些信息可以帮助您将平均股息收益率与其他投资组合进行比较,以便您知道是否需要进行任何调整。

您可以计算的另一个指标是投资组合中持有的股票数量。这可能是构建分散化墙壁的第一个信息砖块。尽管这两个信息(平均股息收益率和投资组合中的股票数量)非常简单,但复杂的数据分析始于简单的指标,有时可能不需要复杂的模型来正确解释情况。

您在前面示例中计算的两个指标称为平均(或均值)和计数(或元素数量)。它们是所谓的描述统计的一部分,详见第三章,描述统计也是数据科学的一部分。

让我们再来看一个数据分析的例子,用于推断性的目的。假设你已经计算了两种商品之间的年度相关性测量,并且想预测下一个年度相关性是正还是负。表格 1-2 中有详细的计算信息。

表格 1-2. 年度相关性测量

年份相关性
2015正相关
2016正相关
2017正相关
2018负相关
2019正相关
2020正相关
2021正相关
2022正相关
2023正相关
注释

相关性 是两个时间序列之间线性依赖关系的度量。正相关 通常意味着两个时间序列平均而言朝着相同方向移动,而负相关 则通常意味着两个时间序列平均而言朝着相反方向移动。相关性在第三章中有讨论。

根据表格 1-2,这两种商品之间的历史相关性大多数情况下(即 88%)是正相关的。根据历史观察,可以说下一个相关性测量的概率为 88%为正相关。这也意味着下一个相关性测量为负的概率为 12%:

E ( Positive correlation ) = 8 9 = 88 . 88 %

这是另一个基本的例子,展示如何使用数据从观察中推断并做出决策。当然,在这里的假设是历史结果会完全反映未来结果,在现实生活中这是不太可能的,但有时候,预测未来唯一的依据就是过去的经验。

在讨论数据科学之前,让我们回顾一下可以使用的数据类型,并将其分成不同的组:

数值数据

这种数据由反映某种类型信息的数字组成,这些信息可以在规律或不规律的间隔时间内收集。例如市场数据(OHLC,¹ 成交量,价差等)和财务报表数据(资产,收入,成本等)。

分类数据

分类数据是可以用名称或标签将其组织成组或类别的数据。它是定性而非定量的。例如,患者的血型就是一种分类数据。另一个例子是从人群中取样的眼睛颜色。

文本数据

文本数据近年来随着自然语言处理(NLP)的发展而日益增长。机器学习模型利用文本数据进行翻译、解释和分析文本的情感。

视觉数据

图像和视频也被视为数据,你可以处理并转化它们成有价值的信息。例如,卷积神经网络(CNN)是一种算法(见第八章),它可以通过标签识别和分类照片(例如,将猫照片标记为猫)。

音频数据

音频数据非常有价值,可以帮助节省转录时间。例如,可以使用音频算法创建字幕并自动创建字幕。还可以创建模型,通过音频的语调和音量来解释说话者的情感。

数据科学是一个跨学科领域,试图使用不同的技术和模型从数据中提取智能和结论,无论这些技术和模型是简单还是复杂的。数据科学过程除了仅仅分析数据外还包括许多步骤。以下是这些步骤的总结:

  1. 数据收集:这个过程涉及从可靠和准确的来源获取数据。计算机科学中广为人知的一句话通常认为是乔治·菲切尔的功劳:“垃圾进,垃圾出”,它指的是需要有质量可靠的数据,才能进行适当的分析。基本上,如果你有不准确或有缺陷的数据,那么所有的过程都将是无效的。

  2. 数据预处理:偶尔,您获取的数据可能处于原始形式,需要进行预处理和清理,以便数据科学模型能够使用它。例如,删除不必要的数据,添加缺失值,或消除无效和重复的数据可能是预处理步骤的一部分。其他更复杂的例子可能包括数据的归一化去噪。这一步的目的是使数据准备好进行分析。

  3. 数据探索:在这一步骤中,进行基本的统计研究以发现数据中的趋势和其他特征。数据探索的一个例子是计算数据的平均值。

  4. 数据可视化:这是上一步骤的一个重要补充。它包括创建直方图和热图等可视化图表,以帮助识别模式和趋势,并促进解释。

  5. 数据分析:这是数据科学过程的主要焦点。这是你使用不同的学习模型对数据进行拟合(训练),以便根据给定的参数来解释和预测未来的结果。

  6. 数据解释:这一步涉及理解数据科学模型呈现的反馈和结论。优化也可能是这一步的一部分;在这些情况下,我们会回到第五步,使用更新的参数再次运行模型,然后重新解释和评估性能。

让我们以 Python 中的一个简单例子来应用数据科学过程的步骤。假设你想分析和预测 VIX(波动率指数),这是一个代表标准普尔 500 股票市场指数的隐含波动率的波动率时间序列指标。VIX 自 1993 年以来就已经存在,并由芝加哥期权交易所(CBOE)发布。

注意

数据科学过程中还有一个隐藏的步骤,我称之为零步骤,它发生在你形成一个想法的时候,这个想法指导了应该启动哪个过程。毕竟,如果没有首先有动机,你不会应用这个过程。例如,相信通货膨胀数据可能推动某些大宗商品的回报是一个想法和启动探索数据以证明这一假设的动机。

由于它旨在衡量股市中的恐惧或不确定性水平,VIX 经常被称为恐慌指数。它是通过对标准普尔 500 指数期权定价计算的百分比得出的。较高的 VIX 值与更大的市场动荡和不确定性相关,而较低的值则与更大的稳定性相关。

第一步是数据收集,在这种情况下可以使用 Python 自动化。以下代码块连接到圣路易斯联邦储备银行的网站,并下载了 1990 年 1 月 1 日至 2023 年 1 月 23 日期间的 VIX 历史数据(第六章专门介绍了 Python 和编写代码;目前,你无需理解代码,因为这不是目标):

# Importing the required library
import pandas_datareader as pdr
# Setting the beginning and end of the historical data
start_date = '1990-01-01'
end_date   = '2023-01-23'
# Creating a dataframe and downloading the VIX data
vix = pdr.DataReader('VIXCLS', 'fred', start_date, end_date)
# Printing the latest five observations of the dataframe
print(vix.tail())

代码使用pandas库导入DataReader函数,该函数从各种来源在线获取历史数据。DataReader函数以数据名称作为第一个参数,其次是来源和日期。print(vix.tail())的输出显示在表 1-3 中。

表 1-3. print(vix.tail())的输出

日期VIXCLS
2023-01-1719.36
2023-01-0120.34
2023-01-1920.52
2023-01-2019.85
2023-01-2319.81

我们继续进行第二步:数据预处理。我将这部分分为检查无效数据和转换数据,以便准备使用。处理时间序列数据时,特别是下载的时间序列数据,有时可能会遇到nan值。NaN 代表不是数字nan值由于缺失、无效或损坏的数据而出现。

你可以用多种方式处理nan值。为了本例子,让我们使用最简单的方法处理这些无效值,即消除它们。但首先,让我们编写一些简单的代码,输出数据框中nan值的数量,以便你了解要删除多少个值:

# Calculating the number of nan values
count_nan = vix['VIXCLS'].isnull().sum()
# Printing the result
print('Number of nan values in the VIX dataframe: ' + str(count_nan))

代码使用isnull()函数并对其进行求和,得出nan值的数量。前一段代码片段的输出如下所示:

Number of nan values in the VIX dataframe: 292

现在你已经知道要删除多少行了,可以使用以下代码删除无效的行:

# Dropping the nan values from the rows
vix = vix.dropna()

第二部分第二步是转换数据。数据科学模型通常需要稳定数据,即具有稳定统计属性(如均值)的数据。

注意

稳定性 的概念以及所需的统计指标在第三章中有详细讨论。目前,您只需要知道的是,在使用数据科学模型时,您可能需要将原始数据转换为稳定数据。

要将 VIX 数据转换为平稳数据,您可以简单地从一个值相对于前一个值的差异中取得。以下代码片段将 VIX 数据框转换为理论上暗示的平稳数据:²

# Taking the differences in an attempt to make the data stationary
vix = vix.diff(periods = 1, axis = 0)
# Dropping the first value of the dataframe
vix = vix.iloc[1: , :]

第三步是数据探索,它完全是关于理解您面前的数据,从统计学角度来说。由于您将在第三章中详细了解统计指标,因此我将限制讨论仅计算数据集的平均值。

平均值 简单地是可以代表数据集中其他值的值,如果它们要选出一位领袖。它是数值总和除以其数量。平均值是描述性统计学中最简单的统计量,也是最常用的统计量。以下公式显示了一组值的平均值的数学表示:

x ¯ = 1 n ∑ i=1 i x i

您可以轻松地计算数据集的平均值如下:

# Calculating the mean of the dataset
mean = vix["VIXCLS"].mean()
# Printing the result
print('The mean of the dataset = ' + str(mean))

前面代码片段的输出如下所示:

The mean of the dataset = 0.0003

下一步是数据可视化,这在很大程度上被认为是有趣的步骤。让我们绘制 VIX 随时间变化的差异值。以下代码片段绘制了图 1-1 中显示的 VIX 数据:

# Importing the required library
import matplotlib.pyplot as plt
# Plotting the latest 250 observations in black with a label
plt.plot(vix[–250:], color = 'black', linewidth = 1.5, 
         label = 'Change in VIX')
# Plotting a red dashed horizontal line that is equal to mean
plt.axhline(y = mean, color = 'red', linestyle = 'dashed')
# Calling a grid to facilitate the visual component
plt.grid()
# Calling the legend function so it appears with the chart
plt.legend()
# Calling the plot
plt.show()

图 1-1. 自 2022 年初以来 VIX 的变化

步骤 5 和 6,数据分析和数据解释,是本书中您将深入学习的内容,因此现在让我们跳过它们,专注于数据科学的入门部分。

在继续之前,让我们回顾一下无效或缺失数据的问题。有时数据是不完整的,存在缺失单元格。尽管这可能会影响算法的预测能力,但不应该阻止您继续分析,因为有快速的修复方法可以帮助减少空单元格的负面影响。例如,考虑表 1-4。

表 1-4. 季度 GDP

季度GDP
2020 年第一季度0.9%
2020 年第二季度1.2%
2020 年第三季度0.5%
2020 年第四季度0.4%
2021 年第一季度#N/A
2021 年第二季度1.0%
2021 年第三季度1.1%
2021 年第四季度0.6%

表中包含一个虚构国家的季度国内生产总值(GDP)³。请注意表格缺少 2021 年第一季度的数值。解决此问题有三种基本方法:

删除包含缺失值的单元格。

这是 VIX 示例中使用的技术。它简单地认为时间戳不存在。这是最简单的修复方法。

假设缺失单元格等于前一个单元格。

这也是一个简单的修正方法,其目的是平滑数据,而不是完全忽略问题。

计算空值周围单元格的平均值或中位数。

此技术将平滑处理推进一步,并假设缺失值等于前后数值的平均值。此外,它可以是几个过去观察的平均值。

数据科学涵盖一系列数学和统计概念,并需要对机器学习算法有深入理解。本书详细讨论了这些概念,但也以易于理解的方式来使技术和非技术读者受益。许多模型被假定为神秘盒子,这其中有一些真实性,但数据科学家的工作是在解释结果之前理解这些模型,这有助于理解模型的局限性。

本书使用 Python 作为主要编程语言来创建算法。正如提到的,第六章介绍了 Python 及其用于操作和分析数据所需的知识,但也为创建不同模型提供了基础,如您所见,这些模型比您想象的简单得多。

在进入下一节之前,让我们先看看数据存储的概念。毕竟,数据很有价值,但您需要将其存储在可以轻松获取和分析的地方。

数据存储 是指用于将数据存储和组织以供未来分析的技术和领域。数据以多种格式存储,如 CSV 和 XLSX。其他类型的格式可能包括 XML、JSON,甚至 JPEG 用于图像。选择格式取决于数据的结构和组织。

数据可以存储在云端或本地,具体取决于您的存储能力和成本。例如,您可能希望将您的历史性一分钟苹果股票数据存储在云端,而不是在 CSV 文件中,以节省本地计算机的空间。

在 Python 中处理时间序列时,您主要会处理两种数据存储类型:数组和数据帧。让我们来看看它们是什么:

数组

数组 用于存储相同类型的元素。通常,同类数据集(如数字)最适合存储在数组中。

数据帧

数据帧 是一个二维结构,可以容纳各种类型的数据。它可以与具有列和行的表格进行比较。

一般情况下,当需要高效存储同类数据集合时应使用数组。当处理异类数据或需要以表格方式编辑和分析数据时,应使用数据帧。

注意

数据科学在不断发展。新的存储方法正在不断开发,旨在提高效率并增加容量和速度。

理解数据科学

数据科学在技术和进步中发挥着重要作用。算法依赖于从数据科学工具提供的信息来执行其任务。但算法是什么?

算法是一组有序的程序,旨在完成特定活动或解决特定问题。算法可以简单到一个硬币翻转,也可以复杂到 Risch 算法。⁴

让我们来看一个非常简单的算法,它会更新一个图表平台所需的金融数据。该算法将按照以下步骤执行:

  1. 连接服务器和在线数据提供商。

  2. 复制带有最新时间戳的金融数据。

  3. 将数据粘贴到图表平台。

  4. 返回步骤 1 并重新执行整个过程。

这就是算法的本质:执行一组有限或无限目标的特定指令。

注意

在前一节讨论的六个数据科学步骤也可以被视为一种算法。

交易策略也是算法,因为它们具有明确的进出场规则。市场套利是一个交易策略的例子。

套利是一种旨在从不同交易所上同一资产的价格差异中获利的交易策略。这些价格差异是由套利者通过他们的买卖活动消除的异常情况。考虑一个股票在不同国家的交易所 A 和 B 上交易(为了简单起见,这两个国家使用相同的货币)。自然地,该股票在两个交易所上的价格必须相同。当这种条件不成立时,套利者们就会出来捕猎。

他们在便宜的交易所购买股票,然后立即在更昂贵的交易所出售,从而确保几乎无风险的利润。这些操作以闪电般的速度执行,因为价格差异由于套利者的强大和速度而不会长时间存在。为了澄清,这里有一个例子:

  • 交易所 A 的股票价格 = $10.00。

  • 交易所 B 的股票价格 = $10.50。

在这种情况下,套利者的算法将执行以下操作:

  1. 在交易所 A 以$10.00 购买股票。

  2. 立即在交易所 B 以$10.50 出售股票。

  3. 收取差额($0.50),并重复直到差距被消除。

注意

交易和执行算法可以非常复杂,并且需要专业知识和某种市场优势。

在这一点上,你应该意识到数据科学的两个主要用途,即数据解释和数据预测:

数据解释

也通常被称为商业智能或简称数据智能。部署算法的目的是理解数据的何时和如何。

数据预测

也常称为预测分析或简称预测。部署算法的目的是理解数据的接下来会发生什么。

在金融市场中使用学习算法的主要目的是预测未来资产价格,以便做出基于信息的交易决策,以高于随机的成功率实现资本增值。我在本书中讨论了许多简单和复杂的学习算法。这些学习算法或模型可以按以下方式分类:

监督学习

监督学习算法是需要带标签数据的模型。这意味着你必须提供数据,让模型在这些过去值上进行训练,并理解隐藏的模式,以便在遇到新数据时能够提供未来的输出。监督学习的例子包括线性回归算法和随机森林模型。

无监督学习

无监督学习算法是不需要带标签数据的模型。这意味着它们可以使用无标签数据完成工作,因为它们设计用于自行发现隐藏的模式。示例包括聚类算法和主成分分析(PCA)。

强化学习

强化学习算法是一种完全不需要数据的模型,因为它们可以发现并自主学习环境。与监督学习和无监督学习模型相比,强化学习模型通过从环境获得的奖励系统反馈来获取知识。通常情况下,这应用于代理与环境互动并学习最大化随时间奖励的行为的情况,因此可能不是时间序列回归的首选算法。另一方面,它可用于开发可应用于时间序列数据以生成预测的策略。

正如您可能已经注意到的那样,本书的标题是金融深度学习。这意味着除了涵盖其他学习模型外,本书将花费相当大的篇幅讨论用于时间序列预测的深度学习模型。深度学习主要围绕神经网络的使用展开,这是一种在第八章中深入讨论的算法。

深层监督学习模型(例如深度神经网络)能够学习数据的分层表示,因为它们包含许多层,每一层在不同抽象级别上提取特征。因此,深度模型可以学习隐藏且复杂的模式,而这些模式可能对浅层(非深度)模型来说很难学习。

另一方面,浅层监督学习模型(如线性回归)对于学习复杂的非线性关系能力有限。但它们需要较少的计算工作,因此速度更快。

当今数据科学算法几乎无处不在,不仅限于金融领域。一些应用包括以下几个方面:

  • 业务分析:使用数据分析优化定价、预测客户流失或改进营销活动

  • 医疗保健:通过深入分析患者数据,改善患者结果、寻找创新疗法或降低医疗成本

  • 体育:分析体育数据以提升团队表现、球员选拔或投注

  • 研究:分析数据以支持科学研究、证明理论或获得新知识

当有人谈论数据科学应用时,了解数据科学家的工作非常有帮助。数据科学家必须评估和理解复杂数据,以获取见解并为决策提供指导。这通常包括开发统计模型、应用机器学习技术和数据可视化。他们支持数据驱动解决方案的实施,并向利益相关者通报他们的结果。

注意

数据科学家与数据工程师有所不同。数据科学家关注数据的解释和分析,而数据工程师则关注收集、存储和分析数据所需的工具和基础设施。

到现在为止,你应该理解了开始数据科学所需的一切。让我们介绍本书的第二个主要主题:金融市场。

金融市场和交易简介

本书的目标是以实际操作的方式介绍不同学习模型的应用,以预测金融时间序列数据。因此,理解交易和金融市场运作的坚实知识至关重要。

金融市场是人们可以交易股票、债券和货币等金融工具的地方。买卖行为称为 交易。购买金融工具的主要但不是唯一目的是资本增值。买方相信工具的价值大于其价格;因此,买方购买股票(多头)并在认为当前价格等于当前价值时出售。相反,交易员如果认为工具价格会下降,也可以赚钱。这个过程被称为 卖空,在期货和外汇(FX)等某些市场上很常见。

卖空的过程涉及从第三方借入金融工具,在市场上卖出,并在回归给第三方之前买回。理想情况下,当你预计工具价格下跌时,你会以较低的成本(价格下降后)买回它,并以市场价格归还给第三方,从而赚取差价。以下示例进一步解释了这些概念:

多头(买入)头寸示例

一位交易员预期微软股票价格未来几年会因技术法规改进而上涨,从而增加收益。他们以每股 250 美元的价格买入一定数量的股票,并计划在 500 美元时卖出。因此,交易员在微软股票上持有多头(也称为 看涨)。

空头(卖出)头寸示例

一名交易员预计洛克希德·马丁股票价格将在接下来的几天内下跌,因为技术策略发出了信号。他们以 450 美元的价格卖空了一些股票,并打算在 410 美元的价格买回来。因此,这名交易员在洛克希德·马丁股票上持有空头(也称为看空)。

注意

上涨的市场称为牛市。源自词语bull和公牛的攻击性本质,看涨与乐观、狂喜和贪婪有关。

下跌的市场称为熊市。源自词语bear及其防御性本质,看跌与悲观、恐慌和恐惧有关。

金融工具可以以其原始形式(现货)或衍生形式存在。衍生品是交易员用来以特定方式交易市场的产品。例如,远期期货合约是一种衍生合约,其中买方锁定资产的价格以便在以后的某个时间购买。

另一种衍生品是期权。期权是在未来以支付保费(期权价格)的方式购买特定资产的权利,而非义务。当买方希望购买基础股票时,他们行使他们的期权;否则,他们可能让期权到期。

交易活动也可能出现为了对冲目的,而不仅仅是投机。其中一个例子是法国航空公司(法国主要航空公司)通过购买石油期货对冲其业务运营。购买石油期货可以保护法国航空公司免受可能损害其主要运营(航空业务)的上涨油价。从使用燃料驱动飞机导致的成本上涨中获得的收益可以抵消期货的成本。这使得航空公司可以专注于其主要业务。这整个过程被称为对冲

另一个例子是,假设一家航空公司预计在接下来的六个月内将消耗一定量的燃料,但对该期间油价的潜在增长感到担忧。为了防范这种价格风险,航空公司可以进入期货合约,以在未来某个日期以固定价格购买石油。

如果在那段时间内石油价格上涨,航空公司仍然可以以较低的固定价格购买石油,这是在期货合约中约定的。如果石油价格下跌,航空公司将有义务支付较高的固定价格,但较低的市场价格可以抵消这一成本。

通过这种方式,航空公司可以减少石油市场价格波动的风险,并稳定其燃料成本。这可以帮助航空公司更好地管理其预算并预测未来的收入。正如您所看到的,其目的不是通过交易操作获得财务收益,而是通过锁定已知的石油价格来稳定其成本。

典型地,根据它们的类型,金融工具被分组为资产类别:

股票市场

股票市场是公司发行股票以筹集业务资金的交易场所(无论是电子的还是实体的)。当人们购买一家公司的股票时,他们成为该公司的部分所有者,并根据公司的政策可能有资格获得股息。根据股票的种类,他们还可能获得在董事会会议上投票的权利。

固定收益

政府和企业可以在固定收益市场借钱。当一个人购买债券时,实际上是向借款人出借资金,借款人同意偿还贷款及利息。根据借款人的信用状况和当前利率,债券的价值可能会上升或下降。

货币

外汇市场,也被称为货币市场,是人们可以购买和出售各种货币的地方。一个国家的货币价值可以根据多种因素的变化而上升或下降,包括经济状况、利率和国家的政治稳定性。

大宗商品

农产品、黄金、石油等具有工业或其他用途的实物资产被称为大宗商品。它们通常是从全球经济趋势中获取利润的手段,同时也是对抗通胀的一种形式。

替代投资

在金融世界中,像房地产、私募股权基金和对冲基金这样的非传统投资被称为替代资产类别。这些资产类别有可能提供比传统资产更高的回报,并且提供多样化的好处,但它们通常流动性较差,评估可能更为困难。

至关重要的是,每种资产类别都有独特的特性和不同的风险水平,因此投资者在投资任何这些资产之前都应该做好功课。

金融市场允许企业和政府筹集运营所需的资金。它们还允许投资者通过投机和投资于有趣的机会赚取利润。交易活动为市场提供流动性。市场越流动,交易就越容易、成本也越低。但市场到底是如何运作的?是什么导致价格的波动呢?

市场微观结构是研究金融市场证券交易的学科。它探讨交易的运作方式以及交易者、投资者和市场做市商的行为。市场微观结构研究的目标是理解价格形成以及影响交易成本的变量。

订单流、流动性、市场效率和价格发现只是市场微观结构研究涵盖的众多主题之一。此外,这项研究还探讨了包括限价单、市价单和算法交易在内的各种交易技术如何影响市场动态。流动性可能是市场微观结构中最重要的概念之一。它描述了一种资产可以在不显著改变其价格的情况下买入或卖出的容易程度。流动性可能会因不同的金融工具和时间而异。它可能会受到多种变量的影响,包括交易量和波动性。

最后,我想讨论市场微观结构的另一个重要领域:价格发现。这指的是在市场中设置价格的方法。价格可以受到订单流、市场做市商活动和各种交易方法的影响。

想象一下,你想买入两只股票的大量股票:股票 A 和股票 B。股票 A 非常流动,而股票 B 非常不流动。如果你想在股票 A 上执行买单,你可能会以所需的市场价格获得成交,几乎没有影响。然而,对于股票 B,你可能会得到更差的价格,因为没有足够的卖家愿意以你期望的买入价格出售。因此,随着你的订单需求增加,价格上涨以匹配卖家的价格,因此,你将以更高(更差)的价格买入。这就是流动性对你的交易可能产生的影响。

数据科学在金融中的应用

让我们开始窥探金融数据科学的主要领域。每个领域都有其需要简单和复杂解决方案的挑战和问题。金融也不例外。近年来,数据科学在改善金融世界(从企业世界到市场世界)的应用大幅增加。让我们讨论其中一些领域:

预测市场走向

在金融时间序列上使用数据科学的目的是发现历史市场数据中的模式、趋势和关系,以便预测未来市场走势。

金融欺诈检测

可以使用数据科学模型检查金融交易中的模式和异常,试图发现可能的欺诈行为。利用数据科学阻止金融欺诈的一种方法是检查信用卡交易数据,寻找不寻常或可疑的支出模式,例如短时间内进行大量小额购买或从同一商店频繁或大额购买。

风险管理

数据科学可以用来分析金融数据,发现投资组合的潜在风险。这可能涉及使用统计建模、机器学习和人工智能等方法分析大量历史数据,以发现可用于预测风险因素的模式和趋势。

信用评分

数据科学可以用于检查金融数据和信用历史,预测个人或公司的信用价值,并做出贷款决策。利用财务数据,如收入和信用历史,来预测一个人的信用价值是应用数据科学进行信用评分研究的一个例子。这可能涉及使用统计建模和机器学习等技术来开发一个预测模型,该模型可以使用许多指标,如先前的信用表现、收入和工作历史,来评估一个人偿还贷款的可能性。

自然语言处理

为了做出更好的判断,NLP 分析和从非结构化的金融数据中提取见解,如新闻文章、报告和社交媒体帖子。NLP 利用文本的情感提取可能来自市场参与者和专家意图和感受的交易机会。NLP 属于情感分析领域(借助机器学习的帮助)。

总结

数据科学领域每天都在不断增长,不断推出新技术和模型来改善数据解释。本章提供了关于数据科学的简单介绍以及你在金融领域如何使用它所需知道的内容。

接下来的三章介绍了统计学、概率论和数学方面的知识,这些知识在尝试理解数据科学模型时可能会用到。尽管本书的目的是以实践方式介绍使用 Python 创建和应用不同模型,但了解你正在处理的内容而不是盲目地将其应用于数据是有帮助的。

如果你需要 Python 复习,请参阅第六章,这是一个基础介绍。它为接下来的内容打下了基础。你不需要成为 Python 专家,但你必须理解代码及其所指的内容,特别是如何调试和检测代码中的错误。

¹ OHLC 指的是市场数据的四个基本部分:开盘价、最高价、最低价和收盘价。

² 我说“暗示”是因为平稳性必须通过你将在第三章中看到的统计检验来验证。目前,假设是对数据进行差分可以得到平稳的时间序列。

³ GDP 的测量在第十二章中有更详细的讨论。

⁴ Risch 算法是一种用于寻找反导数的不定积分技术,你将在第四章中看到这个概念。

第二章:深度学习的基本概率方法

技术的兴起和普及使得每个人都能够运用机器学习和深度学习算法进行数据分析和优化。但不幸的是,许多用户并不了解不同学习模型的基础知识。这让机器学习对他们来说成了一个谜盒,这是一场灾难的前兆。

理解概率、统计和数学的基本概念对于理解和掌握数据以及创建旨在解释和预测数据的模型至关重要。本章介绍了直接或间接与算法相关的概率基础知识。请注意,你不太可能在日常生活中使用这些概率概念,但了解一些算法假设的来源是很重要的。

概率入门

概率 是描述随机变量和随机事件的工具。世界充满了随机性,通过概率方法试图解释混沌是找到我们的方向的最佳方式。诚然,“解释混沌”这个短语可能是个矛盾之词,因为混沌实际上不能被解释,但我们人类不能放弃对不确定事件的控制。这就是为什么我们开发了工具来理解我们充满未知事件的世界。

当你试图为金融交易开发机器学习算法时,你可能会想知道理解概率基础的用处是什么。这是一个合理的问题,你必须知道,一个学科的基础不一定与最终技能相似。

例如,要成为一名飞行员,你必须学习充满技术概念的空气动力学,这与最终的技能并不相似。这与本章节的做法类似;通过学习概率基本原理,你让你的大脑为即将到来的挑战做好了充分的准备。

知道你正在学习的东西的实用性应该会给你带来动力。以下是一些对于机器学习至关重要的关键概率主题:

概率分布函数

随机变量可能出现各种结果的可能性由概率分布描述。对于许多机器学习技术来说,理解典型概率分布的特征和属性至关重要。概率分布函数还描述了不同类型的时间序列数据,从而有助于选择正确的算法。为了简洁和连贯起见,这个话题在第三章中讨论。

假设检验

假设检验 用于确定基于数据样本的基于人口的断言更可能是正确还是不正确。稳态检验使用假设检验,并在第三章中讨论。

决策树

决策树是一种借鉴概率概念的机器学习算法,这些概念包括条件概率,本章有涉及。关于决策树的更多细节,请参阅第七章。

信息理论

信息理论是对信息如何量化、存储和传输进行复杂研究的学科。它被纳入到许多机器学习技术中,包括决策树。它还用于一种非线性相关性度量,称为最大信息系数,该内容在第三章中讨论。

概率概念简介

概率信息的最基本部分是随机变量,它是一个不确定的数字或结果。随机变量用于模拟被认为是不确定的事件,例如货币对未来回报。

随机变量可以是离散的或连续的。离散随机变量具有有限的值集,而连续随机变量在某个区间内有值。考虑以下例子以澄清问题:

  • 离散随机变量的一个例子是掷骰子的结果。结果受以下集合限制:{1, 2, 3, 4, 5, 6}。

  • 连续随机变量的一个例子是 EURUSD 的每日价格回报(一个欧元兑换成美元的汇率)。

随机变量由概率分布描述,这些分布是给出随机变量每个可能值的概率的函数。通常,直方图用于显示概率。直方图绘制在第三章中讨论。

在任何时刻,某个事件将发生的概率在 0 到 1 之间。这意味着概率被分配给随机变量,其范围在 0 到 1 之间,其中概率为 0 表示不可能发生,概率为 1 表示一定发生。

你也可以以百分比形式考虑这一点,百分比范围从 0%到 100%。这两个数字之间的值是有效的,这意味着你可以有一个 0.5133(51.33%)的概率来发生某个事件。考虑掷一个有六面的骰子,知道这个骰子没有任何操纵,那么获得 3 的概率是多少?

因为骰子有六个面,每个结果的概率相等,这意味着对于任何结果,概率如下找到:

P ( x ) = 1 6 = 0 . 167

使用P(x)指定事件x的概率。这给出了以下问题的答案:

P ( 3 ) = 1 6 = 0 . 167

当掷骰子时,只能有一个结果。它不能同时给出 3 和 4,因为一面必须支配另一面。这是互斥的概念。互斥事件(例如在掷骰子时得到 3 或得到 4)最终总和为 1。

看看以下例子:

P ( 1 ) = 1 6 = 0 . 167

P ( 2 ) = 1 6 = 0 . 167

P ( 3 ) = 1 6 = 0 . 167

P ( 4 ) = 1 6 = 0 . 167

P ( 5 ) = 1 6 = 0 . 167

P ( 6 ) = 1 6 = 0 . 167

所有这些互斥事件的总和为 1,这意味着六面骰子的可能性概率之和如下:

P ( 1 ) + P ( 2 ) + P ( 3 ) + P ( 4 ) + P ( 5 ) + P ( 6 ) = 1

注意

声明随机变量有 0.8 的概率发生与声明相同的变量有 0.2 的概率不发生相同。

概率测量可以是条件的也可以是无条件的。条件概率 是指一个事件发生对另一个事件发生的概率影响。例如,考虑到正面就业数据的情况下主权利率上涨的概率是条件概率的一个例子。事件 A 给定事件 B 的发生由数学符号*P(A|B)*表示。

相反,无条件概率 不依赖于其他事件。以条件概率为例,您可以制定一个无条件概率计算,该计算测量利率上涨的概率,而不考虑其他经济事件。

概率具有特定的加法和乘法规则及其各自的解释。在看一个例子之前,让我们先看一下这些公式。两个事件实现的联合概率 是它们同时发生的概率。它是用以下公式计算的:

P ( A B ) = P ( A | B ) × P ( B )

该公式表明了 A 和 B 同时发生的概率是 A 在给定 B 发生的情况下发生的概率乘以 B 发生的概率。因此,方程的右侧将条件概率乘以无条件概率。

加法规则 用于确定至少会发生其中一个结果的概率。这有两种方式:一种处理互斥事件,另一种处理非互斥事件。

如果事件不是互斥的,那么为了避免重复计数,公式是:

P ( A o r B ) = P ( A ) + P ( B ) - P ( A B )

如果事件是互斥的,那么公式简化为:

P ( A B ) = 0

P ( A o r B ) = P ( A ) + P ( B ) - 0

P ( A o r B ) = P ( A ) + P ( B )

注意在互斥事件中,要么发生 A 要么发生 B,因此它们都发生的概率为零。要理解为什么需要减去 A 和 B 的联合概率,请参见图 2-1。

图 2-1. 概率的加法规则

注意在它们是互斥的情况下,发生 A 或 B 的概率必须不包括它们的联合概率。现在让我们看看独立事件的概念。

独立事件 不互相关联(例如,两次掷骰子)。在这种情况下,联合概率计算如下:

P ( A B ) = P ( A ) × P ( B )

独立事件是指一个事件的发生对其他事件的发生绝对没有影响的情况。让我们通过一个例子来验证这个概念。考虑一个简单的抛硬币游戏。得到正面的概率不取决于你在前一次抛硬币时得到了什么。因此,得到正面的概率始终是 0.50(50%)。进一步说,五次抛硬币后只得到正面的概率是多少?

因为每个事件的概率都独立于前一个或下一个事件,所以公式如下:

P ( x ) = 0 . 50 × 0 . 50 × 0 . 50 × 0 . 50 × 0 . 50 = 0 . 03125 = 3 . 125 %

随机变量的期望值是不同结果的加权平均值。因此,期望值实际上是指均值的另一种方式。从数学上讲,期望值如下:

E ( X ) = ∑ i=1 n ( P ( x i ) x i )

查看表 2-1,并尝试计算某年某月下一个就业人数的预期值。

表 2-1. 就业人数

非农就业人数概率
300,0000.1
400,0000.3
500,0000.5
600,0000.1

非农业就业人数指的是美国劳工部发布的每月报告,提供了除农业部门、政府及非营利组织外的全国有薪雇员总数信息。

从表 2-1 可知,经济学家假设在下一个就业人数中,500,000 人增加的概率为 50%,400,000 人增加的概率为 30%。因此,期望值为:

E ( X ) = ( 300 , 000 × 0 . 1 ) + ( 400 , 000 × 0 . 3 ) + ( 500 , 000 × 0 . 5 ) + ( 600 , 000 × 0 . 1 ) = 460 , 000

因此,代表经济学家共识的数字是 460,000,因为它是最接近大多数预测的加权值。它是代表数据集的值。

注意

本节的主要要点如下:

  • 概率描述随机变量和随机事件。它是一个介于 0 和 1 之间的值。

  • 事件的概率可以被分组以形成更复杂的情景。

  • 预期结果是指指定宇宙中每个概率的加权平均值。

抽样和假设检验

当总体较大时,采取代表性样本,使其成为数据的主要描述者。以美国为例。其民主制度意味着人民有权决定自己的命运,但不可能去找每个人并询问他们对每个话题的详细意见。这就是为什么会举行选举并选举代表来代表人民。

抽样是指在更大的总体内选择数据样本并对总体的统计性质做出结论的行为。有几种不同的抽样方法。其中最知名的是以下几种:

简单随机抽样

使用简单随机抽样,总体中的每个元素具有相等的被选中为样本的机会。这可以在一个标记了的总体上生成随机数,其中每个个体被选择的概率相同。

分层抽样

使用分层抽样,将总体根据某些特征分成组,然后从每组中按其大小比例随机抽取样本。

聚类抽样

使用聚类抽样,将总体分成簇,并选择一组随机样本的随机样本。然后,包括所选簇中的所有元素在内。

系统抽样

使用系统抽样,通过从总体中每隔n个个体选择一个元素来选择一个元素,其中n是固定数字。这意味着它不是随机的,而是事先指定的。

经验法则是,获取更多数据,指标反映出的群体就越好。在机器学习领域,抽样非常重要,因为经常需要对数据进行抽样以代表真实群体。例如,在对交易策略进行回测时,需要将整个数据集分成训练样本测试样本,其中前者是算法理解其结构的样本(也称为样本内集),后者是算法测试其预测能力的样本(也称为样本外集)。

另一个使用抽样的例子是交叉验证。使用这种技术,数据集被分成两个或更多子集。模型使用一个子集进行训练,使用其他子集进行测试其结果。对数据的各种子集,该过程重复多次,然后确定模型的平均表现。

这些术语将在接下来的章节中更深入地讨论。现在,你应该明白在机器学习中,抽样的概念非常重要。

抽样并非完美,可能存在误差,就像任何其他估计方法一样。 抽样误差指的是样本统计量与总体统计量之间的差异(如果已知)。 统计量是描述分析数据集的指标(例如,平均值,在第三章中你将更详细地了解到统计量)。 那么,你应该具备多少最小样本量才能对总体进行推断? 经验法则是至少要有 30 个观测值,越多越好。 这把讨论带到了中心极限定理,它指出从总体抽取的随机样本将在样本量增大时接近正态分布(一种对称和钟形的概率分布)。

中心极限定理使得在正态分布中应用推断和结论变得简单。 在进行假设检验之前,让我们先看看置信区间,这是预期的总体参数的值范围。 置信区间通常是通过从点估计值中加或减一个因子来构建的。 例如,给定样本均值 x̄,可以构建置信区间如下:

x ¯ ± ( reliability factor × standard error )

让我们逐步理解计算过程。 样本均值是对总体的估计,由于无法计算总体均值,因此进行随机抽样的假设是样本均值应等于总体均值。 然而,在现实生活中,情况可能有所不同,这就是为什么应该使用概率方法构建置信区间的原因。

注意

显著水平是置信区间的阈值。 例如,95%的置信区间意味着在 95%的置信水平下,估计值应落在某个范围内。 其余 5%的概率不会这样,这就是显著水平(通常用希腊字母α表示)。

可靠性系数是一个统计量,依赖于估计分布和其落入置信区间的概率。 为了简单起见,我们假设总体的方差是正态分布的,总体也是正态分布的。 对于显著水平为 5%(因此置信区间为 95%),在这种情况下可靠性系数为 1.96(获得这个数字的方法与讨论的内容关系不大)。

标准误差是样本的标准偏差。 标准偏差在第三章中有更深入的讨论;暂时知道它代表了不同数值围绕平均值波动的程度。 标准误差使用以下公式计算:

s = σ n

σ is the population standard deviation

n is the square root of the population number

还值得知道,对于 1%显著水平,可靠因子为 2.575,对于 10%显著水平,可靠因子为 1.645。让我们通过一个实际例子来理解所有这些数学。

考虑一个由 100 种金融工具(债券、货币对、股票、结构化产品等)组成的总体。这些工具的年平均回报率为 1.4%。假设总体标准差为 4.34%,在 1%显著水平(99%置信区间)下,平均值的置信区间是多少?

答案仅通过按照以下公式插入数值来确定:

1 . 4 % ± 2 . 575 × 4.34% 100 = 1 . 4 % ± 1 . 11 %

这意味着置信区间在(0.29%, 2.51%)之间。

注:

如果样本量较小和/或总体标准差未知,则 t-分布可能比正态分布更合适。

t-分布 是一种用于建模样本均值分布的概率分布类型,当样本量较小时和/或总体标准差未知时使用。它在形状上类似于正态分布,但尾部更重,代表与较小样本量相关的不确定性。

下一个阶段是假设检验,这是一种获取数据样本结论的关键概率技术。这部分非常重要,因为在许多统计分析和模型中都会使用。

在统计学中,假设检验 是一种从少量数据样本中得出总体结论的技术。它包括建立两个竞争假设,零假设备择假设,关于总体参数,然后通过样本数据确定哪一个更可能准确。

例如,假设一名金融分析师从风险角度评估两个投资组合。他们制定了两个假设:

  • 零假设指出两个投资组合的波动性没有显著差异。

  • 备择假设指出两个投资组合的波动性存在显著差异。

然后,使用统计分析来检验假设,以确定波动性差异是否具有统计显著性或纯属偶然。

根据零假设和备择假设的定义,使用样本数据计算出一个检验统计量。为了评估结果的显著性,将检验统计量与从标准分布中提取的临界值进行比较。如果检验统计量位于关键区域内,则拒绝零假设并接受备择假设。如果检验统计量不落入关键区域,则不拒绝零假设,并得出无足够证据支持备择假设的结论。

这只是一种花哨的说法,即假设检验基本上涉及创建两个相反的场景,运行概率检查,然后决定哪种场景更有可能是真实的。假设检验可以采用两种形式:

单侧检验

这是测试某些金融工具回报是否大于零的示例。

双侧检验

这是测试某些金融工具回报是否与零不同(意味着它可以大于或小于零)的示例。假设检验通常是双侧检验。

零假设是您想要拒绝的假设,因此被测试,希望被拒绝并接受备择方案。双侧检验采用以下一般形式:

H 0 : x = x 0

H a : x ≠ x 0

由于备择方案允许出现零假设中规定的零值以上和以下的值,因此应该有两个临界值。因此,双侧检验的规则是如果检验统计量大于上临界值或小于下临界值,则拒绝零假设。例如,对于正态分布的数据集,检验统计量与临界值(在 5% 显著水平下)进行比较,分别为 +1.96 和 -1.96。如果检验统计量落在 +1.96 和 -1.96 的范围之外,则拒绝零假设。

假设检验的过程包括计算检验统计量。这是通过将总体参数的点估计与零假设的假设值进行比较来完成的。然后,两者都按照样本的标准误差进行缩放。数学表示如下:

Test statistic = Samplestatistic-Hypothesizedvalue Standarderror

假设检验中的一个重要考虑因素是样本可能不具有代表性,这会导致对总体进行描述的错误。这产生了两种类型的错误:

第一类错误

当拒绝零假设时,即使它是真的,也会发生此错误。

第二类错误

当失败地拒绝零假设时,发生此错误,即使它是错误的。

直观地说,显著水平是发生第一类错误的概率。请记住,如果 α = 5%,那么错误地拒绝真实的零假设的机会为 5%。通过一个例子会更清楚。

考虑一位分析师在 20 年期间对长-短组合的年度回报进行研究。平均年回报率为 1%,标准偏差为 2%。分析师认为平均年回报率不等于零,并希望为此构建一个 95% 置信区间,然后进行假设检验。您可以按以下步骤进行:

  1. 说明变量。样本大小为 20,标准偏差为 2%,均值为 1%。

  2. 计算标准误差,根据公式,在这种情况下为 0.44%。

  3. 确定 95%置信区间的临界值。临界值为+1.96 和-1.96。要找到置信区间,从样本均值中加减误差边界。因此,置信区间为(0.13%,1.86%)。

  4. 指定零假设,根据分析师的观点,是一个双尾检验。零假设是年回报等于零。如果检验统计量小于-1.96 或大于+1.96,则应该拒绝它。

  5. 使用公式找到检验统计量的结果为 2.27。因此,零假设被拒绝。

还有一个重要的度量指标需要讨论,那就是 p 值。p 值是在零假设为真的情况下,看到比统计检验中所见的更极端的检验统计量的概率。将 p 值与显著性水平(通常为 0.05)进行比较,可以帮助你理解它。如果 p 值小于或等于显著性水平,则结果被视为具有统计学意义,拒绝零假设,采纳备择假设。

如果 p 值小于 5%的显著性水平,则意味着如果零假设为真,则会看到与当前值一样极端的检验统计量的概率为 5%。另一种定义 p 值的方法是将其视为可以拒绝零假设的最小显著性水平。

注意

本节的主要观点如下:

  • 采样是指在人口中收集数据,旨在对上述人口的统计特性做出结论。

  • 假设检验是一种从小样本数据中得出关于总体的结论的技术。

信息论初探

信息理论是一个与概率密切相关的抽象数学复杂领域。它研究了信息如何被量化、存储和传输。在事件发生时,有三种发生条件:

不确定性

如果事件尚未发生

惊喜

如果事件刚刚发生

信息

如果事件过去曾发生

信息论中的一个关键概念是,它是消息或信息源中的不确定性或随机性水平,并描述了事件或消息意外程度。相反,信息增益度量了接收新信息时熵(惊喜)的减少程度。

基本上,信息理论描述了事件的惊喜程度。当事件发生的概率较低时,它具有更多的惊喜,因此提供的信息更多。同样,当事件发生的概率较高时,它具有较少的惊喜,因此提供的信息也较少。你应该记住的是,从不太可能发生的事件中学到的信息量大于从可能发生的事件中学到的信息量。

在深入研究信息理论领域之前,了解什么是对数以及什么是指数是非常重要的。一般的指数函数将某个常数或变量提升到某个幂次方:

f ( x ) = a x

换句话说,一个数的指数 是你将它乘以自己的次数:

4 3 = 4 × 4 × 4 = 64

对数是指数的反操作,其目的是找到指数——比如,从先前的例子中知道 4 和 64,找到 3:

log 4 ( 64 ) = 3

因此,对数是答案,用一个数乘以自己多少次可以得到另一个数。因为它们是互为反函数,所以可以一起使用来简化甚至解决 x。看下面的例子:

log 4 ( x ) = 3

这里的目标是找到给定对数函数的 x。第一步是在一侧使用指数函数,因为要取消右侧的对数(互为反函数会相互抵消)。这给我们带来了以下结果:

4 log 4 (x) = 4 3

x = 4 3

x = 64

对数可以有不同的底数。然而,最常用的对数具有底数 10。在计算机科学中,底数为 2 的对数表示比特(二进制位)。因此,信息以比特表示。信息增益的公式如下:

H ( x i ) = - l o g 2 ( P ( x i ) )

假设两个变量 xy,其中 x 的概率为 1(100%,因此确定)和 y 的概率为 0.5(50%,因此大部分是随机的)。在这两种情况下的信息价值是多少?答案如下:

H ( x ) = - l o g 2 ( P ( 1 ) ) = 0

H ( y ) = - l o g 2 ( P ( 0 . 5 ) ) = 1

因此,确定事件的信息价值为零,而有可能实现的事件的信息价值为 1。那么概率为 0.05(5%)的非常不可能发生的事件 z 的信息价值是多少呢?

H ( z ) = - l o g 2 ( P ( 0 . 05 ) ) = 4 . 32

概率与信息之间的负相关关系是信息理论的原则之一。熵和信息是相关概念,但它们具有不同的含义和应用。

是用于评估系统有多混乱或随机的度量标准。熵描述了信号的不确定或不可预测程度。系统或通信中的无序或不可预测性随熵的增加而增加。

信息 是由于接收信号而导致的熵或不确定性的减少。信号减少接收者的不确定性或熵的能力与其信息内容成正比。

注意

当所有事件同等可能时,熵被最大化。

熵(Entropy)通过以下公式计算:

S ( x n ) = ∑ i=1 n ( - l o g 2 ( P ( x i ) ) . ( P ( x i ) ) )

因此,熵是对数乘以其各自概率的和的平均值。

现在让我们讨论本节的最后一个概念,信息增益。通过信息增益来计算改变数据集引起的熵的减少。

提示

信息增益是你在第七章中会见到的关键概念之一,特别是在决策树中,因此,在阅读该章节后可能会希望参考本节。

计算信息增益的典型方式是比较转换前后数据集的熵。回想一下,当随机事件的所有结果具有相同的概率时,熵达到最大值。这也可以表示为分布,其中对称分布(如正态分布)具有高熵,而偏斜分布具有低熵。

最小化熵与最大化信息增益相关联。

在结束信息理论的介绍部分之前,让我们看看互信息的概念。这个度量是计算两个变量之间的关系,因此称为信息,它衡量了在给定另一个变量的情况下变量的不确定性减少。互信息的公式如下:

M I ( x , y ) = S ( x ) - S ( x | y )

  • MI(x, y) 是 xy 的互信息。

  • S(x) 是 x 的熵。

  • S(x|y) 是 xy 的条件熵。

因此,互信息衡量了变量之间的依赖关系。互信息越大,变量之间的关系越密切(值为零表示独立变量)。记住这个概念,因为你将在“相关性”中看到它。这是因为互信息也可以作为变量之间非线性关系的度量。

总结一下,在信息理论中你需要掌握以下基础知识:

  • 信息理论利用概率的概念来计算信息和熵,这些概念在机器学习模型和其他计算(如相关性)中使用。

  • 信息是接收信号导致的熵或不确定性减少。熵是评估系统混乱或随机程度的度量。

  • 互信息是两个随机变量之间依赖关系的度量。它也可以用来计算两者之间的相关性。

  • 信息理论中的工具被用于一些机器学习模型,例如决策树。

摘要

在深入讨论机器学习和深度学习模型时,了解概率提供了一个基本框架。本章节概述了你在处理这些模型时可能遇到的概念。理解如何计算概率以及如何进行假设检验非常重要(尽管实际上,算法会替你完成这些操作)。

下一章非常重要,将介绍你需要的统计知识,不仅适用于机器学习,还包括金融交易和复杂数据分析。

第三章:描述性统计和数据分析

描述性统计 是描述数据并尽可能多地从中提取信息的领域。基本上,描述性统计可以像数据的代表一样,因为它总结了其趋势、行为和趋势。

交易和分析从描述性统计中借用了许多指标。本章介绍了描述性统计和数据分析的主要概念。我总是发现最好的教育工具是实际的例子,因此我将使用经济时间序列的例子,即消费者价格指数(CPI),来解释这些概念。

CPI 测量城市居民每月支付的一系列产品和服务的价格;每个月都会向公众发布新的观测值,从而形成连续的时间序列。在任意两个时间段之间的通货膨胀率通过价格指数的百分比变化来衡量。例如,如果去年面包的价格是1.00,而今天的价格是1.00,而今天的价格是1.01,则通胀率为 1.00%。CPI 通常以年度基础发布,这意味着它报告了当前月度观察值与 12 个月前观察值之间的差异。

导入 CPI 数据如下:

# Importing the required library
import pandas_datareader as pdr
# Setting the beginning and end of the historical data
start_date = '1950-01-01'
end_date   = '2023-01-23'
# Creating a dataframe and downloading the CPI data
cpi = pdr.DataReader('CPIAUCSL', 'fred', start_date, end_date)
# Printing the latest five observations of the dataframe
print(cpi.tail())
# Checking if there are nan values in the CPI dataframe
count_nan = cpi['CPIAUCSL'].isnull().sum()
# Printing the result
print('Number of nan values in the CPI dataframe: ' + str(count_nan))
# Transforming the CPI into a year-on-year measure
cpi = cpi.pct_change(periods = 12, axis = 0) * 100
# Dropping the nan values from the rows
cpi = cpi.dropna()

注意

您可以从书的专用GitHub 页面下载全书中的所有代码示例。

年度变化是 CPI 上最常见的变换,因为它清晰简明地测量了总体价格水平在足够时间内的变化,以解释短期波动和季节性影响。

因此,CPI 的年度变化作为通货膨胀趋势的一个指标。这也简单易懂,并可与其他国家和历史时期进行比较,因此在决策者和经济学家中很受欢迎(尽管存在国家之间购物篮权重的缺陷)。以下部分展示了如何利用 CPI 示例对时间序列数据进行统计分析。

中心趋势测量

中心趋势 指的是将数据集总结成一个能代表它们的值的度量。最著名的中心趋势测量是均值(平均值)。均值 简单地是数值总和除以它们的数量。它是最能代表数据的值。均值的数学公式如下:

x ¯ = 1 n ∑ n i=1 x i = 1 n ( x 1 + . . . + x n )

让我们以两个数据集的简单例子来说明。假设您想在数据集 A 和数据集 B 上计算均值。你会怎么做呢?

  • 数据集 A = [1, 2, 3, 4, 5]

  • 数据集 B = [1, 1, 1, 1]

数据集 A 包含五个值(数量),总和为 15。使用上述公式,均值等于 3。数据集 B 包含四个值,总和为 4。这意味着均值为 1。

图 3-1 展示了自 2003 年以来的美国 CPI 同比值。较高的虚线是自 2003 年以来计算的月度平均值。较低的虚线象征着零,下面是通货紧缩期。

注意

当数据集中的所有值都相同时,平均值与这些值相同。

图 3-1. 自 2003 年以来的美国 CPI 同比值,其中较高的虚线代表平均值

你可以使用以下代码创建图 3-1:

# Calculating the mean of the CPI over the last 20 years
cpi_latest = cpi.iloc[–240:]
mean = cpi_latest["CPIAUCSL"].mean()
# Printing the result
print('The mean of the dataset: ' + str(mean), '%')
# Importing the required library
import matplotlib.pyplot as plt
# Plotting the latest observations in black with a label
plt.plot(cpi_latest[:], color = 'black', linewidth = 1.5, 
         label = 'Change in CPI Year-on-Year')
# Plotting horizontal lines that represent the mean and the zero threshold
plt.axhline(y = mean, color = 'red', linestyle = 'dashed', 
         label = 'Mean')
plt.axhline(y = 0, color = 'blue', linestyle = 'dashed', linewidth = 1)
plt.grid()
plt.legend()

平均值的输出应如下所示。

The mean of the dataset: 2.49 %

这意味着年度平均通货膨胀率约为 2.50%。尽管美联储没有明确的通货膨胀目标,但普遍认为共识是维持年度通胀变化在约 2.00%左右,这与历史观察值相差不远。由于政治和经济动荡导致的高通胀数字自 2021 年以来,有必要回归到平均水平以稳定当前局势。这个例子为所谓的正常性(约 2.50%)自 2003 年以来提供了一个数值参考。

显然,由于 2023 年初高达约 6.00%的高通胀率,情况有些偏离正常,但有多偏离?这个问题将在接下来的部分得到回答,该部分讨论了变异性的度量。现在,让我们继续讨论中心趋势。

下一个度量是中位数,简单来说就是将数据集分成两个相等的部分的值。换句话说,如果你按升序排列数据集,中间的值就是中位数。在数据中有许多异常值或分布偏斜(可能会使平均值产生偏差并使其不太具代表性)时使用中位数。

通常有两个与计算中位数相关的主题。第一个与包含偶数值的数据集有关(例如,24 个观察结果),第二个与包含奇数值的数据集有关(例如,47 个观察结果):

计算偶数数据集的中位数

如果排列的数据集具有偶数个值,则中位数是两个中间值的平均值。

计算奇数数据集的中位数

如果排列的数据集具有奇数个值,中位数就是中间值。

让我们举一个简单的例子来说明两个数据集。假设你想在数据集 A 和数据集 B 上计算中位数。你会怎么做?

  • 数据集 A = [1, 2, 3, 4, 5]

  • 数据集 B = [1, 2, 3, 4]

数据集 A 包含五个值,这是一个奇数。这意味着中间值是中位数。在这种情况下,它是 3(注意它也是数据集的平均值)。数据集 B 包含四个值,这是一个偶数。这意味着两个中间值的平均值是中位数。在这种情况下,它是 2.5,这是 2 和 3 之间的平均值。

图 3-2 显示自 2003 年以来的美国消费者物价指数同比值。较高的虚线是自 2003 年以来计算的月中位数。较低的虚线象征着零。基本上,这类似于图 3-1,但绘制的是中位数而不是均值。

图 3-2。自 2003 年以来的美国消费者物价指数同比值,其中较高的虚线表示中位数

您可以使用以下代码创建图 3-2:

# Calculating the median
median = cpi_latest["CPIAUCSL"].median() 
# Printing the result
print('The median of the dataset: ' + str(median), '%')
# Plotting the latest observations in black with a label
plt.plot(cpi_latest[:], color = 'black', linewidth = 1.5, 
         label = 'Change in CPI Year-on-Year')
# Plotting horizontal lines that represent the median and the zero threshold
plt.axhline(y = median, color = 'red', linestyle = 'dashed', 
            label = 'Median')
plt.axhline(y = 0, color = 'blue', linestyle = 'dashed', linewidth = 1)
plt.grid()
plt.legend()

中位数的输出应该如下所示:

The median of the dataset: 2.12 %

显然,中位数受最近来自不寻常环境的异常值影响较小。中位数约为 2.12%,这与暗示的目标 2.00%更加一致。

注意

请记住,第六章将为您提供关于本章节中所见 Python 代码的所有信息,因此您不必担心是否会错过编码概念。

本节最后的中心趋势度量是众数,它是最常见的值(但在数据分析中使用最少的)。

让我们以两个数据集的简单示例为例。假设您要计算以下数据集的众数。您将如何做呢?

  • 数据集 A = [1, 2, 2, 4, 5]

  • 数据集 B = [1, 2, 3, 4]

  • 数据集 C = [1, 1, 2, 2, 3]

数据集 A 包含两次值为 2,这使其成为众数。数据集 B 没有众数,因为每个值仅观察一次。数据集 C 是多峰的,因为它包含多个众数(即 1 和 2)。

注意

众数在处理分类变量(如信用评级)时很有用,而不适用于连续变量(如价格和回报时间序列)。

您不太可能使用众数来分析时间序列,因为均值和中位数更为有用。以下是在金融分析中使用均值和中位数的几个示例:

  • 在价格数据上计算移动平均值以检测潜在趋势。您将在第五章中了解更多关于移动平均线的内容。

  • 计算基于价格衍生指标的滚动中位数以检测其中性区域。

  • 使用历史均值计算证券的预期回报。

中心趋势度量是理解重要的,特别是因为均值和中位数不仅作为独立指标广泛使用,还作为更复杂的度量的组成部分。

注意

本节的关键要点如下:

  • 主要有三种中心趋势度量:均值、中位数和众数。

  • 均值是总和除以数量,而中位数是将数据分成两半的值。众数是数据集中出现最频繁的值。

变异性的度量

变异性的度量描述数据集中数值相对于中心趋势度量(主要是均值)的散布程度。最知名的变异性度量是方差。

方差描述了一组数字与它们的平均值之间的变异性。方差公式背后的理念是确定每个数据点距离均值的距离,然后对这些偏差进行平方以确保所有数字都是正数(因为距离不能是负数),最后将偏差除以观察次数。

计算方差的公式如下:

σ 2 = 1 n ∑ n i=1 (x i -x ¯) 2

此公式计算每个数据点与均值之间偏差的平方和,从而给出不同的距离观察值,然后计算这些距离观察值的平均值。

让我们来看两个数据集的简单例子。假设你想计算数据集 A 和数据集 B 的方差。你会怎么做?

  • 数据集 A = [1, 2, 3, 4, 5]

  • 数据集 B = [5, 5, 5, 5]

第一步是计算数据集的均值,因为这是你将计算数据变异性的基准。数据集 A 的均值为 3。下一步计算方差:

(x 1 -x ¯) 2 = (1-3) 2 = 4

(x 2 -x ¯) 2 = (2-3) 2 = 1

(x 3 -x ¯) 2 = (3-3) 2 = 0

(x 4 -x ¯) 2 = (4-3) 2 = 1

(x 5 -x ¯) 2 = (5-3) 2 = 4

前述结果总结如下:

4 + 1 + 0 + 1 + 4 = 10

最后,结果除以观察数以找到方差:

σ 2 = 10 5 = 2

至于数据集 B,你应该从直觉上考虑。如果观察值全部相等,它们都代表数据集,这也意味着它们是自己的均值。在这种情况下,考虑数据的方差会怎么说?

如果你的回答是方差为零,那么你是正确的。在数学上,你可以如下计算它:

(x 1 -x ¯) 2 = (5-5) 2 = 0

(x 2 -x ¯) 2 = (5-5) 2 = 0

(x 3 -x ¯) 2 = (5-5) 2 = 0

(x 4 -x ¯) 2 = (5-5) 2 = 0

前述结果总和为零,如果你将零除以 4(数据集的数量),你将得到零。直觉上,没有方差,因为所有值都是常数,它们不偏离其均值:

σ 2 = 0 4 = 0

在通货膨胀的例子中,你可以使用以下代码计算方差:

# Calculating the variance
variance = cpi_latest["CPIAUCSL"].var() 
# Printing the result
print('The variance of the dataset: ' + str(variance), '%')

方差的输出应该如下所示:

The variance of the dataset: 3.62 %

尽管如此,存在一个缺陷,即方差代表的是不可与均值比较的平方值,因为它们使用不同的单位。通过对方差取平方根轻松修正此问题。这带来了下一个变异性度量,标准差。它是方差的平方根,是值与均值的平均偏差。

低标准差表明值倾向于接近均值(低波动性),而高标准差表明值相对于其均值分布在更广的范围内(高波动性)。

注意

标准差波动率这两个术语可以互换使用,它们指的是同一件事情。

计算标准差的公式如下:

σ = 1 n ∑ n i=1 (x i -x ¯) 2

如果考虑前面的方差示例,则可以如下找到标准差:

σ DatasetA = 2 = 1 . 41

σ DatasetB = 0 = 0

由于标准差和均值使用相同的单位,所以标准差通常与均值一起使用。当我在下一节讨论正态分布函数时,您很快就会理解这个统计量的重要性。

您可以使用以下代码在 Python 中计算标准差:

# Calculating the standard deviation
standard_deviation = cpi_latest["CPIAUCSL"].std() 
# Printing the result
print('The standard deviation of the dataset: ' + 
      str(standard_deviation), '%')

标准差的输出应如下所示:

The standard deviation of the dataset: 1.90 %

您应该如何解释标准差?平均而言,CPI 年度同比值 tend to be ±1.90%,而同期均值为 2.49%。在“形状的度量”中,您将看到如何更好地利用标准差数据。

本节讨论的最后一个变异性度量是范围。范围是一个非常简单的统计量,显示了数据集中最大值和最小值之间的距离。这让您快速了解了两个历史极端值。查找范围的公式如下:

R a n g e = m a x ( x ) - m i n ( x )

在 Python 中,您可以轻松地做到这一点,因为有内置函数可以在给定一组数据的情况下显示最大值和最小值:

# Calculating the range
range_metric = max(cpi["CPIAUCSL"]) – min(cpi["CPIAUCSL"])
# Printing the result
print('The range of the dataset: ' + str(range_metric), '%')

上述代码的输出应如下所示:

The range of the dataset: 16.5510 %

图 3-3 显示了自 1951 年以来的 CPI 值。对角虚线表示范围,水平虚线表示零阈值。

CPI 的范围显示了通货膨胀衡量值从一个时期到另一个时期的变化大小。不同国家通胀数字的年度变化各不相同。一般来说,像法国和美国这样的发达国家在稳定时期具有稳定的变化(在稳定时期),而像土耳其和阿根廷这样的新兴和前沿世界国家的通胀数字则更具波动性和更极端。

图 3-3. 自 1951 年以来美国 CPI 年度同比变化,带有表示范围的对角虚线

本节的要点如下:

  • 您应该知道的三个关键变异性指标是方差、标准差和范围。

  • 标准差是方差的平方根。这样做是为了使其可与均值进行比较。

  • 范围是数据集中最高值和最低值之间的差异。它是对观察值总体延伸的快速概览。

形状的度量

形状的度量描述了数据集中各个值围绕中心趋势度量的分布。均值和标准差是描述正态分布的两个因素。标准差描述了数据的扩散或分散程度,而均值反映了分布的中心。

概率分布是描述随机实验中不同结果或事件发生可能性的数学函数。换句话说,它给出了随机变量所有可能值的概率。

有许多类型的概率分布,包括离散和连续分布。离散分布 只能取有限数量的值。最著名的离散分布包括伯努利分布、二项分布和泊松分布。

连续分布 用于可以在给定范围内取任意值的随机变量(如股票价格和回报)。最著名的分布是正态分布。

正态分布(也称为高斯分布)是一种连续概率分布,其在均值周围对称且呈钟形。它是统计分析中最广泛使用的分布之一,通常用于描述诸如年龄、体重和考试成绩等自然现象。图 3-4 展示了正态分布的形状。

图 3-4. 均值 = 0,标准差 = 1 的正态分布图

您可以使用以下代码块生成图 3-4:

# Importing libraries
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
# Generate data for the plot
data = np.linspace(–3, 3, num = 1000)
# Define the mean and standard deviation of the normal distribution
mean = 0
std = 1
# Generate the function of the normal distribution
pdf = stats.norm.pdf(data, mean, std)
# Plot the normal distribution plot
plt.plot(data, pdf, '-', color = 'black', lw = 2)
plt.axvline(mean, color = 'black', linestyle = '--')
plt.grid()
plt.show()

由于正态分布变量很常见,大多数统计测试和模型假设分析的数据是正态的。在金融回报中,它们被假设为正态,即使它们经历了一种称为偏度和峰度的形状,这两个测量在本节中讨论。

在正态分布中,数据围绕平均值对称分布,这也意味着平均数等于中位数和众数。此外,约 68% 的数据落在均值的一个标准差范围内,约 95% 落在两个标准差范围内,约 99.7% 落在三个标准差范围内。这一特性使得正态分布成为推断的有用工具。

总结来说,您应从正态分布中保留以下内容:

  • 平均数和标准差描述了分布。

  • 平均数将分布一分为二,使其等于中位数。由于对称性质,众数也等于平均数和中位数。

现在让我们讨论形状的测量。形状的第一个测量是偏度。偏度 描述了分布的不对称性。它分析了分布偏离对称的程度。

正态分布的偏度等于零。这意味着分布在其平均值周围完全对称,均值两侧的数据点数量相等。

正偏 表示分布向右有一个长尾,这意味着平均数大于中位数,因为平均数对异常值敏感,这些异常值会使平均数上升(因此,在x轴的右侧)。类似地,众数将是三个中心趋势测量中的最小值。图 3-5 展示了正偏。

图 3-5. 正偏分布的示例

负偏表示分布的左侧尾部较长,这意味着均值低于中位数。类似地,众数将是三种中心趋势测量之间的最大值。图 3-6 显示了负偏斜。

图 3-6. 一个负偏斜分布的示例

在金融市场中如何解释偏度?如果分布呈正偏斜,则意味着高于均值的收益更多(分布的尾部在正侧更长)。

如果分布呈负偏斜,则意味着低于均值的收益更多(分布的尾部在负侧更长)。

一个收益系列的偏度可以提供有关投资的风险和回报的信息。例如,一个呈正偏的收益系列可能表明投资存在大量大额收益的潜力,但也伴随着频繁的小额损失的风险。

计算偏度的公式如下:

μ ˜ 3 = ∑ n=1 i (x i -x ¯) 3 Nσ 3

让我们检查自 2003 年以来美国 CPI 年同比数据的偏度:

# Calculating the skew
skew = cpi_latest["CPIAUCSL"].skew() 
# Printing the result
print('The skew of the dataset: ' + str(skew))

上述代码的输出应如下所示:

The skew of the dataset: 1.17

数据的偏度为 1.17,但这意味着什么?让我们绘制数据分布图来便于解释。您可以使用以下代码片段来完成这一点:

# Plotting the histogram of the data
fig, ax = plt.subplots()
ax.hist(cpi['CPIAUCSL'], bins = 30, edgecolor = 'black', color = 'white')
# Add vertical lines for better interpretation
ax.axvline(mean, color='black', linestyle='--', label = 'Mean', 
           linewidth = 2)
ax.axvline(median, color='grey', linestyle='-.', label = 'Median', 
           linewidth = 2)
plt.grid()
plt.legend()
plt.show()

图 3-7 显示了上一个代码片段的结果。由于均值大于中位数且偏度为正(大于零),数据显然呈正偏斜。

图 3-7. 美国 CPI 年同比数据分布,显示正偏斜

请记住,偏度是概率分布的不对称性度量。因此,它衡量分布偏离正态分布的程度。解释偏度的经验法则如下:

  • 如果偏度在–0.5 到 0.5 之间,则数据被认为是对称的。

  • 如果偏度在–1.0 到–0.5 或者 0.5 到 1.0 之间,则数据被认为是轻微偏斜的。

  • 如果偏度小于–1.0 或大于 1.0,则数据被认为是高度偏斜的。

正偏表示什么?在这种情况下,1.17 表示高度正偏的数据(在正侧),这与在经济增长时支持通货膨胀的货币政策一致(存在少数导致偏度的通货膨胀性波动)。

有趣的是,对于偏斜分布来说,中位数可能是首选的度量,因为均值往往会被异常值拉动,从而扭曲其值。

下一个形状的度量是kurtosis,它描述了一个分布相对于正态分布的尖峰或平坦程度。Kurtosis 描述了一个分布的尾部,特别是尾部是否比正态分布的更厚或更薄。

正态分布的峰度为 3,这意味着它是一个中峰态分布。如果一个分布的峰度大于 3,则被称为尖峰态,意味着比正态分布更高的峰值和更胖的尾巴。如果一个分布的峰度小于 3,则被称为低峰态,意味着比正态分布更扁平的峰值和更细的尾巴。

计算峰度的公式如下:

k = ∑ n=1 i (x i -x ¯) 4 Nσ 4

有时峰度被测量为过量峰度,以使其起始值为零(对于正态分布)。这意味着从 3 中减去峰度测量值以计算过量峰度。让我们计算美国 CPI 年度数据的过量峰度:

# Calculating the excess kurtosis
excess_kurtosis = cpi_latest["CPIAUCSL"].kurtosis() 
# Printing the result
print('The excess kurtosis of the dataset: ' + str(excess_kurtosis))

前述代码的输出应如下所示:

The excess kurtosis of the dataset: 2.15

在过去 20 年的美国 CPI 年度值的情况下,过量峰度为 2.15,这更符合尖峰态(峰值更高且尾部更胖)分布。正值表示分布比正态更尖峭,而负峰度表示形状比正态更扁平。

我们将在描述统计类别中讨论的最终指标是分位数。分位数是形状和变异性的度量,因为它们提供有关值的分布(形状)和这些值的离散度(变异性)的信息。最常用的类型是四分位数。

四分位数将数据集分为四等份。通过将数据按顺序排列然后执行分割来完成此操作。考虑表 3-1 作为一个例子。

表 3-1. 按升序排列的数字

Value
1
2
4
5
7
8
9

四分位数如下:

  • 下四分位数(Q1)是第一四分位数,在本例中为 2。

  • 中间四分位数(Q2)也是中位数,在本例中为 5。

  • 在本例中,上四分位数(Q3)为 8。

从数学上讲,可以使用以下公式计算 Q1 和 Q3:

Q 1 = ( n+1 4 )

Q 3 = 3 ( n+1 4 )

记住,公式的结果给出的是值的排名,而不是值本身:

Q 1 = ( 7+1 4 ) = 2 nd t e r m = 2

Q 3 = 3 ( 7+1 4 ) = 6 th t e r m = 8

四分位间距(IQR)是 Q3 和 Q1 之间的差异,并提供数据集中前 50%值的扩展度量。由于依赖中间值,IQR 对异常值具有鲁棒性,并提供大部分值扩展的简要摘要。根据以下公式,表 3-1 中数据的 IQR 为 6:

I Q R = Q 3 - Q 1

I Q R = 8 - 2 = 6

IQR 是一个有价值的指标,可以用作许多不同模型中的输入或风险度量。它还可以用于检测数据中的异常值,因为它对它们是免疫的。此外,IQR 可以帮助评估所分析资产的当前波动性,进而与其他方法结合使用以创建更强大的模型。如理解的那样,IQR 在有用性和解释性上优于范围度量,因为前者容易受到异常值的影响。

计算四分位数时要小心,因为有许多方法用于对同一数据集进行不同的计算。最重要的是确保在所有分析中使用相同的方法。用于计算表 3-1 中四分位数的方法称为图基的铰链方法。

注意

本节的主要要点如下:

  • 正态分布是一种连续的概率分布,具有钟形曲线。大多数数据聚集在均值附近。正态分布曲线的均值、中位数和众数都相等。

  • 偏度测量概率分布的不对称性。

  • 峰度度量概率分布的尖峰程度。超额峰度通常用于描述当前的概率分布。

  • 分位数将排列好的数据集分为相等的部分。最常用的分位数是将数据分为四等份的四分位数。

  • IQR 是第三四分位数与第一四分位数之间的差异。它对离群值免疫,因此在数据分析中非常有帮助。

数据可视化

在第一章中,我介绍了数据科学过程中的六个步骤。第 4 步是数据可视化。本节将展示几种以清晰的视觉方式呈现数据的方法,使您能够对其进行解释。

许多类型的统计图用于可视化数据。让我们讨论其中一些。

散点图用于绘制两个变量之间的关系,通过对应于变量交集的点。要创建散点图,请在 CPI 数据上使用以下代码:

# Importing the required library
import matplotlib.pyplot as plt
# Resetting the index
cpi = cpi.reset_index()
# Creating the chart
fig, ax = plt.subplots()
ax.scatter(cpi['DATE'], cpi['CPIAUCSL'], color = 'black', 
           s = 8,  label = 'Change in CPI Year-on-Year')
plt.grid()
plt.legend()
plt.show()

图 3-8 显示了一个时间散点图的结果。这意呈现了 CPI 数据作为第一个变量(y 轴)和时间作为第二个变量(x 轴)。然而,散点图更常用于比较变量;因此,移除时间变量可以提供更多的见解。

图 3-8. 美国 CPI 数据与时间轴的散点图

将英国 CPI 年度变化与美国 CPI 年度变化进行比较。注意在图 3-9 中它们之间的正相关性,因为其中一个变量的较高值与另一个变量的较高值相关。相关性是您将在下一节详细了解的关键度量。绘制图 3-9 的代码如下:

# Setting the beginning and end of the historical data
start_date = '1995-01-01'
end_date   = '2022-12-01'
# Creating a dataframe and downloading the CPI data
cpi_us = pdr.DataReader('CPIAUCSL', 'fred', start_date, end_date)
cpi_uk = pdr.DataReader('GBRCPIALLMINMEI', 'fred', start_date, end_date)
# Dropping the NaN values from the rows
cpi_us = cpi_us.dropna()
cpi_uk = cpi_uk.dropna()
# Transforming the CPI into a year-on-year measure
cpi_us = cpi_us.pct_change(periods = 12, axis = 0) * 100
cpi_us = cpi_us.dropna()
cpi_uk = cpi_uk.pct_change(periods = 12, axis = 0) * 100
cpi_uk = cpi_uk.dropna()
# Creating the chart
fig, ax = plt.subplots()
ax.scatter(cpi_us['CPIAUCSL'], cpi_uk['GBRCPIALLMINMEI'], 
           color = 'black', s = 8, label = 'Change in CPI Year-on-Year')
# Adding a few aesthetic elements to the chart
ax.set_xlabel('US CPI')
ax.set_ylabel('UK CPI')
ax.axvline(x = 0, color='black', linestyle = 'dashed', linewidth = 1)
ax.axhline(y = 0, color='black', linestyle = 'dashed', linewidth = 1)
ax.set_ylim(-2,)
plt.grid()
plt.legend()
plt.show()

图 3-9. 英国 CPI 数据与美国 CPI 数据的散点图

当可视化数据之间的相关性时,散点图非常有效。它们也很容易绘制和解释。通常,当点分散成一条向上倾斜的对角线时,可以假定相关性为正,因为当 x 轴上的变量增加时,y 轴上的变量也会增加。

另一方面,当可以画出一条斜向下的对角线来表示不同变量时,可能存在负相关。负相关意味着无论x轴上的变量如何移动,y轴上的变量很可能以相反的方式移动。

图 3-10 展示了来自图 3-9 的两个通胀数据集之间的最佳拟合线。请注意它是向上倾斜的。

图 3-10. 英国 CPI 数据与美国 CPI 数据的散点图及最佳拟合线

现在我们来看另一种图表方法。折线图是最基本的绘图类型,本质上是联结的散点图,大多数情况下都是针对时间轴(x轴)绘制的。你在图 3-1 和图 3-2 中看到了折线图。

折线图的优点在于简单易行。它们还展示了时间序列的演变,有助于检测趋势和模式。在第五章中,你将学习更复杂的蜡烛图,用于绘制金融时间序列。图 3-11 展示了自 1951 年以来美国 CPI 数据的基本折线图。

图 3-11. 美国 CPI 数据的折线图与时间轴

要创建图 3-11,你可以使用以下代码片段:

# Creating the chart
plt.plot(cpi['DATE'], cpi['CPIAUCSL'], color = 'black', 
         label = 'Change in CPI Year-on-Year')
plt.grid()
plt.legend()
plt.show()

接下来是条形图,用于显示变量(通常是分类的)的分布。图 3-12 展示了自 2022 年初以来的美国 CPI 数据的条形图。

图 3-12. 美国 CPI 数据的条形图与时间轴

要创建图 3-12,你可以使用以下代码片段:

# Taking the values of the previous twelve months
cpi_one_year = cpi.iloc[-12:]
# Creating the chart
plt.bar(cpi_one_year['DATE'], cpi_one_year['CPIAUCSL'], 
        color = 'black', label = 'Change in CPI Year-on-Year', width = 7)
plt.grid()
plt.legend()
plt.show()

条形图在绘制美国 CPI 或股票价格等连续数据时存在局限性。当比例失调时,它们也可能误导。由于后一原因,当处理大型数据集时,直方图更为合适。

直方图是一种特定类型的条形图,用于显示连续数据的频率分布,通过条形来表示统计信息。它指示落入特定类别或数值区间的观察次数。直方图的示例见图 3-13(还参见图 3-7)。

图 3-13. 美国 CPI 数据的直方图

要创建图 3-13,你可以使用以下代码片段:

# Creating the chart
fig, ax = plt.subplots()
ax.hist(cpi['CPIAUCSL'], bins = 30, edgecolor = 'black', 
        color = 'white', label = 'Change in CPI Year-on-Year',)
# Add vertical lines for better interpretation
ax.axvline(0, color = 'black')
plt.grid()
plt.legend()
plt.show()

注意条形图是针对时间轴绘制的,而直方图则没有时间范围,因为它是一组数值,旨在显示整体分布情况。从视觉上看,你可以看到分布的正偏度。

统计学中另一种经典绘图技术是箱形图。它用于可视化连续变量的分布,同时包括中位数和四分位数以及异常值。理解箱形图的方法如下:

  • 箱子代表 IQR。箱子在第一四分位数和第三四分位数之间绘制。箱子的高度表示该范围内数据的分布。

  • 箱子内的线表示中位数。

  • “须”从箱子的顶部和底部延伸到最高和最低数据点,这些点仍然在 1.5 倍 IQR 范围内。这些数据点称为异常值,在图上表示为单个点。

图 3-14 显示了自 1950 年以来美国 CPI 数据的箱形图。

图 3-14. 美国 CPI 数据的箱形图

您还可以绘制不带异常值的数据(任何值,其值超过箱子长度的 1.5 倍)。要创建图 3-14,您可以使用以下代码片段:

# Creating the chart
cpi_latest = cpi.iloc[–240:]
fig, ax = plt.subplots()
ax.boxplot(cpi_latest['CPIAUCSL'])
plt.grid()
plt.legend()
plt.show()

要从图中去除异常值,您只需使用以下小调整:

# Replace the corresponding code line with the following
fig, ax = plt.subplots()
ax.boxplot(cpi_latest['CPIAUCSL'], showfliers = False)

这将为您提供图 3-15。

图 3-15. 不含异常值的美国 CPI 数据箱形图

存在许多其他数据可视化技术,例如热力图(通常与相关数据和温度映射一起使用)和饼图(通常用于预算和分割)。使用哪种技术取决于您需要理解的内容及其适合您需求的情况。例如,折线图更适合仅具有一个特征的时间序列(例如,仅有某种证券的收盘价)。直方图更适合与概率分布数据一起使用。

注意

此部分的主要要点如下:

  • 使用哪种数据可视化技术取决于您要执行的分析和解释类型。某些图表更适合与特定类型的数据一起使用。

  • 数据可视化有助于在数值确认之前进行初步解释。

  • 在处理金融时间序列时,您更有可能使用折线图和蜡烛图。

相关性

相关性 是用来计算两个变量之间线性关系程度的指标。它是一个介于-1.0 和 1.0 之间的数字,其中-1.0 表示变量之间强烈的负相关关系,1.0 表示强烈的正相关关系。

零值表示变量之间没有线性关联。然而,相关性并不意味着因果关系。如果两个变量同向运动,则它们被认为是相关的,但这并不意味着一个变量导致另一个变量移动,或者它们因相同事件而移动。

大多数人认为某些资产具有自然的相关性。例如,因为它们都属于同一行业并受相同趋势和事件的影响,苹果和微软的股票呈正相关(这意味着它们的总体趋势方向相同)。图 3-16 显示了这两只股票之间的图表。请注意它们如何一起移动。

图 3-16。自 2021 年以来的苹果和微软股票价格

这两只股票的高点和低点几乎同时发生。同样,由于美国和英国有相似的经济驱动因素和影响,它们的通货膨胀数据也可能呈正相关,正如您在本章中早些时候看到的。

通过视觉解释和数学公式来检查相关性。在看一个例子之前,让我们讨论计算相关性的根源,以便您了解它的来源及其局限性。

注意

简单地说,要计算相关性,您需要测量两个变量散点图中的点有多接近一条直线。它们看起来越像一条直线,它们的正相关性就越强,因此称为线性相关

有两种主要计算相关性的方法:Spearman 方法和 Pearson 方法。¹

皮尔逊相关系数是从它们之间的标准差和协方差计算的两个变量之间线性关联的度量。

协方差计算两个变量均值之间差异的平均值。如果两个变量有一起移动的倾向,协方差为正,如果两个变量通常反向移动,协方差为负。它的范围在正无穷和负无穷之间。

计算变量xy之间协方差的公式如下:

c o v xy = ∑ i=1 n (x i -x ¯)(y i -y ¯) n

因此,协方差是变量之间平均偏差及其各自均值乘积之和(即,协方差度量它们关联的程度)。取平均值以标准化此计算。皮尔逊相关系数计算如下:

r xy = ∑ i=1 n (x i -x ¯)(y i -y ¯) ∑ i=1 n (x i -x ¯) 2 ∑ i=1 n (y i -y ¯) 2

简化前述相关公式得到以下结果:

r xy = cov xy σ x σ y

因此,皮尔逊相关系数简单地是两个变量之间的协方差除以它们标准差的乘积。让我们计算美国 CPI 年同比值和英国 CPI 年同比值之间的相关性。直觉上,由于英国和美国在经济上有关联,相关性大于零。以下代码块计算了这两个时间序列的皮尔逊相关系数:

# Importing the required libraries
import pandas_datareader as pdr
import pandas as pd
# Setting the beginning and end of the historical data
start_date = '1995-01-01'
end_date   = '2022-12-01'
# Creating a dataframe and downloading the CPI data
cpi_us = pdr.DataReader('CPIAUCSL', 'fred', start_date, end_date)
cpi_uk = pdr.DataReader('GBRCPIALLMINMEI', 'fred', start_date, end_date)
# Dropping the nan values from the rows
cpi_us = cpi_us.dropna()
cpi_uk = cpi_uk.dropna()
# Transforming the US CPI into a year-on-year measure
cpi_us = cpi_us.pct_change(periods = 12, axis = 0) * 100
cpi_us = cpi_us.dropna()
# Transforming the UK CPI into a year-on-year measure
cpi_uk = cpi_uk.pct_change(periods = 12, axis = 0) * 100
cpi_uk = cpi_uk.dropna()
# Joining both CPI data into one dataframe
combined_cpi_data = pd.concat([cpi_us['CPIAUCSL'], 
                               cpi_uk['GBRCPIALLMINMEI']], axis = 1)
# Calculating Pearson correlation
combined_cpi_data.corr(method = 'pearson')

输出如下:

                 CPIAUCSL  GBRCPIALLMINMEI
CPIAUCSL         1.000000         0.732164
GBRCPIALLMINMEI  0.732164         1.000000

这两者之间的相关系数高达 0.73。这符合预期。皮尔逊相关通常与具有比例变化且正态分布的变量一起使用。

斯皮尔曼秩相关是一种非参数秩相关,用于衡量变量之间关系的强度。它适用于不符合正态分布的变量。

注意

记住,财务收益不服从正态分布,但有时出于简单起见会这样处理。

与皮尔逊相关不同,斯皮尔曼秩相关考虑值的顺序,而不是实际值。要计算斯皮尔曼秩相关,请按照以下步骤进行:

  1. 给每个变量的值排名。这是通过将最小变量替换为 1 并将数据集的长度替换为最大数字来完成的。

  2. 计算秩的差异。在数学上,秩的差异用数学公式中的字母d表示。然后,计算它们的平方差。

  3. 求出第 2 步中计算的平方差的总和。

  4. 使用以下公式计算斯皮尔曼秩相关:

    ρ = 1 - 6∑ i=1 n d i 2 n 3 -n

与皮尔逊相关类似,斯皮尔曼秩相关的范围也是从–1.00 到 1.00,并具有相同的解释。

注意

强正相关通常大于 0.70,而强负相关通常小于–0.70。

以下代码块计算了两个时间序列的斯皮尔曼秩相关系数:

# Calculating Spearman's rank correlation
combined_cpi_data.corr(method = 'spearman')

输出如下:

                 CPIAUCSL  GBRCPIALLMINMEI
CPIAUCSL         1.000000         0.472526
GBRCPIALLMINMEI  0.472526         1.000000

在得到这个结果差异后,让我们回答一个非常重要的问题。为什么这两个测量结果如此不同?

首先要记住的是它们测量的内容。皮尔逊相关测量变量之间的线性关系(趋势),而斯皮尔曼秩相关测量单调趋势。单调一词指的是以相同方向移动,但不完全以相同速率或大小移动。此外,斯皮尔曼秩相关将数据转换为序数类型(通过秩),而不是像皮尔逊相关那样使用实际值。

自相关(也称为串行相关)是一种统计方法,用于查看给定时间序列与其滞后版本之间的关系。通常用于通过数据模式(例如季节性或趋势)来预测未来值。自相关因此是值与先前值的关系—例如,比较每一天的微软股票价格与前一天并查看是否存在可辨识的相关性。从算法的角度来看,这可以表示如下表 3-2。

表 3-2. 滞后值

     t     t–1
 $       1.25 $       1.65
 $       1.77 $       1.25
 $       1.78 $       1.77
 $       1.25 $       1.78
 $       1.90 $       1.25

每一行代表一个时间段。列t是当前价格,列t-1是将先前价格放在代表当前的行上。这是在创建机器学习模型时,为了了解当前值与每个时间步长(行)中先前值之间的关系而完成的。

正自相关在趋势资产中经常发生,并与持续性(趋势跟随)的概念相关联。负自相关在波动市场中表现出来,并与反向性(均值回归)的概念相关联。

注意

计算不同时间序列(例如 NVIDIA 和 Oracle 股票)之间的短期相关性的度量通常使用价格的回报(例如差异)而不是实际价格。但是,可以直接利用价格来识别长期趋势。

下面的代码块计算美国 CPI 年度值的自相关:

# Creating a dataframe and downloading the CPI data
cpi = pdr.DataReader('CPIAUCSL', 'fred', start_date, end_date)
# Transforming the US CPI into a year-on-year measure
cpi = cpi.pct_change(periods = 12, axis = 0) * 100
cpi = cpi.dropna()
# Transforming the data frame to a series structure
cpi = cpi.iloc[:,0]
# Calculating autocorrelation with a lag of 1
print('Correlation with a lag of 1 = ', round(cpi.autocorr(lag = 1), 2))
# Calculating autocorrelation with a lag of 6
print('Correlation with a lag of 6 = ', round(cpi.autocorr(lag = 6), 2))
# Calculating autocorrelation with a lag of 12
print('Correlation with a lag of 12 = ', round(cpi.autocorr(lag = 12), 2))

滞后 12 期意味着每个数据值都与 12 期前的数据进行比较,然后计算相关性指标。以下是代码的输出:

Correlation with a lag of 10.97
Correlation with a lag of 60.65
Correlation with a lag of 120.17

现在,在进入下一节之前,让我们回到信息理论,讨论一个能够发现非线性关系的有趣相关系数。

最大信息系数(MIC)是两个变量之间的非参数相关性度量,旨在处理大规模和复杂的数据。它通常被视为传统相关性度量的更稳健的替代方法,如皮尔逊相关系数和斯皮尔曼秩相关系数。由大卫·N·雷舍夫等人引入,^(2)MIC 使用了信息理论中的概念,您在第二章中看到过。

MIC 通过计算对两个变量之间的关系最具信息量的列在列联表中的数量来衡量两个变量之间的关联强度。MIC 值的范围从 0 到 1,较高的值表示较强的关联。它可以处理高维数据,并且可以识别变量之间的非线性关系。

然而,它是无方向的,这意味着接近 1 的值仅表明两个变量之间存在强烈的相关性;它们并不表示相关性是正还是负。换句话说,在将每个变量的范围划分为一组箱之后,将计算每个箱内两个变量之间的相互信息。然后,通过在所有箱中获取最大相互信息值来估计两个变量之间的关联强度。

让我们看一个实际的例子,展示了 MIC 在检测非线性关系方面的优势。以下示例模拟了两个波形序列(正弦和余弦)。直觉上,从图 3-17 中看,似乎两者之间存在滞后-领先关系。

图 3-17. 显示非线性关系形式的两个波形系列

下面的 Python 代码片段创建了两个时间序列并绘制了图 3-17:

# Importing the required libraries
import numpy as np
import matplotlib.pyplot as plt
# Setting the range of the data
data_range = np.arange(0, 30, 0.1)
# Creating the sine and the cosine waves
sine = np.sin(data_range)
cosine = np.cos(data_range)
# Plotting
plt.plot(sine, color = 'black', label = 'Sine Function')
plt.plot(cosine, color = 'grey', linestyle = 'dashed', 
         label = 'Cosine Function')
plt.grid()
plt.legend()

现在的任务是计算三种相关性度量并分析它们的结果。为了简化起见,本节将省略代码,并在第六章中分享,因为首先需要了解 Python 中的一些内容。结果如下:

Correlation | Pearson:  0.035
Correlation | Spearman:  0.027
Correlation | MIC: 0.602

让我们解释一下结果:

  • Pearson 相关性: 注意到这里没有任何类型的相关性,因为它未能捕捉到非线性关联。

  • Spearman 等级相关性: 同样的情况也适用于这里,相关性非常弱。

  • MIC: 该指标显示了两者之间 0.60 的强关系,更接近实际情况。MIC 表明这两个波形有着强有力的非线性关系。

如果正确使用,MIC 在经济分析、金融分析甚至发现交易信号中非常有用。在这些复杂领域中非线性关系非常丰富,能够检测到它们可能会提供相当大的优势。

注意

本节的关键要点如下:

  • 相关性是用于计算变量之间线性关系程度的一个度量。它是一个介于–1.0 和 1.0 之间的数字,–1.0 表示变量之间有强烈的负相关关系,而 1.0 表示有强烈的正相关关系。

  • 有两种主要类型的相关性:Spearman 等级相关性和 Pearson 相关性。它们各自有其优点和局限性。

  • 自相关是变量与其自身滞后值的相关性。例如,如果沃尔玛股票收益的自相关是正的,则表示趋势配置。

  • 当你使用适当的工具,例如 MIC 时,相关度测量也可以指代非线性关系。

平稳性的概念

在统计分析和机器学习中,平稳性是一个关键概念。平稳性发生在时间序列的统计特征(均值、方差等)随时间保持不变的情况下。换句话说,当在时间轴上绘制数据时,没有可识别的趋势。

不同的学习模型依赖于数据的平稳性,因为这是统计建模的基础之一,这主要是为了简化。在金融领域,价格时间序列不是平稳的,因为它们显示出具有变化方差(波动性)的趋势。看看图 3-18,看看你能否检测到趋势。你认为这个时间序列是平稳的吗?

图 3-18. 具有随时间变化的均值的模拟数据

自然地,答案是否定的,因为一个上升的趋势正在明显进行中。这种状态对统计分析和机器学习来说是不可取的。幸运的是,您可以对时间序列应用转换使其平稳。但首先,让我们看看如何通过数学方式检查平稳性,因为视觉方式并不能证明任何事情。解决数据平稳性问题的正确方法是按照以下步骤进行:

  1. 使用您将在本节中看到的不同统计测试检查平稳性。

  2. 如果测试显示数据平稳,您就可以使用数据进行算法处理。如果测试显示数据不是平稳的,则必须进行第三步。

  3. 从前一个值中减去每个值(对值进行差分)。

  4. 使用相同的测试重新检查新转换的数据的平稳性。

  5. 如果测试显示数据平稳,那么您已成功转换了您的数据。否则,请重新进行转换并再次检查,直到您获得平稳的数据。

注意

升序或降序的时间序列在时间上具有变化的均值和方差,因此很可能是非平稳的。当然,也有例外情况,稍后您将了解原因。

记住,平稳性的目标是随时间稳定和恒定的均值和方差。因此,当您看 Figure 3-19 时,您可以推断出什么?

图 3-19。模拟数据在时间上的均值约为零

从视觉上看,数据看起来没有趋势,而且看起来围绕着稳定的均值波动,其方差也在稳定的均值附近变化。第一印象是数据是平稳的。当然,这必须通过统计测试来证明。

第一个也是最基本的测试是 增强的迪基—富勒(ADF)测试。这是使用假设检验来检验平稳性的。

ADF 测试搜索数据中的单位根。单位根是非平稳数据的属性,在时间序列分析的背景下,它指的是一种随机过程的特征,其中系列的根等于 1。简单来说,这意味着其统计特性,如均值和方差,会随时间变化。这是你需要知道的:

  • 零假设假设存在单位根。这意味着,如果您试图证明数据是平稳的,您需要拒绝零假设(如“抽样与假设检验”所示)。

  • 因此,备择假设是不存在单位根且数据具有平稳性。

  • 从测试中获得的 p 值必须小于选择的显著性水平(在大多数情况下,为 5%)。

让我们来测试美国 CPI 年同比数据的平稳性。以下代码片段使用 ADF 测试检查平稳性:

# Importing the required library
from statsmodels.tsa.stattools import adfuller
# Applying the ADF test on the CPI data
print('p-value: %f' % adfuller(cpi)[1])

代码的输出如下:

p-value: 0.0152

假设 5%显著水平,看起来可以接受同比数据是平稳的(然而,如果你想更严格,使用 1%显著水平,那么 p 值表明数据是非平稳的)。无论如何,即使看图表也可能让你百思不得其解。请记住,在 Figure 3-11 中,美国 CPI 的年度变化似乎是稳定的,但并不像平稳数据。这就是为什么需要使用数值和统计测试的原因。

现在,让我们对美国 CPI 的原始数据应用代码,而不是考虑同比变化。以下是代码:

# Creating a dataframe and downloading the CPI data
cpi = pdr.DataReader('CPIAUCSL', 'fred', start_date, end_date)
# Applying the ADF test on the CPI data
print('p-value: %f' % adfuller(cpi)[1])

代码的输出如下:

p-value: 0.999

显然,p 值大于所有显著水平,这意味着时间序列是非平稳的。让我们总结一下这些结果:

  • 看起来在涉及美国 CPI 数据的同比变化时,可以在 5%显著水平下拒绝零假设。数据集被假定为平稳。

  • 看起来当涉及美国 CPI 数据的原始值时,无法在 5%显著水平下拒绝零假设。数据集被假定为非平稳。

当你绘制美国 CPI 数据的原始值时,如图 Figure 3-20 所示,这变得显而易见。

图 3-20. 美国 CPI 数据的绝对值显示出明显的趋势性质

另一个你必须了解的测试是Kwiatkowski–Phillips–Schmidt–Shin(KPSS)测试,这也是一个用于确定时间序列是平稳还是非平稳的统计测试。然而,KPSS 测试可以检测到趋势时间序列中的平稳性,使其成为一个强大的工具。

趋势时间序列实际上可以在其具有稳定均值的条件下是平稳的。

警告

ADF 测试的零假设认为序列是非平稳的,备择假设则认为序列是平稳的。KPSS 测试的零假设认为序列是平稳的,备择假设则认为序列是非平稳的。

在分析通胀数据之前,让我们看看趋势时间序列如何可以是平稳的。记住,平稳性指的是稳定的均值和标准差,因此如果某种方式你有一个逐渐上升或下降的时间序列,但具有稳定的统计特性,它可能是平稳的。下一个代码片段模拟了一个正弦波然后为其添加了一点趋势:

# Importing the required libraries
import numpy as np
import matplotlib.pyplot as plt
# Creating the first time series using sine waves
length = np.pi * 2 * 5
sinewave = np.sin(np.arange(0, length, length / 1000))
# Creating the second time series using trending sine waves
sinewave_ascending = np.sin(np.arange(0, length, length / 1000))
# Defining the trend variable
a = 0.01
# Looping to add a trend factor
for i in range(len(sinewave_ascending)): 
    sinewave_ascending[i] = a + sinewave_ascending[i]
    a = 0.01 + a

如图 Figure 3-21 所示,绘制两个序列表明趋势正弦波似乎是稳定的。但让我们通过统计测试来证明这一点。

图 3-21. 模拟具有趋势正弦波的正常正弦波序列

Figure 3-21 是使用以下代码生成的(确保你已经使用前面的代码块定义了系列):

# Plotting the series
plt.plot(sinewave, label = 'Sine Wave', color = 'black')
plt.plot(sinewave_ascending, label = 'Ascending Sine Wave', 
         color = 'grey')
plt.grid()
plt.legend()
plt.show()

让我们分别对这两个序列进行 ADF 测试,看看结果如何:

# ADF testing | Normal sine wave
print('p-value: %f' % adfuller(sinewave)[1])
# ADF testing | Ascending sine wave
print('p-value: %f' % adfuller(sinewave_ascending)[1])

输出如下:

p-value: 0.000000 # For the sine wave
p-value: 0.989341 # For the ascending sine wave

显然,ADF 检验与趋势市场不能平稳的观点一致。但是 KPSS 检验呢?以下代码使用 KPSS 检验在同一数据上检查平稳性:

# Importing the KPSS library
from statsmodels.tsa.stattools import kpss
# KPSS testing | Normal sine wave
print('p-value: %f' % kpss(sinewave)[1])
# KPSS testing | Ascending sine wave
print('p-value: %f' % kpss(sinewave_ascending)[1])
# KPSS testing while taking into account the trend | Ascending sine wave
print('p-value: %f' % kpss(sinewave_ascending, regression = 'ct')[1])
`''' The 'ct' argument is used to check if the dataset is stationary  around a trend. By default, the argument is 'c' which is used to check if the data is stationary around a constant. '''`

输出如下:

p-value: 0.10 # For the sine wave
p-value: 0.01 # For the ascending sine wave without trend consideration
p-value: 0.10 # For the ascending sine wave with trend consideration

请记住,KPSS 检验的零假设是数据是平稳的;因此,如果 p 值大于显著性水平,则认为数据是平稳的,因为不能拒绝零假设。

当考虑趋势时,KPSS 统计量表明上升的正弦波是一个平稳时间序列。这是如何在趋势时间序列中找到平稳数据的基本示例。

让我们测试美国 CPI 年度数据的平稳性。以下代码片段使用 KPSS 检验检查平稳性:

# Applying the KPSS (no trend consideration) test on the CPI data
print('p-value: %f' % kpss(cpi)[1])
# Applying the KPSS (with trend consideration) test on the CPI data
print('p-value: %f' % kpss(cpi, regression = 'ct')[1])

代码的输出如下:

p-value: 0.010000 # without trend consideration
p-value: 0.010000 # with trend consideration

看起来 KPSS 检验的结果与 ADF 检验的结果相矛盾。这种情况可能会时有发生,差分可能会解决这个问题(请注意,年度数据已经是从绝对 CPI 值差分得来的时间序列,但有些时间序列可能需要多次差分才能变得平稳,而这也取决于差分的期间)。在这种情况下,最安全的解决方案是再次转换数据。

在完成关于平稳性的本节之前,让我们讨论一个复杂的主题,您将在第九章中看到它的实际应用。转换数据可能会导致异常的记忆丢失问题。在他的书籍《金融机器学习进展》(Wiley)中,Marcos López de Prado 提出了一种称为分数阶差分的技术,旨在使数据保持平稳同时保留一些记忆。

当一个非平稳时间序列进行差分以使其平稳时,会发生记忆丢失,这另一种说法是值之间的自相关显著降低,从而移除趋势成分和基础资产的 DNA。原始序列中的差分程度和自相关结构的持久性决定了记忆丢失的程度。

注意

本节的关键要点如下:

  • 平稳性是指时间内稳定的均值和方差的概念。这是一个期望的特征,因为大多数机器学习模型依赖于此。

  • 金融价格时间序列很可能是非平稳的,并且需要进行一阶差分以使其变得平稳并准备好进行统计建模。有些甚至可能需要进行二阶转换才能变得平稳。

  • ADF 和 KPSS 检验检查数据的平稳性,后者能够检查趋势数据的平稳性。

  • 趋势数据可能是平稳的。尽管这种特征很少见,但 KPSS 检验可以检测到平稳性,而 ADF 检验则不能。

回归分析与统计推断

描述性统计描述数据并尽可能多地从中提取信息,而推断统计使用数据或数据样本进行推断(预测)。统计推断中的主要工具是线性回归。

线性回归是你在本书中将在第七章看到的基本机器学习算法之一,当我们讨论其他机器学习算法时,我们将简要讨论回归分析。线性回归方程的最基本形式如下所示:

y = α + β x + ϵ

  • y 是因变量;这是你想要预测的内容。

  • x 是自变量;这是你用作输入来预测y的内容。

  • α 是因变量在独立变量等于零时的期望值。

  • β 表示独立变量每单位变化对因变量的影响。

  • ϵ 是残差或未解释的变化

基本的线性回归方程说明,一个因变量(你想要预测的内容)由一个常数、一个经过调整的敏感变量以及一个残差(用于解释未解释的变化)来解释。参考表 3-3。

表 3-3. 给定x预测y

yx
10049
20099
300149
400199
?249

预测给定x时预测y的线性方程如下所示:

y i = 2 + 2 x i

因此,给定x=249 时的最新y应该是 500:

y i = 2 + 2 x i = 2 + ( 2 × 249 ) = 500

注意线性回归如何完美捕捉到两个变量之间的线性关系,因为没有残差(未解释的变化)。当线性回归完美捕捉到两个变量之间的关系时,这意味着它们的坐标点在x轴上完美对齐成一条线性线。

多元线性回归可以采用以下形式:

y i = α + β 1 x 1 + . . . + β n x n + ϵ i

这基本上意味着因变量y可能受到多个变量的影响。例如,如果你想估计房价,可能需要考虑房间数量、面积、社区以及可能影响价格的任何其他变量。同样,如果你想预测商品价格,可能需要考虑不同的宏观经济因素、汇率以及任何其他的备选数据。

理解每个变量指代的内容非常重要。线性回归有一些假设:

线性关系

因变量与自变量之间的关系应该是线性的,意味着平面上的一条直线可以描述这种关系。在处理复杂变量时,这在现实生活中很少见。

变量的独立性

观察值应该彼此独立,意味着一个观察值的值不会影响另一个观察值的值。

同方差性

残差的方差(因变量的预测值与实际值之间的差异)应在所有独立变量的所有水平上保持恒定。

残差的正态性

残差应呈正态分布,意味着大多数残差接近零,并且分布是对称的。

在多元线性回归的情况下,你可以添加一个新的假设:多重共线性的缺失。独立变量不应高度相关;否则,这可能会使确定每个独立变量对因变量的独特影响变得困难。换句话说,这可以防止冗余。

注意

本节的关键要点如下:

  • 线性回归是推断统计学领域的一部分,它是描述变量之间关系的线性方程。

  • 线性回归解释并预测遵循一个方程,当你训练过去的数据并期望关系在未来保持时获得。

总结

能够进行数据分析对于部署正确的算法以便你可以预测时间序列的未来值至关重要。通过来自统计学世界的大量工具来理解数据。确保你理解什么是平稳性和相关性,因为它们提供了极有价值的建模见解。

¹ 还有其他方式,但这两种方式是最受欢迎的表示形式。

² David N. Reshef 等人,“在大数据集中检测新的关联”,Science 334, no. 6062 (2011 年 12 月): 1518-24。