English Русский Español Deutsch 日本語 Português
preview
改编版 MQL5 网格对冲 EA(第 IV 部分):优化简单网格策略(I)

改编版 MQL5 网格对冲 EA(第 IV 部分):优化简单网格策略(I)

MetaTrader 5测试者 |
574 1
Sahil Bagdi
Sahil Bagdi

概述

在我们连载系列的本期内容,是修订的 MQL5 网格对冲 EA,我们深究网格 EA 的复杂性。据我们在简单对冲 EA 方面的经验,我们现在应用类似的技术来改进网格 EA 的性能。我们的旅程从现有的网格 EA 开始,其会当作我们数学探索的画布。目标呢?剖析底层策略,解开其复杂性,并揭示驱动其行为的理论基础。

但我们要认识到未来的艰巨挑战。我们从事的分析是多方面的,需要深入研究数学概念,及缜密的计算。因此,尝试在一篇文章中同时涵盖数学优化、及随后的基于代码的改进是不切实际的。

因此,在本期中,我们将专注于数学层面。请您准备好全面的理论考证、公式和数字复杂性。别担心,我们将竭力寻求理解优化过程的核心。

在以后的文章中,我们将把注意力转向实际方面 — 实际编码。以我们的理论根基为助臂,我们将把数学见解转化为可操作的编程技术。敬请期待我们在理论与实践之间搭建桥梁,从而解锁网格 EA 的全部潜能。

此处是本文的计划:

  1. 网格策略回顾
  2. 数学优化
  3. 利用 Python 模拟计算
  4. 结束语


网格策略回顾

我们回顾一下该策略。就是首先我们有 2 个选项。

在交易界域,我们面临两个基本选择:

  1. 买入:持续买入,直至达到某个点位。
  2. 卖出:持续卖出,直到满足特定条件。

首先,我们需要根据某些条件决定下单是买入还是卖出。假设我们有一笔买单。我们下单,并密切关注行情。如果行情价格上涨,我们就会获利。一旦价格如我们目标所愿上涨一定额度(通常以点为单位),我们结束本轮交易,并收工。但是,如果我们想开始另一轮,我们也可这样做。

现在,如果价格走向与我们的预期相悖,下跌了相同的一定额度,比如说 “x” 点,我们就会再次下买单作为回应,但这次的手数翻倍。此举是策略性的,因为将手数翻倍会把加权平均价格拉低到初始订单价格的 “2x/3”(能轻易由数学计算得到),这仅比第二笔订单多出 “x/3” 距离,而其很容易吸引价格,这正是我们所愿。这个新的平均值是我们的盈亏平衡点,考虑到我们遭受的任何亏损,我们的净利润于该处零和。

在这个盈亏平衡点,我们有两种途径获利:

  1. 第一笔订单,现在是上层订单(指最先开立、且价位较高的订单),最初显示亏损,因为行情价格低于其开单价。但是,当行情价格回升至第一笔订单的开单价时,该笔订单的亏损会减少,直到为零,并进一步变为正值。这意味着我们的净盈利不断增长。
  2. 第二笔订单,以两倍的手数下单,已经获利。随着行情价格的持续上涨,该笔订单的盈利也会走高,主要加入的点数在于它的手数成倍增加。

这种方式与传统的对冲策略不同,因为它为我们给出了两种获利道路,这让我们在设定目标时有了更大的灵活性。如果我们继续按某个乘数(比如说翻倍)提升每笔新订单的手数,那么减少亏损、并由最后一笔订单提升盈利的效果会逐渐变得更加显著。这是因为最近的订单比之前的订单手数更大,并且随着我们开立的订单更多,这个手数亦会不断提升。如果我们积累了大量的订单,那么与对冲相比,我们从每点中获得的盈利会多得多。当我们稍后将对冲与网格交易相结合时,这就变得尤为重要。在这般混杂策略中,网格组件有产生可观盈利的潜力。

包含两笔订单的示例可以扩展到更多的订单。随着订单数量的提升,特别是当按照一致的间隔下单时,摊平价格趋向于下降。当采用乘数 2 时,平均价格(代表盈亏平衡点)会收敛到倒数第三笔订单的开单价。我们将在后面的讨论中用数学证明来探索这个概念。

随着我们深入研究这种交易策略的复杂性,至关重要的是理解手数规模如何运作、以及价格走势如何影响我们的仓位。通过策略性地管理我们的订单、并调整手数规模,我们可以精准地驾驭行情,踩准有利趋势,并把潜在亏损最小化。我们将在不久的将来制定的双盈利策略,不仅会给我们带来更大的灵活性,还会提升我们的潜在收益,创建一个在行情动态中蓬勃发展的强大交易系统。


数学优化

我们首先看一下我们将做优化的参数,即策略的参数。

策略参数:

  1. Initial Position (IP): 初始开仓是一个二元变量,为我们的交易策略设定阶段方向。数值 1 表示买入动作,指示我们以价格上涨的预期入场。反之,数值 0 表示卖出动作,表明我们预测价格会走低。这个最初选择也许是一个关键的决策点,由它判定我们交易策略的整体乖离,并为后续动作设定基调。优化之后,我们就知道用哪个买卖更佳。
  2. Initial Lot Size (IL): 初始手数定义我们在交易轮次内的首笔订单大小。它奠定了我们参与市场的尺度,并作为我们后续业务规模的根基。选择相适的初始手数至关重要,因它直接影响与我们的交易相关的潜在盈利和亏损。至关重要的是,我们要在潜在回报最大化、与管理我们的风险敞口之间取得平衡。这在很大程度上取决于我们选择的手数乘数,如果乘数较高,则应调低,否则后续订单的手数会很快暴增。
  3. Distance (D): 距离是一个空间参数,确定我们开单价位之间的间隔。它影响我们执行交易的入场点,并在定义我们的交易策略结构方面扮演着重要角色。通过调整距离参数,我们可以控制订单之间的间距,并基于行情条件、及我们的风险承受能力优化我们的入场。
  4. Lot Size Multiplier (M): 手数乘数是一个动态因素,它允许我们根据交易轮次的进展来增加后续订单的手数。它为我们的策略引入了一定程度的自适性,令我们能够在行情有利时增加敞口,或者在面临不利条件时降低它。通过仔细选择手数乘数,我们可以定制我们的持仓规模,以便抓住盈利机会,同时管理风险。
  5. Number of Orders (N): 订单数量代表我们将在单个交易轮次/网格轮次内的下单总数。这并不完全是策略的参数,而是我们在优化策略的真实参数时要考虑的参数。

至关重要的是,深刻领会参数将成为我们优化工作的重点。这些参数是我们构建策略的基础,明白它们的作用和影响,对于制定明智的决策,及实现我们想要的结果至关重要。

为简单起见,我们以它们的基本形式表述这些参数。不过,重点要注意,在数学方程式中,其中一些变量将使用下标表示法表示,以便将它们与其它变量区分开来。

这些参数是构造我们的盈利函数的基础。盈利函数是我们的盈利(或亏损)如何受这些变量变化影响的数学表示。它是我们优化过程的重要组件,令我们能够定量评估不同场景下各种交易策略的成果。

配以这些已建参数,我们现在能够继续定义盈利函数的组件:


我们来计算盈利函数的一个简化场景,其中我们选择买入,并且仅有两笔订单。我们假设手数乘数为 1,这意味着两笔订单的手数相同,均为 0.01。

为了找到盈利函数,我们首先需要判定盈亏平衡点。假设我们有两笔买单,B1 和 B2。B1 位于价格 0 处,B2 位于价格 B1 下方的距离 D,即 B1 价格 - D。(注意,此处的负价格用于分析,不会影响成果,因分析取决于距离参数 D,而非确切的价位。

现在,假设盈亏平衡点位于 B1 下方 x 距离之处。此刻,我们将从 B1 亏损 -x 点,从 B2 获利 +x 点。

如果手数相等(即手数乘数为 1),则盈亏平衡点将正好位于两笔订单的中间。不过,如果手数不同,我们需要参考手数乘数。

例如,如果手数乘数为 2,初始手数为 0.01,则 B1 的手数为 0.01,B2 的手数为 0.02。

在这种情况下,若要找到盈亏平衡点,我们需要通过求解以下方程来找到 x 的值:


我们来分析一下方程的分量。初始手数 0.01 在方程的每个部分中重复(第二部分是指 + 号之后的部分)。我们将其乘以 100,将手数转换为整数,并且由于我们在贯穿整个方程式中始终应用该转换,它维持其重要性。接下来,我们在第一部分将其乘以 2^0,在第二部分乘以 2^1。这些项代表手数乘数,初始手数的幂从 0 开始,每个后续订单的幂递增 1。最后,我们在第一部分用 (0-x),在第二部分用 (D-x),在第 i 部分使用 ((i-1)D-x),因为第 i 笔订单位于 B1 以下 D 的 (i-1) 倍的点位。 求解 x 的方程得到 2D/3,这意味着盈亏平衡点比 B1 低 2D/3 点(在我们的方程中由 x 定义)。如果 D 为 10,则盈亏平衡点将比 B1 低 6.67 点,或比 B2 高 3.34 点。与 B1 的盈亏平衡点相比,更有可能达到这个价位(如果我们只有一笔订单)。这就是网格策略背后的核心概念:回退至以前的订单,直到达成盈利。

现在,我们研究一个有 3 笔订单的情况。

对于 3 笔订单,我们遵循相同的方式。第 1 部分和第 2 部分的解释保持相同。在第 3 部分中,有两个变化:2 的幂增加 1,D 现在乘以 2。其它一切都保持不变。

进一步求解 x,


在 3 笔订单情况下,我们发现当价格低于 B1 的 10D/7 点时,就会发生盈亏平衡。如果 D 为 10,则盈亏平衡价格将比 B1 低 14.28 点,比 B2 低 4.28 点,比 B3 高 5.72 点。再有,与 B1 的盈亏平衡点(有 1 笔订单)、或之前的盈亏平衡点相比,价格更有可能达到这一点。盈亏平衡点继续走低,增加了达到该价位的可能性,如果价格对我们不利,则回退至我们之前的订单更有效。

我们来概括 n 笔订单的公式。

注意:我们假设所有持仓都是买单。卖单的分析是对称的,故我们将保持简单。



然而,事实证明这种概括是不正确的。

其原因可以用一个简单的例子来解释。假设初始手数为 0.01,乘数为 1.5。首先,我们开仓,手数为 0.01。然后,我们开第二仓,手数为 0.01 * 1.5 = 0.015。不过,四舍五入后,它变为 0.01,因为手数必须是 0.01 的倍数。此处有两个问题:

  1. 该方程式根据开仓手数为 0.015 计算,而实践中是不可能的。取而代之,我们的开仓手数为 0.01。
  2. 这一点并不完全是一个问题,而是必须注意的事情。我们研究同样的例子。出于实用性原因,首笔订单是 0.01,第二笔也是 0.01。第三笔订单的手数应该是多少?我们取最后一笔订单的手数再乘以手数乘数,但我们应当用 1.5 乘以 0.01,亦或 0.015?如果我们乘以 0.01,我们就会陷入一个循环中,这令乘数变得毫无用处。故此,我们用 0.015 * 1.5 = 0.0225,实际上变成了 0.02,依此类推。

如上所述,第二点并不完全是一个问题。我们利用数学中的最大整数因子(GIF)、或向下取整函数来解决第一个问题,就是说我们只需砍掉任何正数的小数部分(我们不会详讨负数,因为手数不能为负数)。注入符:floor(.) 或 [.]。示例:floor(1.5) = [1.5] = 1; floor(5.12334) = [5.12334] = 5; floor(2.25) = [2.25] = 2; floor(3.375) = [3.375] = 3。


其中,[.] 表示 GIF,即最大整数因子。进一步求解,我们得到:


更正式地,对于 x 笔订单,我们得到盈亏平衡函数 b(x),


现在我们得到一个盈亏平衡函数,它为我们给出盈亏平衡价格。它返回盈亏平衡价位比 B1 低多少个点。对于盈亏平衡价位,我们需要判定止盈位(TP),即高于 b(x) 的 TP 点数。因为 b(x) 是 B1 价位减去盈亏平衡价位,所以对于止盈位,我们需要从 b(x) 中减去 TP。因此,我们得到止盈位,我们将其表示为 t(x):

给定 x,即订单数量,我们得出止盈位。现在我们需要计算给定 x 的盈利。我们尝试找到盈利函数。

假设价格达到 t(x),即止盈位,且轮次清仓,我们从 B1 赚到的盈利/亏损是 B1 减去 t(x) 的价位,以点数为单位。负值表示我们亏损,而正值表示我们盈利。类似地,我们从 B2 赚到的盈利/亏损是 B2 减去 t(x) 的价格位,以点数为单位,我们知道 B2 价位正好比 B1 价位低 D 点。对于 B3,盈利/亏损是 B3 的价位减去 t(x),以点为单位,我们知道 B3 价位正好比 B1 价位低了 2 乘以 D 点。注意,我们还需要参考初始手数和手数乘数。

数学上,给定 x(即订单数量为 3),我们得到:


更正式地,对于 x 笔订单,我们得到一个盈利函数 p(x),


我们来了解一下这意味着什么。给定任意数量的订单,假设轮次以 x 笔订单清仓(其中“清仓”意味着我们触发止盈位),我们由上述方程 p(x) 给出得到的盈利。现在我们有了盈利函数,我们尝试计算成本函数,其所指是若我们在一个订单数量为 x 的网格轮次遭受亏损(其中“亏损”意味着由于资金不足,我们无法进一步开单来延续网格轮次,因网格策略需要大量的投资,或任何其它原因)。

成本函数应如下所示:

在这个等式中,[.] 部分取初始手数和手数乘数。另一部分 (i.D-x.D) 参考 x.D,即 B1 价位距最低价订单下方 D 点的距离。我们取 x.D,因为那正是我们开新单的地方。如果出于某种原因,很可能是资金不足,我们无法延续这个轮次,那么我们可以肯定地说,如果我们不能在该价位(当价格达到该水平时)开仓,我们就无法延续该轮次。本质上,当我们知晓我们未能延续该轮次时,价位将比 B1 价位低 x.D 点。结果就是,我们将从 B1 订单中损失 (0.D-x.D),从 B2 订单中损失 (1.D-x.D),依此类推,直至最后一笔订单,即 Bx 订单,我们将损失 ((x-1).D-x.D)=-D. 这在理,因为我们比最后一笔订单(价格最低的订单)还低 D 点。

更正式地,对于 x 笔订单,我们得到一个成本函数 c(x),



我们还需要考虑点差,为简单起见,我们假设点差是恒定的,因为采用动态点差会非常复杂。我们假设 S 是静态点差,我们针对 EURUSD 保持等于 1-1.5。点差可能会依据货币对而变化,但该策略配合波动性较低的货币工作最佳,例如 EURUSD。

重点要注意,我们的调整考虑到所有交易,从 0 到 x-1,认识到点差会影响每笔交易,无论盈利与否。出于简化,我们目前将点差(表示为 S)当作常数值。制定这个决定是为了避免我们的数学分析因点差波动的增加而复杂化。尽管这种简化限制了我们模型的真实性,但会令我们能够专注于策略的核心方面,而不会因过于复杂而陷入困境。

现在我们已经拥有了所有必要的函数,我们可以利用 Desmos 绘制它们。

给定上述参数,我们得到下表,其中更改 x 会得到不同的 p(x) 和 c(x) 值:

在这种场景下,p(x 始终小于 c(x),但这可以通过增加 TP 轻松改变。例如,如果我们将 TP 从 5 增加到 50:

现在,p(x) 始终大于 c(x)。萌新交易者或许会想,如果我们可以在 TP=50 的情况下获得如此高水平的风险回报率,为什么还要保持 TP=5?然而,我们必须考虑到概率。TP 从 5 提升到 50 大大降低了价格达到止盈位的可能性。我们必须意识到,如果我们从未、或很少触发止盈,那么看似优良的风险回报率是没有意义的。考虑到概率,我们需要价格数据和基于编码的优化,而不仅仅是方程式,我们将在本系列的后续部分探讨。

您可以利用 Desmos 图形链接来查看这些函数的绘图,并配以参数演绎,从而更好地理解该策略。

至此,我们完成了优化的数学部分。在接下来的章节中,我们将更深入地探讨实现该策略的实际层面,研究真实世界的行情条件,及随之而来的挑战。通过结合我们于此建立的数学基础与数据驱动的分析和优化技术,我们能过改进网格交易策略,以便更好地满足我们的需求,并最大程度地发挥其盈利潜能。

最后的想法: 如早前所述,许多参数会指示盈利潜力很高。不过,至关重要的是明白这些数字主要是为了概括。这背后的原因是数学优化中缺少一个重要组成部分:概率。将概率纳入我们的数学模型是一项复杂的任务,但它是一个不可忽视、不可或缺的因素。为了解决这个问题,我们将依据价格数据进行模拟,允许我们在计算中参考概率,并提高模型的准确性。

利用 Python 模拟计算

在这个模拟中,我们将计算并绘制 p(x) 和 c(x) 相较 x 的图形,其中 x 代表订单数量。p(x) 和 c(x) 的值将绘制在 y 轴上,而 x 的值将绘制在 x 轴上。这种可视化将提供 p(x) 和 c(x) 变化的快速洞察,并有助于识别在不同点哪个函数更大。此外,我们将生成一个表格,显示每个 x 的 p(x) 和 c(x) 的确切值,因为这些值也许无法从图形中轻松读取。这种绘图和表格的组合将提供对 p(x) 和 c(x) 行为的全面理解。

Python 代码:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.ticker import FuncFormatter

# Parameters
D = 10     # Distance
I_L = 0.01 # Initial Lot Size
M = 2      # Lot Size Multiplier
S = 1      # Spread
T_P = 50   # Take Profit

# Values of x to evaluate
x_values = range(1, 21)  # x from 1 to 20

def g(x, I_L, M):
    return np.floor(I_L * 100 * M ** x)

def s(x, I_L, M, S):
    return sum(g(i, I_L, M) * S for i in range(x))

def t(x, D, I_L, M, T_P):
    numerator = sum(i * g(i, I_L, M) for i in range(x)) * D
    denominator = sum(g(i, I_L, M) for i in range(x))
    return (numerator / denominator) - T_P

def p(x, D, I_L, M, S, T_P):
    return sum(g(i, I_L, M) * (i * D - t(x, D, I_L, M, T_P)) for i in range(x)) - s(x, I_L, M, S)

def c(x, D, I_L, M, S):
    return D * sum(g(i, I_L, M) * (x - i) for i in range(x)) + s(x, I_L, M, S)

# Calculate p(x) and c(x) for each x
p_values = [p(x, D, I_L, M, S, T_P) for x in x_values]
c_values = [c(x, D, I_L, M, S) for x in x_values]

# Formatter to avoid exponential notation
def format_func(value, tick_number):
    return f'{value:.2f}'

# Plotting
fig, axs = plt.subplots(2, 1, figsize=(12, 12))

# Combined plot for p(x) and c(x)
axs[0].plot(x_values, p_values, label='p(x)', marker='o')
axs[0].plot(x_values, c_values, label='c(x)', marker='o', color='orange')
axs[0].set_title('p(x) and c(x) vs x')
axs[0].set_xlabel('x')
axs[0].set_ylabel('Values')
axs[0].set_xticks(x_values)
axs[0].grid(True)
axs[0].legend()
axs[0].yaxis.set_major_formatter(FuncFormatter(format_func))

# Create table data
table_data = [['x', 'p(x)', 'c(x)']] + [[x, f'{p_val:.2f}', f'{c_val:.2f}'] for x, p_val, c_val in zip(x_values, p_values, c_values)]

# Plot table
axs[1].axis('tight')
axs[1].axis('off')
table = axs[1].table(cellText=table_data, cellLoc='center', loc='center')
table.auto_set_font_size(False)
table.set_fontsize(10)
table.scale(1.2, 1.2)

plt.tight_layout()
plt.show()

代码解释:

  1. 导入函数库

    • numpy 导入作为 np,用于数值运算。
    • matplotlib.pyplot 导入作为 plt,用于绘图。
    • FuncFormatter matplotlib.ticker导入,用于格式化轴刻度标签。
  2. 设置参数

    • 定义常数 DI_LMST_P,分别代表距离、初始手数、手数乘数、点差、和止盈。
  3. 定义 x 的范围

    • x_values 设置为 1 到 20 范围内的整数。
  4. 定义函数

    • g(x, I_L, M):根据给定的公式计算 g 的值。
    • s(x, I_L, M, S):计算 i 从 0 到 x-1 对应 g(i, I_L, M) * S 的总和。
    • t(x, D, I_L, M, T_P):基于给定公式,按分子和分母计算 t 的值。
    • p(x, D, I_L, M, S, T_P):利用给定公式计算 p(x)。
    • c(x, D, I_L, M, S):利用给定公式计算 c(x)。
  5. 计算 p(x 和 c(x) 值

    • p_valuesx_values 中每个 xp(x) 列表。
    • c_values x_values 中每个 xc(x) 列表。
  6. 定义格式化器

    • format_func(value, tick_number):定义一个格式化器函数,将 y 轴刻度标签的格式设置为小数点后两位。
  7. 绘图

    • fig, axs = plt.subplots(2, 1, figsize=(12, 12)) :创建一个图例和两个子图,排列在单列中。

    第一个子图(p(x) 和 c(x) 的组合图)

    • axs[0].plot(x_values, p_values, label='p(x)', marker='o'):以标记相较 x 绘制 p(x)。
    • axs[0].plot(x_values, c_values, label='c(x)', marker='o', color='orange'):以橙色标记相较 x 绘制 c(x)。
    • axs[0].set_title('p(x) and c(x) vs x'):设置第一个子图的标题。
    • axs[0].set_xlabel('x'):设置 x 轴标签。
    • axs[0].set_ylabel('Values'):设置 y 轴标签。
    • axs[0].set_xticks(x_values):确保为每个 x 值显示 x 轴刻度。
    • axs[0].grid(True):往绘图中添加网格。
    • axs[0].legend():显示图例。
    • axs[0].yaxis.set_major_formatter(FuncFormatter(format_func)):将格式化器应用于 y 轴,以避免指数注入符。

    第二个子图(表格)

    • table_data:准备包含列 x、p(x) 和 c(x)、及其相应值的表数据。
    • axs[1].axis('tight'):调整子图数轴,从而紧密贴合表格。
    • axs[1].axis('off'):关闭表格子图的轴。
    • table = axs[1].table(cellText=table_data, cellLoc='center', loc='center'):在第二个子图中创建一个单元格文本居中的表格。
    • table.auto_set_font_size(False):禁用自动字体大小调整。
    • table.set_fontsize(10):设置表格的字体大小。
    • table.scale(1.2, 1.2):缩放表的大小。
  8. 布局和显示

    • plt.tight_layout():调整布局,以防止重叠。
    • plt.show():显示绘图和表格。

我们采用以下默认参数(可以轻松更改,以便查看不同的结果):

# Parameters
D = 10     # Distance
I_L = 0.01 # Initial Lot Size
M = 2      # Lot Size Multiplier
S = 1      # Spread
T_P = 50   # Take Profit

结果:


注意:文末附有包含上述代码的 Python 文件。


结束语

在我们系列的第四期中,我们专注于通过数学分析和概率的作用来优化简单网格策略,其在网格和对冲策略中经常被忽视。未来的文章将从理论过渡到实践,基于代码的应用,把我们的见解应用到真实交易场景,从而帮助交易者提高回报,并有效管理风险。我们真诚感谢您的持续反馈,并鼓励我们在共同探索、完善交易策略,并取得成功的过程中进一步互动。

祝您编码愉快!祝您交易愉快!



本文由MetaQuotes Ltd译自英文
原文地址: https://www.mql5.com/en/articles/14518

附加的文件 |
最近评论 | 前往讨论 (1)
SoenHien
SoenHien | 5 10月 2024 在 03:54
出色的材料!期待阅读后续文章!!!
特征向量和特征值:MetaTrader 5 中的探索性数据分析 特征向量和特征值:MetaTrader 5 中的探索性数据分析
在这篇文章中,我们将探索特征向量和特征值在探索性数据分析中的不同应用方式,以揭示数据中的独特关系。
开发回放系统(第 56 部分):调整模块 开发回放系统(第 56 部分):调整模块
虽然模块之间已经可以正常交互,但在回放服务中尝试使用鼠标指标时会出现错误。在进入下一步之前,我们需要解决这个问题。此外,我们还将修复鼠标指标代码中的一个问题。所以这个版本经过适当的打磨,最终会稳定下来。
通过推送通知监控交易——一个MetaTrader 5服务的示例 通过推送通知监控交易——一个MetaTrader 5服务的示例
在本文中,我们将探讨如何创建一个服务应用程序,用于向智能手机发送关于交易结果的通知。我们将学习如何处理标准库对象列表,以便根据所需属性组织对象的选择。
神经网络变得简单(第 89 部分):频率增强分解变换器(FEDformer) 神经网络变得简单(第 89 部分):频率增强分解变换器(FEDformer)
到目前为止,我们研究过的所有模型在分析环境状态时都将其当作时间序列。不过,时间序列也能以频率特征的形式表示。在本文中,我将向您介绍一种算法,即利用时间序列的频率分量来预测未来状态。