MarketNet神经网络金融应用
MarketNet 的出现受到了我很长时间以来的一些问题的启发:网络能够识别市场吗?网络能够预测未来的走势吗?网络能够识别有利可图的交易吗?
一键发币: SOL | BNB | ETH | BASE | Blast | ARB | OP | POLYGON | AVAX | FTM | OK
我们已经有了 WordNet 和 ImageNet,现在是时候使用 MarketNet 了。作为交易员,我们会在多个时间范围内关注各种资产类别。人类的视觉能力令人难以置信,但我们会感到疲倦、马虎和有偏见。
我想如果交易员有一个决策支持系统,一个公正的第二意见来确认你的输入,会发生什么。MarketNet 的出现受到了我很长时间以来的一些问题的启发:
- 网络能够识别市场吗?它是 E-Mini S&P 500 期货的快照还是 GOOGL 股票的快照?
- 网络能够预测未来的走势吗?显然,它是一种赚钱的方法,对吧?但作为交易员,我们知道显而易见的事情显然是错误的 [Druckenmiller]。
- 网络能够识别有利可图的交易吗?
以下是我所做的实验的简要总结。这个项目的工作始于 2022-09-27。
1、问题
在处理数据时遇到的第一个问题是模型是否能够识别市场?显然,我们知道我们目前正在关注和交易什么市场,但它们真的不同吗?
model = tf.keras.Sequential([
tf.keras.layers.Rescaling(1./255),
tf.keras.layers.Conv2D(32, 3, activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Conv2D(32, 3, activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Conv2D(32, 3, activation='relu'),
tf.keras.layers.MaxPooling2D(),
tf.keras.layers.Flatten(),
tf.keras.layers.Dense(128, activation='relu'),
tf.keras.layers.Dense(num_classes)
])
该设置是来自 TensorFlow 的加载和预处理指南的简单原始模型。这里没有什么花哨的,我将图像输入大小拉伸到 200 像素的正方形,并增加了时期数以发现过度拟合点。数据存储在每个市场的单独目录中。第一个实验是在股票资产类别中,包括 ES、NQ、YM 和 RTY。
该模型很差,而且开始过度拟合,最终失败。然后我决定在利率资产类别中尝试同样的想法。
识别利率(ZB、ZN 或 FGBL)也没有什么特别之处,最终也开始过度拟合。
跨越各种资产类别:尝试识别目标为 ES、RTY、ZB 和 FGBL 的市场。
总而言之,资产识别领域没有什么有趣的东西,我们只是热身而已。
2、识别方向
现在让我们将图像分为买入日和卖出日。当天的任何积极变化(收盘价 — 开盘价)都被视为买入目标,反之亦然。
需要注意的是,所使用的数据由 IB TWS API 提供,自 2020 年以来一直收集。由于许多与 Matplotlib 相关的操作,生成图像需要花费大量时间。
开盘价定义为 CME 开盘价,收盘价定义为 NYSE 收盘价。条形图为 30 分钟条形图。
看看这个,模型能够检测到一天的趋势。提前停止在这里并不重要,因为它确实过度拟合,但保持稳定的指标,总的来说还可以。这很壮观,但显然没有价值。我们不需要说明显而易见的事情,我们知道如何识别当天的趋势(特别是交易日结束后),我们需要更多。
3、让我们认真起来
好的,现在让我们尝试构建一些更有用的东西,用于日间交易。假设你有一个优势,一个规则系统,它接收当前市场状态作为输入,并输出建议的行动方向。你应该买入、卖出或等待。这是最基本形式的交易策略。现在让我们通过机器学习模型提供额外的眼睛来增强决策。
通过一些历史数据分析,可以模拟你的优势(交易)的结果。本质上,我们有四个类变量(目标)。第一个目标是明确的买入信号,其中 STP(止损)未命中。补充类是相同的买入信号,其中 STP 命中并且我们亏损。在某种程度上,它就像是交易双方(可能)的垃圾邮件检测。卖方也是如此:真正的卖出信号(可能)赚钱,而卖出信号会命中 STP 并亏损(肯定)。
重要的是要注意,积极的结果并不意味着我们肯定赚钱,也不意味着我们没有亏钱。它试图预测的只是交易是否没有命中 STP 并且肯定会亏钱。这是问题的一个非常重要的区别。假设你有优势,总的来说,一旦你采样足够多(交易、做事、实践),你应该没事(赚钱)。我们在这里所做的一切,本质上都是改善优势本身。由于我们有义务进行每笔交易,因此建模有助于仅过滤掉好的交易。
关于这里介绍的悖论,说几句。为了成为一名持续盈利的交易者,你必须拥有优势并像机器人一样进行交易。优势是一种交易系统,通过良好的样本,它肯定会赚钱。心理耐力和虔诚地遵循系统是绝大多数人失败的地方。交易系统很难找到,但一旦连续亏损(你肯定会),就很难不去摆弄/改变你的系统。但话又说回来,我们试图建立一个模型,从本质上改变我们的策略,并允许不时地遵循策略,我们刚才提到,这是成为专业人士的大忌。
让我详细说明一下。这既是真的也是假的。只要我们不改变系统规则,就可以将系统性自由裁量权引入我们的执行程序中。例如,即使你有进入的信号,但几分钟后 CPI / GDP / FOMC 事件就要到来,那么你绝对应该跳过这个。捐出这笔钱总比在事件前后没有流动性和市场行为混乱的情况下进入要好(只需尝试一次)。我们所做的建模是对何时不进行交易的系统判断,因此这是可以接受的,甚至是鼓励的。你不觉得大型机构多年来一直在研究这样的事情吗?
第一次试验是一起学习所有目标。该模型显然很差且不实用。
现在让我们尝试仅为买方建立一个模型:买还是不买?这将需要两个模型(针对每一方),但由于我们确切知道我们将要采取哪一方,因此可以区分这些模型。显然,问题现在简单多了。这始终是一种权衡,但我们可以承受。
表现可以接受,但需要提前停止,否则会开始过度拟合。
现在让我们尝试识别(可能)有利可图的卖出信号与(肯定)亏损的卖出信号。
同样,性能是可以接受的,但需要提前停止。
到目前为止,我们有太多噪音和不可靠的模型。
4、改进输入
关于合成数据生成的一句话很重要。一些市场状态的条形图数量很少(CME 开盘后立即出现买入信号)。其他信号几乎包含当天的所有条形图(NYSE 收盘前 1 小时的卖出信号)。显然,生成具有不同宽度的图像需要进行某种调整(以保持它们的平方)。因此,我们计算特定市场状态的定义范围,并添加额外的列以补偿条形图数量较少的市场。条形图较多和/或范围较小的市场自然会生成方形图像,有时甚至不需要任何调整。为什么要费心呢?因为有时手动检查很重要,我们更喜欢将合成数据保持在统一的类似格式中:正方形、黑色和白色等。
关于统计和交易的另一句话:你可能熟悉两种方法/思想流派/方法论——频率学派与贝叶斯学派。良好的交易需要两者:你需要一流的统计分析来定义风险,你需要贝叶斯分析来评估你的优势。ATR 基于一流的统计数据。Trading in the Zone [Douglas] 和著名的 20 笔交易实验是一种一流的贝叶斯分析。交易的阴阳是平等且恰当地使用这两种方法。
哦,对了,别忘了噪音。
5、OHLC
下一步是引入开盘价和收盘价。首先,我们仅使用最高价和最低价的范围,但显然,整个条形元数据很重要,可能会改善建模。我们引入了实用程序的修改版本来创建图像,这次包含开盘价、最高价、最低价和收盘价。请注意,我们坚持使用黑白彩色图以保持简单。像素矩阵将 1 设置为条形的尾部,将 2 设置为条形的主体。目前绿色/红色条形之间没有区别(但这可能是下一个改进,大声思考)。
从视觉上讲,使用打开/关闭元数据可以更轻松地理解和测试数据,但我们不是要拟合的网络。
尝试将所有 4 个目标归为一类:过度拟合和模型不佳。
买还是不买:还不错,不过开始过度拟合了。
卖还是不卖:同样不错,但开始过度拟合。
6、放大
也许拍下一整天的快照太多了?也许我们需要的只是最后几条,但有多少条呢?我决定尝试许多选项,从不切实际的 4 条(似乎太少)到最初的想法(拍下当天到目前为止的所有条)。
以 HL 开头的数据集仅使用最高价和最低价来创建图像。以 OHLC 开头的数据集使用开盘价、最高价、最低价和收盘价来创建图像。差异已在上面描述过。现在让我们尝试各种 TPO 计数。TPO 代表市场概况术语中的时间价格机会,它只是单个 30 分钟条形图的另一个名称。当不存在 TPO 计数时,我们会在信号是买入或卖出时取所有可用的条形图。如果存在 TPO 计数,我们会取最后的条形图数:4、8、12 和 16。本质上,网络现在可以看到当天的全部数据或最后 2、4、6 或 8 小时的数据。
让我们总结所有可能模型的结果。我们从对所有 4 个目标(买入、不买入、卖出和不卖出)进行简单(但不切实际)的识别开始。我们继续分别对买方和卖方进行更相关的分类。两者都有两个目标:进行交易或不进行交易。
显然,取最后一个条形图数量没有价值,但将所有条形图都提供给网络会增加过度拟合的风险。验证性能并不出色,但可以使用该模型。添加开盘价和收盘价似乎也没有多大帮助。总而言之,这些模型还可以,但到目前为止,我不愿意在我的日间交易中使用它们。即使性能可以接受,也存在太多噪音,而且指标脆弱且不稳定。
关于机器学习最佳实践的一句话。我并不是 Andrej Karpathy 团队的一员,但他的讲座让你感觉自己是。
无论如何,我曾经作为大数据工程师/数据科学家为各种公司做过大量建模工作。一些建议和我通过艰难的方式学到的东西:
- 少即是多。简单的模型很棒,花哨的模型很糟糕。
- 特征工程比(简单)模型重要得多。
- 数据质量永远不会完美,请放心,训练和验证中的对数损失永远不会为 0。
7、缩小
现在让我们尝试缩小:为网络提供比必要更多的输入条。如果信号是在盘中创建的,则可以轻松访问前一天的历史记录并将其添加到图像中。
较宽的图像被压缩成老式的正方形,以保持一致性。结果明显更好,尤其是 OHLC 数据。它最终似乎改善了建模。
现在,这些是我考虑在日内交易中依赖的模型。尽管它们都被标记为过度拟合,但它们的对数损失远低于 0.5 抛硬币截止值,并且准确度在迭代过程中几乎没有变化。此外,我们的准确度水平要高得多,这在训练集和验证集上都得到了再次证实。总而言之,这似乎是可以接受的。
8、市场概况
现在让我们疯狂起来:让我们构建市场概况的图像,而不仅仅是图表。在某种程度上,到目前为止创建的图像只是条形图。如果仅包含高低范围,则它是范围图。如果确实包含开盘价、最高价、最低价和收盘价,则它是条形图。在我们的实验中,我们不关心红色和绿色条形图的颜色,因此它不是 100% 条形图。如果您弄乱了条形图的颜色,它实际上是一个真正的条形图。
现在条形图非常棒,需要说明的是,我目前确实只依靠 30 分钟条形图赚钱,但我的秘诀是市场概况(最初是从 30 分钟条形图构建的)。
简而言之,市场概况只是将价格分组应用于 30 分钟条形图的原始历史数据。从技术上讲,任何条形图大小都可以,但最初的想法是坚持 30 分钟条形图。非常鼓励您尝试一下。我花了 3 个月手工绘制市场概况,它永远改变了我。首先,我通过这样做找到了我的第一个优势。其次,我可以通过查看任何图表(条形图、线形图等)在脑海中为任何市场构建市场概况。强烈推荐练习。
市场概况有许多概念和术语(POC、价值区域、单张印刷品等),但本文不是关于它。简而言之,您需要关心的(在我看来)只是时钟(当前时间)和单张印刷品(尾部)。一旦 CME 开盘或即将关闭,机会就不多了。市场创下当天的新高/新低非常有趣,并提供了机会。区间市场非常棘手且交易风险高。
现在,我们不用绘制图表,而是构建一个简单的市场概况,并将其转换为图像。需要注意的是,市场概况最初严重依赖字母,每个字母代表一个预定义的 TPO(时间价格机会)。通俗地说,字母代表一天中特定的 30 分钟片段。这取决于个人喜好和/或软件如何为您绘制和定义它。
让我们举个例子:以字母“a”开头的市场概况意味着,只要您在市场概况中看到“a”,您就知道这个范围在 CME 开盘后的前 30 分钟内已经交易。相应地,字母“R”显示在纽约证券交易所收盘前最后 30 分钟的市场概况交易活动。不用说,我强烈建议您停止阅读,拿起笔和纸,找出这个例子背后的逻辑。相信我,它会给你带来钱。值得注意的是,在这个例子中,我们的市场概况以小写字母“a”开头,但一些应用程序/实现可能以大写字母“A”开头,只要您坚持并保持一致,这并不重要。
提供市场概况图像并不引人注目,从各方面来看,这里都存在回归。如前所述,包括前一天的数据可能会有所帮助。让我们试试吧。
经过一些调整,我能够为多日市场概况构建一个图像。任何交易策略的核心原则都是你依赖某件事并将其与之前的活动进行比较。它总是与背景有关。带来过去 3 个月的数据可能有些夸张,但仅靠过去 3 个条形图谋生的机会也很低。
关于混合模型的说明。混合总是很棒。如果您添加新的(好的)模型并平均结果,则绝不会降低建模质量。平均方法实际上也不重要。不过,关于这个问题的一个警告是保持简单。混合太多模型总的来说效率低下,因为协调建模需要更多时间,而且更容易出错。
终于有一个不错的模型了!指标一直都很好。尽管它被标记为存在过度拟合,但指标非常好,在局部最小值处有轻微的跳跃,但始终保持接近。
9、额外检查
到目前为止,我们只对 E-mini S&P 500 期货进行了建模,让我们尝试对其他市场进行建模:E-mini Nasdaq-100、E-mini 道琼斯工业平均指数和 E-mini Russell 2000 指数。在我看来,就流动性(价差/深度)、机会和重要性而言,这些是最佳的交易市场。流动性由许多参数定义,但紧密的价差和深度的买入/卖出是关键组成部分。机会是一个主观衡量标准,但这些市场的交易量不会说谎,日内波动非常大。最后,重要性再次是一个主观衡量标准,但这些指数涵盖了您知道的任何公司。如果有人参与其中,坏消息/好消息就会得到真实反映。请记住,任何金融专业人士/顾问/大师/选股者通常都只是一个胆小怕事的骗子,没有金钱/风险,特别是如果这个人毕生致力于与他人分享他的观点。你能想象保罗·都铎·琼斯在 X 上分享他的买入/卖出信号吗?你明白了。
不幸的是,进行模拟和创建图像突然变得非常慢。因为现在我们需要 4 个市场的 OHLC 和市场概况图像,而不是几分钟,而是变成了几个小时的批处理时间。显然,如果最初为整个数据存储创建数据,那么我们可以每周一次逐步添加新图像,但存储就会成为一个问题。正如计算机科学中一贯的那样,空间和时间之间存在权衡。使用更多内存或存储空间可以更快地完成某些事情,反之亦然。这是一门艺术,远远超出了人们的想象或知识。
现在有更多的数据和目录,让我们进行一些排序。顶级目录“ML”包含每个市场“ES”、“NQ”等的目录。每个市场目录(例如“ES”)包含每种图像类型的两个目录:OHLC(开盘价、最高价、最低价和收盘价条形图)与 MP(市场概况)。每种类型的图像目录(例如“OHLC”)都包含交易“买入”与“卖出”的可能入场方。最后,每个入场方目录(例如“买入”)都包含我们非常感兴趣的是/否问题的数据:交易还是不交易优势?
借助 tf.keras.utils.image_dataset_from_directory 函数,我们可以轻松提供所需的目标并构建单独的模型。例如,提供“…/ML/ES/MP/Buy/”以通过市场概况图像为 ES 买方传入交易构建模型。此外,我们可以轻松地手动检查数据,以防万一。
关于花哨的数据格式和高效存储图像的说明。尽管 MNIST 使用了一些复杂的编码和自定义格式以提高效率,但我们保持其简单和原样。同样,这一切都是为了那一个奇怪的日子(新闻/疯狂的飙升/美联储公告等),我们必须放大并彻底检查,因为它要么是辉煌的一天,要么是非常糟糕的一天(就损益而言)。
10、大结局
让我们用我们开始使用的普通模型预设上面列出的四大指数期货、OHLC 和 MP 图像的最终结果。
太棒了!看起来很棒,也很有用。混合模型肯定会进一步提高建模质量。
11、一分钟条形图
所以我们有一些不错的指标和好的模型。上述示例都依赖于 30 分钟条形图,但我的一个优势实际上是在一分钟图表上进行剥头皮交易。我在想,是否有可能对较小的时间范围进行建模?让我们试一试。
我立即意识到我的本地机器不行。我决定使用我的备用 AWS 交易机器 (t3a.medium)。生成 1 分钟条形图的图像需要 24 小时才能完成 1 年的模拟。我停止了它,因为它花费了太多时间,我们已经有超过 150K 张图片,这对于概念验证来说已经足够了。
现在每个周期需要半个多小时才能过去。机器滞后并且感觉很重,我只为 OHLC 做了两个模型。指标很糟糕,没有理由继续这项工作。
显然,如果我们被迫让它发挥作用,我们可以使用更强大的机器,GPU,TPU等。总而言之,这是不切实际的,这就是我一开始就放弃它的原因。作为交易员,我们知道要迅速止损,我也是一样。
12、实时交易实验
交易是纯粹的精英统治。你吃什么就吃什么,政治无济于事。技能是必需的,但勇气和精神耐力有时更为重要。
没有理由不参与其中就进行研究。我可以做无数次实验,向你展示结果的好坏,但这没有任何价值。
交易就是样本量。做一次大额交易,你就可以称自己为交易员了,对吧?不幸的是,这需要更多。我不记得有多少次我持有当天的大额利润,却破产了,最终成为当天的输家。我也记不清有多少次交易接近我的止损水平(我已经将其归类为必输),最后却获利并达到我的获利水平。你懂的。众所周知,利润就像这个行业的鳗鱼一样。
金钱时间,算法和理论已经足够了,这些都很好,但我在这里不是在做慈善。必须支付账单和税款,必须为未雨绸缪而存钱。这是我经营的生意,一切都与博弈论有关。除非能带来回报,否则没有理由进行彻底的研究。
受到《交易区》[Douglas] 的启发,从那时起,我评估交易表现的唯一方法是将 20 笔交易分组。越多越好,但 20 笔是绝对最低限度。低于 20 的一切都只是噪音。现在让我们交易 20 个新的传入边缘/交易,并使用我们花哨的决策支持系统。问题是,如果我使用这个模型严格过滤传入的交易,我是否会改善我的损益?
我放大到迄今为止最赚钱的市场:ES 和 YM。同样的想法适用于这两个市场。交易是通过 30 分钟的条形图进行的,通常需要几分钟才能进入/退出交易,因此添加实时机器学习预测并不是什么大问题(不着急)。
13、解释
由于我们现在有一系列带有精美机器学习预测的交易,让我们决定如何解释它们。有很多正确的方法,但它不是确定性的。我们对每笔交易都有两个预测:基于 OHLC(开盘价、最高价、最低价和收盘价)图表的预测和基于 MP(市场概况)图表的预测。每个预测都由类别名称(Y — 是 / N — 否)和概率(范围为 [50, 100])组成。我决定通过将预测分为 3 组来简化预测。
这 3 组(场景)是:
- Y — 进行交易。
- N — 不进行交易。
- A — 模糊性,OHLC 和 MP 有混合预测,因此它在某种程度上类似于不进行交易。
显然,我们可以对两个预测的概率和多种组合添加一些分位数分析,但如前所述,少即是多。
14、结果
不幸的是,就像市场上的大多数交易理念和事物一样,它比看起来要困难得多。经过适当的采样(交易)后,似乎所有这些花哨的技术和设置都毫无价值!
该系统对 DSS 的任何结果都基本满意。我们原本以为会明确识别出“N”标签是坏交易,但它们却是有利可图的。正如预期的那样,应该避免使用“A”标签,而且它们的损益确实很差。
尝试使用各种截止阈值进行 DSS 聚类也未改善结果。明确区分 OHLC 与 MP 也无济于事。它们要么在一起好,要么在一起坏(就总损益而言)。
我在同一样本和时期进行的另一项研究采用了一种简单的基于树的方法。这里也没有惊人的结果。所有标签都能赚钱,因此不使用信号或使用它根本没有意义。
总而言之,一方面,实验最终失败了,另一方面,这也是一次伟大的教育、反复试验之旅。
失败的可能原因:
- 维度诅咒——数据太多,我们无法全部处理。如果您是机构交易员,并且拥有资源,您可能会获得更好的表现。
- 季节性——市场具有极端的季节性效应,数据始终随随机波动而变化(异方差性)。对猫进行分类和对市场进行快照之间存在巨大差异。猫就是猫,在市场上,猫本质上可以有角。
- 人为错误——某些东西可能没有正确对齐、优化或以平庸的方式编写。无论您有多有经验,或者 linters 有多好,有些错误都很难检测到,尤其是在 ML 中。
无论如何,这是一次非常有趣的学习经历。
15、第二次尝试
我原本想就此结束这个故事。实验已完成,样本量足够好,但结果很糟糕。我突然决定再试一次。我花了好几个月的时间来开发和测试这个基础设施,尽管结果很糟糕,但我还是想继续测试它。我不愿意放弃它。
因此,我决定改变我的建模设置。首先,我降低了自定义回调的最小准确度阈值。要求阈值为 0.95 突然看起来太紧了,而 0.8 更好,因为可以保证快速收敛,并且本质上我们要求尽早停止以避免过度拟合。
然后我将图像大小从 200 减小到 32。这些变化要求闪电般的速度和更小的模型(~1GiB vs. ~500MiB)。最后,我停止提供训练数据作为验证数据。一开始是为了对模型的性能进行某种反馈。但在查看了真正的样本外实验的统计数据后,现在很明显,在这个业务中验证是无用的。唯一真正的验证是样本外实验。不用说,它进一步缩短了运行时间。
现在让我们用新的设置进行交易(样本),看看我们是否能得到更好的结果。
修改后的神经网络也没有提高性能。事实上,它的表现更糟了。是的类别有负的损益,而否的类别有正的损益。这很尴尬,应该恰恰相反。
并获得简单的基于树的方法很棒。请注意,所有错误类别(无论概率截止如何)的总损益为负,而真实类别的总损益为正。还请注意,绝大多数交易都是亏损的(这在该行业很常见),但简单的 ML 能够筛选出好的交易(这正是我们正在寻找的)。
KISS(保持简单,愚蠢)在该行业中非常重要。不幸的是,通过所有花哨的试验和错误,显然简单的 ML 建模要好得多。整个实验中被忽视的另一个考虑因素是实时预测时间。与 LightGBM 相比,TensorFlow 的 Python 模块导入和预测时间要重得多。在实践中,对这两个建模流程进行预测通常不少于 6 秒。将建模简化为基于树的方法只会将这些时间缩短一半。值得注意的是,加载(导入)时间比预测时间长得多(两种方法的预测时间都少于一秒)。
16、见解
在此过程中,我们有一些值得回顾的见解。让我们总结一下最重要的见解。
- 数据越多越好:添加昨天的价格是一个重大突破。
- 使用所有四个历史数据向量:开盘价、最高价、最低价和收盘价可以改善建模。
NQ 价格范围很大,通常比其他市场需要更多的时间(迭代)来创建图像,但它的性能也略好一些(权衡)。 - 这些实验的样本量本质上很小。我从 2017 年开始从事专业业务,并使用仅 3 年的数据存储开始这种机器学习建模,这还不够。我可能只是被随机性愚弄了。
交易是一项艰难的业务。开发优势需要数年时间。改进它需要数年时间。学习永无止境。
原文链接:MarketNet: Computer Vision Applications in Financial Markets
DefiPlot翻译整理,转载请标明出处