English Русский Español Deutsch 日本語 Português
preview
将ML模型与策略测试器集成(结论):实现价格预测的回归模型

将ML模型与策略测试器集成(结论):实现价格预测的回归模型

MetaTrader 5示例 | 26 四月 2024, 10:45
408 0
Jonathan Pereira
Jonathan Pereira

概述:

上一篇文章中,我们完成了CSV文件管理类的实现,用于存储和检索与金融市场相关的数据。创建了基础设施后,我们现在准备使用这些数据来构建和训练机器学习模型。

我们在本文中的任务是实现一个回归模型,该模型可以预测一周内金融资产的收盘价。这一预测将使我们能够分析市场行为,并在交易金融资产时做出明智的决定。

价格预测是制定金融市场交易策略和决策的有用工具。准确预测价格趋势的能力可以带来更好的投资决策,实现利润最大化和损失最小化。此外,价格预测可以帮助识别交易机会和管理风险。

为了实现我们的回归模型,我们将执行以下步骤:

  1. 收集和准备数据:使用Python脚本,我们将获得历史价格数据和其他所需信息。我们将使用这些数据来训练和测试我们的回归模型。

  2. 选择并训练模型:我们将为任务选择合适的回归模型,并使用收集的数据对其进行训练。有几种回归模型,如线性回归、多项式回归和支持向量回归(SVR)。模型的选择取决于它是否适合解决我们的问题以及在训练过程中获得的性能。

  3. 评估模型性能:为了确保回归模型正确工作,我们需要通过一系列测试来评估其性能。此评估将帮助我们识别潜在问题,并在必要时调整模型。

在本文的最后,我们将获得一个回归模型,该模型可以预测一周内金融资产的收盘价。这一预测将使我们能够制定更有效的交易策略,并在金融市场上做出明智的决策。


第1节:选择回归模型

在应用我们的回归模型预测金融资产的周收盘价之前,有必要了解不同类型的回归模型及其特征。这将使我们能够选择最合适的模型来解决我们的问题。在本节中,我们将讨论一些最常见的回归模型:

  1. 线性回归是最简单、最流行的回归模型之一。它假设自变量和因变量之间存在线性关系。它的目的是找到一条最适合数据的直线,同时最小化误差平方和。线性回归虽然易于理解和实现,但可能不适用于变量之间的关系不是线性的问题。

  2. 多项式回归是考虑变量之间非线性关系的线性回归的扩展。使用不同程度的多项式将曲线拟合到数据。多项式回归可以为更复杂的问题提供更好的近似;然而,重要的是要避免过拟合,当模型与训练数据拟合得过于紧密时,会发生过拟合,从而降低其推广到看不见的数据的能力。

  3. 决策树回归是一种基于决策树的模型,它将特征空间划分为不同的、不重叠的区域。在每个区域,预测都是根据观测值的平均值进行的。决策树回归能够捕捉变量之间复杂的非线性关系,但可能会出现过拟合,尤其是当树变得非常大时。修剪和交叉验证技术可以用来对抗过度拟合。

  4. 支持向量回归(Support Vector Regression,SVR)是用于解决回归问题的支持向量机(Support Vector Machine ,SVM)算法的扩展。SVR试图为数据找到最佳函数,同时保持函数和训练点之间的最大裕度。SVR能够使用诸如径向基函数(Radial Basis Function,RBF)之类的核函数对非线性和复杂关系进行建模。然而,与其他回归模型相比,SVR训练在计算上可能是昂贵的。

为了选择最合适的回归模型来预测金融资产一周的收盘价,我们需要考虑问题的复杂性和变量之间的关系。此外,我们必须考虑模型性能和计算复杂性之间的平衡。一般来说,我建议尝试不同的模型,并调整它们的设置以获得最佳性能。

在选择模型时,重要的是要考虑影响模型质量和适用性的几个标准。在本节中,我们将研究在选择回归模型时必须考虑的主要标准:

  1. 回归模型的性能对于确保预测的准确性和有用性非常重要。我们可以使用均方误差(MSE)和平均绝对误差(MAE)以及其他指标来评估性能。在比较不同的模型时,选择在这些指标上表现最好的模型是很重要的。

  2. 模型可解释性是理解变量之间的关系以及它们如何影响预测的能力。线性回归等更简单的模型通常比神经网络等更复杂的模型更容易解释。如果我们想向他人解释我们的预测或了解影响结果的因素,可解释性尤其重要。

  3. 回归模型的复杂性与参数的数量以及模型的结构有关。更复杂的模型可以捕捉数据中更微妙和非线性的关系,但它们也可能更容易过拟合。重要的是要在模型的复杂性和将其推广到未知数据的能力之间找到平衡。

  4. 训练时间是一个需要考虑的重要问题,尤其是在处理大型数据集或迭代训练模型时。与其他更复杂的模型(如神经网络或支持向量回归)相比,更简单的模型,如线性和多项式回归,通常需要更少的训练时间。重要的是要在模型性能和训练时间之间找到平衡,以确保模型适用。

  5. 回归模型的鲁棒性是其处理数据中异常值和噪声的能力。稳健的模型对数据的微小变化不太敏感,可以产生更稳定的预测。选择一个能够处理数据中异常值和噪声的模型是很重要的。

在选择最合适的回归模型来预测收盘价时,重要的是要权衡这些标准,并在它们之间找到正确的平衡。通常建议测试不同的模型并微调其参数以优化性能。通过这种方式,您可以为特定问题选择最佳模型。

基于上述标准,在本文中,我决定使用决策树回归模型来预测收盘价。选择这种模型的理由如下:

  1. 性能:决策树通常适用于回归问题,因为它们能够捕捉变量之间的非线性关系和相互作用。通过适当调整模型超参数,如树深度和每片叶子的最小样本数,我们可以实现适应度和泛化之间的平衡。

  2. 可解释性:决策树的主要优势之一是其可解释性。决策树是基于属性及其值的一系列决策,使其易于理解。这有助于证明预测的合理性和了解影响收盘价的因素。

  3. 复杂性:决策树的复杂性可以通过调整模型的超参数来控制。有了这一点,我们可以在建模复杂关系的能力和模型的简单性之间找到平衡,同时避免过度拟合。

  4. 训练时间:与神经网络或SVM等更复杂的模型相比,决策树通常训练得相对较快。这一事实使得决策树回归模型适用于训练时间是一个重要因素的情况。

  5. 鲁棒性:决策树对数据中的异常值和噪声具有鲁棒性,因为每个决策都基于一组样本而不是单个观测,这有助于预测的稳定性和模型的可靠性。

考虑到所讨论的标准和决策树回归的好处,我认为这个模型适合预测周收盘价。然而,重要的是要记住,模型的选择可能会因每个问题的具体上下文和要求而异。因此,要为您的特定问题选择最合适的模型,您应该测试和比较不同的回归模型。


第2节:数据准备

数据准备和清理是实现回归模型过程中的重要步骤,因为输入数据的质量直接影响模型的效率和性能。这些步骤非常重要,原因如下:

  1. 消除异常值和噪声:原始数据可能包含异常值、噪声和误差,这些都会对模型的性能产生负面影响。通过识别和纠正这些不一致,您可以提高数据的质量,从而提高预测的准确性。

  2. 填充和删除缺失的值:不完整的数据在数据集中很常见,缺失的值可能会导致模型性能不佳。为了确保数据的完整性和可靠性,您可能会考虑输入缺失值、删除数据缺失的记录,或使用特殊技术处理此类数据。输入和删除之间的选择取决于数据的性质、缺失值的数量以及这些值对模型性能的潜在影响。仔细分析每种情况并选择最合适的方法来解决问题是很重要的。

  3. 选择变量:并非数据集中存在的所有变量在预测收盘价时都很重要或有用。适当的变量选择使模型能够专注于最重要的特征,从而提高性能并降低模型复杂性。

  4. 数据转换:有时需要对原始数据进行转换,以匹配回归模型的假设,或改善自变量和因变量之间的关系。转换的例子包括规范化、标准化和使用对数或平方根等数学函数。

  5. 数据划分:将数据集划分为训练子集和测试子集,以正确评估回归模型的性能。这种划分允许在数据子集上训练模型,并测试其泛化到看不见的数据的能力,这提供了对模型在现实世界中的性能的评估。

数据准备和清理阶段确保根据高质量的数据对模型进行训练和评估,最大限度地提高其在预测收盘价方面的有效性和实用性。

我们将看一个使用Python为回归模型准备数据的基本示例。然而,我想指出的是,加深你的知识很重要,因为每个具体的数据集和每个问题都可能需要特殊的准备方法和方法。因此,我强烈建议您花时间学习和理解各种数据准备方法。

要收集数据,我们将使用get_rates_between函数,该函数用于收集特定资产和特定时期的金融数据。它使用MetaTrader 5库连接到交易平台,并获取不同时间间隔的历史价格数据。

该函数具有以下参数:

  • symbol: 表示金融交易品种的字符串(例如,“PETR3”、“EURUSD”)。
  • period: 指定将收集数据的时间框架的整数(例如,每周数据的mt5.TIMEFRAME_W1)。
  • ini: 一个datetime对象,表示数据收集时间间隔的开始时间和日期。
  • end: datetime对象,表示数据收集时间间隔的结束日期和时间。

该功能首先检查MetaTrader 5的启动。如果启动失败,函数将返回一个异常并终止程序。

然后,该函数使用mt5.copy_rates_range()来获取指定交易品种和时段的金融数据。数据保存在 pandas 的DataFrame对象中,该对象是一个二维轴标记的数据结构,适用于存储金融数据。

接收到数据后,该函数会检查DataFrame是否为空,如果为空,它将返回一个异常,因为这表明在收集数据时发生了错误。

如果一切顺利,该函数将使用pd.to_detime()函数将DataFrame的“time”列转换为可读的日期和时间格式。“time”列被定义为DataFrame索引,这有助于数据访问和操作。

def get_rates_between(symbol:str, period : int, ini : datetime, end : datetime):
    if not mt5.initialize():
        print("initialize() failed")
        mt5.shutdown()
        raise Exception("Error Getting Data")

    rates = mt5.copy_rates_range(symbol, period, ini, end)
    mt5.shutdown()
    rates = pd.DataFrame(rates)

    if rates.empty:
        raise Exception("Error Getting Data")

    rates['time'] = pd.to_datetime(rates['time'], unit='s')
    rates.set_index(['time'], inplace=True)

    return rates

在本例中,我们将使用2000年1月1日至2022年12月31日的每周 EURUSD 货币对的金融数据。为此,我们使用get_rates_between函数。首先,导入必要的库:

import pandas as pd
from datetime import datetime, timezone
import MetaTrader5 as mt5
from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split

接下来,确定有关我们要分析的金融交易品种的信息:

symbol = "EURUSD"
date_ini = datetime(2000, 1, 1, tzinfo=timezone.utc)
date_end = datetime(2022, 12, 31, tzinfo=timezone.utc)
period = mt5.TIMEFRAME_W1

现在,我们可以使用前面定义的信息调用get_rates_between函数:

df = get_rates_between(symbol=symbol, period=period, ini=date_ini, end=date_end)

一旦我们有了数据,下一步就是准备创建一个机器学习模型。准备工作包括去除异常值和噪声,选择变量,转换数据,并将其划分为训练集和测试集。让我们详细探讨每一步。

去除噪声和异常值:

第一步是从数据中去除异常值和噪声。噪声是数据中的随机和不必要的变化,会使识别模式变得困难。异常值是与我们数据集中的其他值显著不同的值。两者都会对模型的性能产生负面影响。

有几种方法可以去除异常值和噪声。在本文中,我们将使用指数平滑方法,该方法为最新数据分配指数递减的权重,有助于平滑波动。为此,我们将使用 pandas 中的ewm函数。

smoothed_df = df.ewm(alpha=0.1).mean()

实际上,你可以使用任何适合你的模型和数据的方法。在这里,我们使用指数平滑只是为了简化示例并演示如何处理数据。在现实世界中,建议研究和评估不同的异常值和噪声去除方法,以找到针对特定数据集和特定问题的最佳方法。其他流行的方法包括移动平均过滤、百分位筛选和聚类。


变量的选择

下一步是选择我们将用作特征和目标的变量。在这个例子中,我们将使用开盘价、移动平均线收敛-发散(MACD)指标和指数移动平均线(EMA)作为特征。目标将是收盘价。

# Function to calculate MACD
def macd(df, fast_period=12, slow_period=26, signal_period=9):
    ema_fast = df['close'].ewm(span=fast_period).mean()
    ema_slow = df['close'].ewm(span=slow_period).mean()
    macd_line = ema_fast - ema_slow
    signal_line = macd_line.ewm(span=signal_period).mean()
    return macd_line, signal_line

# Function to calculate EMA
def ema(df, period=30):
    return df['close'].ewm(span=period).mean()

# Calculating MACD and the signal line
smoothed_df['macd'], smoothed_df['signal'] = macd(smoothed_df)

# Calculating EMA
smoothed_df['ema'] = ema(smoothed_df)

# Selecting the   variables
selected_df = smoothed_df[['open', 'macd', 'ema', 'close']].dropna()

数据转换

数据转换很重要,这样变量就可以在相同的范围内,我们可以正确地进行比较。在本例中,我们使用“最小-最大”(Min-Max)规格化,它将数据转换为从0到1的比例。

scaler = MinMaxScaler()
normalized_df = pd.DataFrame(scaler.fit_transform(selected_df), columns=selected_df.columns, index=selected_df.index)

数据划分

最后,我们将数据划分为训练集和测试集。我们将使用训练集来训练模型,并使用测试集来评估其性能。

X = normalized_df[['open', 'macd', 'ema']]
y = normalized_df['close']

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False)

在第2节中,我们执行了几个重要步骤,以确保数据已准备好用于机器学习模型。

我们首先使用 MetaTrader 5 API 加载金融交易品种数据,然后将其转换为 pandas DataFrame,然后设置一个时间列用作索引。然后,我们通过删除任何缺失的值并检查异常值和不一致性来清理数据。此操作对于确保模型不受无效或无关值的影响是必要的。

对于变量,我们之前选择了开盘价、MACD和EMA作为特征,收盘价作为目标。然而,请注意,这一选择是随机的,以提供一个明确的例子。

我们还将数据标准化。这对于确保数据规模的差异不会影响模型非常重要。最后,我们将数据划分为训练集和测试集,以评估模型泛化为新数据的能力。

这些数据准备步骤对于确保模型的预测准确有效至关重要。当数据准备好后,我们可以进入下一阶段,即创建和训练机器学习模型。


第3节:使用决策树训练和评估回归模型

在创建了训练和测试集并相应地准备了数据之后,我们就可以创建、训练和评估我们的决策树回归模型了。决策树是一种监督学习方法,我们可以将其应用于分类和回归问题。在这种情况下,我们将使用决策树来预测金融资产的收盘价。

  • 导入库并创建模型

让我们从导入必要的库开始,并从scikit-learn创建DecisionTreeRegressor模型的实例。

from sklearn.tree import DecisionTreeRegressor
from sklearn.metrics import mean_squared_error, r2_score

regressor = DecisionTreeRegressor(random_state=42)

  • 模型训练

接下来,我们使用训练数据集(X_train和y_train)来训练模型。

regressor.fit(X_train, y_train)

  • 做出预测

通过训练的模型,我们可以对测试数据集(X_test)进行预测,并将结果与测试数据集的实际值(y_test)进行比较。

y_pred = regressor.predict(X_test)

  • 评估模型性能

评估一个模型的性能对于了解它与数据的拟合程度和进行预测非常重要。除了均方误差(MSE)和决定系数(R²),我们还可以使用其他指标来评估我们的决策树回归模型的性能。我们可以研究的一些其他指标包括:

  • 平均绝对误差(MAE),是预测值和实际值之间的绝对差的平均值。这是一个易于理解的指标,可以显示预测与实际值的差距。
  • 平均绝对百分比误差(MAPE)是预测值和实际值之间的绝对百分比误差的平均值。该指标允许以百分比的形式评估模型的效率,这在比较具有不同价值尺度的模型时非常有用。
  • 均方根误差(RMSE)是MSE的平方根。这种度量的优点是它与目标变量具有相同的单位,使结果更容易解释。

我们可以使用 Scikit-learn 库来计算这些额外的度量。首先,导入必要的函数:

from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

然后,使用预测值和实际值计算度量:
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)

现在我们可以展示结果:

print(f"MAE: {mae:.4f}")
print(f"MSE: {mse:.4f}")
print(f"RMSE: {rmse:.4f}")
print(f"R²: {r2:.4f}")

  • 模型设置和优化

根据获得的结果,可能需要对模型进行调整和优化。这可以通过调整决策树超参数来实现,例如最大深度(max_depth)、分割内部节点所需的最小样本数(min_samples_split)、叶节点中所需的最低样本数(mini_samples_leaf)等。

为了优化超参数,有一些方法,如scikit-learn的网格搜索(GridSearchCV)或随机搜索(RandomizedSearchCV)。这些方法允许您测试超参数的不同组合,并找到模型的最佳配置。

from sklearn.model_selection import GridSearchCV
from sklearn.tree import DecisionTreeRegressor


regressor = DecisionTreeRegressor(random_state=42)

param_grid = {
    'max_depth': [3, 4, 5, 6, 7, 8],
    'min_samples_split': [2, 3, 4],
    'min_samples_leaf': [1, 2, 3]
}

grid_search = GridSearchCV(estimator=regressor, param_grid=param_grid, scoring='neg_mean_squared_error', cv=5, n_jobs=-1)
grid_search.fit(X_train, y_train)

best_params = grid_search.best_params_
print(f"Melhores hiperparâmetros: {best_params}")

best_regressor = DecisionTreeRegressor(**best_params, random_state=42)
best_regressor.fit(X_train, y_train)

y_pred_optimized = best_regressor.predict(X_test)

mae_optimized = mean_absolute_error(y_test, y_pred_optimized)
mse_optimized = mean_squared_error(y_test, y_pred_optimized)
rmse_optimized = np.sqrt(mse_optimized)
r2_optimized = r2_score(y_test, y_pred_optimized)

print(f"MAE otimizado: {mae_optimized:.4f}")
print(f"MSE otimizado: {mse_optimized:.4f}")
print(f"RMSE otimizado: {rmse_optimized:.4f}")
print(f"R² otimizado: {r2_optimized:.4f}")


  • 去价格规范化并创建图表

要去价格标准化并绘制图表,可以使用MinMaxScaler中的inverse_transform。首先,我们对实际价格(y_test)和预期价格(y_pred_optimised)进行去规范化,然后使用matplotlib库构建一个图。以下是更新后的代码:

import matplotlib.pyplot as plt

# Function for denormalizing prices
def denormalize_price(scaler, normalized_price, column_name):
    dummy_df = pd.DataFrame(np.zeros((len(normalized_price), len(selected_df.columns))), columns=selected_df.columns)
    dummy_df[column_name] = normalized_price
    denormalized_df = scaler.inverse_transform(dummy_df)
    return denormalized_df[:, selected_df.columns.get_loc(column_name)]

# Denormalize actual and forecast prices
y_test_denorm = denormalize_price(scaler, y_test, 'close')
y_pred_optimized_denorm

本节讨论使用决策树实现回归模型来预测金融资产的收盘价。在对模型进行训练和评估后,我们获得了性能指标并调整了超参数以优化其性能。

然而,需要注意的是,此示例只是一种基本方法,有许多先进的技术和策略可用于提高模型的准确性和性能。此外,回归模型和数据准备的选择可能会因每项任务的背景和具体要求而异。

最后,您应该始终使用不同的数据集,在不同的场景中进行全面的模型测试、验证和迭代,以确保其在预测金融市场价格时的稳健性和可靠性。


第4节:将回归模型集成到策略测试器中

在本节中,我们将详细介绍创建一个系统,该系统允许您直接在 MetaTrader 策略测试器中测试Python模型。这种方法将利用Python的简单性,在模型创建中增加额外的灵活性。验证过程将在MetaTrader中进行,因为我们将模型导出为MQL5的ONNX格式。这意味着我们可以轻松构建和完善我们的模型,同时在MetaTrader环境中进行严格的验证,确保其为金融市场的复杂性做好准备。

Python和MQL5之间的有效交互

该系统基于在Python和MQL5之间建立有效交互的关键需求。为了实现这一点,将创建一个Python类来简化与MQL5策略测试器的消息交换。当Python程序运行时,它将监控策略测试器中的交易,并在测试器启动后立即将资产价格数据传输到Python。这种连续的信息流为回归模型提供了实时数据,使其能够根据这些数据做出决策。此外,您可能希望回到这篇文章,以刷新有关MQL5类实现的信息,以便使用CSV文件。

构建用于Python和MQL5之间通信的文件类

File类支持Python和MQL5策略测试器之间的通信。让我们看看这个类的主要功能。它的主要目的是实现文件操作。

初始化类

File类被设计为Singleton,这保证了在整个程序中只有一个它的实例。这一点对于维护Python和MQL5之间通信的完整性非常重要。

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]


验证和处理文件

File类提供了检查文件是否存在、处理与文件相关的错误以及执行读写操作的基本方法。

  • __init_file方法检查文件是否存在。如果文件不存在,该方法将等待一秒钟,然后返回False。通过此检查,可以确保文件已准备好进行访问。

  • __handle_error方法处理处理处理文件时可能发生的异常。它识别常见错误,如PermissionError和FileNotFoundError,并提供有关这些错误的详细信息。

  • 读取CSV文件需要check_init_param和check_open_file方法。第一个检查文件是否存在,如果存在,读取文件并从DataFrame中的typerun列返回特定值。第二种方法检查文件是否存在,并将其作为完整的DataFrame读取。

from pathlib import Path
from time import sleep
from typing import Tuple
import pandas as pd
from pandas.core.frame import DataFrame
import os
from errno import EACCES, EPERM, ENOENT
import sys

class Singleton(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super(Singleton, cls).__call__(*args, **kwargs)
        return cls._instances[cls]

CSV_SEPARATOR = ';'

class File(metaclass=Singleton):

    def __init__(self) -> None:
        pass

    def __init_file(self, name_arq: str) -> bool:
        return Path(name_arq).is_file() or sleep(1) or False

    def __handle_error(self, e, name_arq: str):
        ERRORS = {
            EPERM: "PermissionError",
            EACCES: "PermissionError",
            ENOENT: "FileNotFoundError"
        }
        print(f"{ERRORS.get(e.errno, 'Unknown error')} error({e.errno}): {e.strerror} for:\n{name_arq}")

    def check_init_param(self, name_arq : str) -> Tuple[str]:
        while True:
            try:
                if self.__init_file(name_arq):
                    df = pd.read_csv(name_arq, sep=CSV_SEPARATOR)
                    return (df.typerun.values[0])
            except (IOError, OSError) as e:
                self.__handle_error(e, name_arq)
            except:
                print('Unexpected error:', sys.exc_info()[0])

    def check_open_file(self, name_arq: str) -> pd.DataFrame():
        while True:
            try:
                if self.__init_file(name_arq):
                    return pd.read_csv(name_arq, sep=CSV_SEPARATOR)
            except (IOError, OSError) as e:
                self.__handle_error(e, name_arq)
            except:
                print('Unexpected error:', sys.exc_info()[0])

    @staticmethod
    def save_file_csv(name_arq: str, dataset:DataFrame = pd.DataFrame({'col':['ok']})):
        dataset.to_csv(name_arq, sep=CSV_SEPARATOR)

    @staticmethod
    def save(name_arq:str, data:str):
        with open(name_arq, 'w') as f:
            f.write(data)

    @staticmethod
    def delete_file(name_arq: str):
        try:
            os.remove(name_arq)
        except:
            pass


保存和删除文件

File类还管理文件的保存和删除。

  • save_file_csv方法将DataFrame保存到csv文件中。当我们需要以可访问的格式保存数据以供以后分析时,这很方便。

  • Save方法用于将数据保存到文本文件中。csv文件中的数据以方便阅读的格式存储。

  • delete_file方法从系统中删除文件。

Python中的数据处理

在Python方面,程序接收有关交易品种价格的数据并对其进行预处理。这种预处理的目的是确保数据可以用于回归模型。现在让我们仔细看看这是如何工作的:

  1. 数据标准化:在初始阶段,数据是标准化的。这意味着将值设置在一定范围内,通常在0和1之间。规范化是必要的,以确保各种特征(例如股票价格和交易量)在相同的规模上。这样可以避免模型中的错误。

  2. 异常值检测和删除:金融数据可能不稳定,异常值可能会对模拟结果产生不利影响。Python程序检测并在必要时纠正这些偏差,以确保源数据的质量。

  3. 创建附加特征:在许多情况下,附加特征是基于原始数据创建的。例如,这些可以是移动平均值、技术指标或模型可以用来做出更明智决策的其他指标。

只有在数据准备充分后,我们才能将其输入回归模型。

作用中的回归模型

我们基于决策树的回归模型已经在历史数据上进行了训练。它现在被加载到Python程序中,用于根据最新的价格数据进行预测。这些预测是做出交易决策的基础,因为它们提供了有关资产未来行为的宝贵信息。需要注意的是,尽管在这个例子中我们使用了一个特定的回归模型,但这种方法可以应用于各种模型,这取决于我们交易策略的具体要求。因此,该系统的灵活性使其能够包括各种模型,以满足每种策略的个性化需求。

ONNX 集成以改进 MetaTrader 5

我想分享一个有趣的提示,可以改善我们在MetaTrader 5中的系统:与ONNX(Open Neural Network Exchange,开放神经网络交换)集成。ONNX是一个非常方便的人工智能工具,因为它允许您轻松地将模型转移到 MetaTrader 5。

在彻底测试并确认我们的模型在MetaTrader 5中的有效性后,我们可以考虑将其导出为ONNX格式。这不仅将扩展MetaTrader 5的功能,还将促进该模型在各种策略和平台系统中的使用。

通过ONNX与MetaTrader 5的本地集成,这可以进一步扩展我们交易策略中模型的使用。

导出前的广泛测试

选择我们当前的方法(涉及与MQL5环境的交互)是因为在将模型导出为ONNX格式之前,需要在受控环境中进行广泛的测试。构建模型并将其直接集成到MQL5中可能是一个复杂且容易出错的过程。因此,即使在将模型导出为ONNX格式之前,这种方法也允许我们仔细地细化和调整模型以获得所需的结果。


结论

总之,我们可以说本文讨论了实现回归模型的集成方法。在第1节中,我们讨论了回归模型的选择,重点是选择正确的算法来解决当前问题的重要性。在第2节中,我们研究了数据准备,包括模型训练的处理和清理。

在第3节中,我们以决策树为例对回归模型进行了训练和评估。此外,我们还考虑了将数据划分为训练和测试数据集,以及选择超参数来优化模型性能。

最后,在第4节中,我们探讨了将回归模型集成到MetaTrader策略测试器中,Python和MQL5之间的交互,以及使用ONNX格式来改进MetaTrader 5中的实现。

总之,本文概述了将模型引入交易策略的关键步骤,强调了正确的模型选择、数据准备、训练和评估以及有效融入交易环境的重要性。这些步骤是构建更强大、数据驱动的交易系统的基础。
上述代码可在Git存储库中获得,以供进一步使用。

本文由MetaQuotes Ltd译自葡萄牙语
原文地址: https://www.mql5.com/pt/articles/12471

神经网络变得轻松(第五十五部分):对比内在控制(CIC) 神经网络变得轻松(第五十五部分):对比内在控制(CIC)
对比训练是一种无监督训练方法表象。它的目标是训练一个模型,突显数据集中的相似性和差异性。在本文中,我们将谈论使用对比训练方式来探索不同的扮演者技能。
MQL5中的范畴论(第20部分):自我注意的迂回与转换 MQL5中的范畴论(第20部分):自我注意的迂回与转换
我们暂时离开我们的系列文章,考虑一下 chatGPT 中的部分算法。有没有从自然变换中借鉴的相似之处或概念?我们尝试用信号类格式的代码,在一篇有趣的文章中回答这些和其他问题。
开发回放系统 — 市场模拟(第 24 部分):外汇(V) 开发回放系统 — 市场模拟(第 24 部分):外汇(V)
今天,我们将去除阻止基于最后成交价进行模拟的限制,并将专门针对这类模拟引入一个新的切入点。整个操作机制将基于外汇市场的原则。该过程的主要区别在于出价(Bid)和最后成交价(Last)模拟的分离。不过,重点要注意,用于随机化时间,并将其调整为与 C_Replay 类兼容的方法在两类模拟中保持雷同。这很好,因为一种模式的变化会导致另一种模式的自动改进,尤其遇到处理跳价之间的时间。
为 MetaTrader 5 开发一款 MQTT 客户端:TDD 方式 - 第2部分 为 MetaTrader 5 开发一款 MQTT 客户端:TDD 方式 - 第2部分
本文是描述 MQTT 协议的本机MQL5客户端开发步骤系列文章的一部分。在这一部分中,我们将描述我们的代码组织、第一个头文件和类,以及我们如何编写测试。本文还包括关于测试驱动开发实践以及我们如何将其应用于该项目的简要说明。