English Русский Español Deutsch 日本語 Português
preview
复购算法:模拟多币种交易

复购算法:模拟多币种交易

MetaTrader 5测试者 | 13 十一月 2023, 11:00
1 006 0
Evgeniy Ilin
Evgeniy Ilin

内容


概述

上一篇文章中,我曾向您展示了许多您可能还不知道的实用功能,但最有趣的事情还在前头 — 研究或交易模拟。 有时单靠一个策略测试器还有所不足。 虽然这是一个非常方便的了解市场的工具,但这只是第一步。 如果您仔细阅读了上一篇文章,那么您很可能已经知道原因了。


解释交易模拟的必要性

交易模拟最直接的原因在于任何进行交易的金融产品的历史数据量都是有限的。 只有当您理解我在上一篇文章中提供的素材,或其它替代方式时,才能察觉此问题。  

问题的本质是,简单的报价历史并不总是足够的,因为这段历史是融合了许多随机和非随机全球事件后交汇形成的,若把事件展开,则所涉场景无以计数。 目前,我尝试尽可能简单地讲述事情,但如果我们继续采用概率论的说法,同时用到上一篇文章的成就,我们就会明白,我们已知的所有金融产品的报价历史都会以不同的方式发展。

这个事实显而易见,如果您看过电影《回到未来(Back to the Future)》。 从科学的角度来看,它有很多谬误和可笑的不协调之处,但尽管如此,这部电影还是传达了这里提供的消息的主要思想。 该消息的本质是,正发生事件的一个版本对我们来说是不够的,我们应该考虑它们的最大数量。 历史只遗留给了我们一个版本,它的尺度有时可能不足以进行客观的评估。 例如,不久前,许多经纪商已经获得了一些最流行的加密货币品种。 就测试和交易这些交易品种的可能性而言,这非常好。 但不利的一面是,在开发基于柱线操作的 EA 时,没有足够的历史数据支持开发可持续的交易系统。

模拟则允许创建人工金融产品,并每次都以完全不同的方式生成报价。 这将为我们提供最广泛的框架来研究数学复购模型,以及我在上一篇文章中谈到的其它重要数学原理。 另一个重要的优势是,我们将能够模拟无限数量的独立金融产品来并行交易。 最终,我们不再限制于测试的持续时间,和独立交易产品的数量。 当然,这些并非真实的报价,但在定价规律方面,它们与真实的报价没有任何区别。


基于离散化逻辑的价格模拟数学模型

在我们的任务中,使用“任意离散化”方式绰绰有余,因为强壮的离散化只会提高我们算法的效率,即便只是因为这样的系统会更有效地自动抵抗扩散。 不过,我已构建了一个算法,也允许模拟跳价。 毕竟,跳价是最小的时间帧。 跳价到达之间的时间差别很大,但如果计算跳价之间的平均时间,则您可以仿效跳价作为第一近似值。

在这种情况下,我们所说的柱线图是指一个固定的时间段,这便于我们从视觉角度进行感知。 但这之所以方便,只是因为您听说它很方便,且您无法摆脱它,因为所有交易终端都是专门为这种范式量身定制的。 然而,这与离散定价的最佳方式相距甚远。 我想,你们中的许多人都熟悉 “renko”。 这种价格离散化的方法只用于一件事 — 远离时间。 对于不同的方式和交易者,这种方法的价值可能完全不同。 不过,我使用此示例仅为了展示离散价格序列的替代方法之一。 按照我的理解,这个例子应该告诉您,在我们的任务上下文中,我们将采用一个完全不同、且不熟悉的离散化逻辑,但它将令我们能够非常简单有效地为定价建模,而不会产生过多的计算成本。

为了在计算能力方面正确构建高效且经济的范式,请看下图:

范例

该图展示出价格回滚的几种可能情况。 对我来说,这两个回滚表示任意的两个点,可以以任何方式选择,选择方法并不重要。 重要的是,我们可以任意选择任何点,其可视为预计的反转点。

“可能”这个词应该立即告诉每个数学家,在给定的点上,存在某种期望事件的概率。 在我们的例子中,我们可以说给定的事件是任意的。 回滚事件的特征是价格增量的上边界和下边界。 该事件的概率可以通过以下方式计算:

概率

这是达到上边界的概率,和由该公式推演出的方程。 该方程描述了在没有预测时机的情况下对价格增量的数学期望。 缺乏预测时机意味着零期望值,但在我们的模拟中,我希望能够调整预测力矩参数,以便我们可以方便地提高或削弱模拟定价的横盘特性。 最终,您将看到这会如何影响复购算法,并且您将获得一个使用复购算法进行多元化交易的操作数学模型。 但首先,我想为教给您这一切背后的完整数学知识。

目前,我们可以看到所有这些方程都很漂亮,而且看起来很实用,但到截至当前为止,还没有便捷的算法来调整金融产品的平坦度(回滚)。 要开发这样的算法,我们需要输入以下数值:

新的均值

第一个值实际上就是 “alpha” 均值。 我们也可以将其称为任意向下走势后价格回滚值的数学期望。 第二个值是回滚百分比的数学期望值,表示为相对于其先前走势的相对值。 这些量化值的本质是相同的,唯一的例外是:

新的数值计算

在此,我只是向您展示这些量化值是如何相关的,以及它们是如何计算的。 在我们的模型中,我们将规范化平均回滚,设置其平均百分比,我们将逆推逻辑,用其来判定平均价格回滚。 您必须承认,平均回滚百分比作为市场平坦度参数的规范化值非常方便。 如果这个百分比设置为零,那么我们实际上需要随机定价(这只是一个例子)。 我唯一要注意的是,所有价格回撤都是相对于 “θ” 点考虑的。 我希望您能原谅我标注中的自由,因为这些素材完全属于我,这里没有一滴别人的作品。 需要这些方程式来理解我接下来要做什么。

任何定价的另一个重要特征是波动性(价格变化率)。 这个参数与时间关联,我们必须想出一些j极其便捷的方式来设置这个数值。 这应该令我们能够轻松有效地控制定价比率,并正确计算交易周期的时间。 目前,所有这些可能看起来都太复杂了,但当我开始实践,并向您展示它是如何操作时,它就会更加清晰。 我们先来应对波动性。

在经典解释中,波动率略有不同,相当于可能的相对价格变化从最小值到最大值的程度,反之亦然,从最大值到最小值。 这种设置价格变动率的方式非常不方便。 有一种更便捷的方式,它涉及测量固定时间段内的平均价格变动。 我们有这样的片段。 它们被称为柱线。 事实上,我们有每根柱线的价格变化模数的随机变量的分布定律。 该值越大,价格波动性(变化率)越大。 我们输入以下设置:

价格变化的参数

至于是否应该模拟 “S” 值的随机分布,我可以说没有必要。 您唯一需要知道的是,实际定价将与我们在数学模型中所用的方法不同。 我建议将 “S” 值固定在其平均值的水平。 由于每一步的时间已经固定,因此我们得到了该步的大小,及其持续时间。 这将令我们能够评估后续交易系统的年度盈利能力,并测量交易周期的平均时间。 现在我们看一眼下面的图片以便继续前进:

平坦度调整


由于我们必须模拟每一步的定价,很明显,该步可以是向下的,也可以是向上的。 如果我们在两个方向上设置一个等概率的分步,那么我们就会得到随机定价。 这意味着为了规范化平坦度,我们应该改变这些分步概率。 这将会为价格的起点提供某种“引力”,价格从该起点开始上涨或下跌。 在我们的例子中,我们需要意识到以下几点:  

每步的数学期望的计算

在本例中,为了简化模型,我假设所选的平均价格反转所需的时间与上一次价格上涨或下跌所花费的时间完全相同。 这些计算的目的是判定单步的瞬时期望值,以便计算该步上升发生的概率。 依据这个概率,就可以调整新一步的模拟。 对于每个单独交易的金融产品,每步后都要重新计算该数值。

这里有一个非常重要的点:如果我们分别描述每种金融产品,那么我们将不得不创建一个数组,其中包含每种金融产品的均价变化数据。 但在我的任务框架内,所有金融产品都是平等的,因此可以引入一个通用且更便捷的特征,每一步都以均价变化百分比的形式描述:

相对起伏

此特性的优点是相对于任何当前价格都是不变的。 甚至,如果我们研究理想的金融产品,那么无所谓以什么价格开始模拟,因为这不会影响测试期间的盈亏。 在我们理解了这一点之后,我们的回购算法就可以安全地从等于 1 的价格开始并行交易。 确定该数值后,就已经可以计算每步的数值本身:

当前步


现在,知道了这一步,我们可以说已为计算每步上升的概率收集到所有必要的数据。 为此,我们套用原始公式,配以一些代入来计算每步的数学期望:

代入

经过这样的代入,我们可以求解这个方程,从而得到每步上升的概率,最后得到缺失的概率:

每步上升概率

唯一值得注意的是,这些方程对于模拟价格跌破起点的情况也有效。 但是当价格上升时该怎么做? 一切都很简单。 我们只需要考虑镜像图表。 这是可以做到的,因为我们正在研究的是完美金融产品。 如果我们想象价格图表可以用某个表达式 “P = P(t)” 来描述,那么该金融产品的逆转将如下所示:

coup

这种逆转将令方程式在价格高于起点时保持工作。 我们唯一需要明白的是,表达式中计算所取的价格量(例如,δ)必须取已经转换后的价格负一次方。

现在我们来构建一个交易模型。 我把它做成单向的,因为它最初是用于加密货币的现货交易。 不过,这种交易模式也适用于外汇货币对。 问题是,如果该模型仅在复购的情况下有效,那么它同样适用于复卖。 唯一的问题是,在测试过程中,我们将略过上部的半波,只基于下部的半波上操作。 为了管理交易模型,我输入了以下特征:

交易模拟设置


买入从 “1-Step Percent/100” 价格开始,复购步则等于 “Step Percent/100”。 其实,还应该乘以起始价格的,但由于我们取该价格等于 1,所以每步的计算就大大简化了。 此外,还引入了步数递增的可能性。 例如,我们可以将下一次复购步数相对于前值增加 N 倍,或者以相同的方式减少它。 所有这些都取决于相应的系数值。 复购步以金融产品的低位货币(而非基准货币)衡量。 此规则也适用于加密货币。

为了简化模型,假设本例中应用的交易产品大致如下:EURUSD、GBPUSD、NZDUSD、诸如此类,即所有交易产品的低位货币必须相同。 这简化了本已非常复杂的模型,且对于测试上一篇文章中的数学原理,和优化复购算法来说都足够了。 在我们的案例中,差额是以佣金的形式考虑的,这都是一回事。 通常,这些参数对于数学模型原型来说已经足够了。 我们来看看复购流程:

均摊

我们将用到第一个选项(绿色回转运动)。 这实际上是买入基准货币,然后于蓝点处卖出。 通过这种方式,任何完成的交易周期都是可盈利的。 这同样适用于红色回转走势的卖出周期,但正如我所说,我们将跳过它们,以便令模型尽可能具有多功能性,并适合外汇市场交易和加密货币交易所的现货交易。

该模型的制作方式令交易杠杆不起作用。 我认为我已经教给您足够的理论信息,如此您就能更好地理解实践部分,且它也许会帮助某人在我的成就上构建自己的模型。


模型测试

我们从不同的报价生成变体开始测试。 为了直观地向您展示生成报价的差异,我们首先按照以下位置模型设置:

依据该设置,我们将达成随机定价。 我们从这个观点查看几个生成的报价:

随机报价的生成

这是来自数学模型的图表,它展示了从牌价里随机获取的两个报价,和另一条与起始价格偏差最大的附加曲线。 在数学模型中,可以设置需要并行模拟的金融产品数量,自然这会有很多,且总会有一个对称性最小、波动性最大的。 但我希望您明白,这只是概率处理的结果。 现在我们把参数置于不同的位置:

正如您可能已经理解的那样,此步会造成价格返回起点的引力。 结果如下:


请注意上一个图像和当前图像之间的差异。 此处,我们已经强制把平坦度调整到所需的方向。 我们可以看到,曲线被强烈地压制在起始价格上 — 同样的事情也发生在波动最剧烈的黑色报价上。 这两个示例针对每个金融产品都精确地模拟了一千步。 稍后,我将增加这些数量,并对其进行修改,从而了解它们是如何工作的,以及哪些参数会确切的受到影响。

现在有必要判定使用哪些参数来测试人工交易,以及如何测试人工交易。 我们快速回顾一下我在上一篇文章中回答的问题。 以一种更简单、更易于理解的方式,它们听起来如下:

  1. 复购交易系统的盈利条件。
  2. 当无休止地交易理想的交易产品时,盈利曲线是否趋向于完美的直线?
  3. 在固定的交易时间段内,随着产品数量增加到无穷大,盈利线是否趋向于完美的直线?

我们来找出盈利的条件。 为此,我们首先采用随机定价进行并行交易,然后查看结果。 它大致如下所示:

净值 1

在不同的世代中,即得到盈利的曲线,亦有无盈利的曲线。 目前尚不清楚,但在随机定价的情况下确认复购是徒劳的,也许是并行交易产品数量的急剧增加。 我们来看看如果我们将它们的数量增加到 100 个,同时将每个产品的模拟步数增加到 10,000 个,会发生什么:

净值 2

正如您所看到的,并行交易的产品数量增加,和测试持续时间的增加,都没有任何明显的影响。 最有可能的是,这证实了来自上一篇文章中数学证明的事实,即任何交易系统,包括复购算法,在完全随机定价,且没有预测时机的情况下都会耗尽账户。 在这个阶段,我认为第 1 点在理论和实践上都得到了证明。 现在我们移到第二点,并设置以下设定:

根据我的测试,返回引力足以让任何读者进行效果的视觉评估。 当然,我们可以设置较低的百分比,但影响不会那么明显。 我将模拟步数重置为原始值 1000 步。 现在我们来看看结果:

净值 3

我认为这不难理解这张图形,除其它外,它是前一段落证明的附加补充,但同时,它也是下一段落证明的起点。 我计划中的下一件事是,在不更改任何其它参数的情况下增加所有测试片段的持续时间。 为了清晰起见,我将每个产品的模拟步数增加了 50 倍,从 1000 个增加到 50,000 个。 这是一个相当大的增长,但这是无需多次测试和平均结果的情况下直观地感受到这种影响的唯一途径。 我们看一下结果:

净值 4

正如我们所看到的,曲线变得更加平滑,并接近一条直线,这意味着随着测试持续时间的增加线性因子(图形美感)增加的第二条原理完全符合预测。 当然,只有在假设所选策略可盈利的情况下,这才是属实的。 在现阶段,我认为第二段落在理论上和实践上都得到了证明

现在,我们将模拟步数恢复到初始水平 1000 步,反之,将并行交易的产品数量增加 10 倍,最高可达 1000 个。 根据图例,我们应该感到图形美感的可观提升。 我们看看这是否属实:

净值 5

正如我们所看到的,这个假设已经得到证实,并且效果非常明显。 在这个阶段,我相信这三个假设全部在理论和实践上都得到了证明。 结果如下:

  1. 任何交易系统盈利的条件都是预测时机的存在。
  2. 随着交易或回测持续时间的增加,盈利交易系统的任何曲线都变得更加美观和笔直(没有自动手数)+ [前提是满足第 1 点]。
  3. 随着一个多币种交易系统的交易货币对数量的增加,或并发交易系统数量的增加,交易系统的盈利曲线变得更加美观和笔直 + [前提是每个系统的点 1 都得到满足]。

      测试 EA

      我们已经弄清楚了如何正确使用交易系统,包括复购算法,以便能通过自动和手动交易尽可能高效和安全地赚钱。 对于正确组合交易系统,资金管理和其它各种状况的计算,值得另写一篇文章,我计划稍后会写。

      我添加了这一章节,如此您可以清楚地看到这一事实,复购算法是一种可操作的策略。 为此,我创建了一个测试 EA,它复现了我们的数学模型,唯一的区别是它也处理上部半波(卖出交易周期)。 我发现了一些设置,证明了为 MetaTrader 5 创建类似交易系统的可能性。 这是其中之一:

      示例

      测试是基于 2009 年至 2023 年期间进行的,并行测试用到了与我们的数学模型类似的所有 “28” 个货币对。 我使用我在前一篇文章中描述的多机器人模板来构建测试算法。 当然,盈利曲线远非理想,这种交易的初始本金应该是巨额的,但尽管如此,我在本文中的任务不是给您一个现成的机器人,而是演示接近数学模型。 您应该了解的最重要的事情是,通过某些修改,该算法将会更安全、更高效、更可行。 我建议您自行发现改进的本质。 我认为这将是公平的,因为我揭示的东西通常被隐藏。

      智能系统、沿用的设定、以及数学模型本身都作为文件附加到文后,如您愿意,您可以更详细地研究它们的结构,也许可以进一步拓展这个思路。 事实上,在我的数学模型中,它的用途比我在这里描述的要多得多。 在回测后,它有了自己的一组输出参数,有致于此,它计算许多重要的交易特征。 当然,它的功能非常有限,但对于证明和近似估算来说已经足够了。


      结束语

      在这篇文章中,我所完成的实践部分,证明了多元化原则有效,且应该加以使用。 最重要的是,结合之前的文章,我已经在理论上和实践上证明了许多重要的事情,至少可以让您提高交易效率。 此外,在创建的 EA 的帮助下,复购算法基于过去十多年来的生存能力得到了证明。

      考虑到这一点,我们已经确认了定价的波浪理论,或者说市场平坦度。 我建议您关注这篇文章作为额外的确认。 在其中,作者最大程度地关注了与我在文章中描述的完全相同的算法。 从那里,您可以获得更多有关知识,譬如,如何利用这些成果来改进我的测试 EA,或开发您自己的测试 EA。

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

      附加的文件 |
      materials.zip (308.4 KB)
      如何用 MQL5 创建自定义真实强度指数指标 如何用 MQL5 创建自定义真实强度指数指标
      这是一篇关于如何创建自定义指标的新文章。 这一次,我们将与真实强度指数(TSI)共事,并基于它创建一个智能系统。
      理解并有效地使用 MQL5 策略测试器 理解并有效地使用 MQL5 策略测试器
      对于 MQL5 程序员或开发人员,一项基本需求就是掌握那些重要且颇具价值的工具。 其中一个工具是策略测试器,本文是理解和使用 MQL5 策略测试器的实用指南。
      神经网络变得轻松(第三十九部分):Go-Explore,一种不同的探索方式 神经网络变得轻松(第三十九部分):Go-Explore,一种不同的探索方式
      我们继续在强化学习模型中研究环境。 在本文中,我们将见识到另一种算法 — Go-Explore,它允许您在模型训练阶段有效地探索环境。
      MQL5 中的范畴论 (第 8 部分):幺半群(Monoids) MQL5 中的范畴论 (第 8 部分):幺半群(Monoids)
      本文是以 MQL5 实现范畴论系列的延续。 本期,我们引入幺半群作为域(集合),通过包含规则和幺元,将范畴论自其它数据分类方法分离开来。