机器学习算法交易教程第二版(九)
原文:
zh.annas-archive.org/md5/a3861c820dde5bc35d4f0200e43cd519译者:飞龙
第二十三章:结论和下一步
我们这本书的目标是让你能够将机器学习(ML)应用于各种数据源,并提取信号,为交易策略增加价值。为此,我们对投资过程采取了更全面的视角,从构思到策略评估,并引入了机器学习作为该过程的一个重要元素,以ML4T 工作流的形式。
在展示了从基础到高级的广泛范围的机器学习算法的使用时,我们看到了机器学习如何在设计、测试和执行策略的过程中的多个步骤中添加价值。然而,在很大程度上,我们着重于核心机器学习价值主张,即从比人类专家能够系统地从更大量的数据中提取可操作信息的能力。
这个价值主张随着数字数据的爆炸而真正获得了流行,数字数据使得利用计算能力从越来越多样化的信息集中提取价值变得更有前景和必要。然而,机器学习的应用仍然需要大量的人为干预和领域专业知识来定义目标、选择和筛选数据、设计和优化模型,并适当地利用结果。
用于交易机器学习的领域特定方面包括金融数据的性质和金融市场的环境。当信噪比通常很低时,使用具有高学习能力的强大模型需要特别小心以避免过度拟合。此外,交易的竞争性意味着模式迅速演变,因为信号衰减,需要额外关注性能监控和模型维护。
在这个总结性章节中,我们将简要总结本书中学到的关键工具、应用和经验教训,以避免在如此多的细节之后失去大局观。然后,我们将确定一些我们没有涉及但对你扩展我们介绍的许多机器学习技术并在日常使用中变得高效是值得关注的领域。
总之,在本章中,我们将:
-
回顾关键收获和经验教训
-
指出建立在本书技术基础上的下一步
-
建议将机器学习纳入你的投资过程中的方法
关键收获和经验教训
本书的一个核心目标是演示使用机器学习从数据中提取信号以指导交易策略的工作流程。图 23.1 概述了这个用于交易的机器学习工作流程。本节总结的关键收获与我们在构建针对金融市场大型数据集的复杂预测模型时遇到的具体挑战相关:
图 23.1:利用机器学习进行交易的关键要素
在进行交易机器学习实践时需要牢记以下重要见解:
-
数据是唯一最重要的要素,需要仔细的采集和处理。
-
领域专业知识是实现数据价值和避免使用机器学习中一些陷阱的关键。
-
机器学习提供了您可以调整和组合以创建解决方案的工具。
-
模型目标和性能诊断的选择对于朝着最佳系统进行有效迭代至关重要。
-
回测过度拟合是一个需要引起重视的巨大挑战。
-
黑盒模型的透明度可以帮助建立信心并促进怀疑论者对机器学习的接受。
我们将对这些想法稍作详细阐述。
数据是唯一最重要的要素
机器学习在交易和其他领域的崛起在很大程度上补充了我们详细讨论的数据爆炸。我们在第二章,市场和基本数据-来源和技术中阐述了如何访问和处理这些数据来源,历来是量化投资的支柱。在第三章,金融替代数据-类别和用例中,我们提出了一个评估替代数据潜在价值的标准框架。
一个关键的洞察是,像深度神经网络这样的最先进的机器学习技术之所以成功,是因为它们的预测性能随着更多数据的使用而持续改进。另一方面,模型和数据复杂性需要匹配以平衡偏差-方差权衡,这在数据的噪声与信号比越高时变得更具挑战性。管理数据质量和整合数据集是实现潜在价值的关键步骤。
新的石油?原始和中间数据的质量控制
就像石油一样,这些天一个常见的比较,数据从其原始形式通过多个阶段的管道流向可以为交易策略提供动力的精炼产品。对最终产品质量的仔细关注对于获得所期望的效益至关重要。
有时,您会获得原始形式的数据并控制所需的众多转换。更常见的情况是,您处理一个中间产品,并应明确此时数据到底测量了什么。
与石油不同,随着数据来源的不断增加,通常没有客观的质量标准。相反,质量取决于其信号内容,而信号内容又取决于您的投资目标。对新数据集的成本效益评估需要一个高效的工作流程,包括我们稍后将讨论的适当基础设施。
数据整合-整体大于部分之和
投资策略的数据价值往往取决于结合市场、基本面和替代数据的互补来源。我们看到,机器学习算法(如基于树的集成或神经网络)的预测能力部分是由于它们能够检测到非线性关系,特别是变量之间的相互作用效应。
调节变量影响的能力作为其他模型特征的函数取决于捕获目标结果不同方面的数据输入。资产价格与宏观基本面、社会情绪、信用卡支付和卫星数据的结合可能会产生更可靠的预测,比单独使用每个来源要可靠得多(前提是数据量足够大以学习隐藏的关系)。
多来源数据的处理增加了正确标记的挑战。准确分配能够准确反映历史出版的时间戳至关重要。否则,通过在数据实际可用之前使用算法进行测试,我们引入了前瞻性偏差。例如,第三方数据可能具有需要调整以反映信息实际对于实时算法而言可用的时间戳。
领域专业知识 - 区分信号和噪音
我们强调,信息丰富的数据是成功的机器学习应用的必要条件。然而,领域专业知识同样至关重要,用于定义战略方向、选择相关数据、构建信息丰富的特征以及设计健壮的模型。
在任何领域,从业者都对关键结果的驱动因素和它们之间的关系有着自己的理论。金融领域以大量的可用数量研究为特点,包括理论和实证研究。然而,马科斯·洛佩斯·德·普拉多和其他人(科克兰 2011)批评了大多数实证结果:基于普遍的数据挖掘得出的数百个变量中发现预测信号的声明往往不具有抗干扰性,并且不适应实验设置的变化。换句话说,统计显著性往往是大规模的试错而不是真正的系统关系的结果,这与“如果你折磨数据足够长时间,它就会招供”的说法相一致。
一方面,人们对金融市场的运作方式有着深入的理解。这应该为数据的选择和使用以及依赖机器学习的策略的理论提供支持。一个重要的原因是优先考虑更有可能成功的想法,并避免导致不可靠结果的多重测试陷阱。我们在第四章,金融特征工程 - 如何研究 Alpha 因子,以及第五章,投资组合优化和绩效评估中概述了关键想法。
另一方面,新颖的机器学习技术可能会发现有关金融结果驱动因素的新假设,这将为理论提供信息,并应进行独立测试。
除了原始数据外,特征工程通常是使信号对算法有用的关键。利用几十年来对推动理论和实证收益的风险因素的研究是优先考虑更可能反映相关信息的数据转换的良好起点。
然而,只有创造性的特征工程才能产生能够随时间在市场上竞争的创新策略。即使对于新的 Alpha 因子,一个能够解释它们如何运作的引人注目的叙述,考虑到市场动态和投资者行为的已建立的观念,也将为资本配置提供更多的信心。
由于假发现和过度拟合的风险使得在测试之前优先考虑策略变得更加必要,而不是“听任数据说话”。我们在第七章,线性模型 - 从风险因素到收益预测中介绍了如何调整夏普比率,以考虑实验的数量。
ML 是解决数据问题的工具包
ML 提供了可以应用于许多用例的算法解决方案和技术。本书的第 2、3和4部分介绍了 ML 作为一套多样化工具,可以为策略过程的各个步骤增加价值,包括:
-
想法生成和 Alpha 因子研究
-
信号聚合和投资组合优化
-
策略测试
-
交易执行
-
策略评估
此外,ML 算法被设计为进一步发展、适应和组合,以解决不同背景下的新问题。因此,除了能够将其应用于数据进行富有成效的实验和研究之外,了解这些算法背后的关键概念和思想也很重要,这在第六章,机器学习流程中有所阐述,并在图 23.2中进行了总结:
图 23.2:ML 工作流程
此外,最佳结果通常是通过人在环路解决方案实现的,这些解决方案将人类与 ML 工具结合起来。在第一章,从想法到执行的交易机器学习中,我们介绍了量化基本面投资风格,其中酌情性和算法交易相结合。这种方法可能会变得更加重要,并依赖于灵活和创造性地应用我们介绍的基本工具及其对各种数据集的扩展。
模型诊断有助于加快优化速度
在第六章,机器学习流程中,我们概述了最重要的 ML 特定概念。ML 算法通过对功能形式进行假设来学习输入数据和目标之间的关系。如果学习基于噪声而不是信号,预测性能将受到影响。
当然,我们今天并不知道如何从明天的结果的角度分离信号和噪音。谨慎的交叉验证可以避免前瞻偏差,而健壮的模型诊断,如学习曲线和优化验证测试,则可以帮助缓解这一基本挑战,并校准算法的选择或配置。通过定义专注的模型目标,以及对于复杂模型,区分由于优化算法问题和目标本身而导致的性能缺陷,可以使这项任务变得更加容易。
没有免费午餐
没有系统,无论是计算机程序还是人类,都无法可靠地预测超出其在训练过程中观察到的新示例的结果。唯一的出路是具有一些额外的先验知识或做出超出训练示例的假设。我们在本书的第七章中涵盖了从线性模型到非线性集成模型的广泛算法,线性模型-从风险因素到回报预测,以及在本书第十一章,随机森林-一种日本股票的长短策略,以及第十二章,提升您的交易策略,以及本书第四部分的各个章节中的神经网络。
我们看到线性模型做出了一个强烈的假设,即输入和输出之间的关系具有非常简单的形式,而非线性模型如梯度提升或神经网络旨在学习更复杂的函数。虽然很明显简单的模型在大多数情况下会失败,但复杂的模型并不总是更好。如果真实关系是线性的,但数据有噪音,那么复杂模型将学习将噪音作为其假定存在的复杂关系的一部分。这就是**"没有免费午餐"定理**的基本思想,它指出没有一种算法在所有任务中都是普遍优越的。在某些情况下良好的拟合会以其他地方性能不佳为代价。
用于调整算法选择的关键工具是数据探索和基于对模型做出的假设的理解进行的实验。
管理偏差-方差权衡
在调整算法以适应数据时的一个关键挑战是偏差和方差之间的权衡,它们都会使预测误差超出数据的自然噪声。一个简单的模型如果不能充分捕捉数据中的关系,将会出现欠拟合并表现出偏差,即会产生系统性错误的预测。一个过于复杂的模型会过拟合并学习噪音,除了信号之外,还会显示出不同样本的很大方差。
在模型选择和优化过程的任何给定迭代中,诊断这种权衡的关键工具是学习曲线。它显示训练和验证误差如何取决于样本大小。这使我们能够在不同选项之间做出决策以提高性能:调整模型的复杂度或获取更多数据点。
训练误差越接近人类表现或另一个基准,模型过度拟合的可能性就越大。低验证误差告诉我们我们很幸运找到了一个好模型。如果验证错误率高,我们没有。然而,如果随着训练规模的增加而持续下降,则可能需要更多数据。如果训练误差高,更多数据不太可能有所帮助,我们应该添加特征或使用更灵活的算法。
定义目标模型目标
机器学习过程中的第一步之一是定义算法要优化的目标。有时,选择很简单,比如在回归问题中。分类任务可能更困难,例如,当我们关心精确率和召回率时。将冲突的目标整合成一个单一指标,如 F1 分数,有助于集中优化工作。我们还可以包括需要满足的条件而不是优化的条件。我们还看到,强化学习完全取决于定义正确的奖励函数来指导代理的学习过程。
优化验证测试
安德鲁·吴强调了由学习算法或优化算法问题导致的性能不足之间的区别。像神经网络这样的复杂模型假设非线性关系,并且优化算法的搜索过程可能会导致局部最优而不是全局最优。
如果模型未能正确翻译一个短语,例如,测试会比较正确预测的分数和搜索算法发现的解决方案的分数。如果学习算法为正确解决方案打分更高,则需要改进搜索算法。否则,学习算法正在优化错误的目标。
谨防回测过度拟合
我们在整本书中反复讨论了由于过度拟合历史数据而产生的虚假发现的风险。第五章,投资组合优化和绩效评估,关于策略评估,概述了主要驱动因素和潜在的解决方案。与网络规模的图像或文本数据相比,低信噪比和相对较小的数据集(与网络规模的图像或文本数据相比)使得这一挑战在交易领域尤为严重。意识到这一点至关重要,因为数据的易获得性和应用机器学习的工具增加了风险。
没有简单的答案,因为风险是不可避免的。然而,我们提出了调整回测指标以考虑重复试验的方法,例如调整后的夏普比率。当努力实现实时交易策略时,分阶段的模拟交易和在市场执行过程中密切监控的绩效需要成为实施过程的一部分。
如何从黑盒模型中获得见解
深度神经网络和复杂集成模型可能会引起怀疑,因为它们被视为不可解释的黑盒模型,特别是在回测过拟合风险的背景下。我们在第十二章《提升您的交易策略》中介绍了几种方法,以了解这些模型是如何进行预测的。
除了传统的特征重要性度量之外,最近的博弈论创新SHapley Additive exPlanations(SHAP)是理解复杂模型机制的重要一步。SHAP 值允许精确地将特征及其值归因于预测,从而更容易在特定理论下验证模型的逻辑,以针对给定的投资目标理解市场行为。除了解释外,准确的特征重要性评分和预测归因还可以深入洞察投资结果的驱动因素。
另一方面,围绕模型预测透明度的重要性存在一些争议。深度学习的发明者之一 Geoffrey Hinton 认为,人类决策的原因经常是模糊的。也许机器应该根据其结果进行评估,就像我们对待投资经理一样。
实践中的交易 ML
随着您将众多工具和技术整合到投资和交易流程中,有许多方面可以成为您努力的焦点。如果您的目标是做出更好的决策,您应选择与您当前技能集相符合但又雄心勃勃的项目。这将帮助您开发一个以高效工具为支撑的工作流程,并获得实践经验。
我们将简要列出一些有助于扩展本书所涵盖的 Python 生态系统的工具。它们包括大数据技术,最终将成为规模实施基于 ML 的交易策略所必需的。我们还将列出一些允许您使用 Python 实施交易策略的平台,可能会提供对数据源、ML 算法和库的访问。最后,我们将指出采用 ML 作为组织的良好实践。
数据管理技术
数据在 ML4T 过程中的核心作用需要熟悉一系列技术,以便在规模化地存储、转换和分析数据,其中包括使用云服务,如亚马逊云服务、微软 Azure 和谷歌云。
数据库系统
数据存储意味着使用数据库。从历史上看,这些通常是使用 SQL 以良好定义的表格式存储和检索数据的关系数据库管理系统(RDBMSes)。这些数据库包括来自商业提供商如 Oracle 和 Microsoft 以及开源实现如 PostgreSQL 和 MySQL 的数据库。最近,出现了非关系型的替代方案,通常被统称为 NoSQL,但其种类千差万别,包括:
-
键值存储:快速读/写访问对象。我们在第二章,市场和基本数据 - 来源和技术中介绍了 HDF5 格式,它可以方便快速访问 pandas DataFrame。
-
列存储:利用列中数据的同质性以促进压缩和更快的基于列的操作,如聚合。这在流行的亚马逊 Redshift 数据仓库解决方案中使用,以及 Apache Parquet、Cassandra 和 Google 的 Big Table 中使用。
-
文档存储:旨在存储不符合关系数据库所需的严格模式定义的数据。这在使用 JSON 或 XML 格式的 Web 应用程序中很受欢迎,在第四章,金融特征工程 - 如何研究 Alpha 因子中我们遇到了它。例如,它在 MongoDB 中使用。
-
图数据库:设计用于存储具有节点和边缘的网络,并专门用于查询有关网络指标和关系的查询。它在 Neo4J 和 Apache Giraph 中使用。
已经有一些趋同于关系数据库系统建立的惯例。Python 生态系统便于与许多标准数据源进行交互,并提供快速的 HDF5 和 Parquet 格式,正如本书中所示。
从 Hadoop 到 Spark 的大数据技术
数百吉字节及以上规模的数据管理需要使用多台形成集群的机器并行进行读取、写入和计算操作。换句话说,您需要一个在多台机器上以集成方式运行的分布式系统。
Hadoop 生态系统已成为一个开源软件框架,用于使用 Google 开发的 MapReduce 编程模型对大数据进行分布式存储和处理。该生态系统已在 Apache 基金会的支持下多样化发展,今天包括许多涵盖大规模数据管理不同方面的项目。
Hadoop 中的关键工具包括:
-
Apache Pig:一种数据处理语言,由 Yahoo 开发,用于使用 MapReduce 实现大规模提取-转换-加载(ETL)管道。
-
Apache Hive:针对 PB 级数据的交互式 SQL 查询的事实标准。它是在 Facebook 开发的。
-
Apache HBASE:一种用于实时读/写访问的 NoSQL 数据库,可线性扩展到数十亿行和数百万列。它可以使用各种不同的模式组合数据源。
Apache Spark 已成为集群上交互式分析最流行的平台。MapReduce 框架允许并行计算,但需要重复从磁盘读取/写入操作以确保数据冗余。由于弹性分布式数据(RDD)结构,Spark 已经极大地加速了规模化的计算,这种结构允许高度优化的内存计算。这包括对优化所需的迭代计算,例如,对于许多机器学习算法的梯度下降。幸运的是,Spark DataFrame 接口是以 pandas 为目标设计的,因此你的技能相对顺利地转移。
机器学习工具
我们在本书中涵盖了 Python 生态系统的许多库。Python 已经发展成为数据科学和机器学习的首选语言。开源库的集合不断多样化和成熟,构建在强大的科学计算库 NumPy 和 SciPy 的稳健核心之上。
流行的 pandas 库在推广 Python 用于数据科学方面做出了重大贡献,并且随着 2020 年 1.0 版本的发布而逐渐成熟。scikit-learn 接口已成为现代专业机器学习库(如 XGBoost 或 LightGBM)的标准,这些库通常与工作流自动化工具(如 GridSearchCV 和 Pipeline)进行交互,而我们在整本书中已经多次使用过。
有几个提供简化机器学习工作流程的供应商:
-
H2O.ai 提供了与 ML 自动化集成的 H2O 平台。它允许用户将数千个潜在模型拟合到其数据中,以探索数据中的模式。它在 Python、R 和 Java 中都有接口。
-
Datarobot 旨在通过提供一个平台来快速构建和部署云端或本地的预测模型,自动化模型开发过程。
-
Dataiku 是一个协作数据科学平台,旨在帮助分析师和工程师探索、原型设计、构建和交付自己的数据产品。
还有几个由公司领导的开源倡议,这些公司基于并扩展了 Python 生态系统:
-
量化对冲基金 TwoSigma 通过 BeakerX 项目为 Jupyter Notebook 环境贡献了量化分析工具。
-
Bloomberg 已将 Jupyter Notebook 集成到其终端中,以便于对其金融数据进行交互式分析。
在线交易平台
开发使用机器学习的交易策略的主要选项是在线平台,这些平台通常寻找并分配资金给成功的交易策略。流行的解决方案包括 Quantopian、Quantconnect 和 QuantRocket。较新的 Alpha Trading Labs 则专注于高频交易。此外,Interactive Brokers(IB) 提供了一个 Python API,你可以使用它来开发自己的交易解决方案。
Quantopian
我们介绍了 Quantopian 平台,并演示了如何使用其研究和交易环境来分析和测试交易策略与历史数据相比。Quantopian 使用 Python,并提供大量教育资料。
Quantopian 主办比赛,招募算法以构建其众包对冲基金投资组合。它为获胜算法提供资金支持。实时交易在 2017 年 9 月停止,但该平台仍提供大量历史数据,并吸引了活跃的开发者和交易者社区。这是一个讨论想法和从他人学习的良好起点。
QuantConnect
QuantConnect 是另一个开源的、社区驱动的算法交易平台,与 Quantopian 竞争。它还提供一个 IDE,用于使用 Python 和其他语言对算法策略进行回测和实时交易。
QuantConnect 还拥有来自世界各地的充满活力的全球社区,并提供对包括股票、期货、外汇和加密货币在内的众多资产类别的访问。它提供与各种经纪商的实时交易集成,例如 IB、OANDA 和 GDAX。
QuantRocket
QuantRocket 是一个基于 Python 的平台,用于研究、回测和运行自动量化交易策略。它提供数据收集工具、多个数据供应商、研究环境、多个回测引擎,以及通过 IB 进行实时和模拟交易。QuantRocket 以其支持国际股票交易而自豪,并以其灵活性脱颖而出(但 Quantopian 也在朝这个方向努力)。
QuantRocket 支持多种引擎——它自己的 Moonshot,以及用户选择的第三方引擎。虽然 QuantRocket 没有传统的集成开发环境(IDE),但与 Jupyter 的集成良好,可以产生类似的效果。QuantRocket 提供免费版本,可访问示例数据,但在 2020 年初写作时,访问更广泛的功能集的费用从每月 $29 起。
结论
我们首先强调了数字数据的爆炸增长和 ML 作为投资和交易策略的战略能力的出现。这种动态反映了金融之外的全球业务和技术趋势,并且更有可能持续而不是停滞或逆转。许多投资公司刚刚开始利用人工智能工具的范围,就像个人正在获得相关技能,业务流程正在适应这些新的创造价值机会一样,正如介绍章节所概述的那样。
未来还有许多令人兴奋的 ML 应用于交易的发展即将到来,可能会推动目前的动能。它们可能在未来几年变得相关,并包括 ML 过程的自动化、生成合成训练数据以及量子计算的出现。该领域的非凡活力意味着这本身就足以填满一本书,而旅程将继续保持令人兴奋的状态。
第二十四章:Alpha 因子库
在本书中,我们已经描述了如何从市场、基本和替代数据中提取特征,以构建 机器学习 (ML) 模型,为交易策略提供信号。特征的智能设计,包括适当的预处理和去噪,通常是实现有效策略的关键。本附录综合了关于特征工程的一些经验教训,并提供了有关这一重要主题的额外信息。
第四章,金融特征工程 - 如何研究 Alpha 因子,总结了学者和从业者长期以来努力识别有助于可靠预测资产回报的信息或变量。这项研究从单因素资本资产定价模型发展到了一个“新因子动物园”(Cochrane,2011)。因子动物园包含了自 1970 年以来 anomalies 文献中呈现的数百种公司特征和证券价格指标,被认为是股票回报的统计显著预测因子(参见 Green,Hand 和 Zhang,2017)的摘要。
第四章,金融特征工程 - 如何研究 Alpha 因子,按照它们所代表的基础风险将因子分类,以及投资者将在市场回报之上获得的奖励。这些类别包括价值与增长、质量和情绪,以及波动性、动量和流动性。在本书中,我们使用了众多指标来捕捉这些风险因素。本附录扩展了这些例子,并收集了流行指标,以便您将其用作策略开发的参考或灵感。它还向您展示如何计算这些指标,并包括一些评估这些指标的步骤。
为此,我们将重点放在 TA-Lib 实施的广泛指标范围上(参见 第四章,金融特征工程 - 如何研究 Alpha 因子)以及 101 Formulaic Alphas 论文(Kakushadze,2016)上,该论文呈现了实际量化交易因子的使用情况,平均持有期为 0.6-6.4 天。为了方便复制,我们将限制此次审查的指标,使其依赖于易于获取的市场数据。尽管存在这一限制,但潜在有用数据源和特征的广泛且迅速发展的范围意味着此概述远非全面。
在本章中,我们将使用 P[t] 表示资产在时间 t 的收盘价,V[t] 表示交易量。必要时,上标,如 或
,用于区分开盘、最高、最低或收盘价。r[t] 表示时间 t 的简单回报率。
和
分别指的是从 t-d 到 t 的价格和回报的时间序列。
TA-Lib 中实施的常见 alpha 因子
TA-Lib 库被广泛用于由交易软件开发人员执行金融市场数据的技术分析。它包括来自多个类别的 150 多种常用指标,范围从重叠研究,包括移动平均线和布林带,到统计函数,如线性回归。以下表格总结了主要类别:
| 函数组 | # 指标 |
|---|---|
| 重叠研究 | 17 |
| 动量指标 | 30 |
| 成交量指标 | 3 |
| 波动性指标 | 3 |
| 价格变换 | 4 |
| 周期指标 | 5 |
| 数学运算符 | 11 |
| 数学变换 | 15 |
| 统计函数 | 9 |
还有 60 多种旨在识别交易者常用的蜡烛图形式的函数,这些函数依赖于对图表的视觉检查。鉴于关于它们预测能力的混合证据(霍顿 2009 年;马歇尔、扬和罗斯 2006 年),以及使用本书中涵盖的 ML 算法从数据中学习此类模式的目标,我们将重点放在前面表中列出的类别上。具体来说,在本节中,我们将重点放在移动平均线、重叠研究、动量、成交量和流动性、波动性以及基本风险因素上。
查看笔记本common_alpha_factors以获取本节中的代码示例和有关 TA-Lib 指标的其他实现细节。我们将演示如何计算个别股票以及 2007 年至 2016 年期间交易量最大的 500 支美国股票样本的选定指标(请参阅笔记本sample_selection以准备这个较大数据集)。
一个关键的基本模块 - 移动平均线
许多指标允许使用不同类型的移动平均(MAs)进行计算。它们在平滑系列和对新发展的反应之间进行不同的权衡。您可以将它们用作自己指标的构建块,或者通过修改其构建中使用的 MA 类型来修改现有指标的行为,正如我们将在下一节中演示的那样。以下表格列出了可用的 MA 类型,用于计算它们的 TA-Lib 函数以及您可以传递给其他指标以选择给定类型的代码:
| 移动平均 | 函数 | 代码 |
|---|---|---|
| 简单 | SMA | 0 |
| 指数 | EMA | 1 |
| 加权 | WMA | 2 |
| 双指数 | DEMA | 3 |
| 三重指数 | TEMA | 4 |
| 三角形 | TRIMA | 5 |
| 考夫曼自适应 | KAMA | 6 |
| MESA 自适应 | MAMA | 7 |
在本节的其余部分,我们将简要概述它们的定义并可视化它们的不同行为。
简单移动平均
对于长度为N的窗口的价格系列P[t],在时间t的简单移动平均(SMA)对窗口内的每个数据点进行平均:
指数移动平均
对于长度为 N 的价格序列 P[t],在时间 t 的指数移动平均(EMA),记为 EMA[t],被递归地定义为当前价格和最近的前一个 EMA[t][-1] 的加权平均,其中权重为 和
,定义如下:
加权移动平均
对于长度为 N 的价格序列 P[t],在时间 t 的加权移动平均(WMA)被计算为使每个数据点的权重对应于其在窗口内的索引:
双重指数移动平均
对于时间 t 的价格序列 P[t] 的双重指数移动平均(DEMA),记为 DEMA[t],基于 EMA 设计得更快地对价格变化做出反应。它计算为当前 EMA 的两倍差异与应用于当前 EMA 的 EMA 之间的差异,标记为 :
由于计算使用了 EMA[2],DEMA 需要 个样本才能开始生成值。
三重指数移动平均
对于时间 t 的价格序列 P[t] 的三重指数移动平均(TEMA),记为 TEMA[t],也基于 EMA,但设计得更快地对价格变化做出反应,并指示短期价格走势。它计算为当前 EMA 与应用于当前 EMA 的三倍差异之间的三倍差异,标记为 EMA[2] 的差异,加上应用于 EMA[2] 的 EMA,标记为 EMA[3]:
由于计算使用了 EMA[3],DEMA 需要 个样本才能开始生成值。
三角形移动平均
对于时间 t 的价格序列 P[t] 的窗口长度为 N 的三角形移动平均(TRIMA),记为 TRIMA(N)[t],是最后 N 个 SMA(N)[t] 值的加权平均。换句话说,它将 SMA 应用于 SMA 值的时间序列:
考夫曼自适应移动平均
考夫曼自适应移动平均(KAMA)的计算旨在考虑市场波动性的变化。有关这种稍微复杂的计算的详细说明,请参见笔记本中的资源链接。
MESA 自适应移动平均
MESA 自适应移动平均(MAMA)是一种根据相位变化速率(由希尔伯特变换鉴别器测量,参见 TA-Lib 文档)调整到价格变动的指数移动平均。除了价格序列外,MAMA 还接受两个额外参数,fastlimit 和 slowlimit,用于控制在计算 MAMA 时应用于 EMA 的最大和最小 alpha 值。
移动平均的可视比较
图 A.1 说明了不同移动平均线在平滑时间序列和适应最近变化方面的行为差异。所有时间序列均计算为 21 天的移动窗口(有关详细信息和彩色图片,请参阅笔记本):
图 A.1:AAPL 收盘价的移动平均线比较
重叠研究 – 价格和波动趋势
TA-Lib 包括几个旨在捕捉近期趋势的指标,如下表所示:
| 函数 | 名称 |
|---|---|
| BBANDS | 布林带 |
| HT_TRENDLINE | 希尔伯特变换 – 瞬时趋势线 |
| MAVP | 可变周期移动平均线 |
| MA | 移动平均线 |
| SAR | 抛物线 SAR |
| SAREXT | 扩展抛物线 SAR |
MA 和 MAVP 函数是前文描述的各种移动平均线的包装器。我们将在本节中重点介绍一些示例;更多信息和可视化内容请参阅笔记本。
布林带
布林带将一个移动平均线与代表移动标准差的上下带相结合。我们可以通过提供输入价格系列、移动窗口的长度、上下带的乘数和移动平均线的类型来获得三个时间序列,如下所示:
s = talib.BBANDS(df.close, # No. of periods (2 to 100000)
timeperiod=20,
nbdevup=2, # Deviation multiplier for lower band
nbdevdn=2, # Deviation multiplier for upper band
matype=1) # default: SMA
对于 2012 年的 AAPL 收盘价格样本,我们可以如下绘制结果:
bb_bands = ['upper', 'middle', 'lower']
df = price_sample.loc['2012', ['close']]
df = df.assign(**dict(zip(bb_bands, s)))
ax = df.loc[:, ['close'] + bb_bands].plot(figsize=(16, 5), lw=1);
上述代码的结果如下图所示:
图 A.2:AAPL 2012 年收盘价的布林带
发明该概念的约翰·波林格还根据三条线与当前价格之间的关系定义了 20 多个交易规则(参见第四章,金融特征工程 – 如何研究阿尔法因子)。例如,外部带之间的距离较小意味着近期价格波动减少,这反过来被解释为未来更大的波动和价格变动。
我们可以通过形成上下带之间以及它们与收盘价之间的比率来标准化布林带的特定于安全性的值,如下所示:
fig, ax = plt.subplots(figsize=(16,5))
df.upper.div(df.close).plot(ax=ax, label='bb_up')
df.lower.div(df.close).plot(ax=ax, label='bb_low')
df.upper.div(df.lower).plot(ax=ax, label='bb_squeeze')
plt.legend()
fig.tight_layout();
下图显示了结果归一化的时间序列:
图 A.3:归一化的布林带指标
下面的函数可与 pandas 的 .groupby() 和 .apply() 方法一起使用,以计算 500 只股票的指标,如下所示:
def compute_bb_indicators(close, timeperiod=20, matype=0):
high, mid, low = talib.BBANDS(close,
timeperiod=20,
matype=matype)
bb_up = high / close -1
bb_low = low / close -1
squeeze = (high - low) / close
return pd.DataFrame({'BB_UP': bb_up,
'BB_LOW': bb_low,
'BB_SQUEEZE': squeeze},
index=close.index)
data = (data.join(data
.groupby(level='ticker')
.close
.apply(compute_bb_indicators)))
图 A.4 绘制了跨越 500 只股票的每个指标值的分布(在第 1 和第 99 百分位处截断,因此图中出现了尖峰):
图 A.4:归一化的布林带指标分布
抛物线 SAR
抛物线 SAR旨在识别趋势反转。它是一种趋势跟踪(滞后)指标,可用于设置跟踪止损或确定入场或退出点。通常,在价格图表中表示为靠近价格条的一组点。一般来说,当这些点位于价格上方时,表示向下趋势;当点位于价格下方时,表示向上趋势。点的方向变化可解释为交易信号。但是,在平盘或区间市场中,该指标的可靠性较低。其计算如下:
极值点(EP)是在每个趋势期间保留的记录,代表当前上涨趋势中达到的最高值或下跌趋势中的最低值。在每个周期内,如果观察到新的最大值(或最小值),则 EP 将使用该值进行更新。
α值代表加速因子,通常最初设置为 0.02。每当记录新的 EP 时,此因子增加α。然后,速率将加快,直至 SAR 收敛于价格。为了防止它变得太大,通常将加速因子的最大值设置为 0.20。
我们可以按以下方式计算和绘制样本收盘价序列:
df = price_sample.loc['2012', ['close', 'high', 'low']]
df['SAR'] = talib.SAR(df.high, df.low,
acceleration=0.02, # common value
maximum=0.2)
df[['close', 'SAR']].plot(figsize=(16, 4), style=['-', '--']);
上述代码生成以下图表:
图 A.5:AAPL 股价的抛物线 SAR
动量指标
第四章,金融特征工程 - 如何研究阿尔法因子,介绍了动量作为历史上表现最佳的风险因子之一,并列举了几个旨在识别相应价格趋势的指标。这些指标包括相对强弱指数(RSI),以及价格动量和价格加速度:
| 因子 | 描述 | 计算 |
|---|---|---|
| 相对强弱指数(RSI) | RSI 比较了股票近期价格变动的幅度,以识别股票是否处于超买或超卖状态。较高的 RSI(通常超过 70)表示超买,较低的 RSI(通常低于 30)表示超卖。首先,它分别计算过去给定数量(通常为 14)的交易日内上涨( | |
| 价格动量 | 该因子计算给定数量的前期交易日 d 的总回报。在学术文献中,通常使用最近 12 个月,除了最近一个月之外,因为经常观察到短期逆转效应。但是,也广泛使用较短的期间。 | |
| 价格加速度 | 价格加速度使用线性回归系数 |
TA-Lib 实现了 30 个动量指标;其中最重要的指标列在下表中。我们将介绍一些选定的示例;更多信息请参见笔记本 common_alpha_factors:
| 函数 | 名称 |
|---|---|
| PLUS_DM/MINUS_DM | 正/负方向运动 |
| PLUS_DI/MINUS_DI | 正/负方向指标 |
| DX | 方向运动指数 |
| ADX | 平均趋向指数 |
| ADXR | 平均趋向指数评级 |
| APO/PPO | 绝对/百分比价格振荡器 |
| AROON/AROONOSC | 阿隆/阿隆振荡器 |
| BOP | 力量平衡指数 |
| CCI | 商品通道指数 |
| CMO | Chande 动量振荡器 |
| MACD | 移动平均线收敛/发散 |
| MFI | 资金流指标 |
| MOM | 动量 |
| RSI | 相对强弱指数 |
| STOCH | 随机指标 |
| ULTOSC | 终极振荡器 |
| WILLR | 威廉指数 |
其中一些指标密切相关且相互构建,如下例所示。
平均趋向运动指标
平均趋向指数(ADX)结合了另外两个指标,即正向和负向方向指标(PLUS_DI 和 MINUS_DI),它们依次基于正向和负向方向运动(PLUS_DM 和 MINUS_DM)。有关更多细节,请参阅笔记本。
正/负方向运动
对于价格序列 P[t],其中每日最高价为 ,每日最低价为
,方向性运动跟踪时间段 T 内价格变动的绝对大小,计算方法如下:
我们可以计算并绘制 AAPL 股票 2012-13 年的 2 年价格序列的此指标:
df = price_sample.loc['2012': '2013', ['high', 'low', 'close']]
df['PLUS_DM'] = talib.PLUS_DM(df.high, df.low, timeperiod=10)
df['MINUS_DM'] = talib.MINUS_DM(df.high, df.low, timeperiod=10)
以下图形可视化了结果时间序列:
图 A.6:AAPL 股票价格的 PLUS_DM/MINUS_DM
正/负方向指数
PLUS_DI 和 MINUS_DI 分别是 PLUS_DM 和 MINUS_DM 的简单 MA,每个 MA 都除以平均真实范围(ATR)。有关更多细节,请参阅本章后面的波动性指标部分。
简单 MA 是在给定的周期内计算的。ATR 是真实范围的平滑平均。
平均趋向指数
最后,平均趋向指数(ADX)是绝对值的简单 MA,该值等于 PLUS_DI 和 MINUS_DI 之间的差异除以它们的和:
它的值在 0-100 范围内振荡,通常如下解释:
| ADX 值 | 趋势强度 |
|---|---|
| 0-25 | 不存在或弱趋势 |
| 25-50 | 强趋势 |
| 50-75 | 非常强趋势 |
| 75-100 | 极强趋势 |
我们按照之前的示例,为我们的 AAPL 样本系列计算 ADX 时间序列,如下所示:
df['ADX'] = talib.ADX(df.high,
df.low,
df.close,
timeperiod=14)
下图可视化了 2007-2016 年间的结果:
图 A.7:AAPL 股价系列的 ADX
阿隆振荡器
阿隆指标测量了一段时间内的高点之间的时间和低点之间的时间。它计算了 AROON_UP 和 AROON_DWN 指标,如下所示:
阿隆振荡器只是 AROON_UP 和 AROON_DOWN 指标之间的差异,它在 -100 到 100 的范围内移动,如下图所示为 AAPL 价格系列:
图 A.8:AAPL 股价系列的阿隆振荡器
买卖力道
买卖力道(BOP)旨在通过评估每一方对价格的影响来衡量市场上买方相对卖方的力量。它的计算方法是收盘价与开盘价之差除以最高价与最低价之差:
商品通道指数
商品通道指数(CCI)测量当前 典型 价格与历史平均价格之间的差异。典型价格由当前的最低、最高和收盘价的平均值计算而得。正(负)CCI 表示价格高于(低于)历史平均值。计算方法如下:
移动平均收敛差离
移动平均收敛差离(MACD)是一种非常流行的趋势跟踪(滞后)动量指标,显示了证券价格的两个 MAs 之间的关系。它的计算方法是从 26 日 EMA 中减去 12 日 EMA。
TA-Lib 实现返回 MACD 值及其信号线,即 MACD 的 9 日 EMA。此外,MACD-Histogram 衡量了指标与其信号线之间的距离。以下图表显示了结果:
图 A.9:AAPL 股价系列的三个 MACD 系列
随机相对强度指数
随机相对强度指数(StochRSI)基于本节开头描述的 RSI,并意图识别交叉点以及超买和超卖条件。它比较当前 RSI 到给定时间段 T 内最低 RSI 的距离,与 RSI 在此期间所假设的最大值范围。计算方法如下:
TA-Lib 实现比 Chande 和 Kroll(1993)的原始未平滑随机 RSI 版本提供了更多的灵活性。要计算原始指标,请保持 timeperiod 和 fastk_period 相等。
返回值fastk是未平滑的 RSI。 fastd_period用于计算平滑的 StochRSI,返回为fastd。如果您不关心 StochRSI 的平滑,请将fastd_period设置为 1,并忽略fasytd输出:
fastk, fastd = talib.STOCHRSI(df.close,
timeperiod=14,
fastk_period=14,
fastd_period=3,
fastd_matype=0)
df['fastk'] = fastk
df['fastd'] = fastd
图 A.10 绘制了收盘价以及平滑和未平滑的随机 RSI:
图 A.10:AAPL 股价的平滑和未平滑的 StochRSI 序列
随机振荡器
随机振荡器是一种动量指标,它将某一安全性的特定收盘价与一段时间内的价格范围进行比较。随机振荡器基于收盘价应该确认趋势的想法。对于随机(STOCH),有四条不同的线:K^(Fast)、D^(Fast)、K^(Slow)和D^(Slow)。 D是信号线,通常画在其对应的K函数上:
,
和
是过去
期的极端值。当使用相同周期时,
和
是等价的。我们得到以下图表中显示的序列,如下所示:
slowk, slowd = talib.STOCH(df.high,
df.low,
df.close,
fastk_period=14,
slowk_period=3,
slowk_matype=0,
slowd_period=3,
slowd_matype=0)
df['STOCH'] = slowd / slowk
图 A.11:AAPL 股价的 STOCH 序列
终极振荡器
终极振荡器(ULTOSC)衡量了当前收盘价与前三个时间框架的最低价之间的平均差异——默认值为 7、14 和 28——以避免对短期价格变动做出过度反应,并结合短期、中期和长期市场趋势。
首先计算买入压力 BP[t],然后将其在三个周期 T[1]、T[2]和 T[3]上归一化到真实范围(TR[t])上求和:
ULTOSC 然后按照以下方式计算为三个周期的加权平均值:
以下图表显示了此结果:
图 A.12:AAPL 股价的 ULTOSC 序列
威廉姆斯百分比 R
威廉姆斯百分比 R,也称为威廉姆斯百分比范围,是一个动量指标,其数值在 0 到-100 之间变动,用于衡量超买和超卖水平,以识别进入和退出点。它类似于随机振荡器,并将当前收盘价与过去T周期(通常为 14 个周期)内的最高价()和最低价(
)范围进行比较。指标计算如下,并且结果显示在以下图表中:
图 A.13:AAPL 股价的 WILLR 序列
交易量和流动性指标
专注于成交量和流动性的风险因素包括换手率、美元交易量或市值等指标。TA-Lib 实现了三个指标,其中前两个密切相关:
| 功能 | 名称 |
|---|---|
| AD | 蔡金 A/D 线 |
| ADOSC | 蔡金 A/D 振荡器 |
| OBV | 能量潮指标 |
还请参阅第二十章,用于条件风险因素和资产定价的自动编码器,在那里我们使用阿米胡德流动性指标来衡量绝对收益和美元交易量之间的滚动平均比率。
蔡金累积/分布线和振荡器
蔡金涨跌线(AD)或累积/分布(AD)线是一种基于成交量的指标,旨在衡量资产流入和流出的累积资金流量。该指标假设通过收盘价相对于周期内的最高价和最低价的位置来确定买入或卖出压力的程度。当股票收盘在周期范围的上半部分(下半部分)时,存在买入(卖出)压力。其目的是在指标与证券价格背离时发出方向变化的信号。
A/D 线是每个周期资金流量量(MFV)的累积总和。计算方法如下:
-
将资金流指数(MFI)计算为收盘价与高低范围的关系
-
将 MFI 乘以周期的交易量 V[t] 来得到 MFV
-
获取 A/D 线作为 MFV 的累积总和:
蔡金 A/D 振荡器(ADOSC)是应用于蔡金 AD 线的 MACD 指标。蔡金振荡器旨在预测 AD 线的变化。
它被计算为 AD 线的 3 天 EMA 与 10 天 EMA 之间的差值。下图显示了 ADOSC 系列:
图 A.14:AAPL 股价的 ADOSC 系列
能量潮指标
能量潮指标(OBV)是一个累积动量指标,它将成交量与价格变化联系起来。它假设 OBV 的变化先于价格变化,因为智慧资金可以通过上升的 OBV 流入证券而被看到。当公众跟随时,证券和 OBV 都会上升。
当证券收盘价高于前一次收盘价时,将当前交易量加到上次 OBV[t][-1] 上(当证券收盘价低于前一次收盘价时,从上次 OBV[t][-1] 中减去当前交易量)来计算当前的 OBV[t]:
波动性指标
波动性指标包括股票特定的度量,如资产价格和收益的滚动(归一化)标准偏差。它还包括更广泛的市场指标,如芝加哥期权交易所的波动率指数(VIX),该指数基于标普 500 期权的隐含波动率。
TA-Lib 实现了真实波动幅度指标的归一化和平均版本。
真实波动幅度
平均真实波幅(ATR)指标显示了市场的波动性。它由 Wilder(1978 年)引入,并被用作许多其他指标的组成部分。它旨在预测趋势变化,其数值越高,趋势变化的可能性越大;指标值越低,当前趋势越弱。
ATR 被计算为真实范围(TRANGE)的周期T的简单移动平均,其将波动性定义为最近交易范围的绝对值:
结果系列如下图所示:
图 A.15:AAPL 股票价格的 ATR 系列
标准化平均真实波幅
TA-Lib 还提供了一种标准化的 ATR,允许跨资产进行比较。标准化平均真实波幅(NATR)的计算方法如下:
标准化使 ATR 对于长期分析更为相关,在价格大幅变动和跨市场或跨证券比较时尤为重要。
基本风险因素
风险的常用度量包括资产回报对旨在代表基本因素的投资组合回报的敞口。我们介绍了法玛和弗伦奇(2015 年)的五因子模型,并展示了如何使用两状态法玛-麦克贝斯回归估计因子负载和风险因子溢价,详情见第七章,线性模型-从风险因素到回报预测。
为了估计证券价格与五因子模型中包括公司规模、价值与成长动态、投资政策和盈利能力等因素之间的关系,除了广义市场外,我们可以使用 Kenneth French 的数据库提供的投资组合回报作为滚动线性回归中的外生变量。
以下示例使用pandas_datareader模块访问数据(详见第二章,市场和基本数据-来源和技术)。然后,它计算了 21、63 和 252 个交易日的窗口的回归系数:
factor_data = (web.DataReader('F-F_Research_Data_5_Factors_2x3_daily', 'famafrench',
start=2005)[0].rename(columns={'Mkt-RF': 'MARKET'}))
factor_data.index.names = ['date']
factors = factor_data.columns[:-1]
t = 1
ret = f'ret_{t:02}'
windows = [21, 63, 252]
for window in windows:
print(window)
betas = []
for ticker, df in data.groupby('ticker', group_keys=False):
model_data = df[[ret]].merge(factor_data, on='date').dropna()
model_data[ret] -= model_data.RF
rolling_ols = RollingOLS(endog=model_data[ret],
exog=sm.add_constant(model_data[factors]),
window=window)
factor_model = rolling_ols.fit(params_only=True).params.rename(
columns={'const':'ALPHA'})
result = factor_model.assign(ticker=ticker).set_index(
'ticker', append=True).swaplevel()
betas.append(result)
betas = pd.concat(betas).rename(columns=lambda x: f'{x}_{window:02}')
data = data.join(betas)
刚刚描述的风险因素通常被称为智能贝塔因子(见第一章,用于交易的机器学习-从想法到执行)。此外,对冲基金已经开始使用从大规模数据挖掘练习中派生出的 alpha 因子,我们现在将转向这些因子。
WorldQuant 寻找公式阿尔法
我们在第一章,用于交易的机器学习-从想法到执行中介绍了 WorldQuant,作为一种众包投资策略的趋势的一部分。WorldQuant 维护着一个虚拟研究中心,全球量化分析师在此竞争,以确定阿尔法。这些阿尔法是以计算表达式形式的交易信号,帮助预测价格变动,就像前一节描述的通用因子一样。
这些公式 alpha将从数据中提取信号的机制转换为代码,并且它们可以单独开发和测试,目标是将它们的信息整合到更广泛的自动化策略中(Tulchinsky 2019)。正如本书中反复强调的那样,在大型数据集中挖掘信号容易出现多重测试偏差和假发现。尽管存在这些重要的警告,这种方法代表了对前一节中介绍的更传统特征的现代替代方案。
Kakushadze(2016)提供了 101 个这种 alpha 的示例,其中 80% 当时被用于真实的交易系统中。它定义了一系列操作横截面或时间序列数据的函数,并且可以组合使用,例如以嵌套形式。
笔记本 101_formulaic_alphas 展示了如何使用 pandas 和 NumPy 实现这些函数,并且还说明了如何计算大约 80 个这些公式 alpha 的示例,其中我们有输入数据(例如,我们缺乏准确的历史部门信息)。
横截面和时间序列函数
Kakushadze(2016)提出的公式 alpha 的构建块是相对简单的表达式,它们计算纵向或横截面数据,并且可以很容易地使用 pandas 和 NumPy 实现。
横截面函数包括排名和缩放,以及对收益进行分组归一化,其中分组意味着在不同粒度级别上表示部门信息:
我们可以将排名函数直接转换为 pandas 表达式,使用 DataFrame 作为参数,格式为 周期数 × 标的证券数,如下所示:
def rank(df):
"""Return the cross-sectional percentile rank
Args:
:param df: tickers in columns, sorted dates in rows.
Returns:
pd.DataFrame: the ranked values
"""
return df.rank(axis=1, pct=True)
还有一些可能会很熟悉的时间序列函数:
| 函数 | 定义 |
|---|---|
ts_{O}(x, d) | 对过去 d 天的时间序列应用运算符 O;非整数天数 d 被转换为向下取整的天数 d。 |
ts_lag(x, d) | x 在 d 天前的值。 |
ts_delta(x, d) | 今天的 x 的值与 d 天前的值之间的差异。 |
ts_rank(x, d) | 过去 d 天的排名。 |
ts_mean(x, d) | 过去 d 天的简单移动平均值。 |
ts_weighted_mean(x, d) | 过去 d 天的加权移动平均值,线性衰减权重 d,d – 1,…,1(重新缩放为总和为 1)。 |
ts_sum(x, d) | 过去 d 天的滚动求和。 |
ts_product(x, d) | 过去 d 天的滚动乘积。 |
ts_stddev(x, d) | 过去 d 天的移动标准差。 |
ts_max(x, d), ts_min(x, d) | 过去 d 天的滚动最大值/最小值。 |
ts_argmax(x, d), ts_argmin(x, d) | ts_max(x, d), ts_min(x, c) 的日期。 |
ts_correlation(x, y, d) | 过去 d 天 x 和 y 的相关性。 |
这些时间序列函数也很容易使用 pandas 的滚动窗口功能来实现。例如,对于滚动加权平均值,我们可以结合 pandas 和 TA-Lib,就像在前一节中演示的那样:
def ts_weighted_mean(df, period=10):
"""
Linear weighted moving average implementation.
:param df: a pandas DataFrame.
:param period: the LWMA period
:return: a pandas DataFrame with the LWMA.
"""
return (df.apply(lambda x: WMA(x, timeperiod=period)))
为了创建滚动相关函数,我们提供了两个包含不同股票的时间序列的 DataFrame 列:
def ts_corr(x, y, window=10):
"""
Wrapper function to estimate rolling correlations.
:param x, y: pandas DataFrames.
:param window: the rolling window.
:return: DataFrame with time-series min for past 'window' days.
"""
return x.rolling(window).corr(y)
此外,这些表达式使用了常见的运算符,正如我们将在转向每个结合了前述几个函数的公式α时看到的那样。
公式化的α表达式
为了说明α表达式的计算,我们需要使用前一节中从 2007 年到 2016 年的 500 支交易最多的股票的样本创建以下输入表格(有关数据准备的详细信息,请参见笔记本sample_selection)。每个表格包含了个股的时间序列列:
| 变量 | 描述 |
|---|---|
returns | 每日收盘至收盘收益 |
open、close、high、low、volume | 每日价格和交易量数据的标准定义 |
vwap | 每日成交量加权平均价格 |
| adv(d) | 过去d天的平均每日美元交易额 |
我们的数据不包括许多α表达式所需的每日成交量加权平均价格。为了能够演示它们的计算,我们使用每日开盘、最高、最低和收盘价格的简单平均值来非常粗略地近似这个值。
与前一节中介绍的常见α相反,公式α没有对其所代表的风险敞口进行经济解释。我们将展示几个简单编号的实例。
Alpha 001
第一个α表达式的公式如下所示:
rank(ts_argmax(power(((returns < 0) ? ts_std(returns, 20) : close), 2.), 5))
三元运算符a ? b : c在a评估为true时执行b,否则执行c。因此,如果每日收益为正,它会计算 20 天滚动标准差的平方;否则,它会计算当前收盘价的平方。然后,它会按照显示此值最大的日期的指数对资产进行排名。
使用c和r分别表示收盘价和收益输入,α可以使用前述函数和 pandas 方法在 Python 中进行转换,如下所示:
def alpha001(c, r):
"""(rank(ts_argmax(power(((returns < 0)
? ts_std(returns, 20)
: close), 2.), 5)) -0.5)"""
c[r < 0] = ts_std(r, 20)
return (rank(ts_argmax(power(c, 2), 5)).mul(-.5)
.stack().swaplevel())
对于 500 支股票的 10 年样本,Alpha 001 值的分布及其与一日前向收益的关系如下所示:
图 A.16:Alpha 001 直方图和散点图
信息系数(IC)相当低,但在-0.0099 处具有统计显著性,互信息(MI)估计值为 0.0129(有关实现细节,请参见第四章,金融特征工程 - 如何研究α因子,和笔记本101_formulaic_alphas)。
Alpha 054
我们的第二个表达式是收盘价和最低价之间的差异与收盘价和最高价之间的差异的比率,分别乘以开盘价和收盘价,然后再乘以五次方:
-(low - close) * power(open, 5) / ((low - high) * power(close, 5))
同样,转换为 pandas 很简单。我们使用o,h,l和 c 来表示包含 500 列中每个股票的相应价格系列的数据帧:
def alpha054(o, h, l, c):
"""-(low - close) * power(open, 5) / ((low - high) * power(close, 5))"""
return (l.sub(c).mul(o.pow(5)).mul(-1)
.div(l.sub(h).replace(0, -0.0001).mul(c ** 5))
.stack('ticker')
.swaplevel())
在这种情况下,IC 为 0.025,而 MI 得分为 0.005。
现在我们将看看这些不同类型的 alpha 因子在单变量和多变量视角下的比较情况。
双变量和多变量因素评估
为了评估众多因素,我们依赖于本书介绍的各种性能指标,包括以下内容:
-
有关某一因素与一日前收益率的信号内容的双变量测量
-
使用所有因素来预测一日前收益率的梯度提升模型的多变量特征重要性度量
-
根据 Alphalens 使用因子分位数投资的投资组合的财务表现
我们将首先讨论双变量度量,然后转向多变量度量;我们将通过比较结果来结束。有关相关代码示例和其他探索性分析,请参阅笔记本factor_evaluation,我们将在此处省略因素之间的相关性。
信息系数和互信息
我们将使用以下双变量度量标准,这些度量标准在第四章,金融特征工程 - 如何研究 Alpha 因子中进行了介绍:
-
IC 以斯皮尔曼等级相关性衡量
-
使用由 scikit-learn 提供的
mutual_info_regression计算的 MI 分数
MI 分数使用了 100,000 个观察样本来限制最近邻计算的计算成本。除此之外,这两个度量标准都很容易计算,并且已经被反复使用;有关实施细节,请参阅笔记本。然而,我们将看到它们可以产生非常不同的结果。
特征重要性和 SHAP 值
为了衡量给定所有其他可用因素的特征的预测相关性,我们可以使用默认设置的 LightGBM 梯度提升模型来训练,以使用所有(大约)130 个因素来预测前瞻性收益。该模型使用 8.5 年的数据训练 104 棵树,使用提前停止。我们将获得最后一年数据的测试预测,这将产生 3.40 的全局 IC 和 2.01 的日均值。
接下来,我们将计算特征重要性和SHapley 加法解释(SHAP)值,如第十二章,提升您的交易策略中所述;有关详细信息,请参阅笔记本。 图 A.17中的影响图突出显示了 20 个最重要特征的值如何相对于模型的默认输出正面或负面地影响模型的预测。以 SHAP 值衡量,alphas 054 和 001 位于前五因素之列:
图 A.17:常见和公式化 alpha 的 SHAP 值
现在,让我们比较不同指标如何评价我们的因素。
比较 - 每个指标的前 25 个特征
在 SHAP 值和传统特征重要性之间的排名相关性,后者是特征对模型损失函数减少的加权贡献,为 0.89。SHAP 值与两个单变量指标之间的相关性也很大,约为 0.5。
有趣的是,MI 和 IC 在特征排名上存在显著差异,相关性仅为 0.16,如下图所示:
图 A.18:性能指标的排名相关性
图 A.19显示了根据每个指标的前 25 个特征。除了 MI 分数喜欢 "常见" alpha 因子之外,两个来源的特征都排名很高:
图 A.19:每种性能指标的前 25 个特征
目前尚不清楚为什么 MI 与其他指标不一致,以及为什么它分配高分的特征在梯度提升模型中发挥了重要作用。一个可能的解释是计算仅使用了 10% 的样本,分数似乎对样本大小敏感。
金融业绩-Alphalens
最后,我们主要关心 alpha 因子发出的交易信号的价值。如第四章介绍的,金融特征工程-如何研究 alpha 因子,并反复演示,Alphalens 对因子性能进行单独评估。
笔记本 alphalens_analysis 让您选择一个单独的因子,并计算根据因子分位值投资的投资组合在给定时间段内的表现如何。
图 A.20中的示例显示了 Alpha 54 的结果;尽管头部和底部五分位组合在每日基础上取得了 1.5 bps 的平均收益,但长短组合的累积收益为负值:
图 A.20:Alpha 54 的 Alphalens 性能指标
随意使用笔记本作为模板,更系统地评估样本因子或您自己选择的其他因子。