MetaTrader 5 Python用户组 - 如何在Metatrader中使用Python - 页 83

 

正确-错误的准备....

我在哪里可以读到这方面的信息?我根据我对什么是重要的,什么是不重要的看法,为NS准备数据。

有一点让我感到困惑的是,同类型的数据 是应该 "堆积起来 "收集,还是随着数据的到来而增加?

应该从哪一方收集数据:从 "老 "的一方还是从 "新 "的一方?

 
Сергей Таболин:

正确-错误的准备....

我在哪里可以读到这方面的信息?我根据我对什么是重要的,什么是不重要的看法,为NS准备数据。

有一点让我感到困惑的是,同类型的数据 是应该 "堆积起来 "收集,还是随着数据的到来而增加?

应该从哪一边收集数据:从 "老 "还是从 "新"?

在国防部的主题中问,有人会回答。这就是连接器的主题

 
Сергей Таболин:

麻烦的是,正常化是一个完全失败的事业。

让我解释一下。有一些数据A、B、C...

它们在意义上是不同的,等等。每个人(google)都说归一化应该按列(A-A-A,B-B-B,C-C-C)进行,而不是按行。这在逻辑上是可以理解的。

但是,当新的数据出现在 "预测 "中时,如果只有一行,如何将其标准化?而该行中的任何一个词都可以在训练和测试数据上超越规范化?

而通过字符串进行的归一化则没有任何效果!

实际上,在检查了这些细微差别之后,我有了这样的 "灵魂的呐喊" ))))

在归一化过程中,系数被保存。为了避免超出范围,我们应该取一大块历史数据并进行归一化处理,然后将这些系数应用于新的数据上

在非正常化的数据上,网格将不会学习,或者学习效果不佳。这就是他们的本性。
 
Maxim Dmitrievsky:

系数在归一化过程中被保留。为了避免超出范围,我们需要将一大块历史数据进行归一化处理,然后将这些系数应用到新的数据上

它不会从非正常化的数据中学习,或者说它的学习效果很差。这就是他们的特殊性。

所有这些都是合乎逻辑的,可以理解的,但电网正在被训练!此外有资料显示,使用非标准化的数据对学习来说更复杂,但这并不是关键。

那么如何不走出范围呢?例如,有一个价格。训练和测试数据有一定的价格范围--取123-324。但价格却涨到了421。它是如何进入这个范围的?

但我们正在偏离问题的核心--为什么在正常的训练和测试下,预测会有什么结果?

 

亲爱的朋友们,我的滑雪板又一次没有动静了......我在请求帮助。

我决定勾勒出一个小测试器来测试训练好的网络 预测。

# Загрузка данных
df_full = pd.read_csv(flname_csv, header=None)
r, c = df_full.shape
border = c - row_signal
test_data = np.array(df_full.values[:, :border])
test_verification = np.array(df_full.values[:, border:])
print(test_data[2], 'len =', len(test_data[2]))
print(test_verification[2], 'len =', len(test_verification[2]))

这里一切都很好。

[3.00000 e+00 7.00000 e+00 1.14656 e+00 1.14758 e+00 1.14656 e+00 1.14758 e+00
 3.00000 e+00 7.00000 e+00 1.27800 e+03 1.27800 e+03 3.00000 e+00 7.00000 e+00
 1.14758 e+00 1.14857 e+00 1.14758 e+00 1.14857 e+00 3.00000 e+00 8.00000 e+00
 2.93000 e+02 6.20000 e+02 3.00000 e+00 8.00000 e+00 1.14857 e+00 1.14960 e+00
 1.14821 e+00 1.14960 e+00 3.00000 e+00 8.00000 e+00 4.78000 e+02 7.23000 e+02
 3.00000 e+00 8.00000 e+00 1.14960 e+00 1.14966 e+00 1.14860 e+00 1.14860 e+00
 3.00000 e+00 8.00000 e+00 2.32100 e+03 2.41100 e+03] len = 40
[1. 0.] len = 2

而接下来你知道的是...

if num_check_rows > r or num_check_rows == 0:
    num_check_rows = r

model = tf.keras.models.Sequential()
model = tf.keras.models.load_model(flname)
model.summary()

for i in range(num_check_rows):
    b = model.predict(test_data[i])
    a = b[0]
    x = a[0]
    y = a[1]
    x = format(x, '.5f')
    y = format(y, '.5f')
    print(f'ожидалось {test_verification[i]} >>> получили [{x} {y}]')

宣誓

Model: "sequential_16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 20)                820       
_________________________________________________________________
dropout (Dropout)            (None, 20)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 10)                210       
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 22        
=================================================================
Total params: 1,052
Trainable params: 1,052
Non-trainable params: 0
_________________________________________________________________

Traceback (most recent call last):
  File "M:/PythonProgs/PycharmProjects/NNets/ТестерНС.py", line 79, in <module>
    b = model.predict(test_data[i])
.....
ValueError: Error when checking input: expected dense_input to have shape (40,) but got array with shape (1,)

怎么了?

 

在网上搜索并查看了这篇文章,在此基础上我写了我的代码,我得出了一个令人失望的结论:任何 "初学者 "文章的作者都必然会忘记提到一些重要的东西......。

而在这里,事实证明,StandardScaler 是用于训练网络 的。但该文章对它是什么以及为什么需要它却只字未提。

此外,StandardScaler是标准化的。此外,我想知道我如何可以对单一输入矢量甚至更少的输入矢量实现同样的标准化。

更糟糕的是,"标准化 "是通过数据集的列来进行的!这是不可能的。不,好吧,只是为了统计,这很好。但对预报员来说,是 "***洞"!当新的数据到来时,我是否必须重新训练网络,以使新的数据进入 "标准化 "范围?

胡说八道!

当这个 "新网络 "得到训练时,情况可能已经发生了巨大的变化。那么,这到底有什么意义呢?

这么多的Python与一堆 "削尖了的 "库....

如果你能改变我的想法,我将非常感激。


P.S. 我只想相信,我没有在Python上白白浪费我的时间。
 
Сергей Таболин:

我在网上搜索并查看了这篇文章,在此基础上我写了我的代码,我得出了一个令人失望的结论:任何 "初学者 "文章的作者都必然会忘记提到一些重要的东西......

而在这里,事实证明,StandardScaler 是用于训练网络的。但该文章对它是什么以及为什么需要它却只字未提。

此外,StandardScaler是标准化的。此外,我想知道我如何可以对单一输入矢量甚至更少的输入矢量实现同样的标准化。

更糟糕的是,"标准化 "是通过数据集的列来进行的!这是不可能的。不,好吧,只是为了统计,这很好。但对预报员来说,是 "***洞"!当新的数据到来时,我是否必须重新训练网络,以使新的数据进入 "标准化 "范围?

胡说八道!

当这个 "新网络 "得到训练时,情况可能已经发生了巨大的变化。那么,这到底有什么意义呢?

这么多的Python与一堆 "削尖了的 "库....

如果你改变我的想法,我将非常感激。


P.S. 我只想相信,我没有在Python上白白浪费我的时间。
也许是因为这只是一个开始。
但我最近对python在mt方面的能力感兴趣。而关于是否有可能做到这一点,没有人回答。除此之外,它在mql4中也无法工作。我决定不浪费我的时间(也许一段时间后情况会好转)。
 

(我几乎听不出来。)))

但现在我有另一个问题(因为我开始了这一切)。

当我训练该网络 时,我得到了以下结果

Score on train data     Score on test data      Test loss       Test acc
0.970960                0.968266                0.199544        0.981424

换句话说--结果是讨价还价!

我启动了我的测试器。我得到了这样的结果

Model: "sequential_16"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
dense (Dense)                (None, 15)                465       
_________________________________________________________________
dropout (Dropout)            (None, 15)                0         
_________________________________________________________________
dense_1 (Dense)              (None, 7)                 112       
_________________________________________________________________
dense_2 (Dense)              (None, 2)                 16        
=================================================================
Total params: 593
Trainable params: 593
Non-trainable params: 0
_________________________________________________________________
2021-01-18 17:59:04.495645: I tensorflow/stream_executor/platform/default/dso_loader.cc:44] Successfully opened dynamic library cublas64_10.dll
ожидалось [0. 1.] >>> получили [0.08348 0.08859]
ожидалось [0. 1.] >>> получили [0.08324 0.08838]
ожидалось [0. 0.] >>> получили [0.08667 0.09141]
ожидалось [0. 0.] >>> получили [0.08263 0.08784]
ожидалось [0. 0.] >>> получили [0.09200 0.09218]
ожидалось [0. 0.] >>> получили [0.08351 0.08861]
ожидалось [0. 0.] >>> получили [0.08944 0.09384]
ожидалось [1. 0.] >>> получили [0.08313 0.08828]
ожидалось [1. 0.] >>> получили [0.08432 0.08933]

Process finished with exit code 0

好吧,告诉我你到底在哪里可以看到网络被训练到98%的正确结果????

 

你好,看了几页的讨论,没有发现任何关于以下问题的具体内容。


- 目前是否有任何像MetaTraderR或MetaTrader5软件包一样的MT和R整合工作?


欢呼声

 

对不起,我将继续我的史诗...)))

在从同一个谷歌上获得更多的知识后,我得出了结论。

  1. 数据应该是 "平衡的"。例如,如果在1000个输入数据中,只有100个出现信号,我们至少需要1000-((1000-100)/3)=700个 "空 "数据(不形成信号)来删除。
  2. 其余的最好是 "正常化"。把它带入0-1的范围。但这里有一个明显的困难,就是选择规范化的 "范围"。哪些是最低限度的考虑,哪些是最高限度的考虑?我还不知道。我仅通过其范围对每个输入数组进行归一化处理...

通过满足这两个条件,我得到了网络学习曲线 的明显减少。此外,我还发现

  1. 前面丢弃的一些损失函数表现得更好。
  2. 隐藏层较少的结果开始占主导地位。
  3. 剩下的就是检查训练纪元的数量。

另外还有一个问题:网络的反应应该是什么?

  1. 一个神经元(0-1-2)(无信号-购买-销售)。
  2. 两个神经元[0-0]、[1-0]、[0-1] 。
  3. 三个神经元[0-0-1]、[1-0-0]、[0-1-0]
???