文章 "重构经典策略(第十一部分)移动平均线的交叉(二)"

 

新文章 重构经典策略(第十一部分)移动平均线的交叉(二)已发布:

移动平均线和随机振荡器可用于生成趋势跟踪交易信号。然而,这些信号只有在价格行为发生之后才会被观察到。我们可以有效地利用人工智能克服技术指标中这种固有的滞后性。本文将教您如何创建一个完全自主的人工智能驱动型EA,这种方式可以改进您现有的任何交易策略。即使是最古老的交易策略也可以被改进。

我们之前已经讨论过预测移动平均线交叉的概念, 这是原文。我们观察到,移动平均线交叉比直接预测价格变化更容易预测。今天,我们将重新审视这个熟悉的问题,但采用一种完全不同的方法。
 
我们现在想要彻底研究这对我们的交易程序有多大影响,以及这一方案如何改进您的交易策略。移动平均线交叉是现存最古老的交易策略之一。使用如此广为人知的技术构建盈利策略是一项挑战。然而,我希望在这篇文章中向您展示,“老狗”确实可以学会新把戏。

为了使我们的比较具有实证性,我们首先将在MQL5中为EURGBP货币对构建一个仅使用以下指标的交易策略:

  1. 两条应用于收盘价的指数移动平均线。一条周期为20,另一条设置为60。
  2. 随机振荡器,使用默认设置5,3,3,设置为指数移动平均模式,并在CLOSE_CLOSE模式下进行计算。
  3. 平均真实波动范围指标(ATR),周期为14,用于设置我们的获利和止损水平。

我们的策略在日线时间框架上进行交易。将从2022年1月1日开始,一直到2024年6月初对这一策略进行回测。策略首先将使用经典的交易规则。即当快速移动平均线向上穿过慢速移动平均线且随机震荡指标读数高于80时,将产生买入信号。对于卖出信号,情况则相反。当快速移动平均线低于慢速移动平均线,且随机振荡指标低于20时,我们将记录一个卖出信号。


作者:Gamuchirai Zororo Ndawana

 

感谢 Gamu。我很喜欢您的出版物,并尝试通过复制您的步骤来学习。

我遇到了一些问题,希望能对其他人有所帮助。

1) 我使用您提供的脚本对 EURGBP_Stochastic 日线进行了测试,结果只产生了 2 个订单,夏普比率为 0.02。我相信我的设置与您相同,但在 2 个经纪商上只产生了 2 个订单。

2)给其他人提个醒,如有必要,您可能需要修改符号设置以匹配您的经纪商(例如,将 EURGBP 改为 EURGBP.i)。

3)接下来,当我尝试导出数据时,我得到的 ATR 数组超出范围,我相信这是因为我的数组中没有 100000 条记录(如果我将其改为 677),我可以相应地得到一个有 677 行的文件。也许你也可以在下载中加入数据提取脚本。

4) 我从您的文章中复制了代码,并在 Python 中进行了尝试,但得到的错误信息是 look_ahead 未定义 ----> 3 data.loc[data["Close"].shift(-look_ahead) > data["Close"], "Binary Target"] = 1

4 data = data.iloc[:-look_ahead,:]


NameError: name 'look_ahead' is not defined

5) 当我加载您的 Juypiter 笔记本时,我发现它需要设置前瞻 #让我们预测未来的 20 步

look_ahead = 20 ,之后我只使用了你的附带文件,但却出现了以下错误,可能与只有 677 行有关。

在开始可视化之前,我运行了 #Scale 数据

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()

data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] = scaler.fit_transform(data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']])

结果出现了一个错误,我不知道如何解决

ipython-input-6-b2a044d397d0>:4: SettingWithCopyWarning:试图在 DataFrame 的片段副本上设置值。请尝试使用 .loc[row_indexer,col_indexer] = value 代替它。 请参阅文档中的注意事项:https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] = scaler.fit_transform(data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']])

 
linfo2 #:

感谢 Gamu。我很喜欢您的出版物,并试着模仿您的步骤来学习。

我遇到了一些问题,希望这能帮助其他人。

1) 我使用您提供的脚本对 EURGBP_Stochastic 日线进行了测试,结果只产生了 2 个订单,夏普比率为 0.02。我相信我的设置与您相同,但在 2 个经纪商上只产生了 2 个订单。

2)作为对其他人的提醒,如有必要,您可能需要修改符号设置以匹配您的经纪商(例如,将 EURGBP 改为 EURGBP.i)。

3)接下来,当我尝试导出数据时,我得到的 ATR 数组超出范围,我相信这是因为我的数组中没有 100000 条记录(如果我将其改为 677),我可以相应地得到一个有 677 行的文件。也许您也可以在下载中加入数据提取脚本。

4)我从您的文章中复制了代码,并在 Python 中进行了尝试,但得到的错误信息是 look_ahead 未定义 ----> 3 data.loc[data["Close"].shift(-look_ahead) > data["Close"], "Binary Target"] = 1

4 data = data.iloc[:-look_ahead,:]


NameError: name 'look_ahead' is not defined

5) 当我加载您的 Juypiter 笔记本时,我发现它需要设置展望 #让我们预测未来 20 步的情况

look_ahead = 20 , 之后我只使用了你的附带文件,但却出现了以下错误,可能与只有 677 行有关。

在开始可视化之前,我运行了 #Scale 数据

from sklearn.preprocessing import RobustScaler

scaler = RobustScaler()

data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] = scaler.fit_transform(data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']])

这给了我一个错误,我不知道如何解决

ipython-input-6-b2a044d397d0>:4: SettingWithCopyWarning:试图在 DataFrame 的片段副本上设置值。请尝试使用 .loc[row_indexer,col_indexer] = value 代替它。 请参阅文档中的注意事项:https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']] = scaler.fit_transform(data[['Open', 'High', 'Low', 'Close', 'MA Fast', 'MA Slow','Stoch Main']])

你好,尼尔,我相信你很好。

让我看看能帮上什么忙:

1) 这个错误很奇怪,我是这么处理的:

我们的系统只有在两个人工智能模型给出相同预测的情况下才会开启交易。训练模型并评估其系数,这样就能知道每个模型何时会产生信号,信号是什么。然后仔细监控回溯测试,看看模型所处的条件是否能解释交易数量。

2) 这是一个经常出现的问题,而且很难控制,因为每个经纪商都有自己的命名规则,但您提供的解决方案是有效的。

3) 这可能表明您的经纪商只有 677 条每日数据可以使用,不包括周期计算。这很正常,我也遇到过这种情况。有时我只想获取 1 年的每日数据,但只能获取 200 条左右的数据。

4) 尝试在出现问题的语句上方定义前瞻,然后在整个代码中更新(如果需要)。

5) 这可能是我们使用的库版本、Python 版本等不同造成的。所以这一行

data[['Open'、'High'、'Low'、'Close'、'MA Fast'、'MA Slow'、'Stoch Main']] =

可能需要调整为

data.loc[:,['Open','High',...,'Stoch Main']] =
 
Gamuchirai Zororo Ndawana #:
你好,尼尔,我相信你很好。

让我看看能帮上什么忙:

1) 这个错误很奇怪,我是这么处理的:

我们的系统只有在两个人工智能模型给出相同预测时才会开启交易。训练模型并评估其系数,这样就能知道每个模型何时会产生信号,信号是什么。然后仔细监控回溯测试,看看模型所处的条件是否能解释交易数量。

2) 这是一个经常出现的问题,而且很难控制,因为每个经纪商都有自己的命名规则,但您提供的解决方案是有效的。

3) 这可能表明您的经纪商只有 677 条每日数据可以使用,不包括周期计算。这很正常,我也遇到过这种情况。有时我试着只获取 1 年的每日数据,但只能获取 200 条或更多。

4) 尝试在导致问题的语句上方定义前瞻,然后在整个代码中更新(如果需要)。

5) 这可能是我们使用的库版本、Python 版本等不同造成的。所以这一行

data[['Open'、'High'、'Low'、'Close'、'MA Fast'、'MA Slow'、'Stoch Main']] =

可能需要调整为

data.loc[:,['Open','High',...,'Stoch Main']] =

感谢 Gamu,是的,我知道有很多活动部件,我会看看这是否能解决我的问题。

 
linfo2 #:

谢谢 Gamu 感谢您的建议,是的,我知道有很多活动部件,我会看看这是否能解决我的问题。

对不对?这么多,而这只是一个简单的实现