MetaTrader 5 Python User Group - メタトレーダーでPythonを使用する方法 - ページ 83

 

右-間違った準備...。

どこで読めますか?何が重要で何が重要でないか、自分の感覚に従ってNS用のデータを準備します。

ひとつ不思議なのは、同じような データを「山ほど」集めるべきなのか、それとも「どんどん」追加していくべきなのか、ということです。

古いもの」と「新しいもの」、どちらからデータを集めるべきか?

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

右-間違った準備...。

どこで読めますか?何が重要で何が重要でないか、自分の感覚に従ってNS用のデータを準備します。

ひとつ不思議なのは、同じような データを「山ほど」集めるべきなのか、それとも「どんどん」追加していくべきなのか、ということです。

古い方」と「新しい方」、どちらからデータを集めるべきか?

MoDスレッドで質問すれば、誰かが答えてくれるでしょう。これはコネクタのトピックです

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

問題は、ノーマライゼーションが完全に失われていることです。

説明しよう。データA、B、C...があります。

意義などが異なるのです。みんな(google)、正規化は行単位ではなく列単位(A-A-A, B-B-B, C-C-C)で行うべきと言っています。これは論理的に理解できる。

しかし、「予測」のために新しいデータが現れたとき、それが1行だけの場合、どのように正規化するのでしょうか?そして、その行にあるどの項も、トレーニングデータとテストデータで正規化を超えることができるのですね。

また、文字列による正規化は何の効果もありません

実は、このニュアンスを確認した後に、こんな「魂の叫び」がありました ))))

正規化中に係数が保存されます。範囲外を避けるために、履歴の大きな塊をとって正規化し、この係数を新しいデータに適用する必要がある

正規化されていないデータでは、グリッドは学習しないか、学習能力が低い。それが彼らの本性です。
 
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は標準化 です。さらに、1つの入力ベクトル、あるいはそれ以下でも同じ標準化を実現するにはどうしたらよいかを知りたい。

さらに悪いことに、「標準化」はデータセットのカラムによって行われるのです。いや、まあ、統計だけならそれでいいんですけどね。でも、予想では「○○ホール」なんですよね~。新しいデータが届いたとき、新しいデータを「標準化」の範囲に入れるためだけに、ネットワークの再トレーニングをしなければならないのでしょうか?

嘘つけ!

この「新しいネットワーク」が育成される頃には、すでに状況は一変しているかもしれません。だから、一体何が言いたいんだ?

Pythonに「研ぎ澄まされた」ライブラリがたくさんあるのはここまでか...。

私の考えを変えてくれるとありがたい。


P.S. Pythonにかけた時間を無駄にしなかったと信じたい。
 
Сергей Таболин:

しかし、「初心者向け」の記事を書いた人は、必ずと言っていいほど重要なことを忘れている...という残念な結論に至りました。

そしてここで、ネットワークのトレーニングにStandardScalerが 使われていることが判明しました。しかし、その内容や必要性については、記事には一言も書かれていない。

さらに、StandardScalerは標準化 である。さらに、1つの入力ベクトル、あるいはそれ以下でも同じ標準化を実現するにはどうしたらよいかを知りたい。

さらに悪いことに、「標準化」はデータセットのカラムによって行われるのです。いや、まあ、統計だけならそれでいいんですけどね。でも、予想では「○○ホール」なんですよね~。新しいデータが届いたとき、新しいデータを「標準化」の範囲に入れるためだけに、ネットワークの再トレーニングをしなければならないのでしょうか?

嘘つけ!

この「新しいネットワーク」が育成される頃には、すでに状況は一変しているかもしれません。だから、一体何が言いたいんだ?

Pythonに「研ぎ澄まされた」ライブラリがたくさんあるのはここまでか...。

考えを改めてくれればありがたいのですが。


P.S. Pythonにかけた時間を無駄にしなかったと信じたい。
これからが本番だからでしょうか。
しかし、最近、Pythonのmt.NET向け機能に興味を持つようになりました。そして、それが可能かどうかについては、誰も答えていない。追加で、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の統合を行うものは現在あるのでしょうか?


乾杯

 

すみません、叙事詩の続きです・・・。)))

同じgoogleでもう少し知識を得てから、結論に至った。

  1. データは "バランスよく "あるべき。例えば、1000個の入力データのうち、100個にしか信号が現れない場合、少なくとも1000 - ((1000 - 100) /3) = 700個の「空」データ(信号を形成しない)を削除する必要がある。
  2. 残りは、できれば「正規化」してほしい。0~1の範囲に収める。しかし、ここに正規化の「範囲」を選択することの明らかな難しさがある。何を最低限と考え、何を最大と考えるか。まだわかりません。各入力配列を範囲のみで正規化すると......。

この2つの条件を満たすことで、ネットワークの学習曲線が 顕著に短縮されました。さらに、私が見つけたのは

  1. 先に破棄した損失関数の方が性能が良いものもある。
  2. 隠れ層が少ない結果が優位になった。
  3. あとは、学習エポック数の確認です。

さらに、「ネットワークはどうあるべきか」という問題もありました。

  1. 1ニューロン(0-1-2) (シグナルバイセルなし)
  2. ニューロン2個[0-0],[1-0],[0-1]。
  3. 3つのニューロン [0-0-1], [1-0-0], [0-1-0]
???