English Русский Español Deutsch 日本語 Português
preview
时间序列分类问题中的因果推理

时间序列分类问题中的因果推理

MetaTrader 5交易系统 | 4 九月 2024, 09:24
43 0
Maxim Dmitrievsky
Maxim Dmitrievsky

文章内容:

前一篇文章中,我们深入研究了通过元学习器和交叉验证进行训练的方法,以及以 ONNX 格式保存模型的方法。我还注意到,机器学习模型并不能从互不相关、相互矛盾的数据中找出开箱即用的规律。在这种情况下,发送到神经网络或任何其他机器学习算法的输入和输出的内容非常重要。

另一方面,我们不可能总是准备好必要的训练数据,因为这些数据的结构已经包含了因果关系。通常,这是一组指标和买卖场景的示例。递增符号、之字形或移动平均线的相对位置通常用于确定未来交易的方向。所有这些类型的标记都不是专家,通常也不包含真正的因果关系。

数据标记可能是机器学习领域最昂贵、最耗费时间和资源的过程,因为它需要研究领域的专家(称为注释者)参与其中。即使是强大的语言神经网络,如 GPT 及其类似网络,在大量数据的训练下,也只能对形成语义上下文的语言模式进行分类。然而,它们并没有回答任何特定陈述是真是假的问题。注释团队使用这些模型,调整他们的答案,使其对最终用户有用。

在这种情况下,交易者有一个合理的问题:如果我知道如何标记数据,那么为什么我需要一个神经网络?毕竟,我可以简单地根据我的知识编写逻辑并有效地使用它。这个想法是对的,也是错的。说它错误,是因为神经网络可以很好地应对预测任务,因此只需在标记良好的数据上对其进行训练,然后在新数据上接收预测结果即可,而无需费心编写交易策略的逻辑。此外,内置功能还允许使用新数据评估预测的可靠性。说它正确,是因为如果不知道向神经网络输入什么,或者提供错误的标签数据作为输出,神经网络就无法在默认情况下创建可以获利的交易策略。

交易者们并没有立即意识到机器学习的上述问题。最初,即使是第一个简单机器学习算法的创建者也坚信,神经元的数学模拟复制了大脑神经元的工作,这意味着一个足够大的神经网络将能够完全执行大脑的功能,并学会独立分析信息。后来人们了解到,大脑具有大量高度专业化的部分。每个部分都要处理某些信息,并将其传送给其他部分。多层神经网络架构就是这样出现的,正是由于它的出现,研究人员才更接近于揭开大脑工作的神秘面纱。这样的架构已经学会了完美地处理特定的信息,如视觉、文本、音频或表格数据。

后来发现,这种神经网络在进行监督学习时也没有能力对真实模式做出独立的结论。它们容易训练过度和主观臆断。

理解大脑结构和功能的下一步是发现自然神经网络是基于强化学习的,而不仅仅是从现成的样本中学习。在这种学习中,复杂系统会因主观上正确的决定而受到奖励,因错误的决定而受到惩罚。在多次获得此类奖励后,根据手头的任务,积累经验并学习主观正确的答案选项。如果大脑或神经网络之前已经遇到过某些情况,那么它就会开始减少犯错。

这导致了强化学习的出现,当研究人员自己设置奖励函数(优化算法中的某种适应度函数)时,奖励或惩罚神经网络的正确或错误答案。现在,机器学习算法不再基于现成的标记良好的数据进行训练,而是通过反复试验来实现,试图最大化奖励函数。目前,针对不同任务有大量的强化学习算法,这一领域发展相当活跃。

这似乎是一个突破,直到它开始被用于金融时间序列分类等问题。很明显,这种学习很难控制,因为现在一切都归结为设置正确的奖励函数和选择正确的网络架构。我们面临着同样一个微不足道的问题:如果我们不知道真正的目标函数(它描述了系统状态与其反应之间的真正因果关系),那么除非你很幸运,否则我们不太可能通过对目标函数本身和各种强化学习算法的多次搜索找到它。

在没有监督者的情况下有条件学习的生成模型也发生了大致相同的情况。基于编码器-解码器或生成器-鉴别器的原理,它们学习压缩信息,突出重要特征,或区分真实样本和虚构样本(在对抗性神经网络的情况下),然后生成合理的示例,如图像。虽然图像或多或少都很清楚,而且它们是一种看似合理的神经网络“无稽之谈”,但生成准确一致的答案要复杂得多。在生成特定答案的过程中固有的随机因素无法让我们就因果关系得出明确的结论,这并不适合像交易这样的高风险活动,因为算法的随机行为就是损失的代名词。

本文作者在时间序列分类问题(尤其是外汇货币对)上尝试了所有这些算法,但对结果不太满意。

最近,关于所谓 "可靠" 或 "值得信赖" 的机器学习的出版物越来越多。总体而言,这套方法尚未完全形成,而且因领域而异。重要的是要理解,它通过机器学习算法解决了因果推理问题。研究人员已经学会了理解和信任机器学习,以至于他们准备委托它在数据中搜索因果关系,当然,这将机器学习提升到了一个全新的水平。因果推理被广泛应用于医学、计量经济学和市场营销等领域。

本文介绍了为理解一些与算法交易相关的 因果推理 技术。


因果推理的历史

因果关系由来已久,在我们所知的大多数(如果不是全部的话)先进文化中都曾考虑过因果关系。

亚里士多德是古希腊最多产的哲学家之一,他认为理解一个过程的因果结构是了解该过程的必要组成部分。此外,他还认为,能够回答 "为什么" 的问题是科学解释的精髓所在。亚里士多德指出了四种原因(物质原因、形式原因、效率原因和最终原因)。这个想法可能反映了现实中一些有趣的方面,尽管对现代人来说可能听起来违反直觉。

18 世纪著名的苏格兰哲学家大卫·休谟提出了一个更为统一的因果关系框架。休谟首先认为,我们从未观察到世界上的因果关系。我们唯一观察到的是,有些事件是相互关联的:我们只发现其中一个实际上跟在另一个后面。一个台球的动量伴随着第二个台球的运动。这就是外部感官所看到的整体。心灵不会从这一连串的物体中体验到任何感觉或内在印象:因此,在每个特定现象中,都没有任何力量或必然联系。

对休谟因果关系理论的一种解释如下:

  1. 我们只观察到物体 A 的运动或外观如何先于物体 B 的运动或外观。
  2. 如果我们看到足够多的次数,我们就会产生一种期待感。
  3. 这种期待感是我们因果关系概念的本质(它不是关于世界,而是关于我们发展出来的感觉)

至少从两个角度来看,这一理论非常有趣。首先,这一理论的内容与心理学中的条件反射非常相似。条件反射是一种学习形式。条件反射的类型有很多,但它们都依赖于一个共同的基础 - 联想(因此这种学习类型被称为联想学习)。在任何类型的条件反射中,我们都会接受一些事件或对象(通常称为刺激),并将其与特定的行为或反应联系起来。联想学习在不同的动物物种中都起作用,在人类、猴子、狗和猫以及蜗牛等更简单的生物体内都能发现它。

其次,大多数经典的机器学习算法也是基于关联来工作的。在监督学习中,我们试图找到一个将输入映射到输出的函数。为了有效地做到这一点,我们需要弄清楚输入的哪些元素对预测输出有用。在大多数情况下,关联就足以实现这一目的。

有关研究因果关系可能性的更多信息来自儿童心理学。

Alison Gopnik 是一位美国儿童心理学家,研究婴儿如何建立世界模型。她还与计算机科学家合作,帮助他们了解人类婴儿如何构建关于外部世界的常识性概念。孩子们甚至比成年人更多地使用联想学习,但他们也是永不满足的实验者。你见过父母试图说服孩子不要乱扔玩具吗?一些家长倾向于将这种行为解释为粗鲁、破坏性或攻击性,但孩子们往往有其他动机。他们通过系统的实验来研究物理定律和社会互动规则(Gopnik,2009 年)。11 个月大的婴儿更喜欢尝试表现出不可预测特性的物体,而不是行为可预测的物体(Stahl & Feigenson, 2015)。这种偏好使他们能够有效地建立世界模型。

我们可以从婴儿身上学到的是,我们并不像休谟假设的那样仅限于观察世界,我们还可以与它互动。在因果推理中,这些相互作用被称为干预。干预是许多人认为的科学方法圣杯:随机对照试验(RCT)的核心。

但我们如何区分关联和真正的因果关系呢?让我们试着弄清楚。


机器学习中的因果推理基础

机器学习中因果推理的主要目标是确定我们能否根据训练好的机器学习算法做出决策。在这里,我们并不总是对预测的准确性和频率感兴趣,尽管这也很重要,但我们更感兴趣的是预测的稳定性和我们对预测的信心程度。

因果推理的主要论点是:"相关性并不意味着因果关系"。这意味着相关性并不能证明一个事件对另一个事件的影响,而只能确定这两个或多个事件的线性关系。

因此,因果关系是通过一个变量对另一个变量的影响来确定的。在第三方干预的情况下,影响变量通常被称为工具变量,或者简单地称为协变量(机器学习中的特征)之一。或通过某个行为到另一个行为。一般来说,事件 A 之后是否一定会发生事件 B?还是事件 A 实际上导致了事件 B?因此,它也被称为 A/B 测试。这正是我们要进一步处理的问题,但使用的是机器学习算法。

有许多方法可以解决因果关系的推断问题,包括使用随机实验、使用工具变量和机器学习。在此列举所有方法没有任何意义,因为其他著作对此也有专门论述。我们感兴趣的是如何将其应用于时间序列分类问题。

值得注意的是,几乎所有这些方法都基于 诺伊曼-鲁宾因果模型 或潜在结果(成果)模型。这是一种统计方法,有助于确定一个事件实际上是否是另一个事件的结果。

例如,训练好的分类器在训练和验证子样本上显示出利润,而其信号却导致测试子样本上的损失。要衡量使用该分类器对新数据产生的因果效应,我们需要比较在新数据上实际训练和未训练分类器的结果。由于不可能看到未经训练的分类器的结果,因为它不会产生任何买入或卖出信号,因此这种潜在的结果是未知的。我们只有训练后的实际结果,而没有训练的未知结果是反事实的。换句话说,我们需要弄清楚,与随机开仓交易相比,训练分类器是否会增加利润或从新数据中获利。也就是说,训练分类器有任何积极的效果吗?

这种困境"因果推理的基本问题",即我们不知道如果没有训练分类器,实际结果会是什么,而只有在训练了分类器之后,我们才知道实际结果。

由于因果推理的基本问题,无法直接观察到单位层面(单个训练实例)的因果效应。我们不能肯定地说我们的预测是否有所改进,因为我们没有任何东西可以与之比较。然而,通过随机实验,我们可以评估群体层面的因果效应。在随机试验中,分类器在不同的子样本上进行随机训练。由于训练示例的这种随机分布,分类器的预测结果(平均)是相同的,分类器对特定示例的预测结果的差异可归因于测试集的示例包含或不包含在训练示例中的情况。然后,我们可以通过计算处理样本(在数据上使用训练有素的分类器)和对照样本(在数据上使用未经训练的分类器)的平均结果之差,得到平均因果效应(也称为平均处理效应)的估计值。

或者设想有一个多重宇宙,在每个子宇宙中都生活着同一个人,他做出了不同的决定,导致了不同的结果(成果)。每个子宇宙中的人只知道自己的未来版本,并不知道其他子宇宙中的 "自己" 的未来选项。

在多元宇宙的例子中,我们假设所有人在其他宇宙中都有对应的人。平均而言,所有人都是相似的。这意味着我们可以将他们做出决定的原因与这些决定的结果进行比较。因此,基于这些知识,我们就有可能得出一个因果结论:如果某个特定的人在另一个宇宙中以某种方式行事,而他或她以前从未在那里行事过,那么他或她会发生什么。当然,如果这些宇宙是相似的。


因果推理中的证据阶梯

因果推理方法有一些系统化,这代表了根据证据能力划分的方法等级。这将有助于找出我们选择的方法将具有什么样的证据效力。下面是文章的引用,上面提供了链接。

  • 阶梯的第一级是典型的科学实验。

你可能在中学甚至小学就接受过这种教育,为了解释如何进行科学实验,我的生物老师让我们从盒子里取出种子,分成两组,分别种在两个罐子里。老师坚持要我们把两个罐子里的条件完全相同:种子数量相同,地面湿润程度相同等等。我们的目标是测量光对植物生长的影响,所以我们把一个罐子放在窗户附近,把另一个锁在壁橱里。两周后,我们所有靠近窗户的瓶子都长出了漂亮的小芽,而我们留在壁橱里的瓶子几乎什么都没有长出来。老师解释说,光照是两个罐子之间唯一的区别,我们可以得出结论,光照不足会导致植物无法生长。

这基本上是在归因时最严格的要求。坏消息是,这种方法只适用于你对治疗组(接受光照的瓶子)和对照组(橱柜里的瓶子)都有一定程度的控制的情况。至少要有足够的控制力,使所有条件严格保持一致,只有一个参数(本例中为光照)需要实验。显然,这既不适用于社会科学,也不适用于数据科学。

那么你可能会问,作者为什么要把它写进文章里呢?嗯,基本上是因为这是参考方法。所有的因果推理方法在某种程度上都是为了在严格遵守中学老师解释的规则而无法得出结论的情况下重现这种简单的方法。

  • 统计实验(又称 A/B 测试)

可能是科技领域最著名的因果推理方法:A/B 测试,又称随机对照试验。统计实验背后的想法是依靠随机性和样本量来减轻将治疗组和对照组置于完全相同条件下的能力。大数定律、中心极限定理或贝叶斯推理等基本统计定理保证了这一点,并提供了一种从收集的数据中推断估计值及其精度的方法。

  • 准实验

准实验是指你的治疗组和对照组被一个自然过程划分的情况,这个过程不是真正随机的,但可以被认为足够接近以计算估计值。在实践中,这意味着您将有不同的方法,这些方法将与您对 A/B 测试情况的 "接近程度" 的不同假设相对应。自然实验的著名例子包括:利用越战征兵抽签来估算退伍军人身份对收入的影响,或者利用新泽西州和宾夕法尼亚州的边界来研究最低工资对经济的影响。

  • 反事实方法

在这里,我们放弃了治疗组和对照组的想法(实际上,不是完全放弃),事实上,在没有 X 参与的情况下,根据历史数据对时间序列 Y 进行建模,因为 X 已经发挥了作用。因此,在实验过程中,我们可以将Y的实际数据(X 参与其中)与模型(没有 X 的 Y 的预测)进行比较,并猜测效果大小,根据 Y 模型的准确性对其进行调整。然而,为了使这一假设接近事实,我们需要对方法的稳定性进行最多的测试。由此产生的效果不仅取决于模型的质量,而且总体上取决于所选方法的正确应用。

在构建时间序列分类模型时,我们只能使用反事实方法。换句话说,我们需要自己提出一个工具变量或处理方法,将其应用于我们的观察,然后对方法的稳定性进行适当的测试,这就是我们未来要做的。显然,这是最复杂的方法,根据证据阶梯,它的证据强度最小。


因果推理中的符号

我们一致认为,"处理" T 指的是对某个对象的某种影响,无论是诊所的病人、受广告宣传影响的人,还是训练集中的某个样本。那么有两种选择,受试者要么接受处理,要么不接受处理。

我们也已经知道,每个对象(单位)不能同时被处理和不被处理。也就是说,可能有两种情况。

那么,

表示未进行处理的单位和进行处理的单位的潜在结果。我们可以通过这些潜在结果的差异来计算个体处理效果:

由于上述因果推断的基本问题,我们无法获得个体治疗效果,因为只有一个结果是已知的,但我们可以计算所有类似受试者的平均处理效果,其中一些受试者接受了处理,而另一些没有:

或者,我们可以只对经过治疗的单位获得平均处理效果:


偏差

偏差是区分相关性(关联)和因果关系(因果)的关键。如果在另一个宇宙中,我们的“自我”发现自己处于完全不同的存在条件下,他们做出的决定的结果将不再与我们在这个宇宙中习惯的结果相对应,那该怎么办。那么,关于可能结果的结论将是错误的,假设只会是关联的,而不是因果关系。

对于训练好的分类器来说也是如此,当它们不再能从以前未见过的新数据中获利,或者干脆不再正确预测时,就会出现这种情况。


这个等式回答了为什么关联关系不是因果关系的问题。这里的偏差是,不同宇宙中的人们的生活条件在对两个宇宙产生任何影响之前是多么不同。这是因为还有许多其他变量会影响他们做出的决定的结果。因此,一个宇宙和另一个宇宙中的人群不仅在做出不同的决定方面不同,而且在不同的生存条件下也不同。


事实证明,如果我们在不同宇宙中的存在条件是可比的,那么我们关于我们在另一个宇宙中的行为结果(平均而言)的结论将是因果关系的:

因此,均值之差现在变成了平均因果效应:

我们可以简单地得出结论:要估计因果效应,一个宇宙的样本应该与另一个宇宙的样本具有可比性。如果是这样的话,那么我们就能够确定真正的关系,并以很大的概率预测 "自我" 在另一个宇宙中的行动结果。

换句话说,当偏差等于零时,关联就变成了因果关系。

将上述内容转换成机器学习术语,我们通常要处理训练数据、验证数据以及测试数据。机器训练模型使用部分验证数据参与的训练数据进行学习。如果子样本具有可比性,那么我们在训练和验证数据上的预测误差将大致相同。如果子样本因条件偏差而不同,则验证数据的预测误差将更大。更不用说测试子样本了,其数据分布可能与前两个样本的分布根本不相似。

但是,如果子样本的分布不同,我们怎么能做出因果推断呢?上一节已经给出了部分答案:我们可以通过随机实验进行因果推断。


随机实验

如前所述,随机化允许我们将数据随机分成几组,其中一组接受 "治疗"(在我们的例子中,即模型训练),而另一组则不接受 "治疗"。此外,我们应该多次这样做,训练许多模型。为了消除我们评估中的偏差,这是必要的。随机化和训练多个分类器消除了潜在结果对一个特定机器学习模型的依赖。

一开始可能会有些困惑。我们可能会认为,由于结果(预测)不依赖于某个特定模型,因此训练该模型毫无用处。从这一特定模型的预测角度来看,答案是肯定的。然而,我们面对的是潜在的 结果(预测)。

潜在结果是指模型经过训练或未经过训练的结果。在随机实验中,我们不希望结果(预测)与训练无关,因为模型训练会直接影响结果。

但我们希望潜在的结果不受训练任何特定分类器的影响,这是有偏差的!

我们这样说的意思是,我们希望对照组和测试组的潜在结果相同。我们的训练和测试数据需要具有可比性,因为我们想消除评估中的偏差。但是,每个单独的分类器对不同的训练示例赋予不同的权重,即使它们是混合的,这使得每个观察的处理量不同。这使得因果推断变得复杂。

通过随机化训练样本,我们可以获得测试样本和训练样本的模型误差差异,从而评估处理(训练)效果。不过,在分类的情况下,应考虑到机器学习算法的特点。在这种情况下,效果估计仍然有偏差,因为每个单独的分类器都是在一半或更多的原始示例上训练的,给每个示例不同的权重(处理)。通过使用多个分类器(它们的集合),我们通过平均分类器得分来最小化偏差,使每个单元的处理更加平等。这将所有训练示例置于相同的条件下,并赋予它们相同的值。

在本节中,我们了解到随机实验有助于消除数据中的偏差,从而做出更可靠的因果推断。模型集合有助于我们对训练效果进行等效估算。


匹配

通过随机实验,我们可以估算出训练一组模型的平均效果。然而,我们感兴趣的是获取每个训练实例的个体效应。这是必要的,以便了解交易策略在什么情况下平均会带来利润,以及在哪些情况下应该调整或排除交易。换句话说,我们希望根据每个对象的个体特征获得训练效果的条件估计。

匹配是一种比较整个样本中单个样本的方法,以确保它们在所有其他特征上都是相似的,除了它们是否包含在训练集中。这使我们能够为每个训练示例得出单独的分数。

匹配有精确和不精确(近似)之分。

例如,在粗略匹配中,我们可以根据欧几里德距离、闵可夫斯基距离和马氏距离等接近度标准来比较所有单位。但由于我们处理的是时间序列,我们可以选择按时间对单位进行位置比较。如果我们训练的是一个模型集合,那么每个模型在任何给定时间的预测结果都已与时间轴上该点的特征集相关联。我们要做的就是比较所有模型对某一特定时间点的预测结果。与其他方法相比,这种比较的计算复杂性最小,这将允许更多的实验。此外,这将是一次精确的匹配。


不确定性

在算法交易中,我们仅确定平均和单个处理效果是不够的,因为我们要建立最终的分类器模型。我们需要应用因果推理工具来估计数据集中的不确定性,并将单元分为对条件处理(训练分类器)有反应的单元和没有反应的单元。换句话说,在绝大多数情况下,这些分类是正确和错误。取决于不确定性的程度,不确定性是所有集合模型的潜在结果之间的差异之和。

由于我们是从分类器的角度估计数据的不确定性,因此买卖订单应该单独评估,因为它们的联合分布会混淆最终的估计。


元学习器

因果推理中的元学习器是帮助估计因果效应的机器学习模型。

我们已经熟悉了 ATE 和 ATT 的概念,它们为我们提供了有关群体平均因果效应的信息。然而,重要的是要记住,人和其他复杂的有机体(例如动物、社会团体、公司或国家)对相同的处理会有不同的反应。当我们遇到这种情况时,ATE 会向我们隐瞒重要信息。 

解决这一问题的方法之一是计算 CATE(条件平均处理效果),也称为 HTE。在计算 CATE 时,我们不仅要考虑处理方法,还要考虑一系列变量,这些变量定义了每个单位的个体特征,这些特征可能会改变处理方法对结果的影响。

在二元处理的情况下,CATE 可定义为:

其中,X 是描述每个对象(单位)的特征。因此,我们从同质处理效果过渡到异质处理效果。

人或其他单位对相同的处理方法会有不同的反应,这种观点通常以矩阵的形式表示,有时也称为上行矩阵,如图所示。


当信息(如广告)呈现给接收人时,字符串表示对内容的响应。各列表示未给予处理时的反应。

四个彩色单元格代表处理效果的动态变化。有信心的买家(绿色)会购买,而不考虑处理。红色(请勿打扰)不做处理也能买,但做了处理就不买了。失去兴趣者(灰色)无论处理情况如何都不会购买,而蓝色者不处理也不会购买,但如果处理到他们,他们可能会购买。

如果您是一位预算有限的营销人员,那么您应该专注于向蓝色组(可被说服)进行营销,尽可能避免向红色组(请勿打扰)进行营销。

在 "必胜" 和 "失利" 这两类人群中进行营销不会对你造成直接伤害,但也不会带来任何好处。

同样,如果你是一名医生,你希望给可能从中受益的人开药,避免给可能受到伤害的人开药。在现实世界的许多场景中,结果变量可以是概率性的(如购买的概率),也可以是连续性的(如消费金额)。在这种情况下,我们无法确定离散的组别,只能集中精力寻找在未处理和处理条件下结果变量预期增幅最大的单位。这种治疗与不治疗的结果差异有时被称为 "提升(uplift)"。

将其转化为时间序列分类的语言,我们需要确定训练集中的哪些示例对处理(分类器训练)反应最好,并将它们放在一个单独的组中。

估计异质性处理效果的一种简单方法是建立一个代理模型,根据您使用的预测因子预测处理变量,形式表示如下: 

T ~ X

这种模型的性能基本上应该是随机的。如果是非随机的,就意味着处理取决于特质,这就意味着存在一些我们没有考虑到的缺失变量,它会影响我们的因果推论,造成混乱。出现这种情况的原因往往是随机对照试验设计不当,没有真正随机分配处理。


S-Learner

S-Learner 是一种简单的 CATE 建模方法的名称。S-Learner 属于所谓的元学习器。请注意,因果元学习器与传统机器学习中使用的元学习概念没有直接关系。它们采用一个或多个基本(传统)机器学习模型,并利用这些模型计算因果效应。一般来说,只要与您的数据相匹配,您可以使用任何足够复杂的机器学习模型(树、神经网络等)作为基础学习器。

S-Learner 是最简单的元模型,只使用一个基本学习器(所以它的名字是:S(ingle,单个)-Learner)。S-Learner 背后的理念非常简单:在完整的训练数据集上训练一个模型,包括作为特征的处理变量,预测两种潜在结果,然后减去结果得到 CATE。

训练完成后,S-Learner 的预测步骤如下:

  1. 选择感兴趣的观察值。
  2. 将该观测值的处理值设置为 1(或 True)。
  3. 使用训练好的模型预测结果。
  4. 再次进行同样的观察。
  5. 这次将处理值设置为 0(或 False)。
  6. 预测一下。
  7. 用处理后的预测值减去未处理前的预测值。


T-Learner

T-Learner 的主要动机是克服 S-Learner 的主要局限性。如果 S-Learner 可以学会忽略处理,那么为什么不让它无法忽略处理呢?

T-Learner 正是如此。我们现在不再对所有观测值(已处理和未处理)拟合一个模型,而是拟合两个模型 - 一个只针对已处理单位,另一个只针对未处理单位。

在某种程度上,这等同于在基于树的模型中,强制将第一个分割点按处理变量进行分割。

T-Learner 的学习过程如下:

  1. 将数据按处理变量分为两个子集。
  2. 训练两个模型 - 每个子集一个。
  3. 对于每个观测点,使用两种模型预测结果。
  4. 将未处理模型的结果减去有处理模型的结果。

需要注意的是,由于我们已将处理分割作为两个独立的模型进行了编码,因此现在不会出现处理被忽视的情况。

T-Learner 专注于改进 S-Learner 可能(但不一定)失败的一个方面。这种改进是有代价的。将两种算法拟合到两个不同的数据子集意味着每种算法都要在较少的数据上进行训练,这会降低拟合的质量。

这也使得 T-Learner 的数据使用效率较低(我们需要两倍的数据来训练每个 T-Learner 基础学习器,才能生成与 S-Learner 质量相当的表现)。这通常会导致 T-Learner 分数比 S-Learner 分数的差异更大。特别是在一个处理组的观测数据远远少于另一个处理组的情况下,方差会变得非常大。

总之,当您预期处理效果较小时,T-Learner 可以发挥作用,而 S-Learner 可能无法识别处理效果。需要注意的一点是,这种元学习器通常比 S-Learner 更耗费数据,但随着数据集总体规模的增加,这种差异会逐渐缩小。


X-Learner

X-Learner 是一种元学习器,旨在更有效地利用数据中的可用信息。 

X-Learner 试图直接估算 CATE,并在此过程中使用了 S-Learner 和 T-Learner 以前放弃的信息。这是哪个类型的数据?S-Learner 和 T-Learner 研究的是所谓的反应函数,即单位如何对处理做出反应(换句话说,反应函数是特质 X 和处理 T 到结果 y 的映射)。同时,没有一个模型使用真实结果来模拟 CATE。 

  1. 第一步很简单,你已经知道了,这正是我们在 T-Learner 上所做的。我们按处理变量对数据进行分割,以获得两个独立的子集:第一个子集只包含接受处理的单位,第二个子集只包含未接受处理的单位。接下来,我们训练两个模型:每个子集一个。 
  2. 我们引入一个名为 "倾向得分模型 "的额外模型(最简单的情况是逻辑回归),并对其进行训练,以预测 X 特质的处理效果。
  3. 接下来,我们计算处理效果,并根据特征和 CATE 值训练两个模型。
  4. 使用这两个模型得出的结果与模型倾向得分得出的权重相加。

X-Learner 可以对两个子模型进行加权,因此在数据集高度不平衡的情况下,X-Learner 可以发挥真正的作用。 

另一方面,如果你的数据集非常小,X-Learner 可能不是最佳选择,因为每个额外的模型在拟合时都会带来额外的噪声,我们可能没有足够的数据来使用该模型。在这种情况下,S-Learner 更为合适。

还有更高级的元学习者,我不会使用它们,所以在这篇短文中讨论它们也没有什么意义。它们是 Debiased/orthogonal 机器学习和 R-learner,您可以自行学习。


关于现有元学习器的结论

尽管提出的算法有相当广泛的理论部分,但它们只是对 CATE 效应的估计。关于因果推论的文献几乎没有涉及检测和评估处理效果的整个周期,除非是一些非常明显的案例。报告指出,应由研究人员制定实验方案,然后使用这些估算器。我决定再进一步,将这些估算器的元素融入到创建一个自动交易系统中。与之前一样,为算法的输入和输出提供符号和标签,然后算法会尝试识别数据中可能存在的因果关系,并将其余部分排除在交易决策逻辑之外。

 

实现元学习器功能以构建交易算法

有了必要的起码知识,我建议研究一下我自己的算法。针对不同的元学习器和使用元学习器分析因果效应的方法进行了许多实验。目前,所提出的算法是算法库中最好的算法之一,尽管它还可以改进。

由于我们认为使用单一分类器来评估潜在结果是不切实际的,而单一分类器是有偏差的,因此该函数的第一个参数是指定数量的分类器。我使用了 CatBoost 算法。接下来是学习器的超参数,如迭代次数和树深度,以及坏样本比例(bad_samples_fraction),这是第一篇专门讨论元学习器的文章中提到的参数。这是最终训练集中应剔除的分类不佳样本的百分比。我们应该尽量避免在这些时刻进行交易。

BAD_BUY 和 BAD_SELL 是不好的例子索引的集合,每次迭代都会补充。 

在每次新的迭代中(迭代次数等于指定的学习者人数),数据集都会按一定比例(这里是 50/50)随机分为训练子样本和验证子样本。这样可以防止每个算法过度训练。随机分区允许每个分类器在独特的子样本上进行训练和验证,而整个数据集则用于产生估计值。这就消除了估计值中的偏差,使我们能够更准确地评估哪些实例实际上对处理(分类器训练)的敏感性较低。

每次训练后,都会将实际的类标签与预测的标签进行比较。预测错误的标签会加入不佳样本的集合。我们希望,随着分类器数量的增加,真正糟糕样本的估计值偏差会越来越小。

在不佳样本集合形成后,我们会计算所有索引中不佳样本的平均数量。然后,我们选择那些不佳样本数量超过平均值一定数量的指数。这样,我们就可以改变最终模型训练中包含的不佳样本的数量,因为在大量的再训练中,每个指标都有可能至少有一次落入不佳样本中。在这种情况下,所有的样本都会被排除在最终的训练集中,那么这种算法就不会起作用。 

def meta_learners(models_number: int, iterations: int, depth: int, bad_samples_fraction: float):
    dataset = get_labels(get_prices())
    data = dataset[(dataset.index < FORWARD) & (dataset.index > BACKWARD)].copy()

    X = data[data.columns[1:-2]]
    y = data['labels']

    BAD_BUY = pd.DatetimeIndex([])
    BAD_SELL = pd.DatetimeIndex([])

    for i in range(models_number):
        X_train, X_val, y_train, y_val = train_test_split(
            X, y, train_size = 0.5, test_size = 0.5, shuffle = True)
        
        # learn debias model with train and validation subsets
        meta_m = CatBoostClassifier(iterations = iterations,
                                depth = depth,
                                custom_loss = ['Accuracy'],
                                eval_metric = 'Accuracy',
                                verbose = False,
                                use_best_model = True)
        
        meta_m.fit(X_train, y_train, eval_set = (X_val, y_val), plot = False)
        
        coreset = X.copy()
        coreset['labels'] = y
        coreset['labels_pred'] = meta_m.predict_proba(X)[:, 1]
        coreset['labels_pred'] = coreset['labels_pred'].apply(lambda x: 0 if x < 0.5 else 1)
        
        # add bad samples of this iteration (bad labels indices)
        coreset_b = coreset[coreset['labels']==0]
        coreset_s = coreset[coreset['labels']==1]

        diff_negatives_b = coreset_b['labels'] != coreset_b['labels_pred']
        diff_negatives_s = coreset_s['labels'] != coreset_s['labels_pred']
        BAD_BUY = BAD_BUY.append(diff_negatives_b[diff_negatives_b == True].index)
        BAD_SELL = BAD_SELL.append(diff_negatives_s[diff_negatives_s == True].index)

    to_mark_b = BAD_BUY.value_counts()
    to_mark_s = BAD_SELL.value_counts()
    marked_idx_b = to_mark_b[to_mark_b > to_mark_b.mean() * bad_samples_fraction].index
    marked_idx_s = to_mark_s[to_mark_s > to_mark_s.mean() * bad_samples_fraction].index
    data.loc[data.index.isin(marked_idx_b), 'meta_labels'] = 0.0
    data.loc[data.index.isin(marked_idx_s), 'meta_labels'] = 0.0

    return data[data.columns[1:]]

其余功能未作更改,已在前一篇文章中作了介绍。您可以在那里下载它们,而元学习器功能则可以替换为建议的功能。在本文的其余部分,我们将重点讨论实验情况,并尝试得出最终结论。


测试因果推理算法

假设我们根据某种标准(所谓的适合度函数)对交易策略进行遗传优化。我们感兴趣的不仅是最佳优化结果,而且还要确保平均而言,所有通过的结果都是好的。如果交易策略不佳或参数差值过大,那么就会出现大量结果不理想的优化过程,从而对平均评估值产生负面影响。我们希望避免这种情况,因此我们将多次训练我们的算法,然后取平均值,并将最佳结果与平均值进行比较。

为此,我编写了一个自定义测试器的修改版,可以一次性测试列表中所有训练好的模型:

def test_all_models(result: list):
    pr_tst = get_prices()
    X = pr_tst[pr_tst.columns[1:]]
    pr_tst['labels'] = 0.5
    pr_tst['meta_labels'] = 0.5
    

    for i in range(len(result)):
        pr_tst['labels'] += result[i][1].predict_proba(X)[:,1]
        pr_tst['meta_labels'] += result[i][2].predict_proba(X)[:,1]

    pr_tst['labels'] = pr_tst['labels'] / (len(result)+1)
    pr_tst['meta_labels'] = pr_tst['meta_labels'] / (len(result)+1)
    pr_tst['labels'] = pr_tst['labels'].apply(lambda x: 0.0 if x < 0.5 else 1.0)
    pr_tst['meta_labels'] = pr_tst['meta_labels'].apply(lambda x: 0.0 if x < 0.5 else 1.0)

    return tester(pr_tst, plot=plt)

现在,我们将进行 25 次因果推理(我们将训练 25 个独立模型,这些模型在随机划分子样本方面具有高度随机性):

options = []
for i in range(25):
    print('Learn ' + str(i) + ' model')
    options.append(learn_final_models(meta_learners(15, 25, 2, 0.3)))

options.sort(key=lambda x: x[0])
test_model(options[-1][1:], plt=True)
test_all_models(options)

让我们首先根据 R^2 版本测试最佳模型:

然后一次性测试所有模型:

平均结果与最佳结果相差无几。这意味着,在受控随机实验过程中,有可能更接近真实的因果关系。

让我们用其他元学习器输入参数对算法进行训练和测试。

options = []
for i in range(25):
    print('Learn ' + str(i) + ' model')
    options.append(learn_final_models(meta_learners(5, 10, 1, 0.4)))

options.sort(key=lambda x: x[0])
test_model(options[-1][1:], plt=True)
test_all_models(options)


结果如下:

我们还注意到,训练历史的深度(图中用竖线标出)会影响结果的质量,也会影响模型的特征数量和其他超参数(一般来说这并不奇怪),而模型质量的差异仍然很小。我认为,由此产生的稳定性是所建议算法的一个重要属性或特征,它让我们对由此产生的交易策略的质量更有信心。


总结

本文向您介绍了因果推理的基本概念。这是一个相当广泛和复杂的话题,不可能在一篇文章中涵盖所有方面。因果推理和因果思维植根于哲学和心理学,在我们理解现实中起着重要作用。因此,所写的大部分内容都能在直观层面上很好地感受到。不过,我在某种程度上是不可知论者,我试图举一个实际的、说明性的例子来证明所谓的因果推理在时间序列分类问题中的威力。您可以使用这种算法进行各种实验。只需替换上一篇文章代码中的几个函数即可。实验并没有就此结束,也许会出现新的有趣信息,我稍后会与大家分享。


实用参考资料

  • Aleksander Molak "Python 中的因果推理和发现"
  • Matheus Facure "勇敢者的因果推论"
  • Miguel A. Hernan, James M. Robins "因果推理:假设"
  • Gabriel Okasa "用于因果效应估计的元学习器:有限样本交叉拟合性能"

本文由MetaQuotes Ltd译自俄文
原文地址: https://www.mql5.com/ru/articles/13957

附加的文件 |
causal_inference.py (11.05 KB)
神经网络变得简单(第 69 部分):基于密度的行为政策支持约束(SPOT) 神经网络变得简单(第 69 部分):基于密度的行为政策支持约束(SPOT)
在离线学习中,我们使用固定的数据集,这限制了环境多样性的覆盖范围。在学习过程中,我们的 Agent 能生成超出该数据集之外的动作。如果没有来自环境的反馈,我们如何判定针对该动作的估测是正确的?在训练数据集中维护 Agent 的政策成为确保训练可靠性的一个重要方面。这就是我们将在本文中讨论的内容。
MQL5 简介(第 3 部分):掌握 MQL5 的核心元素 MQL5 简介(第 3 部分):掌握 MQL5 的核心元素
在这篇便于初学者阅读的文章中,我们将为您揭开数组、自定义函数、预处理器和事件处理的神秘面纱,并对所有内容进行清晰讲解,让您可以轻松理解每一行代码,从而探索 MQL5 编程的基础知识。加入我们,用一种独特的方法释放 MQL5 的力量,确保每一步都能理解。本文为掌握 MQL5 奠定了基础,强调了对每行代码的解释,并提供了独特而丰富的学习体验。
新手在交易中的10个基本错误 新手在交易中的10个基本错误
新手在交易中会犯的10个基本错误: 在市场刚开始时交易, 获利时不适当地仓促, 在损失的时候追加投资, 从最好的仓位开始平仓, 翻本心理, 最优越的仓位, 用永远买进的规则进行交易, 在第一天就平掉获利的仓位,当发出建一个相反的仓位警示时平仓, 犹豫。
神经网络变得简单(第 68 部分):离线优先引导政策优化 神经网络变得简单(第 68 部分):离线优先引导政策优化
自从第一篇专门讨论强化学习的文章以来,我们以某种方式触及了 2 个问题:探索环境和检定奖励函数。最近的文章曾专门讨论了离线学习中的探索问题。在本文中,我想向您介绍一种算法,其作者完全剔除了奖励函数。