Python 机器学习算法交易实用指南(五)
原文:
zh.annas-archive.org/md5/fcb09c483bdb21866eb6782158d1f8d5译者:飞龙
第十五章:词嵌入
在前两章中,我们应用了词袋模型将文本数据转换为数值格式。结果是稀疏的、固定长度的向量,表示文档在高维词空间中的位置。这允许评估文档的相似性,并创建特征来训练机器学习算法,分类文档的内容或评估其中表达的情感。然而,这些向量忽略了术语使用的上下文,因此,例如,包含相同单词的不同句子将被编码为相同的向量。
在本章中,我们将介绍一种替代类别的算法,它使用神经网络来学习个别语义单元(如单词或段落)的向量表示。这些向量是密集的,而不是稀疏的,而且有几百个实值,而不是几万个二进制或离散条目。它们被称为嵌入,因为它们将每个语义单元分配到连续向量空间中的位置。
嵌入是通过训练模型将标记与其上下文关联起来而产生的,这样做的好处是类似的用法意味着类似的向量。此外,我们将看到嵌入如何通过它们的相对位置来编码语义方面的关系,例如词之间的关系。因此,它们是我们将在后面的章节中介绍的深度学习模型中强大的特征。
具体来说,在本章中,我们将涵盖以下主题:
-
词嵌入是什么,以及它们如何工作和捕捉语义信息
-
如何使用训练好的词向量
-
哪些网络架构对训练 Word2vec 模型有用
-
如何使用 Keras、gensim 和 TensorFlow 训练 Word2vec 模型
-
如何可视化和评估词向量的质量
-
如何使用 SEC 文件训练 Word2vec 模型
-
如何扩展 Word2vec 的
Doc2vec
词嵌入如何编码语义
词袋模型将文档表示为反映其所包含标记的向量。词嵌入将标记表示为较低维度的向量,使得它们的相对位置反映了它们在上下文中的使用方式的关系。它们体现了语言学中的分布假设,即单词最好通过它们的搭配来定义。
词向量能够捕捉许多语义方面;不仅是近义词彼此靠近,而且单词之间可以有多个相似度程度,例如,单词“驾驶员”可能与“汽车司机”或“导致”的相似。此外,嵌入反映了单词对之间的关系,例如类比(东京对日本就像巴黎对法国,或者 went 对 go 就像 saw 对 see),我们将在本节稍后进行说明。
嵌入是通过训练机器学习模型来预测单词与它们的上下文或反之。在下一节中,我们将介绍这些神经语言模型的工作原理,并介绍成功的方法,包括 Word2vec、Doc2vec和 fastText。
神经语言模型如何学习上下文中的用法
词嵌入是通过训练一个浅层神经网络来预测给定上下文的单词而产生的。传统语言模型将上下文定义为目标词之前的单词,而单词嵌入模型使用包围目标的对称窗口中包含的单词。相比之下,词袋模型使用整个文档作为上下文,并使用(加权)计数来捕捉单词的共现关系,而不是预测向量。
早期使用的神经语言模型包括增加了计算复杂性的非线性隐藏层。Word2vec 及其扩展简化了体系结构,以便在大型数据集上进行训练(例如,维基百科包含超过二十亿个标记;有关前馈网络的详细信息,请参阅第十七章 深度学习)。
Word2vec 模型 – 大规模学习嵌入
Word2vec 模型是一个将文本语料库作为输入并输出该语料库中单词的一组嵌入向量的两层神经网络。有两种不同的架构可以使用浅层神经网络有效地学习单词向量,如下图所示:
-
Continuous-Bag-Of-Words(CBOW)模型使用上下文词向量的平均值作为输入来预测目标词,因此它们的顺序并不重要。CBOW 模型训练速度更快,对于频繁词汇来说稍微准确一些,但对不经常出现的单词关注较少。
-
Skip-Gram(SG)模型与之相反,使用目标词来预测从上下文中抽样的词。它在小数据集上效果很好,并且即使对于罕见的单词或短语也能找到良好的表示:
因此,Word2vec 模型接收一个嵌入向量作为输入,并与另一个嵌入向量计算点积。请注意,假设归一化向量,当向量相等时,点积被最大化(绝对值),当它们正交时被最小化。
然后使用反向传播来根据由任何分类错误造成的目标函数计算的损失来调整嵌入权重。在下一节中,我们将看到 Word2vec 如何计算损失。
训练通过将上下文窗口滑过文档进行,通常被分成句子。每次完整迭代整个语料库都被称为一个时代。根据数据,可能需要几十个时代才能使向量质量收敛。
从技术上讲,SG 模型已被证明可以因式分解包含相应单词和上下文对的点互信息的单词-上下文矩阵(请参阅 GitHub 上的参考文献)。
模型目标 – 简化 softmax
Word2vec 模型旨在预测一个单词,而这个单词可能是非常大的词汇表中的一个。神经网络通常使用 softmax 函数,该函数将任意数量的实值映射到相等数量的概率,以实现相应的多类目标,其中h指嵌入,v指输入向量,c是单词w的上下文:
然而,softmax 的复杂性随着类别数量的增加而增加,因为分母需要计算词汇表中所有单词的点积以标准化概率。Word2vec 模型通过使用 softmax 的简化版本或基于采样的方法(详见参考资料)来提高效率:
-
分层 softmax 将词汇表组织为具有词作为叶节点的二叉树。到每个节点的唯一路径可用于计算单词概率。
-
噪声对比估计 (NCE) 对上下文外的“噪声词”进行采样,并将多类任务近似为二元分类问题。随着样本数量的增加,NCE 的导数接近 softmax 梯度,但只要 25 个样本就能产生与 softmax 相似的收敛速度,速度快 45 倍。
-
负采样 (NEG)省略了噪声词样本,以逼近 NCE 并直接最大化目标词的概率。因此,NEG 优化了嵌入向量的语义质量(相似用法的相似向量),而不是测试集上的准确性。然而,它可能对频率较低的单词产生比分层 softmax 目标更差的表示。
自动短语检测
预处理通常涉及短语检测,即识别常用在一起的标记,并应该接收单一向量表示(例如,纽约市,请参阅第十三章中关于 n-gram 的讨论,处理文本数据)。
原始的 Word2vec 作者使用了一种简单的提升评分方法,该方法将两个词w[i]、w[j]标识为一个二元组,如果它们的联合出现相对于每个词的单独出现超过了给定阈值,通过一个修正因子δ校正:
评分器可以重复应用以识别连续更长的短语。
另一种选择是归一化的点间互信息分数,这种方法更准确,但计算成本更高。它使用了相对词频P(w),并在+1 和-1 之间变化:
如何评估嵌入向量 - 向量运算和类比
词袋模型创建反映标记在文档中存在和相关性的文档向量。潜在语义分析减少了这些向量的维度,并在此过程中识别了可被解释为潜在概念的内容。潜在狄利克雷分配将文档和术语都表示为包含潜在主题权重的向量。
词和短语向量的维度没有明确的含义。然而,嵌入在潜在空间中编码了相似用法,以一种体现在语义关系上的接近性的方式。这导致了有趣的性质,即类比可以通过添加和减去词向量来表达。
以下图显示了连接巴黎和法国的向量(即它们的嵌入之差)如何反映了首都关系。类似的关系,伦敦:英国,对应于相同的向量,即英国与通过将首都向量添加到伦敦得到的位置非常接近:
正如单词可以在不同的语境中使用一样,它们可以以不同的方式与其他单词相关联,而这些关系对应于潜在空间中的不同方向。因此,如果训练数据允许,嵌入应该反映出几种不同类型的类比关系。
Word2vec 的作者提供了一份涵盖地理、语法和句法以及家庭关系等多个方面的几千个关系的列表,用于评估嵌入向量的质量。如上所示,该测试验证了目标词(英国)最接近的是将代表类似关系(巴黎:法国)的向量添加到目标的补充(伦敦)后得到的结果。
以下图将在维基百科语料库上训练的 Word2vec 模型的最相关类比的 300 维嵌入,具有超过 20 亿标记,通过主成分分析(PCA)投影到二维。从以下类别的超过 24,400 个类比的测试实现了超过 73.5% 的准确率(参见笔记本):
使用嵌入模型
与其他无监督学习技术类似,学习嵌入向量的目标是为其他任务生成特征,如文本分类或情感分析。
获取给定文档语料库的嵌入向量有几种选项:
-
使用从通用大语料库(如维基百科或谷歌新闻)中学到的嵌入
-
使用反映感兴趣领域的文档来训练自己的模型
对于后续的文本建模任务,内容越专业化、越不通用,第二种方法就越可取。然而,高质量的词向量需要大量数据,并且需要包含数亿字的信息性文档。
如何使用预训练的词向量
预训练词嵌入的几个来源。流行选项包括斯坦福的 GloVE 和 spaCy 的内置向量(有关详细信息,请参见笔记本 using_trained_vectors)。
GloVe - 用于词表示的全球向量
GloVe 是在斯坦福 NLP 实验室开发的无监督算法,它从聚合的全局词-词共现统计中学习单词的向量表示(请参阅参考文献)。可用于以下网络规模来源的预训练向量:
-
Common Crawl 共有 420 亿或 840 亿令牌和词汇表或 190 万或 220 万令牌。
-
Wikipedia 2014 + Gigaword 5,共有 60 亿令牌和 40 万令牌的词汇表。
-
推特使用了 20 亿条推文,27 亿令牌和 120 万令牌的词汇表
我们可以使用 gensim 将矢量文本文件转换并加载到 KeyedVector 对象中:
from gensim.models import Word2vec, KeyedVectors
from gensim.scripts.glove2Word2vec import glove2Word2vec
glove2Word2vec(glove_input_file=glove_file, Word2vec_output_file=w2v_file)
model = KeyedVectors.load_Word2vec_format(w2v_file, binary=False)
Word2vec 作者提供了包含超过 24,000 个类比测试的文本文件,gensim 用于评估词向量。
在维基百科语料库上训练的词向量涵盖了所有类比,并在各个类别中达到了 75.5% 的总体准确率:
| 类别 | 样本 | 准确率 | 类别 | 样本 | 准确率 |
|---|---|---|---|---|---|
| 首都-普通国家 | 506 | 94.86% | 比较级 | 1,332 | 88.21% |
| 首都-世界 | 8,372 | 96.46% | 最高级 | 1,056 | 74.62% |
| 城市-州 | 4,242 | 60.00% | 现在分词 | 1,056 | 69.98% |
| 货币 | 752 | 17.42% | 国籍形容词 | 1,640 | 92.50% |
| 家庭 | 506 | 88.14% | 过去时 | 1,560 | 61.15% |
| 形容词到副词 | 992 | 22.58% | 复数 | 1,332 | 78.08% |
| 反义词 | 756 | 28.57% | 复数动词 | 870 | 58.51% |
常见爬网词嵌入的 10 万个最常见标记覆盖了约 80% 的类比,并以 78% 的略高准确率,而 Twitter 的词嵌入则仅覆盖了 25%,准确率为 62%。
如何训练自己的单词向量嵌入
许多任务需要嵌入或特定领域的词汇,而基于通用语料库的预训练模型可能无法很好地或根本无法表示。标准 Word2vec 模型无法为词汇表中不存在的单词分配向量,而是使用降低其预测价值的默认向量。
例如,在处理行业特定文件时,词汇表或其使用可能随着时间推移而变化,因为新技术或产品出现。因此,嵌入也需要相应地发展。此外,企业盈利发布使用的语言不完全反映在基于维基百科文章预训练的 GloVe 向量中。
我们将使用 Keras 库来说明 Word2vec 架构,我们将在下一章中更详细地介绍,并使用 Word2vec 作者提供的代码的 gensim 适配更高效的代码。Word2vec 笔记本包含额外的实现细节,包括 TensorFlow 实现的参考。
Keras 中的 Skip-Gram 架构
为了说明 Word2vec 网络架构,我们使用 TED Talk 数据集,该数据集具有对齐的英文和西班牙文字幕,我们首次在第十三章中介绍了处理文本数据。
笔记本包含将文档标记化并为词汇表中的每个项目分配唯一 ID 的代码。我们要求语料库中至少出现五次,并保留 31300 个标记的词汇表。
噪声对比估计
Keras 包括一个make_sampling_table方法,允许我们创建一个训练集,其中上下文和噪声词与相应的标签配对,根据它们的语料库频率进行采样。
结果是 2700 万个正面和负面的上下文和目标对的例子。
模型组件
Skip-Gram模型为词汇表中的每个项目包含一个 200 维嵌入向量,导致 31300 x 200 可训练参数,加上两个用于 sigmoid 输出。
在每次迭代中,模型计算上下文和目标嵌入向量的点积,通过 sigmoid 产生概率,并根据损失的梯度调整嵌入。
使用 TensorBoard 可视化嵌入
TensorBoard 是一种可视化工具,允许将嵌入向量投影到三维空间中,以探索单词和短语的位置。
使用 gensim 从 SEC 备案中学习的单词向量
在本节中,我们将使用 gensim 从美国年度证券交易委员会(SEC)备案中学习单词和短语向量,以说明单词嵌入对算法交易的潜在价值。在接下来的几节中,我们将将这些向量与价格回报结合使用作为特征,训练神经网络来根据安全备案的内容预测股票价格。
特别是,我们使用一个数据集,其中包含 2013-2016 年间上市公司提交的超过 22,000 份 10-K 年度报告,其中包含财务信息和管理评论(参见第三章,金融替代数据)。对于大约一半的公司的 11-K 备案,我们有股价以标记预测建模的数据(有关数据来源和sec-filings文件夹中笔记本的引用,请参阅详细信息)。
预处理
每个备案都是一个单独的文本文件,一个主索引包含备案元数据。我们提取最具信息量的部分,即以下部分:
-
项目 1 和 1A:业务和风险因素
-
项目 7 和 7A:管理对市场风险的讨论和披露
笔记本预处理显示如何使用 spaCy 解析和标记文本,类似于第十四章中采用的方法,主题建模。我们不对单词进行词形还原处理,以保留单词用法的细微差别。
自动短语检测
我们使用gensim来检测短语,就像之前介绍的那样。Phrases模块对标记进行评分,而Phraser类相应地转换文本数据。笔记本展示了如何重复此过程以创建更长的短语:
sentences = LineSentence(f'ngrams_1.txt')
phrases = Phrases(sentences=sentences,
min_count=25, # ignore terms with a lower count
threshold=0.5, # only phrases with higher score
delimiter=b'_', # how to join ngram tokens
scoring='npmi') # alternative: default
grams = Phraser(phrases)
sentences = grams[sentences]
最频繁的二元组包括common_stock,united_states,cash_flows,real_estate和interest_rates。
模型训练
gensim.models.Word2vec类实现了之前介绍的 SG 和 CBOW 架构。Word2vec 笔记本包含额外的实现细节。
为了方便内存高效的文本摄取,LineSentence类从提供的文本文件中创建一个生成器,其中包含单独的句子:
sentence_path = Path('data', 'ngrams', f'ngrams_2.txt')
sentences = LineSentence(sentence_path)
Word2vec类提供了先前介绍的配置选项:
model = Word2vec(sentences,
sg=1, # 1=skip-gram; otherwise CBOW
hs=0, # hier. softmax if 1, neg. sampling if 0
size=300, # Vector dimensionality
window=3, # Max dist. btw target and context word
min_count=50, # Ignore words with lower frequency
negative=10, # noise word count for negative sampling
workers=8, # no threads
iter=1, # no epochs = iterations over corpus
alpha=0.025, # initial learning rate
min_alpha=0.0001 # final learning rate
)
笔记本展示了如何持久化和重新加载模型以继续训练,或者如何将嵌入向量单独存储,例如供 ML 模型使用。
模型评估
基本功能包括识别相似的单词:
model.wv.most_similar(positive=['iphone'],
restrict_vocab=15000)
term similarity
0 android 0.600454
1 smartphone 0.581685
2 app 0.559129
我们也可以使用正负贡献来验证单个类比:
model.wv.most_similar(positive=['france', 'london'],
negative=['paris'],
restrict_vocab=15000)
term similarity
0 united_kingdom 0.606630
1 germany 0.585644
2 netherlands 0.578868
参数设置的性能影响
我们可以使用类比来评估不同参数设置的影响。以下结果表现突出(详细结果请参见models文件夹):
-
负采样优于分层 softmax,同时训练速度更快。
-
Skip-Gram 架构优于 CBOW 给定的目标函数
-
不同的
min_count设置影响较小,50 为最佳表现的中间值。
使用最佳表现的 SG 模型进行进一步实验,使用负采样和min_count为 50,得到以下结果:
-
比五更小的上下文窗口会降低性能。
-
更高的负采样率提高了性能,但训练速度慢了。
-
更大的向量提高了性能,大小为 600 时的准确率最高,为 38.5%。
使用 Doc2vec 进行情感分析
文本分类需要组合多个词嵌入。一个常见的方法是对文档中每个词的嵌入向量进行平均。这使用所有嵌入的信息,并有效地使用向量加法来到达嵌入空间中的不同位置。但是,有关单词顺序的相关信息会丢失。
相比之下,用于生成文本片段(如段落或产品评论)的嵌入的最先进模型是使用文档嵌入模型Doc2vec。这个模型是 Word2vec 作者在发布其原创贡献后不久开发的。
与 Word2vec 类似,Doc2vec也有两种类型:
-
分布式词袋(DBOW)模型对应于 Word2vec 的 CBOW 模型。文档向量是通过训练网络在预测目标词的合成任务中产生的,该任务基于上下文词向量和文档的文档向量。
-
分布式记忆(DM)模型对应于 Word2vec Skip-Gram 架构。通过训练神经网络来预测目标单词,使用整个文档的文档向量。
Gensim 的 Doc2vec 类实现了这种算法。
在 Yelp 情感数据上训练 Doc2vec
我们使用 500,000 条 Yelp 评论(参见第十三章,处理文本数据)的随机样本,以及它们的相关星级评分(参见 notebook yelp_sentiment):
df = (pd.read_parquet('yelp_reviews.parquet', engine='fastparquet')
.loc[:, ['stars', 'text']])
stars = range(1, 6)
sample = pd.concat([df[df.stars==s].sample(n=100000) for s in stars])
我们使用简单的预处理来删除停用词和标点符号,使用 NLTK 的分词器并删除少于 10 个标记的评论:
import nltk
nltk.download('stopwords')
from nltk import RegexpTokenizer
from nltk.corpus import stopwords
tokenizer = RegexpTokenizer(r'\w+')
stopword_set = set(stopwords.words('english'))
def clean(review):
tokens = tokenizer.tokenize(review)
return ' '.join([t for t in tokens if t not in stopword_set])
sample.text = sample.text.str.lower().apply(clean)
sample = sample[sample.text.str.split().str.len()>10]
创建输入数据
gensim.models.doc2vec 类以 TaggedDocument 格式处理文档,其中包含标记化的文档以及允许在训练后访问文档向量的唯一标记:
sentences = []
for i, (_, text) in enumerate(sample.values):
sentences.append(TaggedDocument(words=text.split(), tags=[i]))
训练界面与 word2vec 类似,但有额外的参数来指定 Doc2vec 算法:
model = Doc2vec(documents=sentences,
dm=1, # algorithm: use distributed memory
dm_concat=0, # 1: concat, not sum/avg context vectors
dbow_words=0, # 1: train word vectors, 0: only doc
vectors
alpha=0.025, # initial learning rate
size=300,
window=5,
min_count=10,
epochs=5,
negative=5)
model.save('test.model')
您还可以使用 train() 方法来继续学习过程,并且,例如,逐渐降低学习率:
for _ in range(10):
alpha *= .9
model.train(sentences,
total_examples=model.corpus_count,
epochs=model.epochs,
alpha=alpha)
因此,我们可以将文档向量作为特征来访问,以训练情感分类器:
X = np.zeros(shape=(len(sample), size))
y = sample.stars.sub(1) # model needs [0, 5) labels
for i in range(len(sample)):
X[i] = model[i]
我们将训练一个 lightgbm 梯度提升机,如下所示:
- 从训练集和测试集创建
lightgbmDataset对象:
train_data = lgb.Dataset(data=X_train, label=y_train)
test_data = train_data.create_valid(X_test, label=y_test)
- 定义具有五个类别的多类模型的训练参数(否则使用默认值):
params = {'objective' : 'multiclass',
'num_classes': 5}
- 对模型进行 250 次迭代的训练,并监视验证集错误:
lgb_model = lgb.train(params=params,
train_set=train_data,
num_boost_round=250,
valid_sets=[train_data, test_data],
verbose_eval=25)
- Lightgbm 对所有五个类别进行概率预测。我们使用
np.argmax()来获取具有最高预测概率的列索引来获取类别预测:
y_pred = np.argmax(lgb_model.predict(X_test), axis=1)
- 我们计算准确率评分来评估结果,并看到相对于五个平衡类别的基线 20%,准确率提高了 100% 以上:
accuracy_score(y_true=y_test, y_pred=y_pred)
0.44955063467061984
- 最后,我们通过混淆矩阵来更仔细地查看每个类别的预测:
cm = confusion_matrix(y_true=y_test, y_pred=y_pred)
cm = pd.DataFrame(cm / np.sum(cm), index=stars, columns=stars)
- 并将结果可视化为
seaborn热图:
sns.heatmap(cm, annot=True, cmap='Blues', fmt='.1%')
总之,doc2vec 方法使我们能够在不经过太多调整的情况下,比一个简单的基准模型取得了非常大的测试准确率改进。如果我们只选择顶部和底部的评论(分别为五星和一星),并训练一个二元分类器,则使用每个类别的 250,000 个样本时,AUC 分数可以达到 0.86 以上。
附加内容 - 用于翻译的 Word2vec
该 notebook 翻译演示了一个语言中编码的关系通常对应于另一种语言中的类似关系。
它说明了如何使用单词向量通过将单词向量从一个语言的嵌入空间投影到另一个语言的空间使用翻译矩阵来翻译单词和短语。
摘要
本章以词嵌入如何更有效地为个别标记编码语义开始,这比我们在第十三章中使用的词袋模型更为有效。我们还看到了如何通过线性向量算术验证嵌入,以评估是否正确表示了单词之间的语义关系。
学习词嵌入时,我们使用的浅层神经网络曾经在包含数十亿标记的 Web 数据规模上训练速度很慢。word2vec 模型结合了几种算法创新,显著加速了训练,并为文本特征生成确立了新标准。我们看到了如何使用spaCy和gensim来使用预训练的词向量,并学会了训练自己的词向量嵌入。然后,我们将word2vec模型应用于 SEC 提交文件。最后,我们介绍了doc2vec扩展,它以与单词向量类似的方式学习文档的向量表示,并将其应用于 Yelp 商家评论。
现在,我们将开始第四部分关于深度学习(如前言所述,在线可用),从介绍前馈网络、流行的深度学习框架和大规模高效训练技术开始。
第十六章:下一步
本书的目标是使您能够将机器学习(ML)应用于各种数据源,并提取对投资策略的设计和执行有用的信号。为此,我们将机器学习介绍为交易策略过程的重要组成部分。我们看到,机器学习可以在设计、测试、执行和评估策略的多个步骤中添加价值。
显然,机器学习的核心价值主张在于能够比人类专家更系统地从更大量的数据中提取可行动的信息。一方面,这一价值主张随着数字数据的爆炸而变得更具吸引力和必要性,使得利用计算能力进行数据处理变得更有前景。另一方面,机器学习的应用仍然需要人类的重大干预和专业知识来定义目标、选择和筛选数据、设计和优化模型以及适当地利用结果。
在这个总结性的章节中,我们将简要总结本书中学到的关键工具、应用和经验教训,以避免在许多细节之后失去对整体情况的把握。然后,我们将确定我们未涵盖但值得关注的领域,这些领域将有助于您进一步扩展我们介绍的许多机器学习技术,并在日常使用中变得高效。我们将强调对个人生产力有价值的技能组合。
总之,在本章中,我们将讨论以下主题:
-
回顾主要收获和经验教训,
-
指出在本书中技术的下一步建设方向,
-
建议将机器学习纳入您的投资过程中的方法。
主要收获和经验教训
在继续进行交易机器学习实践时要牢记的重要见解包括:
-
数据是最重要的因素
-
领域专业知识有助于发现数据的潜在价值,特别是在金融领域
-
机器学习提供了许多用例的工具,应进一步发展并结合使用数据解决新问题
-
模型目标的选择和性能诊断对于朝向最佳系统的生产力迭代至关重要
-
回测过拟合是一个需要重视的巨大挑战
-
黑盒模型透明化有助于建立信心并促进采用
我们将更详细地阐述这些想法。
数据是最重要的因素
交易和其他领域中机器学习的崛起很大程度上补充了我们详细介绍的数据爆炸。我们在第二章,市场和基本数据中说明了如何访问和处理这些数据源,历来是量化投资的支柱。在第三章,金融替代数据中,我们提出了一个框架,用于评估替代数据潜在价值的标准。
一个关键的见解是,像深度神经网络这样的最新 ML 技术之所以成功,是因为它们的预测性能随着数据的增加而不断提高。另一方面,模型和数据复杂性需要匹配,以平衡偏差-方差的权衡。管理数据质量和整合数据集是实现潜在价值的关键步骤。
质量控制
就像石油一样,这些天很流行的一个比较,数据经过从原始形式到能够推动交易策略的精炼产品的多个阶段的管道。仔细关注最终产品的质量至关重要,以达到预期的里程碑。
有时,您会获得原始数据,并控制所需的大量转换。更常见的情况是,您处理中间产品,并应明确了解此时数据究竟测量了什么。
不同于石油,随着数据源的不断增加,通常没有客观的质量标准。相反,质量取决于其信号内容,而信号内容又取决于您的投资目标。对新数据集的成本效益评估需要一个高效的工作流程,包括我们将在以下部分介绍的适当基础设施。
数据整合
对于投资策略的数据价值往往取决于结合市场、基本和替代数据的互补来源。我们发现,像基于树的集成或神经网络这样的 ML 算法的预测能力部分是由于它们能够检测到非线性关系,特别是变量之间的相互作用效应。
调节变量影响的能力作为其他模型特征的函数在捕获目标结果的不同方面的数据输入上得到了发展。将资产价格与宏观基本面、社会情绪、信用卡支付和卫星数据相结合,可能会在不同的经济和市场环境中产生更可靠的预测,比单独使用每个来源(假设数据足够大以学习隐藏的关系)更可靠。
从多个来源获取数据增加了正确标注的挑战。为了避免通过使用数据来测试算法,在数据实际可用之前就有了预见性偏见,分配准确的时间戳至关重要。例如,数据可能由提供者分配了时间戳,需要调整以反映数据实际可用于实时算法的时间点。
领域专业知识有助于释放数据的价值。
我们强调了数据是成功的机器学习应用的必要驱动因素,但领域专业知识也是重要的,以指导战略方向、特征工程和数据选择、模型设计。
在任何领域,从业者都对关键结果的驱动因素以及它们之间的关系有着理论。金融领域以大量相关的定量研究(理论和实证)脱颖而出。马科斯·洛佩斯·德·普拉多等人(参见 GitHub 的参考资料github.com/PacktPublishing/Hands-On-Machine-Learning-for-Trading)批评了大多数经验结果,因为普遍存在的数据挖掘可能会使研究结果无效。尽管如此,对金融市场运作方式的深刻理解是存在的,并应该指导数据的选择和使用,以及依赖机器学习的策略的正当化。我们在第四章 Alpha Factor Research 和 第五章 Strategy Evaluation 中概述了关键思想。
另一方面,新的机器学习技术可能会发现有关金融结果驱动因素的新假设,这将为机器学习理论提供信息,并应进行独立测试。
特征工程和 alpha 因子研究
与原始数据相比,特征工程通常是使信号对算法有用的关键。利用几十年的风险因素研究成果,从理论和实证的角度来驱动收益是一个很好的起点,以优先考虑更有可能反映相关信息的数据转换。
然而,只有创造性的特征工程才能带来能够随着时间竞争的创新策略。即使对于新的 alpha 因子,一个能够解释它们如何工作的引人注目的叙述,鉴于已有的市场动态和投资者行为理念,将会为资本分配提供更多信心。
假设发现的风险和对历史数据过拟合的风险使得在测试之前优先考虑策略变得更加必要,而不是让数据说话。我们讨论了如何根据实验数量调整夏普比率。
机器学习是解决数据问题的工具包
机器学习提供了可以应用于许多用例的算法解决方案和技术。本书的第 2、3 和 4 部分(如第一章,用于交易的机器学习 中所述)将机器学习作为一套多样化的工具集,可以为策略过程的各个步骤增加价值,包括:
-
想法生成和阿尔法因子研究,
-
信号聚合和投资组合优化,
-
策略测试
-
交易执行,并且
-
策略评估
更重要的是,机器学习算法被设计成进一步发展、适应和结合以解决不同环境中的新问题。因此,除了能够将它们应用于数据以进行富有成效的实验和研究外,理解这些算法背后的关键概念和思想也非常重要,如第六章,机器学习过程 中所述。
此外,最佳结果通常是通过将人类专家与机器学习工具结合起来实现的。在第一章,用于交易的机器学习 中,我们介绍了量化投资风格,其中包括定量和算法交易。这种方法可能会变得越来越重要,并且依赖于对我们涵盖的基本工具以及将它们扩展到各种数据集的灵活和创造性应用。
模型诊断有助于加快优化速度
在第六章,机器学习过程 中,我们概述了一些最重要的概念。机器学习算法通过对功能形式做出假设来学习输入数据和目标之间的关系。如果学习基于噪声而不是信号,预测性能将受到影响。
当然,我们今天无法从明天的结果的角度分离信号和噪声。例如,使用学习曲线和优化验证测试的模型诊断可以帮助缓解这一基本挑战,并校准算法的选择或配置以适应手头的数据或任务。通过定义专注的模型目标,以及对于复杂模型,区分由于优化算法或目标本身的问题而导致的性能缺陷,可以使这项任务变得更容易。
不做免费午餐
没有系统——计算机程序或人类——有基础可靠地预测新样本的结果,超出了它在训练期间观察到的范围之外。唯一的出路是具有一些额外的先验知识或做出超出训练样本范围的假设。我们从本书的第七章,线性模型 和 第八章,时间序列模型,到非线性集成模型的广泛范围的算法进行了讨论,如第十章,决策树和随机森林 和 第十一章,梯度提升机,以及本书第四部分的各个章节中的神经网络。
我们看到,线性模型做出了一个强烈的假设,即输入和输出之间的关系具有非常简单的形式,而稍后讨论的模型旨在学习更复杂的函数。虽然显而易见简单模型在大多数情况下会失败,但复杂模型并不总是更好。如果真实关系是线性的,但数据是嘈杂的,复杂模型将会学习噪音作为其假定存在的复杂关系的一部分。这就是“没有免费午餐定理”的基本思想,该定理指出没有一种算法在所有任务中都是普遍优越的。在某些情况下的良好拟合会以在其他情况下的性能不佳为代价。
定制算法选择的关键工具是数据探索和基于对模型做出的假设的理解进行的实验。
管理偏差-方差权衡
适应算法到数据的挑战有一个不同的视角,即偏差和方差之间的权衡,这会导致除了数据的自然噪音之外的预测误差。一个简单的模型如果没有充分捕捉到数据中的关系,将会欠拟合并表现出偏差,即,会产生系统性的错误预测。一个过于复杂的模型会过拟合,并且除了任何信号外还会学习噪声,因此结果会对不同样本显示出很多方差。
在模型选择和优化过程的任何给定迭代中,诊断这种权衡的关键工具是学习曲线。它显示了训练和验证误差如何取决于样本大小。这使我们能够在不同的选项之间做出决定以改善性能:调整模型的复杂性或获取更多数据点。
训练误差越接近人类或其他基准,模型过拟合的可能性就越大。低验证误差告诉我们我们很幸运地找到了一个好模型。如果验证误差很高,我们就没有。然而,如果随着训练大小的增加而持续下降,更多数据可能有所帮助。如果训练误差很高,更多的数据不太可能有所帮助,我们应该增加特征或使用更灵活的算法。
定义目标模型目标
机器学习过程中的第一步之一是为算法定义一个优化的目标。有时,选择很简单,例如在回归问题中。分类任务可能更加困难,例如,当我们关心精确率和召回率时。将相互冲突的目标合并到一个单一指标中,如 F1 得分,有助于聚焦优化工作。我们还可以包括需要满足而不是优化的条件。我们还看到,强化学习完全取决于定义正确的奖励函数来指导代理的学习过程。
优化验证测试
Andrew Ng(请参见 GitHub 上的参考资料:github.com/PacktPublishing/Hands-On-Machine-Learning-for-Algorithmic-Trading)强调了由于学习算法或优化算法的问题而导致性能不佳之间的区别。像神经网络这样的复杂模型假设非线性关系,而优化算法的搜索过程可能会陷入局部而不是全局最优解。
例如,如果一个模型未能正确翻译一个短语,则测试会比较正确预测和搜索算法发现的解决方案的分数。如果学习算法为正确解决方案得分更高,则搜索算法需要改进。否则,学习算法正在优化错误的目标。
警惕反向测试过拟合
我们在整本书中反复讨论了由于过度拟合历史数据而产生的假发现的风险。第五章,策略评估,概述了主要驱动因素和潜在的补救措施。低噪声与信号比和相对较小的数据集(与网络规模图像或文本数据相比)使得这一挑战在交易领域尤为严重。意识至关重要,因为数据和应用 ML 工具的易获取性会将风险指数级增加。
没有逃脱,因为没有预防的方法。然而,我们提出了调整反向测试指标以考虑重复试验的方法,比如通货紧缩夏普比率。在制定实时交易策略时,阶段性纸上交易和在市场执行过程中密切监测绩效需要成为实施过程的一部分。
如何从黑匣子模型中获得见解
深度神经网络和复杂集成模型在被视为不可透明的黑匣子模型时可能会引起怀疑,特别是考虑到反向测试过拟合的风险。我们在第十一章中介绍了几种方法,以了解这些模型如何进行预测,梯度提升机。
除了传统的特征重要性度量之外,最近博弈论创新的SHapley Additive exPlanations(SHAP)是理解复杂模型机制的重要一步。SHAP 值允许对特征及其值进行精确归因,从而更容易在特定投资目标的市场行为理论光下验证模型的逻辑。除了理论基础外,确切的特征重要性得分和预测的归因还允许更深入地洞察感兴趣的投资结果的驱动因素。
另一方面,围绕模型预测透明度是否应该成为目标本身存在一些争议。深度学习发明者之一 Geoffrey Hinton 认为,人类决策通常也是模糊的,机器也应该根据其结果进行评估,就像我们期望投资经理一样。
实践中的交易机器学习
当您继续将众多工具和技术整合到您的投资和交易流程中时,有许多事情可以成为您努力的焦点。如果您的目标是做出更好的决策,您应该选择与您当前技能集相符的现实而雄心勃勃的项目。这将帮助您开发一个高效的工作流程,支持您具有生产力的工具,并获得实际经验。
我们将简要列出一些有用的工具,以扩展本书涵盖的 Python 生态系统,并参考 GitHub 上列出的链接进行更深入的探讨。这些包括大数据技术,最终将有必要以规模实现用于交易策略的 ML。我们还将列出一些允许您使用 Python 实施交易策略的平台,通常具有数据源和 ML 算法和库的访问权限。
数据管理技术
数据在 ML 流程中的核心作用要求熟悉一系列技术,以便在规模上存储、转换和分析数据,包括使用云服务,如 Amazon Web Services、Azure 和 Google Cloud。
数据库系统
数据存储意味着使用数据库,历史上由使用 SQL 以商业提供者(如 Oracle 和 Microsoft)和开源实现(如 PostgreSQL 和 MySQL)的明确定义的表格格式存储和检索数据的关系数据库管理系统(RDBMS)主导。最近,出现了一些替代方案,通常被集体标记为 NoSQL,但相当多样,即:
-
键值存储:快速读/写对象。我们在第二章中介绍了 HDF5 格式,市场和基本数据,它有助于快速访问 pandas DataFrame。
-
列存储:利用列中数据的同质性来实现压缩和更快的基于列的操作,如聚合。在流行的 Amazon Redshift 数据仓库解决方案、Apache Parquet、Cassandra 或 Google 的 Big Table 中使用。
-
文档存储:设计用于存储不符合关系数据库所需的严格模式定义的数据。由使用 JSON 或 XML 格式的网络应用程序所普及,我们在第四章 Alpha Factor Research 中遇到过。例如,在 MongoDB 中使用。
-
图数据库:设计用于存储具有节点和边的网络,并专注于网络指标和关系的查询。用于 Neo4J 和 Apache Giraph。
已经有一些转变朝向了关系数据库系统所建立的约定。Python 生态系统促进了与许多标准数据源的交互,并提供了快速的 HDF5 和 Parquet 格式,正如本书中所展示的。
大数据技术 - Hadoop 和 Spark
规模化的数据管理,即数百 GB 甚至更多,需要使用形成集群的多台机器来进行读取、写入和计算操作,并行进行,即分布在各种机器上。
Hadoop 生态系统已经成为一个分布式存储和处理大数据的开源软件框架,使用了 Google 开发的 MapReduce 编程模型。生态系统在 Apache 基金会的框架下变得多样化,并且今天包括了许多项目,涵盖了规模化数据管理的不同方面。Hadoop 中的关键工具包括:
-
Apache Pig:使用 MapReduce 实现大规模 提取-转换-加载 (ETL) 流水线的数据处理语言,由 Yahoo 开发
-
Apache Hive:在 Facebook 开发的交互式 SQL 查询的事实标准,可查询 PB 级数据
-
Apache HBASE:用于实时读/写访问的 NoSQL 数据库,线性扩展到数十亿行和数百万列,并可以使用各种不同的模式组合数据源。
Apache Spark 已成为集群上交互式分析最流行的平台。MapReduce 框架允许并行计算,但需要反复的磁盘读写操作以确保数据冗余。Spark 大大加速了规模化计算,原因是弹性分布式数据(RDD)结构,可以进行高度优化的内存计算。这包括了像梯度下降这样的多个 ML 算法所需的迭代计算。
机器学习工具
我们在这本书中涵盖了 Python 生态系统的许多库。Python 已经发展成为数据科学和机器学习的首选语言,一系列开源库不断多样化和成熟,构建在强大的科学计算库 NumPy 和 SciPy 的稳固核心之上。显著促进了 Python 在数据科学领域的使用的流行 pandas 库正在计划其 1.0 版本的发布。scikit-learn 接口已经成为现代机器学习库(如 xgboost 或 lightgbm)的标准,它经常与各种工作流自动化工具(如 GridSearchCV 和 Pipeline)交互,我们在整本书中都反复使用了这些工具。
有几个提供机器学习工作流的服务提供商:
-
H2O.ai (
www.h2o.ai/) 提供了将云计算与机器学习自动化集成的 H2O 平台。它允许用户将数千个潜在模型与其数据拟合以探索数据中的模式。它在 Python、R 和 Java 中都有接口。 -
DataRobot 旨在通过提供一个快速构建和部署预测模型的平台,来自动化模型开发过程,可在云端或本地部署。
-
Dataiku 是一个协作数据科学平台,旨在帮助分析师和工程师探索、原型、构建和交付自己的数据产品。
还有一些由公司主导的开源倡议,它们在 Python 生态系统上构建和扩展:
-
定量对冲基金 Two Sigma 在
beakerx项目下向 Jupyter Notebook 环境贡献了量化分析工具。 -
彭博社已将 Jupyter Notebook 集成到其终端,以便对其金融数据进行交互式分析。
在线交易平台
开发利用机器学习的交易策略的主要选项是在线平台,这些平台经常寻找并分配资金给成功的交易策略。流行的解决方案包括 Quantopian、Quantconnect、QuantRocket 以及最近关注高频交易的 Alpha Trading Labs。
此外,交互经纪商(IB)提供了一个 Python API,您可以使用它来开发自己的交易解决方案。
Quantopian
我们介绍了 Quantopian 平台,并演示了如何使用其研究和交易环境来分析和测试交易策略与历史数据进行对比。Quantopian 使用 Python 并提供大量教育资料。
Quantopian 主办持续每日比赛,以招募算法为其众包对冲基金组合。Quantopian 为获胜算法提供资金支持。在线交易已于 2017 年 9 月停止,但该平台仍提供大量历史数据,并吸引着活跃的开发者和交易者社区,是讨论想法和向他人学习的良好起点。
QuantConnect
QuantConnect 是另一个开源、社区驱动的算法交易平台,与 Quantopian 竞争。它还提供一个 IDE,用于使用 Python 和其他语言进行算法策略的回测和实时交易。
QuantConnect 还拥有来自世界各地的动态全球社区,并提供许多资产类别的访问,包括股票、期货、外汇和加密货币。它提供与各种经纪人(如 IB、OANDA 和 GDAX)的实时交易集成。
QuantRocket
QuantRocket 是一个基于 Python 的平台,用于研究、回测和运行自动化的量化交易策略。它提供数据收集工具、多个数据供应商、研究环境、多个回测器,以及通过 IB 进行实时和模拟交易。它以支持国际股票交易而自豪,并凭借其灵活性脱颖而出。
QuantRocket 支持多个引擎 — 其自己的 Moonshot,以及用户选择的第三方引擎。虽然 QuantRocket 没有传统的集成开发环境(IDE),但与 Jupyter 集成良好,可以产生类似的功能。QuantRocket 在撰写本文时并不免费,定价从 19 美元/月开始。
结论
我们从强调数字数据的爆炸和 ML 作为投资和交易策略的战略能力的出现开始。这种动态反映了金融以外的全球商业和技术趋势,而且很可能会继续下去,而不是停滞或逆转。许多投资公司刚刚开始利用各种人工智能工具,就像个人正在获得相关的技能,业务流程正在适应这些价值创造的新机会一样,如导论章节所述。
未来还有许多令人兴奋的 ML 应用于交易的发展,可能会进一步推动当前的动能。它们可能在未来几年变得相关,并包括 ML 过程的自动化、合成训练数据的生成和量子计算的出现。这一领域的非凡活力意味着这本身就可以填满一本书,并且旅程将继续保持令人兴奋。