金融中的深度学习(四)
原文:
annas-archive.org/md5/1d10c05a97f5e0702eda83b77eec256b译者:飞龙
第十章:深度强化学习用于时间序列预测
强化学习是处理顺序决策问题的机器学习分支。该分支中的算法通过与环境的交互和奖励反馈来学习做出最优决策。在时间序列预测的背景下,它可以用来开发基于历史数据进行顺序预测的模型。传统的预测方法通常依赖于统计方法或监督学习技术,这些方法假设数据点之间是独立的。然而,时间序列数据表现出时间依赖性和模式,这些可以通过强化学习有效地捕捉。
用于时间序列预测的强化学习模型通常涉及一个基于观察到的状态采取行动并根据其预测准确性获得奖励的代理程序。代理通过试错学习以在时间上最大化累积奖励。关键挑战在于找到探索(尝试新行动)与利用(使用已学知识)之间的最佳平衡。
本章概述了关于预测时间序列数据的强化学习和深度强化学习的基本概念。
强化学习的直觉
简化总是理解更高级细节的正确途径。因此,在深入研究之前,让我们从一个简单的角度来看待强化学习。
强化学习主要涉及奖励和惩罚。想象一个孩子因做好事而受到奖励,因做坏事而受到惩罚。随着时间的推移,孩子会成长并积累经验,以便做好事并尽量避免做坏事(没有人是完美的)。因此,学习是通过经验来完成的。
从时间序列的角度来看,基本思想是一样的。想象在过去数据上训练模型,然后让其通过经验学习,在做出良好预测时奖励它,在犯错时校正其参数,以便下次实现更好的准确性。算法本质上是贪婪的,并且希望最大化其奖励;因此,随着时间的推移,它在预测下一个可能值时变得更加优秀,这当然依赖于分析的时间序列的质量和信噪比。
强化学习这个术语来源于算法在做出正确决策时给予正向强化,在做出错误决策时给予负向强化。你必须了解的前三个概念是状态、行动和奖励:
状态
每个时间步骤的特征。例如,在某个时间步骤,市场的当前状态是其 OHLC 数据和其交易量数据。更简单的话来说,状态是解释变量。
行动
交易员在每个时间步骤可能做出的决策。一般涉及买入、卖出或持有。更通俗的说法,动作是算法在面对特定状态时的决策(例如,交易员注意到市场估值过高并决定发起买单的简单自主性例子)。
奖励
正确动作的结果。最简单的奖励是正回报。请注意,设计不良的奖励函数可能导致模型问题,例如买入并持有策略[¹]。
表 10-1 展示了强化学习的三个主要元素。
表 10-1. 一个假设的决策表
| 时间 | 开盘 | 最高 | 最低 | 收盘 | | | 动作 | 奖励 | |
|---|---|---|---|---|---|---|---|---|
| 状态 | 1 | 10 | 14 | 8 | 10 | | | 买入 | 0 |
| 状态 | 2 | 10 | 15 | 6 | 13 | | | 买入 | 3 |
| 状态 | 3 | 13 | 16 | 8 | 14 | | | 卖出 | –1 |
| 状态 | 4 | 10 | 16 | 8 | 14 | | | 持有 | 0 |
状态是从时间列到收盘列的行,动作可以是分类的,正如您从动作列看到的,奖励可以是数值(例如,正或负的利润)或分类的(例如,利润或亏损标签)。
从上述列表中可以看出,仅设计一个寻找奖励的系统似乎很复杂。奖励函数量化了处于特定状态或采取特定行动的可取性或效用。因此,奖励函数向代理提供反馈,指示其行动的即时质量,并引导其学习过程。在我们详细讨论奖励函数之前,让我们先看看什么是状态-动作表(也称为 Q 表)。
Q 表,即质量表,是一种数据结构,用于存储和更新在给定状态下采取特定行动的期望值(称为Q 值)。状态-动作对(s, a)在时间 t 的 Q 值表示代理通过遵循特定策略,在状态 s 中采取行动 a 能够达到的预期累积奖励。因此,Q 表是一种表格结构,将每个状态-动作对映射到其对应的 Q 值。
初始时,Q 表通常使用任意值或设为零进行初始化。随着算法探索环境(市场)并接收奖励,它基于观察到的奖励和预估的未来奖励更新表中的 Q 值。这一过程通常使用 Q 学习等算法完成。
注
随着反复的探索和利用,Q 表逐渐收敛到对最优 Q 值更准确的估计,代表在每个状态下采取的最佳行动。通过使用 Q 表,代理可以做出明智的决策,并学会在给定环境中最大化累积奖励。记住,奖励可以是利润、夏普比率或任何其他绩效指标。
Q-learning 是一种流行的强化学习算法,通过迭代更新其动作值函数(即 贝尔曼方程),使代理程序能够学习到最优的行动:
Q ( s t , a t ) = R ( s t , a t ) + γ m a x [ Q ( s t+1 , a t+1 ) ]
Q ( s t , a t ) is the expected reward R ( s t , a t ) is the reward table γ is the learning rate (known as g a m m a )
学习率(γ)越大,算法越多考虑先前的经验。注意,如果 γ 等于零,那么学习就等同于什么都没学到,因为第二项将会自我抵消。举个简单的例子,考虑 表格 10-2。
表格 10-2. R 表
| 时间(状态) | 行动(动作) | 等待(动作) |
|---|---|---|
| 1 | 2 个奖励单位 | 0 个奖励单位 |
| 2 | 2 个奖励单位 | 0 个奖励单位 |
| 3 | 2 个奖励单位 | 0 个奖励单位 |
| 4 | 2 个奖励单位 | 0 个奖励单位 |
| 5 | 2 个奖励单位 | 4 个奖励单位 |
该表格描述了随时间的行动结果。每个时间步长,执行(做某事)将获得 2 的奖励,而在第五个时间步长等待行动将获得 4 的奖励。这意味着代理程序可以做出以下选择之一:
-
立即行动并获得 2 个奖励单位。
-
等待一段时间再行动,可以获得 4 个奖励单位。
假设 γ = 0.80. 使用贝尔曼方程并向后工作,将得到以下结果:
Q ( s 1 , a 1 ) = 0 + 0 . 8 ( 2 . 04 ) = 1 . 63 Q ( s 2 , a 2 ) = 0 + 0 . 8 ( 2 . 56 ) = 2 . 04 Q ( s 3 , a 3 ) = 0 + 0 . 8 ( 3 . 20 ) = 2 . 56 Q ( s 4 , a 4 ) = 0 + 0 . 8 ( 4 . 00 ) = 3 . 20
表格 10-2 可能会更新为以下的 表格 10-3 。
表格 10-3. Q 表
| 时间(状态) | 行动(动作) | 等待(动作) |
|---|---|---|
| 1 | 2 个奖励单位 | 1.63 个奖励单位 |
| 2 | 2 个奖励单位 | 2.04 个奖励单位 |
| 3 | 2 个奖励单位 | 2.56 个奖励单位 |
| 4 | 2 个奖励单位 | 3.20 个奖励单位 |
| 5 | 2 个奖励单位 | 4.00 个奖励单位 |
因此,Q 表会持续更新隐含的奖励,以帮助最大化最终的奖励。要理解贝尔曼方程中为什么有 max 这个术语,可以参考 表格 10-4 中的例子。
表格 10-4. R 表
| 时间(状态) | 买入 | 卖出 | 持有 |
|---|---|---|---|
| 1 | 5 | 8 | 8 |
| 2 | 3 | 2 | 1 |
| 3 | 2 | 5 | 6 |
计算在 Q 表中(表格 10-5)假设学习率为 0.4 时,x 的预期值。
表格 10-5. Q 表
| 时间(状态) | 买入 | 卖出 | 持有 |
|---|---|---|---|
| 1 | ? | ? | ? |
| 2 | ? | x | ? |
| 3 | 2 | 5 | 6 |
按照公式,您应该得到以下结果:
x = 2 + 0 . 4 ( m a x ( 2 , 5 , 6 ) ) = 4 . 4
状态(特征)必须具有预测性质,以便强化学习算法能够比随机预测更准确地预测下一个值。特征的例子可以是相对强弱指数(RSI)、移动平均和滞后收盘价格的值。
在输入统计偏好保持不变的情况下至关重要,即具有固定性。这带来了一个问题:如果移动平均值不是固定的,那么如何将其用作输入?简单的答案是通过通常的转换,即进行百分比差异。
注意
可以使用分数差分来将非平稳时间序列转换为平稳时间序列,同时保留其记忆。
策略 定义了智能体在环境中的行为。它是一个从状态到动作的映射,指示智能体在给定状态下应该采取什么动作。策略本质上通过指定基于观察到的状态应执行的动作来引导智能体的决策过程。
强化学习的目标是找到最大化智能体长期累积奖励的最佳策略。这通常通过试错过程实现,智能体与环境互动,采取行动,获得奖励,并根据观察到的结果调整其策略。
开发策略通常比探索策略更快,但可能更受限,因为它寻求更大和即时的奖励,而在此之后可能有一条路径导致更大的奖励。理想情况下,最佳策略是两者的组合。但是你如何确定这种最佳混合?这个问题由 epsilon(ε)回答。
Epsilon 是用于探索和开发权衡的参数。它决定了智能体选择随机动作(探索)与选择估计值最高的动作(开发)的概率。
常用的探索策略包括 epsilon-greedy 和 softmax。在 epsilon-greedy 中,智能体以概率 (1 – ε) 选择估计值最高的动作,然后以 ε 的概率选择随机动作。这允许智能体探索不同的动作,并有可能发现更好的策略。随着智能体逐渐学习,epsilon 值通常会逐渐衰减,以减少探索并更多地专注于开发[²]。Softmax 动作选择考虑了估计的动作值,但在决策过程中引入了随机性。与 softmax 相关的温度参数决定了动作选择的随机性,温度越高,探索就越多。
警告
不要混淆 epsilon 和 gamma:
-
Gamma 是一个参数,它决定了未来奖励的重要性。它控制了智能体对即时奖励与延迟奖励的价值比重(因此,它与延迟满足问题相关)。Gamma 的值通常在 0 和 1 之间,数值越接近 1,智能体就越重视未来奖励,而数值越接近 0,就越不重视未来奖励。要更好地理解这一点,请再次查看贝尔曼方程。
-
Epsilon 是用于探索和开发权衡的参数。它决定了智能体选择随机动作(探索)与选择估计值最高的动作(开发)的概率。
此时,你可能会感到对所呈现的大量新信息感到不知所措,特别是因为它与你在本书中迄今所见的内容不同。在进入更复杂的深度强化学习讨论之前,快速总结一下本章至今所见的内容可能会有益。强化学习本质上是给机器一个任务,然后让它自己学会如何完成。
在时间序列分析中,状态表示环境在特定时间的当前情况或状态。例如,技术指标的值就是一个状态的例子。状态由 Q 表表示。动作是不言自明的,可以是买入、卖出或持有(或者更复杂的组合,如减少权重和增加权重)。奖励是算法试图最大化的,可以是每笔交易的利润,夏普比率或任何性能评估指标。奖励也可以是惩罚,如交易次数或最大回撤(在这种情况下,你的目标是将其最小化)。强化学习算法将通过不同策略的多次迭代和变量来尝试检测隐藏的模式,并优化交易决策以最大化盈利。这说起来容易,实现起来难(或者编码起来难)。
一个问题迫切需要回答:使用 Q 表来表示金融时间序列的不同状态是否高效?这个问题将在下一节中回答。
深度强化学习
深度强化学习 将强化学习技术与深度学习架构,特别是深度神经网络结合在一起。它涉及训练代理程序通过与环境的互动来学习最优行为并做出决策,使用深度神经网络来逼近价值函数或策略。
强化学习算法和深度强化学习算法的主要区别在于,前者使用 Q 表估计 Q 值,而后者使用人工神经网络来估计 Q 值(详见第八章关于人工神经网络的详细信息)。
注意
作为提醒,人工神经网络(ANNs)是一种受人脑结构和功能启发的计算模型。神经网络由连接的节点组成,组织成层。主要的层类型包括输入层、隐藏层和输出层。输入层接收初始数据,然后通过隐藏层处理,最后输出层产生网络的预测。
本节的主要目标是理解并设计一个深度强化学习算法,其目的是数据预测。请记住,强化学习由于一些问题(在本节末尾讨论),目前还没有广泛应用,需要在将其作为量化金融主要交易算法之前解决这些问题。
因此,深度强化学习将有两个主要元素具有重要任务:
-
一个深度神经网络架构来识别模式并逼近关联的因变量和自变量之间的最佳函数
-
强化学习架构允许算法通过试错学习如何最大化某个利润函数
在继续将各个关键概念定义清楚之前,让我们先介绍几个关键概念。重放内存,又称经验重放,涉及存储和重用过去的经验以增强学习过程并提高训练的稳定性和效率。
在深度强化学习中,一个代理与环境互动,观察状态,采取行动并获得奖励。每次观察、行动、奖励和导致的下一个状态被视为一次经验。重放内存作为一个缓冲区,存储了这些经验的集合。
重放内存具有以下关键特点:
存储
重放内存是一种可以存储固定数量经验的数据结构。每个经验通常包括当前状态、采取的行动、导致的奖励、下一个状态以及一个指示该情节是否终止的标志。
抽样
在训练过程中,代理程序不是立即使用发生的经验,而是从重放内存中抽取一批经验。从存储的大量转换中随机抽取经验有助于解相关数据并打破连续经验中存在的时间依赖关系。
批量学习
随机抽取的一批经验随后用于更新代理的神经网络。通过批量学习而不是单个经验的学习,代理可以更有效地利用计算资源并改善学习稳定性。批量学习还允许应用优化技术,如随机梯度下降,来更新网络权重。
重放内存为深度强化学习算法提供了几个好处。这些好处包括经验复用,因为代理可以从更多样化的数据集中学习,减少顺序更新可能引起的偏差。打破相关性是另一个好处,因为在强化学习的经验收集过程中,顺序的性质可能会在连续的经验之间引入相关性。从重放内存中随机抽取经验有助于打破这些相关性,使学习过程更加稳定。
到目前为止,我们已经讨论了以下步骤:
-
定义和初始化环境
-
设计神经网络架构
-
设计带有经验重放的强化学习架构以稳定学习过程
-
与环境交互并存储经验,直到学习过程完成并对新数据进行预测
我们尚未讨论的一件事是如何通过加倍神经网络架构来减少过度估计。
双深度 Q 网络(DDQN)模型是由 DeepMind 在 2015 年推出的原始 DQN 架构的扩展。DDQN 的主要动机是解决 DQN 算法中的已知问题,称为过度估计偏差,这可能导致次优的动作选择。
在原始 DQN 中,每个状态-动作对的动作值(Q 值)是使用单个神经网络估算的。然而,在学习过程中,Q 值是使用下一个状态中所有可能动作的最大 Q 值来估算的(查看 表 10-5)。这个最大 Q 值有时会导致真实动作值的过度估计,从而导致次优策略。
DDQN 通过利用两个独立的神经网络解决这种过度估计偏差:Q 网络和目标网络。Q 网络是一个深度神经网络,用于逼近动作值函数(Q 函数)。换句话说,它估算了给定状态下每个可能动作的价值。Q 网络的参数(权重和偏置)通过训练来学习,以最小化预测 Q 值和目标 Q 值之间的差异。目标网络是 Q 网络的一个单独副本,用于在训练期间估算目标 Q 值。它有助于稳定学习过程并改善 Q 网络的收敛性。目标网络的权重在训练过程中不会更新;相反,它们会定期更新以匹配 Q 网络的权重。
DDQN 的关键思想是将动作的选择与其值的估算分离开来。
注意
算法定期更新 Q 网络和偶尔更新目标网络。这样做是为了避免同一模型用于估算下一个状态的 Q 值,然后将其传递给贝尔曼方程,以估算当前状态的 Q 值的问题。
因此,为了将这些元素放入有序序列中,深度强化学习架构可能如下所示:
-
初始化环境。
-
选择 epsilon 值。请记住,epsilon 是控制训练期间代理行为的探索-利用权衡参数。
-
获取当前状态。请记住,当前状态的示例可能是 OHLC 数据、RSI、收益标准差,甚至是星期几。
-
在第一轮中,由于模型尚未训练,算法通过探索选择动作;因此,动作是随机选择的(例如,从买入、卖出和持有的选择面板)。如果不是第一步,则可能使用利用来选择动作。利用是指动作由神经网络模型确定。
-
应用动作。
-
将前述元素存储在回放内存中。
-
输入和目标数组被获取,并训练 Q 网络。
-
如果轮次尚未结束,请从第 3 步开始重复该过程。否则,训练目标网络并从第 1 步重复。
要说明算法,让我们在合成正弦波时间序列上使用它。创建时间序列,然后应用深度强化学习算法,旨在预测未来值。
完整的代码可以在 GitHub 仓库 中找到(供复制目的)。
图 10-1 显示了测试数据(实线)与预测数据(虚线),使用了 1 个周期,5 个输入(滞后值),批量大小为 64,并且有 1 个隐藏层,每个隐藏层有 6 个神经元。
图 10-1. 使用了 1 个周期,5 个输入,批量大小为 64,并且有 1 个隐藏层,每个隐藏层有 6 个神经元的测试数据与预测数据对比
图 10-2 显示了测试数据(实线)与预测数据(虚线),使用了 1 个周期,5 个输入(滞后值),批量大小为 64,并且有 2 个隐藏层,每个隐藏层有 6 个神经元。
图 10-2. 使用了 1 个周期,5 个输入,批量大小为 64,并且有 2 个隐藏层,每个隐藏层有 6 个神经元的预测值与实际值对比
图 10-3 显示了使用了 10 个周期,5 个输入(滞后值),批量大小为 32,并且有 2 个隐藏层,每个隐藏层有 6 个神经元的预测。
图 10-3. 使用了 10 个周期,5 个输入,批量大小为 32,并且有 2 个隐藏层,每个隐藏层有 6 个神经元的预测值与实际值对比
图 10-4 显示了使用了 10 个周期,5 个输入(滞后值),批量大小为 32,并且有 2 个隐藏层,每个隐藏层有 24 个神经元的预测。
图 10-4. 使用了 10 个周期,5 个输入,批量大小为 32,并且有 2 个隐藏层,每个隐藏层有 24 个神经元的预测值与实际值对比
图 10-5 显示了使用了 10 个周期,8 个输入(滞后值),批量大小为 32,并且有 2 个隐藏层,每个隐藏层有 64 个神经元的预测。
图 10-5. 使用了 10 个周期,8 个输入,批量大小为 32,并且有 2 个隐藏层,每个隐藏层有 64 个神经元的预测值与实际值对比
如您所知,更多周期意味着更好的拟合——直到某一点,过拟合可能开始成为问题。幸运的是,现在您知道如何减少这种风险。
注意
请注意,正弦波示例非常基础,算法可以使用更复杂的数据。选择正弦波时间序列仅用于说明目的,您必须在更复杂的时间序列上使用更复杂的方法来评估算法。
强化学习容易过拟合,更容易学习简单的模式而不是隐藏且复杂的模式。此外,您现在应该意识到奖励函数设计的难度和特征选择的重要性。此外,这些模型通常被认为是神秘盒子,这使得解释其预测背后的推理变得困难。所有这些问题现在都成为实施稳定且盈利性强的深度强化学习算法用于交易的障碍。
总结
强化学习可以应用于时间序列预测任务,其目标是根据历史数据预测未来值。在这种方法中,代理与代表时间序列数据的环境互动。代理接收过去值的观察结果,并采取行动预测未来值。代理的行动涉及调整其内部模型或参数以进行预测。它使用强化学习算法从过去的经验中学习,并随着时间推移提高其预测准确性。
代理根据其预测的准确性接收奖励或惩罚。奖励可以设计成反映预测误差或预测对特定应用程序的效用。通过反复试验的过程,代理学会将时间序列数据中的某些模式或特征与未来结果联系起来。它学会了做出既能最大化奖励又能最小化误差的预测。
强化学习过程涉及在探索和利用之间取得平衡。代理探索不同的预测策略,试图发现模式并进行准确预测。它还利用其现有知识基础进行预测,根据迄今为止所学到的内容。强化学习用于时间序列预测的目标是训练代理以进行准确可靠的预测。通过不断接收反馈并更新其预测策略,代理适应时间序列中变化的模式并改进其预测能力。
第十一章 将展示如何运用更多的深度学习技术和应用。
¹ 买入并持有策略是一种被动行为,交易者或算法发起一笔买单,并长期持有以试图复制市场的回报,并最小化由于过度交易而产生的交易成本。
² 切记保持 epsilon 衰减,因为它将在稍后的代码中用作变量。
第十一章:高级技术和策略
到目前为止,您应该对深度学习算法及其如何开发模型以预测时间序列数据有了坚实的理解。尽管这只是部署盈利算法的第一步,但您应该知道,您从本书开始以来已经走了很长一段路。本章分为独立的几节,讨论了应用一些先进的深度学习技术和时间序列预测方法的有趣方式,以及增强该过程。
利用 COT 数据预测长期趋势
交易者承诺(COT)报告是由美国商品期货交易委员会(CFTC)发布的每周发布,提供了期货市场各种市场参与者持仓情况的信息。该报告基于从期货交易所(包括芝加哥商品交易所(CME)和洲际交易所(ICE))收集的数据。COT 报告将交易者分为三大组:
商业交易商(也称为经销商或套期保值者)
这些通常是利用期货市场来对冲其主要业务活动的公司。例如,粮食生产商可能使用期货合约来保护农业市场价格波动。他们的头寸通常与基础市场呈负相关。
非商业交易者(也称为基金或杠杆资金)
此组包括大型投机者,如对冲基金和商品交易顾问。非商业交易者通常根据其市场展望和追求利润的策略进行头寸建立。他们的头寸通常与基础市场呈正相关,因为他们具有追随趋势的特性。
非报告类交易者
此类别包括小型投机者和其头寸不符合 CFTC 设定的报告要求的交易者。他们与基础市场之间没有明确的相关性。
该报告详细说明了每个组的持仓情况,指出它们在特定期货市场中是否净多头(持有的多头头寸多于空头头寸)或净空头(持有的空头头寸多于多头头寸)。
交易者和投资者分析 COT 报告,以深入了解不同市场参与者的情绪和行为。通过监控头寸变动,他们试图识别市场潜在趋势或反转。该报告在商品和货币市场特别受欢迎,被用作基本分析工具和评估市场情绪。本节介绍了以下内容:
-
创建一个算法自动下载 COT 数据并进行分析。
-
绘制并理解 COT 值与其相应基础市场之间的相关性。此外,检查 COT 值中的平稳性,以查看它们是否可以直接用于算法中。
-
使用滞后值创建一个 LSTM 算法,以预测下一个 COT 值并进行评估。这将被称为间接单步 COT 模型。
-
使用直接方法创建一个 LSTM 算法,以预测未来几周的 COT 观察值。这将被称为MPF COT 直接模型。
-
使用递归方法创建一个 LSTM 算法,以预测未来几周的 COT 观察值。这将被称为MPF COT 递归模型。
COT 报告中主要有四列感兴趣的内容:长期对冲者、短期对冲者、长期基金和短期基金。它们是计算净对冲者和净基金的四个基本支柱。一些交易者喜欢在进行净值计算和看到更大画面之前分析每一列。在进行净值过程之前了解每一列背后的逻辑有助于理解。
长期对冲者(商业交易者的多头头寸百分比)
你可以将这些对冲者视为资产的消费者。长期对冲者是购买某种资产(如小麦)期货以对冲其主要业务的实体。主要目标是通过在未来锁定所需的固定价格来保护自己免受价格上涨的风险。通过这样做,他们可以更准确地计划生产成本,并避免如果小麦价格上涨可能带来的损失。因此,长期对冲者购买资产是出于担心其价格将上涨。他们通常在价格下跌时购买,这导致与资产价格的负相关性。
短期对冲者(商业交易者的空头头寸百分比)
你可以将这些对冲者视为资产的生产者。短期对冲者是出售某种资产的空头期货以对冲其主要业务的实体。主要目标是保护自己免受价格下跌的风险。因此,短期对冲者在资产价格上涨时卖出。他们通常在价格上涨时出售,这导致与资产价格的正相关性(这意味着随着资产价格的上涨,短期对冲者的数量增加)。
长期基金(非商业交易者的多头头寸百分比)
投机性长期基金头寸是未来合约的买方,预期价格将上涨。由于其追随趋势的特性,它们与资产价格有正相关性。
空头基金(非商业交易者的空头头寸百分比)
投机性卖空基金头寸是未来合约的卖方,预期价格将下跌。由于其追随趋势的特性,它们与资产价格有负相关性。例如,当资产上涨时,这些空头基金的数量减少。
注
根据您的需求,可以以不同方式进行 COT 报告的清算。如果您偏向于商业交易者,那么您可以简单地取商业多头和商业空头之间的差值(或者您可以称之为消费者和生产者)。如果您偏向于非商业交易者,那么您可以取非商业多头和非商业空头之间的差值。如果您偏向于全球视角,那么您可以取商业和非商业交易者的净清算差值,这样您将得到一个只总结特定资产市场定位全局图像的时间序列。
表 11-1 对净 COT 值的计算进行了一些解释。
表 11-1. COT 净清算表示
| 套保者多头 | 套保者空头 | 基金多头 | 基金空头 | 净套保者 | 净基金 | 净 COT |
|---|---|---|---|---|---|---|
| A | B | C | D | E = A - B | F = C - D | G = F - E |
净 COT 值具有以下公式:
Net COT = 净资金 - 净套保者
它与资产的基础价格呈正相关。图 11-1 显示了加拿大元(CAD)的净 COT 定位。
图 11-1. 自 2015 年以来的净 COT 加元;注意其价值的均值回归性质。
让我们看看如何使用 Python 下载 COT 值。首先,pip install 允许您自动从 CFTC 网站下载 COT 值的库:
pip install cot_reports
如果库存在问题,您可以使用在GitHub 仓库中找到的预下载的 Excel 格式 COT 报告进行手动导入(本节末尾提供了一个代码块)。
导入必要的库以下载 COT 报告的历史观察结果。为简单起见,让我们选择加元的定位:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from master_function import import_cot_data
允许您获取所选市场 COT 值的 import_cot_data() 函数定义如下(在 master_function.py 中找到):
def import_cot_data(start_year, end_year, market):
df = pd.DataFrame()
for i in range(start_year, end_year + 1):
single_year = pd.DataFrame(cot.cot_year(i,
cot_report_type='traders_in_financial_futures_fut'))
df = pd.concat([single_year, df], ignore_index=True)
new_df = df.loc[:, ['Market_and_Exchange_Names',
'Report_Date_as_YYYY-MM-DD',
'Pct_of_OI_Dealer_Long_All',
'Pct_of_OI_Dealer_Short_All',
'Pct_of_OI_Lev_Money_Long_All',
'Pct_of_OI_Lev_Money_Short_All']]
new_df['Report_Date_as_YYYY-MM-DD'] =
pd.to_datetime(new_df['Report_Date_as_YYYY-MM-DD'])
new_df = new_df.sort_values(by='Report_Date_as_YYYY-MM-DD')
data = new_df[new_df['Market_and_Exchange_Names'] == market]
data['Net_COT'] = (data['Pct_of_OI_Lev_Money_Long_All'] – \
data['Pct_of_OI_Lev_Money_Short_All']) – \
(data['Pct_of_OI_Dealer_Long_All'] –\
data['Pct_of_OI_Dealer_Short_All'])
return data
要导入加元 COT 值,使用以下语法:
CAD = 'CANADIAN DOLLAR - CHICAGO MERCANTILE EXCHANGE'
data = import_cot_data(2015, 2023, CAD)
data = np.array(data.iloc[:, –1], dtype = np.float64)
值得一提的是,其他市场有以下代码名称,您可以用来导入它们:
EUR = 'EURO FX - CHICAGO MERCANTILE EXCHANGE'
GBP = 'BRITISH POUND STERLING - CHICAGO MERCANTILE EXCHANGE'
JPY = 'JAPANESE YEN - CHICAGO MERCANTILE EXCHANGE'
CHF = 'SWISS FRANC - CHICAGO MERCANTILE EXCHANGE'
AUD = 'AUSTRALIAN DOLLAR - CHICAGO MERCANTILE EXCHANGE'
MXN = 'MEXICAN PESO - CHICAGO MERCANTILE EXCHANGE'
BRL = 'BRAZILIAN REAL - CHICAGO MERCANTILE EXCHANGE'
BTC = 'BITCOIN - CHICAGO MERCANTILE EXCHANGE'
SPX = 'E-MINI S&P 500 - CHICAGO MERCANTILE EXCHANGE'
注意
如果出现请求错误,请在运行导入部分之前应用以下代码(记得 pip install proxy_requests 库):
from proxy_requests.proxy_requests import ProxyRequests
req = ProxyRequests("https://api.ipify.org")
req.get()
图 11-2 显示了加元相对于加元/美元的净 COT 定位。注意两者之间强烈的正相关性。计算最近 200 次观察的皮尔逊相关系数为惊人的 0.66。换句话说,净 COT 数据的高点与加元/美元的高点相吻合。同样,净 COT 数据的低点与加元/美元的低点相吻合。
图 11-2. 加元/美元(左刻度)与加元净 COT 定位(右刻度)。
警告
请注意,图表显示的是 CADUSD 而不是常用的 USDCAD 货币对。这是因为您试图理解 CAD;因此,将其作为基础货币有助于您看到 CAD 投机者的正相关性以及 CAD 套期保值者的负相关性。要从 USDCAD 观察中获得 CADUSD,请取其倒数:
C A D U S D = 1 USDCAD
下一步是检查 COT 值的平稳性,以了解是否需要进行转换。请记住,转换可以是差分、取百分比回报,甚至使用分数阶差分(如第九章所述):
from statsmodels.tsa.stattools import adfuller
print('p-value: %f' % adfuller(raw_data)[1])
输出如下:
p-value: 0.000717
COT 值似乎是稳定的,可以用作算法的输入。
算法 1:间接单步 COT 模型
拟合优度模型将使用长短期记忆(LSTM)来预测每个时间步长的下一个 COT 值。假设预测与基础市场方向相关的值可能会对未来一周的预期移动产生偏见。例如,如果预测未来一周 COT 值较高,则您可能会在每周交易准备中有一个看涨 CAD 的偏好。
首先,导入所需的库:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, LSTM
from master_function import import_cot_data, data_preprocessing
from master_function import plot_train_test_values,
from master_function import calculate_directional_accuracy
from sklearn.metrics import mean_squared_error
导入所需的数据:
CAD = 'CANADIAN DOLLAR - CHICAGO MERCANTILE EXCHANGE'
data = import_cot_data(2015, 2023, CAD)
data = np.array(data.iloc[:, –1], dtype = np.float64)
设置超参数并创建数组:
num_lags = 100
train_test_split = 0.80
num_neurons_in_hidden_layers = 200
num_epochs = 200
batch_size = 4
# Creating the training and test sets
x_train, y_train, x_test, y_test = data_preprocessing(data,
num_lags,
train_test_split)
为了符合 LSTM 架构,独立变量必须转换为三维数组。可以使用以下代码完成这一操作:
x_train = x_train.reshape((–1, num_lags, 1))
x_test = x_test.reshape((–1, num_lags, 1))
接下来,创建模型的架构并预测训练集(仅了解拟合优度)和测试集上的值:
# Create the LSTM model
model = Sequential()
# Adding a first layer
model.add(LSTM(units = neurons, input_shape = (num_lags, 1)))
# Adding a second layer
model.add(Dense(neurons, activation = 'relu'))
# Adding the output layer
model.add(Dense(units = 1))
# Compiling the model
model.compile(loss = 'mean_squared_error', optimizer = 'adam')
# Fitting the model
model.fit(x_train, y_train, epochs = num_epochs, batch_size = batch_size)
# Predicting in the training set for illustrative purposes
y_predicted_train = model.predict(x_train)
# Predicting in the test set
y_predicted = model.predict(x_test)
要绘制预测值与实际值的图表,请使用以下语法:
plot_train_test_values(100, 50, y_train, y_test, y_predicted)
图 11-3 将预测值与实际测试值进行了比较。乍看之下,模型似乎很好地捕捉了 COT 值的变化。让我们来看一下性能结果。
图 11-3. COT 训练数据后跟 COT 测试数据(虚线)和预测的 COT 数据(细线);垂直虚线表示测试期的开始。使用的模型是 LSTM 回归算法。
在从 2015 年到 2023 年使用的 CADUSD 模型结果如下:
Directional Accuracy Train = 86.18 %
Directional Accuracy Test = 60.87 %
RMSE Train = 5.3655332132
RMSE Test = 14.7772701349
Correlation In-Sample Predicted/Train = 0.995
Correlation Out-of-Sample Predicted/Test = 0.88
注意
对您而言的一个有趣任务是应用模型来预测基础市场的回报,使用 COT 值作为输入。您可以使用净 COT 值或其他六个可用的系列之一,例如长期套期保值者和净资金。但请务必始终检查平稳性。
算法 2:MPF COT 直接模型
MPF COT 模型将使用 LSTM 预测 COT 值的轨迹,以引导主要市场走势的到来。假设通过预测下一个 COT 值(比市场本身更少噪音),您可以获得市场预期轨迹的指南。由于 COT 值是平稳的,并且与非平稳的市场高度相关,使用 MPF 直接在市场上预测比使用 MPF 在市场上直接预测要有更好的预测机会。该算法使用直接方法(更多信息,请参阅第九章)。首先,导入所需的库:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, LSTM
from master_function import import_cot_data, direct_mpf
from master_function import calculate_directional_accuracy
from sklearn.metrics import mean_squared_error
设置超参数并创建数组:
# Setting the hyperparameters
num_lags = 100
train_test_split = 0.80
neurons = 400
num_epochs = 200
batch_size = 10
forecast_horizon = 50
# Creating the training and test sets
x_train, y_train, x_test, y_test = direct_mpf(data,
num_lags,
train_test_split,
forecast_horizon)
为了符合 LSTM 结构,必须将独立变量转换为三维数组。可以使用以下代码完成:
x_train = x_train.reshape((–1, num_lags, 1))
x_test = x_test.reshape((–1, num_lags, 1))
接下来,创建模型的结构并使用递归函数预测值:
# Create the LSTM model
model = Sequential()
# Adding a first layer
model.add(LSTM(units = neurons, input_shape = (num_lags, 1)))
# Adding a second layer
model.add(Dense(neurons, activation = 'relu'))
# Adding the output layer
model.add(Dense(units = forecast_horizon))
# Compiling the model
model.compile(loss = 'mean_squared_error', optimizer = 'adam')
# Fitting the model
model.fit(x_train, y_train, epochs = num_epochs, batch_size = batch_size)
# Predicting in the test set
y_predicted = model.predict(x_test)
要绘制预测值与实际值的图,使用以下语法:
plt.plot(y_predicted[–1], label = 'Predicted data', color = 'red',
linewidth = 1)
plt.plot(y_test[–1], label = 'Test data', color = 'black',
linestyle = 'dashed', linewidth = 2)
plt.grid()
plt.legend()
图 11-4 将预测值与真实测试值进行了比较。
图 11-4. 预测数据与测试数据对比。
以下是对 CADUSD 使用的模型的结果:
Directional Accuracy Test = 57.14 %
RMSE Test = 26.4021245739
Correlation Out-of-Sample Predicted/Test = 0.426
算法 3:MPF COT 递归模型
该算法使用递归方法(更多信息,请参阅第九章)。首先,导入所需的库:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, LSTM
from master_function import data_preprocessing, import_cot_data
from master_function import plot_train_test_values, recursive_mpf
from master_function import calculate_directional_accuracy
设置超参数并创建数组:
num_lags = 100
train_test_split = 0.80
neurons = 100
num_epochs = 200
batch_size = 2
# Creating the training and test sets
x_train, y_train, x_test, y_test = data_preprocessing(data,
num_lags,
train_test_split)
为了符合 LSTM 结构,必须将独立变量转换为三维数组。可以使用以下代码完成:
x_train = x_train.reshape((–1, num_lags, 1))
x_test = x_test.reshape((–1, num_lags, 1))
接下来,创建模型的结构并使用递归函数预测值:
# Create the LSTM model
model = Sequential()
# Adding a first layer
model.add(LSTM(units = neurons, input_shape = (num_lags, 1)))
# Adding a second layer
model.add(Dense(neurons, activation = 'relu'))
# Adding the output layer
model.add(Dense(units = 1))
# Compiling the model
model.compile(loss = 'mean_squared_error', optimizer = 'adam')
# Fitting the model
model.fit(x_train, y_train, epochs = num_epochs, batch_size = batch_size)
# Predicting in the test set on a recursive basis
x_test, y_predicted = recursive_mpf(x_test, y_test, num_lags, model)
要绘制预测值与实际值的图,使用以下语法:
plot_train_test_values(100, 50, y_train, y_test, y_predicted)
图 11-5 将预测值与测试值进行了比较。
图 11-5. COT 数据的多期预测。
以下是对从 2015 年到 2023 年 CADUSD 使用的模型的结果:
Directional Accuracy Test = 52.17 %
RMSE Test = 40.3120541504
Correlation Out-of-Sample Predicted/Test = 0.737
注意
记住,在设置 random_state 并确保可复现性对于实验是有用的,但如果数据分布确实是随机的,则可能限制模型良好泛化的能力。在许多情况下,建议使用不同的随机种子进行多次运行,以更好地了解模型的性能和稳健性。这就是为什么本书中许多模型的代码中没有 random_state 实现(除了第七章中的少数模型)。
不要忘记过拟合的症状。不幸的是,过拟合有时并不那么容易检测到,因此请考虑这些一般规则:
高训练精度和低测试精度
该模型在训练数据上表现出色,但在测试数据上表现不佳。这清楚地表明,该模型记住了训练数据,而非学习了一般模式。
训练和测试性能之间存在显著差距
训练和测试误差率之间存在显著差异。理想情况下,这两个指标应该接近,而较大的差距则表明过拟合。
模型复杂度异常高
如果模型过于复杂,具有大量参数或特征,则更容易出现过拟合。较简单的模型可能对新数据泛化效果更好。
噪声预测
过拟合模型倾向于在新数据上做出错误和不一致的预测。这是因为它们对输入数据的微小变化(包括噪声)非常敏感。
综合应用
每周五由 CFTC 发布的 COT 报告概述了关键市场参与者的持仓情况。它可以转化为时间序列预测任务,旨在改善市场预测。特别感兴趣的市场参与者是商业参与者(交易商或对冲者)和非商业参与者(杠杆资金或基金)。
注意
确保将master_function.py放在解释器的目录中。或者,您可以简单地在 Python 中打开master_function.py并执行整个文件。但是,后一种方法需要您每次重新启动内核时都这样做。
深度学习技术可以应用于 COT 值,以预测市场定位通过隐藏模式和季节配置。本节讨论了三种算法从 COT 报告中挤出价值。您可以尝试使用机器学习模型、深度强化学习,甚至简单的统计技术来更好地理解 COT 数据。
要手动导入 COT 值,请参考在GitHub 仓库找到的历史数据,并使用以下代码(将解释器的路径更改为下载文件所在的位置):
import pandas as pd
import numpy as np
# Import the data using pandas
data = pd.read_excel('name_of_file.xlsx')
重要的是要记住 COT 报告提供了市场参与者持仓的快照,应与其他工具和分析方法结合使用。虽然它可以提供有价值的信息,但它并不是独立的交易策略,而是需要仔细考虑其他因素才能做出明智的交易决策。
使用技术指标作为输入
您在第五章中学习了技术指标。现在是时候将它们作为输入,以预测底层市场的回报。使用滞后值意味着过去的观察值可能会转化为可观测的预测。本节将探讨这一假设之外的过去,并寻找其他价格变换中的价值。您可以进行以下价格衍生计算:
数学变换
这种转换类型很可能是对原始数据的直接操作。一个例子是基本差分或简单移动平均。归一化也是数学转换的一部分。
技术转换
这种类型的转换不太明显,结果可能一点也不像原始数据。例如,RSI 就是这样的一个技术指标,它是基于移动平均线和归一化的递归规则创建的。
分类转换
这种转换类型将数值数据转换为分类数据,反之亦然。例如,被称为OneHotEncoder的算法将分类数据转换为二进制数据,以便机器学习算法能够对其进行分类。
在继续之前,有一个值得讨论的数据问题。多重共线性是回归分析中的统计现象,当多个独立变量(输入)在多元回归模型中彼此高度相关时发生。换句话说,这种情况是指两个或更多预测变量之间存在强线性关系。这种相关性可能会使得回归模型难以区分每个预测变量对依赖变量(结果变量)的个别影响。显然,如果您使用具有不同时间周期的多个 RSI 指标,则很可能会遇到多重共线性问题。请确保寻找弱相关的指标。
本示例中使用了两个技术指标(或转换):
-
五周 RSI,一个不需要任何转换的稳定指标。
-
周收盘价与 20 周移动平均线之间的差异。这也是一个不需要任何转换的稳定计算。
因此,将使用上周的 RSI 值和上周收盘价与 20 周移动平均线之间的距离来预测 EURUSD 的每周回报。
首先,导入所需的库:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, LSTM
from master_function import mass_import, rsi, ma, calculate_accuracy
from master_function import plot_train_test_values,
from master_function import multiple_data_preprocessing
from sklearn.metrics import mean_squared_error
from master_function import add_column, delete_column
接下来,使用mass_import()函数导入数据:
data = mass_import(0, 'W1')[:, –1]
data = rsi(np.reshape(data, (–1, 1)), 5, 0, 1)
data = ma(data, 5, 0, 2)
data[:, 2] = data[:, 0] – data[:, 2]
data = add_column(data, 1)
for i in range(len(data)):
data[i, 3] = data[i, 0] – data[i – 1, 0]
data[:, 0] = data[:, –1]
data = delete_column(data, 3, 1)
定义多数据预处理函数,该函数获取两个技术指标的值并对它们进行滞后处理,以便用作预测 EURUSD 回报的输入。表 11-2 显示了训练表x_train,其中包含六个滞后值作为独立变量来解释和预测下一个 EURUSD 回报。
表 11-2。训练数组的示例
| RSI t–1 | (Close – MA)t–1 | RSI t–2 | (Close – MA)t–2 | RSI t–3 | (Close – MA)t–3 |
|---|---|---|---|---|---|
| 36.6190 | –0.003804 | 48.5188 | 0.001044 | 42.4396 | –0.001714 |
| 46.7928 | 0.001674 | 36.6190 | –0.003804 | 48.5188 | 0.001044 |
| 40.5430 | –0.002518 | 46.7928 | 0.001674 | 36.6190 | –0.003804 |
| 65.9614 | 0.011340 | 40.5430 | –0.002518 | 46.7928 | 0.001674 |
| 47.2585 | –0.000390 | 65.9614 | 0.011340 | 40.5430 | –0.002518 |
| 63.9755 | 0.011302 | 47.2585 | –0.000390 | 65.9614 | 0.011340 |
下一个函数已经定义,但讨论其功能并无害处。multiple_data_preprocessing()函数仅为回测创建了四个必需的数组,但使用了两个技术指标作为输入。你可以定义这个函数来处理六个滞后值(三个用于 RSI,三个用于收盘价与移动平均值之间的差)如下:
def multiple_data_preprocessing(data, train_test_split):
data = add_column(data, 4)
data[:, 1] = np.roll(data[:, 1], 1, axis = 0)
data[:, 2] = np.roll(data[:, 2], 1, axis = 0)
data[:, 3] = np.roll(data[:, 1], 1, axis = 0)
data[:, 4] = np.roll(data[:, 2], 1, axis = 0)
data[:, 5] = np.roll(data[:, 3], 1, axis = 0)
data[:, 6] = np.roll(data[:, 4], 1, axis = 0)
data = data[1:, ]
x = data[:, 1:]
y = data[:, 0]
split_index = int(train_test_split * len(x))
x_train = x[:split_index]
y_train = y[:split_index]
x_test = x[split_index:]
y_test = y[split_index:]
return x_train, y_train, x_test, y_test
设定超参数并创建数组:
num_lags = 6 # Must equal the number of the lagged values you create
train_test_split = 0.80
neurons = 500
num_epochs = 500
batch_size = 200
# Creating the training and test sets
x_train, y_train, x_test, y_test = multiple_data_preprocessing(data,
train_test_split)
要符合 LSTM 架构,独立变量必须转换为三维数组。这可以通过以下代码完成:
x_train = x_train.reshape((–1, num_lags, 1))
x_test = x_test.reshape((–1, num_lags, 1))
接下来,创建模型的架构并预测训练集(仅了解拟合程度)和测试集上的值:
# Create the LSTM model
model = Sequential()
# Adding a first layer
model.add(LSTM(units = neurons, input_shape = (num_lags, 1)))
# Adding a second layer
model.add(Dense(neurons, activation = 'relu'))
# Adding a third layer
model.add(Dense(neurons, activation = 'relu'))
# Adding a fourth layer
model.add(Dense(neurons, activation = 'relu'))
# Adding a fifth layer
model.add(Dense(neurons, activation = 'relu'))
# Adding the output layer
model.add(Dense(units = 1))
# Compiling the model
model.compile(loss = 'mean_squared_error', optimizer = 'ada
# Fitting the model
model.fit(x_train, y_train, epochs = num_epochs, batch_size = batch_size)
# Predicting in the training set for illustrative purposes
y_predicted_train = model.predict(x_train)
# Predicting in the test set
y_predicted = model.predict(x_test)
要绘制预测值与实际值,请使用以下语法:
plot_train_test_values(100, 50, y_train, y_test, y_predicted)
图 11-6 将预测值与真实测试值进行比较。
图 11-6. 训练数据随后是测试数据(虚线),以及预测数据(细线);垂直虚线代表测试期的开始。使用的模型是 LSTM 回归算法。
以下是模型的结果:
Accuracy Train = 59.39 %
Accuracy Test = 51.82 %
RMSE Train = 0.0163232045
RMSE Test = 0.0122093494
Correlation In-Sample Predicted/Train = 0.255
Correlation Out-of-Sample Predicted/Test = 0.015
调整模型并看到如何改进是非常有趣的。由于这些是每周的预测,高准确率可能是优化模型和确保不过拟合的第一步。¹ 值得注意的是,由于此算法试图预测工具的财务回报,所以使用calculate_accuracy()函数而不是calculate_directional_accuracy()。
注意
尝试在 MPF 模式下运行本节中看到的算法,并看看你能从中提取什么。记住在执行时算法的限制条件。
使用深度学习预测比特币的波动性
比特币是一种去中心化的数字货币,由一个使用化名Satoshi Nakamoto的未知个人或实体于 2009 年创造。它是第一个引入的加密货币,至今仍然是最知名和广泛交易的加密货币。考虑到这些年对比特币的巨大炒作,你可能不需要介绍它,但多一些了解永远有好处。
比特币运行在一种名为区块链的技术上,这是一个分布式分类帐系统。与由政府或中央银行发行和监管的传统货币不同,比特币不受任何中央机构控制。
相反,它依赖于一个点对点网络的计算机节点来验证和记录交易。如今,比特币在加密货币交易所上交易频繁,并用于投机和套期保值操作。最常交易的货币对是 BTCUSD,即 1 比特币相对于美元的价值。
图 11-7 显示了 BTCUSD(比特币兑美元的价值)的演变。
Figure 11-7. 自 2014 年以来 BTCUSD 的历史演变,使用线性刻度。
您可以使用以下代码生成 Figure 11-7:
import pandas as pd
# Manually importing BTCUSD values
my_data = pd.read_excel('Bitcoin_Daily_Historical_Data.xlsx')
# Renaming the columns
my_data.columns = ['Date', 'Open', 'High', 'Low', 'Close']
# Setting the date column
my_data['Date'] = pd.to_datetime(my_data['Date'])
# Charting
plt.plot(my_data['Date'], my_data['Close'], label = 'BTCUSD',
color = 'black')
plt.legend()
plt.grid()
确保从GitHub 仓库下载历史 BTCUSD 值,并将解释器目录设置为与下载文件相同的文件夹中。
Figure 11-7 使用线性刻度绘制,这意味着数据在直线和均匀间隔的轴上表示(10 和 20 之间的空间与 1230 和 1240 之间的空间相同)。还可以使用所谓的对数刻度来绘制经历大幅跳跃的时间序列。
Figure 11-8 显示了 BTCUSD(比特币价值以美元计价)的对数尺度演变。
Figure 11-8. 自 2014 年以来 BTCUSD 的历史演变,使用半对数尺度。
使用以下代码使用plt.semilogy()函数生成 Figure 11-8:
plt.semilogy(my_data['Date'], my_data['Close'], label = 'BTCUSD',
color = 'black')
plt.legend()
plt.grid()
注意
semilog一词指的是将两个轴之一转换为对数刻度,而log指的是将两个轴都转换为对数刻度。
由于时间是线性的,因此您只需转换y-轴(即值),因此您在技术上使用的是半对数图表。这就是为什么matplotlib()函数被称为plt.semilogy()。
如果您喜欢使用 Python 脚本导入 BTCUSD 值,请使用以下代码:
import requests
import json
import pandas as pd
import numpy as np
import datetime as dt
# Selecting the time frame
frequency = '1h'
# Defining the import function
def import_crypto(symbol, interval = frequency):
# Getting the original link from Binance
url = 'https://api.binance.com/api/v1/klines'
# Linking the link with the cryptocurrency and the time frame
link = url + '?symbol=' + symbol + '&interval=' + interval
# Requesting the data in the form of text
data = json.loads(requests.get(link).text)
# Converting the text data to a dataframe
data = np.array(data)
data = data.astype(np.float)
data = data[:, 1:5]
return data
# Importing hourly BTCUSD data
data = import_crypto('BTCUSDT')
让我们看看深度学习是否有助于利用滞后值预测 BTCUSD 的波动性。但首先,有两个问题需要回答:
-
预测比特币波动性的用途是什么?
-
如何计算比特币的波动性?
要回答第一个问题,通过预测比特币的波动性,交易者可以潜在地识别出价格波动增加的时期,并从中获利。类似地,波动性预测还可以提供市场情绪的见解。当投资者预期不确定或动荡的市场条件时,可能表明缺乏信心,从而导致市场动态的潜在变化。
要回答第二个问题,您可以使用收盘价格的滚动标准差测量。这允许您创建一个反映比特币历史波动性的新时间序列。
注意
通常,波动率的增加是市场压力和恐惧的迹象,这转化为熊市情绪。相反,波动率的减少是市场健康稳定的迹象,这转化为牛市。这种关系并不完美,其他变量可能会影响它。例如,如果你计算比特币每日收盘价格与 10 天滚动波动率的相关系数,你会发现它是正的(在某些时期,它非常正)。比特币以兴奋资产而闻名,涨势伴随着一种称为 FOMO 的现象,即害怕错过的缩写。这种心理偏差是市场泡沫的构成要素之一,所有人都希望从中获利而不断买入。
预测分析的第一步是理解你正在处理的数据。提醒一下,波动率指的是金融工具(如股票、债券、大宗商品或货币)价格在特定时间段内的变化或波动程度。它是该特定资产的离散度的统计度量。
图 11-9 显示了比特币的最新 10 天波动率值,这些值是通过滚动标准差计算得出的。最新的数据表明,最近,价格波动大部分时间都在 10 天均值周围的 500 美元左右波动(更深入地了解标准差,请参阅第三章)。
图 11-9. 比特币的滚动 10 天标准差作为波动率的代理。
让我们开始吧。对于这个任务,让我们手动将 BTCUSD 导入解释器。首先,导入所需的库:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, LSTM
from master_function import add_column, delete_row, volatility
from master_function import data_preprocessing, plot_train_test_values
from master_function import calculate_directional_accuracy
from sklearn.metrics import mean_squared_error
from statsmodels.tsa.stattools import adfuller
接下来,使用pandas导入数据:
data = pd.read_excel('Bitcoin_Daily_Historical_Data.xlsx').values
下一步是计算波动率。其函数在master_function中定义,因为你已经导入了它,所以应该可以直接使用:
data = volatility(data, 10, 0, 1)
data = data[:, –1]
你必须检查是否平稳。如果数据是平稳的,那么它就准备好用于训练了。否则,你可能需要进行转换。以下代码对比特币的 10 天波动率应用 ADF 测试:
print('p-value: %f' % adfuller(data)[1])
这是输出:
p-value: 0.120516
看起来波动率值是非平稳的。让我们尝试进行差分:
data = np.diff(data)
注意
你也可以应用分数阶差分以保留一丝记忆。
图 11-10 显示了比特币的最新 10 天差异波动率值。
图 11-10. 比特币的滚动 10 天标准差(差异)。
接下来是设置超参数并像往常一样准备数组:
num_lags = 300
train_test_split = 0.80
neurons = 80
num_epochs = 100
batch_size = 500
# Prepare the arrays
x_train, y_train, x_test, y_test = direct_mpf(data,
num_lags,
train_test_split,
forecast_horizon)
要符合 LSTM 架构,独立变量必须转换为三维数组。这可以通过以下代码完成:
x_train = x_train.reshape((–1, num_lags, 1))
x_test = x_test.reshape((–1, num_lags, 1))
创建深度神经网络架构,并添加几个额外的层:
# Create the LSTM model
model = Sequential()
# Adding a first layer
model.add(LSTM(units = neurons, input_shape = (num_lags, 1)))
# Adding a second layer
model.add(Dense(neurons, activation = 'relu'))
# Adding a third layer
model.add(Dense(neurons, activation = 'relu'))
# Adding a fourth layer
model.add(Dense(neurons, activation = 'relu'))
# Adding the output layer
model.add(Dense(units = forecast_horizon))
# Compiling the model
model.compile(loss = 'mean_squared_error', optimizer = 'adam')
现在,拟合并预测数据:
model.fit(x_train, y_train, epochs = num_epochs, batch_size = batch_size)
y_predicted = model.predict(x_test)
图 11-11 比较了预测值与测试值。
图 11-11. 预测比特币的波动性;所使用的模型是 LSTM 回归算法。
以下是模型的结果:
Accuracy Train = 66.56 %
Accuracy Test = 63.59 %
RMSE Train = 95.6086778521
RMSE Test = 186.1401365824
Correlation In-Sample Predicted/Train = 0.807
Correlation Out-of-Sample Predicted/Test = 0.56
请记住,由于回测期间、时间粒度、交易成本、不同经纪人的不同报价、不同超参数和不同随机化,回测结果可能会有显著差异。优化是关键组成部分,必须在对算法形成意见之前对结果进行验证。因此,你的任务是改善结果,并更好地预测波动性。
你可能还想知道是否可以直接准确地预测比特币的回报,而不是随机的。答案是肯定的,如果你需要一些可能有助于预测比特币回报的输入的想法,请查看以下非详尽列表:
-
历史价格数据及其衍生品:使用历史价格数据是预测回报的基本方面。你可以包括每日、每周或每月价格变动、移动平均值和价格波动率等特征。
-
交易量:比特币的交易量提供了有关市场活动水平和流动性的宝贵信息。更高的交易量通常伴随着重大的价格波动。
-
市场情绪指标:来自社交媒体平台、新闻文章或论坛的情绪分析可以帮助衡量市场对比特币的整体情绪。比特币的恐惧与贪婪指数是一个不错的选择,因为它每天发布一次,并使用许多基本变量来计算其值。
-
网络指标:比特币的区块链数据提供了有用的指标,例如交易数量、哈希率和难度水平。这些指标反映了比特币网络的活动和健康状况,这可能会影响价格。
-
市场指标:考虑使用一般市场指标,如标普 500 指数或恐慌指数作为外部变量。加密货币,包括比特币,有时会与传统金融市场表现出相关性。
-
加密货币特定指标:与加密货币领域特定的其他指标,例如所有加密货币的总市值和比特币的主导比例,可能提供有关更广泛市场情况的见解。
-
技术指标:各种技术分析指标,例如 RSI 和波动性,可以提供有关潜在价格趋势和逆转的见解。
-
Google 趋势:监测与比特币相关的搜索词在 Google 趋势上的流行度可以提供有关公众兴趣和潜在价格变动的见解。
-
加密货币交易数据:来自加密货币交易所的数据,例如未平仓合约、资金费率和清算数据,可以提供有关市场动态和潜在价格变动的见解。
训练的实时可视化
训练过程中发生了什么?当你查看每个时期的进度条时,你会发现训练过程正在进行中:
第 1/100 时期
9/9 [=============================] – 3s 77ms/step - loss: 0.0052
Epoch 2/100
9/9 [=============================] – 1s 78ms/step - loss: 0.0026
Epoch 3/100
9/9 [=============================] – 1s 68ms/step - loss: 0.0015
然而,您还可以编写一个动态图表,显示样本内预测如何通过时期更新并接近样本内的真实值。这将是本节的第一个目标。在继续之前,请刷新您对术语的理解:
在样本内的真实值
这些是y_train中包含的值。它们是模型用来校准训练的真实值。它们属于训练集。
样本内的预测
这些是y_predicted_train中包含的值。它们是模型在训练过程中输出的预测值。它们属于训练集,并受到前瞻偏差的影响,即在做出决策或预测时使用未来信息,而这些决策或预测应该基于当时仅有的历史数据。
样本外的真实值
这些是用于测试模型在从未见过的数据上预测值的测试值。它们属于测试集。
样本外的预测
这些是跟随训练阶段的预测值。它们属于测试集。
让我们举个你在第九章熟悉的例子,ISM PMI 数据。目标是创建一个一步预测的 LSTM 模型,预测 ISM PMI 值的差分,同时在训练过程中动态绘制图表,显示预测结果如何校准到训练集。首先,导入所需的库:
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from keras.models import Sequential
from keras.layers import Dense, LSTM
from master_function import data_preprocessing
from master_function import calculate_directional_accuracy
from sklearn.metrics import mean_squared_error
import tensorflow as tf
import random
从GitHub 代码库中导入并进行 ISM PMI 数据的差分:
data = np.diff(np.reshape(pd.read_excel('ISM_PMI.xlsx').values, (–1)))
下一步是设置超参数并像往常一样准备数组:
num_lags = 100
train_test_split = 0.80
neurons = 200
num_epochs = 200
batch_size = 4
# Creating the training and test sets
x_train, y_train, x_test, y_test = data_preprocessing(data,
num_lags,
train_test_split)
为了符合 LSTM 架构,必须将独立变量转换为三维数组。可以使用以下代码完成:
x_train = x_train.reshape((–1, num_lags, 1))
x_test = x_test.reshape((–1, num_lags, 1))
创建深度神经网络架构:
# Create the LSTM model
model = Sequential()
# Adding a first layer
model.add(LSTM(units = neurons, input_shape = (num_lags, 1)))
# Adding a second layer
model.add(Dense(neurons, activation = 'relu'))
# Adding a third layer
model.add(Dense(neurons, activation = 'relu'))
# Adding a fourth layer
model.add(Dense(neurons, activation = 'relu'))
# Adding the output layer
model.add(Dense(units = 1))
# Compiling the model
model.compile(loss = 'mean_squared_error', optimizer = 'adam')
以下代码将x_train数据拟合到y_train数据,并在每个时期绘制预测结果:
def update_plot(epoch, logs):
if epoch % 1 == 0:
plt.cla()
y_predicted_train = model.predict(x_train)
plt.plot(y_train, label = 'Training data',
color = 'black', linewidth = 2.5)
plt.plot(y_predicted_train, label = 'Predicted data',
color = 'red', linewidth = 1)
plt.title(f'Training Epoch: {epoch}')
plt.xlabel('Time')
plt.ylabel('Value')
plt.legend()
plt.savefig(str(random.randint(1, 1000)))
# Create the dynamic plot
fig = plt.figure()
# Train the model using the on_epoch_end callback
class PlotCallback(tf.keras.callbacks.Callback):
def on_epoch_end(self, epoch, logs = None):
update_plot(epoch, logs)
plt.pause(0.001)
plot_callback = PlotCallback()
history = model.fit(x_train, y_train, epochs = num_epochs,
batch_size = batch_size, callbacks = [plot_callback])
图 11-12 展示了第 1 个时期的训练情况。注意算法刚刚开始,尚未完全捕捉独立和因变量之间的关系。
图 11-12。ISM PMI 数据在第 1 个时期的训练正在进行中。
图 11-13 展示了第 21 个时期的训练情况。看起来算法仍在校准自身以适应特征。
图 11-13。ISM PMI 数据在第 21 个时期的训练正在进行中。
图 11-14 展示了第 29 个时期的训练情况。模型开始适应数据。
图 11-14。ISM PMI 数据在第 29 个时期的训练正在进行中。
图 11-15 展示了第 62 轮训练。模型似乎很好地拟合了数据,尽管存在一些错误,但这不是本节的主要目的。
动态训练图表可以是一个有趣的工具,用于观察模型的学习情况——以及它是否真正在学到东西。这有助于解决常数预测的问题,即当模型无法捕捉因变量和自变量之间的任何关系时。
图 11-15. ISM PMI 数据在第 62 轮训练中进行中。
几个因素可能导致深度学习中的常数预测问题:
糟糕的模型架构
如果模型表达能力不足,可能会难以学习有意义的模式,从而采用简单的常数预测。
数据有限或噪声过多
数据不足或噪声过多可能会阻碍模型学习有意义的模式。如果数据缺乏多样性或包含显著错误,模型可能会收敛到常数预测,因为这是最简单的方式来减少损失。
不恰当的损失函数
损失函数的选择在训练期间对指导模型起着至关重要的作用。如果损失函数不适合任务或模型架构,可能不会鼓励模型做出多样化预测,导致常数预测。
糟糕的超参数调整
超参数,如批量大小和神经元数量,可以显著影响训练过程。如果这些超参数未得到适当调整,模型可能无法有效收敛,导致常数预测。
此时,您一定想知道使用Sequential()和Dense()函数构建的架构是什么样子。自然地,它应该类似于您之前看到的神经网络图。要查看此内容,您必须从提示符中pip install所需的库:
pip install pydot
pip install pydotplus
pip install graphviz
接着,从官方网站下载graphviz二进制文件夹,解压文件内容,然后将bin文件夹设置为 Python 解释器(例如 Spyder)的路径之一。重新启动内核,然后像往常一样编译您的模型。最后,使用以下代码打印架构:
from tensorflow.keras.utils import plot_model
from IPython.display import Image
plot_model(model, to_file = 'Architecture.png',
show_shapes = True,
show_layer_names = True)
Image('Architecture.png')
图 11-16 展示了代码的输出。
图 11-16. 模型架构示例。
代码输出编译后的 LSTM 模型当前的架构。
概要
这个信息密集的章节向你展示了使用一些交易算法预测回报的几个想法。它主要是激发批判性和创新性思维的一种方式,并从中找到可以推导交易信号的新想法。例如,你可以尝试在从算法得到的信号上应用过滤器。过滤器 就像开关一样,根据最终条件是否满足来允许信号。一个带有过滤器的假设交易策略的例子是,仅在市场位于其 200 日移动平均线之上时采取看涨信号,并且仅在市场位于其 200 日移动平均线之下时采取看跌信号。
你的主要收获应该是如何组织结构,以便理解回测过程。与本章相比,第十二章将是一场轻松的旅程,因为它探讨了风险管理和旨在增强研究过程的基本工具。
¹ 摇摆交易涉及持有短期到中期的头寸,通常是几天到几周,以从价格波动或大趋势中获利。
² 该指数用于衡量加密货币市场投资者的情绪和情绪。它提供了一个从 0 到 100 的数值,其中较低的值表示极度恐惧,较高的值表示极度贪婪。该指数旨在帮助交易员和投资者根据当前情绪识别潜在的市场转折点。
第十二章:市场驱动因素和风险管理
在今天快速发展的市场中,理解市场驱动因素和风险管理对于在交易和投资努力中取得成功至关重要。
市场驱动因素是影响金融市场的因素,如经济指标、企业绩效、地缘政治事件、央行政策和技术进步。通过了解这些驱动因素,投资者可以做出明智的决策,预测市场趋势。算法交易员必须注意可能导致模型波动的这些事件。风险管理是坚实投资策略的支柱。它包括多样化、止损指令、头寸规模、风险-回报评估和情绪纪律。
通过深入了解市场驱动因素并结合有效的风险管理技术,交易员可以应对金融市场的复杂性,并增加交易算法成功的可能性。
本章分为两个主要部分。第一部分从基本角度讨论市场驱动因素,第二部分从一般角度讨论风险管理。
市场驱动因素
理解市场驱动因素对于制定健康和稳健的交易系统至关重要。不了解是什么推动市场最终将导致整个过程的失败。到目前为止,您已经看到了使用同一时间序列的滞后值或技术指标的定量交易算法,但这只是看问题的一种方式。
在交易过程中,会发生许多事件,这些事件可能会影响头寸和承担的风险。了解这些事件可能有助于减少一些风险,但也可能在途中提供一些方向性机会。这一部分可以看作是关于基本分析和市场预期的入门。如果您对这个领域很熟悉,那么这应该很容易。
市场驱动因素和经济直觉
市场驱动因素影响并引导资产的运动和行为。这些驱动因素可以是金融、经济、地缘政治或甚至心理的。考虑以下四种资产类别:股票、固定收益、大宗商品和货币。
注意
作为提醒,固定收益是指一种投资类型,它以利息或股息的形式为投资者提供定期和可预测的支付,在一定期限内。之所以称为固定收益,是因为这些投资所产生的收入通常是固定的并在事先已知,与其他投资(如股票)产生的可变收入相对。
固定收益投资最常见的形式是债券,这些债券实质上是政府、市政当局、公司或其他实体发行的债务证券,以筹集资金。
当经济强劲时,由于投资者和市场参与者的偏好和行为不同,通常会对资产类别产生不同的影响。让我们详细看一下:
股票市场
强劲的经济条件通常会导致企业利润上升,因为企业的收入和销售额增加。这种收益增加可以推动股票价格上涨,因为投资者预期公司会有更好的回报。这还会导致消费者支出增加。这可能会使那些依赖消费者购买的公司(如零售和消费品公司)受益,它们可能会经历销售增加和盈利能力提升。此外,强劲的经济会给投资者带来信心,使他们更愿意承担风险并投资于股票市场(而不是固定收益市场)。积极的情绪可以吸引更多的买家,导致股票价格上涨(这也可能吸引投机交易者推高价格)。此外,央行可能会采取政策有效控制通胀,这对股票市场可能是有利的。适度的通胀率和低利率可以鼓励借贷、投资和业务扩展。
固定收益市场
随着经济的增强,央行可能会提高利率,以防止经济过热并控制通胀。新债券的高收益率使得现有收益较低的债券变得不那么吸引人。因此,尤其是对于长期债券,债券价格可能会下降。此外,当经济强劲且企业业绩良好时,投资者可能更倾向于将资金配置到股票市场上,因为那里可能会有更高的回报。同样的推理也适用于安全避风港资产(如政府债券)需求较低的情况,因为投资者对整体经济前景更为乐观。因此,这类债券的需求可能会减少,对价格构成下行压力。
大宗商品
强劲的经济通常会导致工业生产增加和消费者支出增加。因此,对大宗商品的需求,特别是像铜和钢这样的工业金属,由于它们在制造和建筑中的用途而上升。经济增长还导致能源消耗增加。因此,石油和天然气的需求通常会增加,推动它们的价格上涨。通胀预期上升是经济增长的结果,这可能会导致投资者转向贵金属(如黄金和白银)作为对抗货币贬值和市场不确定性的避险。最后,农产品商品(如小麦和玉米)也可能会因消费者在食品产品上的增加支出而出现上涨。
货币
强劲的经济通常会吸引外国投资并增加对本国货币的需求。国际投资者在强劲的经济中寻求更高的回报,从而增加了对以该货币计价的资产的需求。随着对本国货币的需求增加,其在外汇市场上相对于其他货币的价值也会升值。中央银行可能会提高利率以管理不断上涨的通货膨胀,并确保经济稳定。较高的利率吸引了寻求更好回报的外国投资者,推动对本国货币的需求增加并推高其价值。同样,强劲的经济通常会导致出口增加,因为本国的商品和服务在全球市场上变得更具竞争力。这可以改善国家的贸易平衡并有助于货币更加强劲。
注意
在现实生活中,这些关系更加复杂,因为其他因素如政治稳定性和天气事件也会影响到这些关系。看到这些相关性和市场逻辑的违反和结构性断裂并不罕见。它们可以用作经验法则,但决不是绝对可靠的条件。
经济直觉 的概念指的是选择预测因变量的特征的合理性。将公司盈利和国债收益率选择为独立变量,以预测股市回报的基本应用经济直觉。在基于外生和基本因素创建复杂的交易算法时,建议使用经济直觉。
一些专家认为技术指标可能不足以提供下一步预期的完整图景,但其他人指出基本面指标在短期内不能使用,有时长期数据也不足或不可得。
新闻解读
新闻解读 是分析和理解新闻事件、经济指标、地缘政治发展及其他相关信息如何影响金融市场的过程。在探索如何分析新闻之前,重温您对经济指标的了解至关重要:
国内生产总值(GDP)
这一指标代表了一个国家在特定时期内所有生产的商品和服务的总货币价值,通常以季度或年度为单位进行测量。 GDP 被用作衡量一个国家整体经济健康和表现的指标。
失业率
这一指标计算出正在失业并积极寻找工作的劳动力的百分比。这是评估就业市场健康状况和整体经济状况的关键指标。失业率通常由政府机构每月报告。较低的失业率通常被认为是积极的,因为它表明更健康的就业市场、更高的经济活动和更多的求职机会。相反,较高的失业率可能表明经济面临挑战,劳动力未被充分利用。政策制定者密切监测失业率,以评估其经济政策的有效性,并做出有关解决就业相关问题的知情决策。
通货膨胀率
简单来说,通货膨胀是一段时间内经济中货物和服务的总体价格水平上涨。当发生通货膨胀时,每单位货币购买的货物和服务比之前少。换句话说,通货膨胀侵蚀了货币的购买力。通常使用各种价格指数(如消费者物价指数(CPI))来衡量通货膨胀。通常是按年计算。你在第三章中看到了 CPI。
央行政策利率
也称为基准利率,它们代表国家央行设定的利率,以影响和控制国内的整体经济活动和通货膨胀。这些利率是货币政策的主要工具。最常见的央行政策利率是隔夜或政策利率,即商业银行在隔夜基础上向央行借款或放款的利率。这一利率至关重要,因为它影响经济中的其他各种利率,包括贷款利率和储蓄账户的存款利率。央行利用政策利率的变动来实现特定的经济目标,如控制通货膨胀、刺激经济增长和维持价格稳定。
消费者信心指数
这些指数衡量消费者对当前和未来经济前景的乐观或悲观程度。这些指数旨在评估消费者情绪,这可以提供关于消费者支出行为和整体经济健康状况的见解。消费者信心指数通常基于对一定数量家庭的代表性样本进行的调查。
注意
另一个重要的经济指标是 ISM PMI,这是第九章中讨论的一个指标。
作为一名交易员,新闻解读涉及评估新闻事件的重要性,并确定其对资产价格的潜在影响。在消化新闻时,请考虑以下几点:
-
不同的新闻项目可能对各种资产类别产生不同的影响。例如,积极的经济数据可能会提振股票,但导致黄金等避险资产下跌。了解新闻事件与资产之间的相关性和反向关系至关重要。
-
新闻可以塑造市场情绪,导致看涨或看跌的趋势。交易者必须评估市场参与者对新闻的感知以及它可能影响其行为的方式。
-
一些新闻对市场有直接影响,导致价格突然波动,而其他新闻可能会产生更渐进和持久的影响。交易者应意识到新闻的时间敏感性,以优化他们的交易策略。
-
在某些情况下,市场已经将某些新闻事件的预期价格计入其中。交易者需要将实际新闻发布与市场预期进行比较,以确定该新闻是否令人惊讶。
注意
通过权威的财经新闻媒体(如金融时报和彭博社)保持信息更新,并进行彻底的研究,可以帮助交易者在动态和不断变化的市场环境中做出更明智的决策。
风险管理
找到一种预测性且有利可图的交易策略将为你赚钱,但一个健全的风险管理系统将使你能够保持资金。在传统金融领域,最基本的风险管理形式是分散化,即将资金分配到不同的不相关资产类别中,以分散资本贬值的风险。
另一个基本的风险管理示例就是简单地避免可能不时困扰零售交易社区的诈骗行为。
如今,有大量的资产管理者、信号提供者和复制交易算法承诺高额且稳定的回报。这些在线服务的丰富多样性引发了一个问题,即投资的质量是否值得。在评估交易服务时,有三个简单的规则要遵循:
-
保证回报和欺诈是两个可以互换的概念。避免陷入这个陷阱。
-
即使是最微小的不明确也是一个重大警告信号。要求透明且可解释的结果,由第三方审计员支持。
-
绝大多数业绩记录都是假的,结果主要基于错误的回测或选择偏见。你必须始终保持怀疑。
风险管理的另一个例子是头寸大小确定。头寸大小 指的是确定分配给特定交易或投资的适当资本量的过程。它涉及根据各种因素(如风险容忍度、账户规模和市场条件)计算要交易的股票、合约或手数的数量。适当的头寸大小对于风险管理至关重要,有助于交易者避免过度损失。智能交易算法在交易时具有这种功能,因此根据诸如波动性和预期回报等因素对头寸进行优化。
有几种技术和方法可用于头寸大小确定,例如以下几种:
固定货币金额
这种方法涉及将交易资本的固定货币金额分配给每笔交易。例如,您可以决定在每笔交易中风险账户的$250。因此,这种方法假定每笔交易的权重相等。
固定比例
使用这种技术,您会将交易资金的固定比例分配给每笔交易。例如,您可以决定在每笔交易中承担账户的 1%风险。随着账户规模的变化,头寸大小会相应调整。
凯利准则
凯利准则是一个数学公式,根据获胜和失败交易的概率计算出最佳头寸大小。它考虑了交易者的优势(成功概率)和回报比率。该公式有助于确定分配的资本百分比,以最大限度地实现长期增长,同时最小化破产的风险。
命中率方法
命中率方法是我使用的一种技术,它采用了一种关于连续获胜和连续失败的动量方法。它假设获胜必须以更大的头寸来奖励,而失败必须以较小的头寸来惩罚。命中率越高,头寸就越大,反之亦然。
风险管理基础知识
风险管理并不一定要复杂。您可以通过使用本节中提供的几种简单技术来创建一个稳健的风险管理系统。
止损和目标
止损单(止损)是在交易开始时设置的自动订单,以确保最小预定损失。例如,如果您以2,000,您可以将止损单设定为1,250,您的损失不会超过2,000 时出售的预期被称为 止盈单(目标)。
注意
任何交易的最基本风险管理系统都是设定适当的止损和目标,以便您能够设定期望并限制风险。
有一个规则是绝对不能违反的:始终设定止损和目标。算法可以轻松地让您自动化这个过程。
移动止损
表格 12-1. 经济日历
行为金融:偏见的力量
另一种确保至少获得一些利润的方法是将止损移动到$1.0100,从而确保无论如何都能获利。当然,你将止损移动到当前市场价格越接近时,被止损获利的可能性就越大。
注意
对于趋势跟随策略,使用追踪止损是个好主意,因为它们允许你顺势操作。
经济日历是一种风险规避的形式,它显示预计会对市场产生影响的重要新闻发布。表格 12-1 展示了某一天经济日历的假设示例。
追踪止损是一种动态的止损订单,随着市场价格朝着预期方向移动,从而确保更少的损失,并在某个时点确保没有损失的交易。理解追踪止损订单的最佳方法是通过一个例子。
一些交易者根据新闻进行交易,因此他们喜欢在新闻发布前或发布后数秒钟内交易,以从波动中获利。从风险管理的角度来看,这是不推荐的,因为新闻事件周围的波动是随机的,有时会令市场感到意外。
| 时间 | 国家 | 事件 | 影响 | 上一个数值 | 预期数值 | 实际数值 |
|---|---|---|---|---|---|---|
| 9:00 AM | 英国 | 消费者价格指数 | 高 | 1.00% | 1.20% | 1.10% |
| 11:30 AM | 德国 | 核心消费者价格指数 | 高 | 0.50% | 0.75% | 0.75% |
| 4:30 PM | 美国 | 初次申请失业救济金人数 | 低 | 232,000 | 215,000 | 229,000 |
| 7:30 PM | 美国 | 利率决定 | 高 | 1.50% | 1.50% | TBA |
假设你在 EURUSD 上做多,进场价为1.0500。你设定了止损订单在1.0230,你希望确保你的交易永远不会亏损。解决方法是使用追踪止损订单,将止损从1.0000,这样即使市场回落到$1.0000,你也能平仓并保持不赔不赚。
最好的做法是避免在历史上曾引发极端波动的重要发布时进行交易。例如政治公告、GDP 数据和 FOMC 会议。
注意
FOMC 代表美联储公开市场委员会。该委员会监督美国的公开市场国库操作并就利率做出决策。
行为金融,源自行为经济学的一个领域,试图解释市场异常和交易者的行为。通过深入理解行为金融,你将更好地理解市场在特定事件和水平周围为何如此反应。
金融市场由不同的人类和机器参与者的行动和反应组成,形成了心理和数量上的混合物。这解释了低信号与噪声比——换句话说,为什么在常规基础上准确预测市场是困难的。这些行动和反应也被称为偏见,它们是人类在应对某些事件时的缺陷。偏见是本节的主角,分为两类:
认知偏见
这些偏见源于缺乏知识。认知偏见通常涉及基于错误市场假设或糟糕研究而得出的错误结论。
情绪偏见
这些偏见大多是感情驱动的,具有冲动性质。它们不是由于教育缺乏而是由于自我控制和自我管理不足引起的。
认知偏见
本小节列出了一些最常见的认知偏见及其市场影响,并提供了如何避免它们的建议:
保守主义偏见
当市场参与者对新信息反应迟缓,并过于重视基本率时,就会发生这种情况。这是一种不适应的失败类型。应对这种偏见的方法是强迫自己对基础分析持怀疑态度,并始终保持灵活和准备好变化。由于市场是前瞻性的,它并不总是像过去那样表现。
确认偏见
当交易者专注于有利于其当前头寸的信息类型,并忽视对其头寸不利的信息类型时就会发生这种情况。这是迄今为止最常见的偏见之一,实际上是一种随着时间过去导致过度自信的正常心理状态。最好的矫正方法是保持中立和公正,尽管这说起来比做起来更容易。另一种方法是通过突出分析的基础资产的吸引力(或不吸引力)的记分卡自动化决策过程。总体而言,人类普遍受到这种偏见影响——这不仅仅是金融领域特有的。
控制幻觉偏见
当交易者高估其控制交易结果的能力时就会发生这种情况。这种偏见主要由连续赢利交易引起,可能会因为对投资资产控制权的感觉而导致集中持仓。市场由大量参与者组成,投资数万亿美元,因此不太可能受到任何单个人的影响(有少数关于小型和低流动性资产的例外情况)。去除控制幻觉的方法是保持专注和谦逊,理解你面对的是一个准随机环境,其动态和驱动因素每天都在变化。
后见之明偏见
当交易者高估他们过去的准确性时,可能会导致过度冒险。看过去的图表,很容易得出结论,随后的方向显而易见。大多数回测都包含一种后见之明的偏见,因为条件是在分析期结束时创建的。市场技术分析师在看到某些技术过去表现良好时会高估自己的能力,但未考虑到测试期间的环境。此外,某些配置在发生时与完成时看起来并不相同。后见之明偏见很难治愈,但最好的方法是考虑分析期间存在的变量,以更真实的方式模拟过去的环境。
锚定偏见
当交易者的观点被锚定到某一基准点并且未能改变以包含新信息时,就会发生这种情况。如我所提到的,分析师或交易者必须保持动态和开放的心态。治疗这种偏见的最佳方法是及时了解新信息和数据。
可得性偏见
当交易者根据易于回忆的位置选择头寸时,就会发生这种情况。这意味着熟悉的资产比非熟悉的资产更具吸引力,这是一个错误的假设,因为机会可能来自任何类型的市场。这是一种心理快捷方式,交易者在研究上不费多少心思。治疗这种偏见的方法是,在选择可投资资产组合之前必须进行充分的尽职调查。不要仅仅因为你熟悉 EURUSD 而交易它:拓宽你的视野。
损失规避偏见¹
当输掉的痛苦大于赢得的喜悦时,就会发生这种情况。这是目前最常见的偏见。人类更倾向于不想失去钱,而不是赚钱,正如丹尼尔·卡尼曼和阿莫斯·特沃斯基在《前景理论:风险决策分析》(1977 年)中所证明的。损失规避可能导致减少的风险承受能力,因此可能导致预期收益减少。然而,其最显著的影响在于止损水平。厌恶损失的人不愿意承认自己正在损失,并且会将亏损的头寸视为持续的头寸,因此更愿意等待直到盈利。这是非常危险的,因为放任无止损的头寸可能导致灾难性的结果。此外,有些人因为害怕遗憾而在赢利头寸上太快地平仓(一种后悔恐惧的表现)。处理损失规避偏见的最佳方法是自动化风险管理过程,并尊重在交易启动时设定的止损和目标订单。
情绪偏见
本小节列出了一些最常见的情绪偏见及其影响。作为提醒,认知偏见与知识缺乏相关,而情绪偏见则与心理特征相关:
过度自信的偏见
当交易员享受连胜时,并认为这是由于他们优越的市场交易能力所致,这导致他们持有集中的头寸并进行过度交易。一个好的连胜会有结束的时候,因此交易员必须始终遵循程序,确保他们不偏离策略。
遗憾规避偏差
这指的是出于恐惧而保持低风险投资。这确实与交易员的风险偏好有关。没有对与错的答案,但是对遗憾的恐惧可能使交易员错失有趣的机会。你应该冒险赚钱,但只能是经过计算的风险。
物权偏差
当交易员认为所拥有的资产比未拥有的资产更有价值时就会发生这种情况。这可能会限制交易员的机会,并导致他们只能持有已经拥有的资产,即使这些资产随时间衰减。市场处处充满机会,参与者必须时刻保持警惕,寻找下一个大机会。**** ****# 总结
本章讨论了有助于指导你在交易旅程中的各种交易话题。交易还必须包括主观意见,以创造客观意见。风险管理是交易和投资的关键方面,涉及识别、评估和减轻潜在风险,以保护资本并尽量减少损失。其主要目标是在追求长期稳定盈利的同时保全资本。
通过完成本章,你已经读完了整本书,并了解了如何开发旨在预测价格回报和其他时间序列的机器学习和深度学习算法。旅程并未止步于此;你必须继续尝试不同的技术,直到找到最适合你的风险-回报配置的策略为止。
你还应该意识到你通过完成这本书走了多远。写作是一种孤独的努力,但是是你与这些页面上的文字互动,使文字栩栩如生。你对材料的奉献和与我一同踏上这次冒险的意愿对我来说意义重大。
我希望这本书在某种程度上能够激励或启发你。它是出于爱、激情和深深的愿望来简化复杂概念而写的。你在这个叙事中的存在使其变得更加有意义。
¹ 这也被视为情绪偏差。****