MetaTrader 5 Python User Group - como usar o Python no Metatrader - página 83

 

Certo - mal preparado....

Onde posso ler sobre isto? Preparo dados para os NS de acordo com a minha percepção do que é importante e do que não é.

Uma coisa que me intriga é se o mesmo tipo de dados deve ser recolhido "numa pilha" ou acrescentado à medida que entra?

De que lado devem ser recolhidos os dados: dos "mais velhos" ou dos "mais recentes"?

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

Certo - mal preparado....

Onde posso ler sobre isto? Preparo dados para os NS de acordo com a minha percepção do que é importante e do que não é.

Uma coisa que me intriga é se o mesmo tipo de dados deve ser recolhido "numa pilha" ou acrescentado à medida que entra?

De que lado devem ser recolhidos os dados: do "mais velho" ou do "mais recente"?

No tópico MoD perguntar, alguém irá responder. Este é o tópico de ligação

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

O problema é que a normalização é uma causa totalmente perdida!

Deixem-me explicar. Há alguns dados A, B, C...

São diferentes em termos de significado e assim por diante. Todos (google) dizem que a normalização deve ser feita por colunas (A-A-A, B-B-B, C-C-C) e não por filas. Isto é logicamente compreensível.

Mas quando aparecem novos dados para "predição" COMO normalizá-los se são apenas UMA fila? E qualquer termo nessa linha pode ir além da normalização dos dados de formação e teste?

E a normalização por cordas não tem qualquer efeito!

Na verdade, depois de verificar estas nuances, tive este "grito da alma" ))))

Durante a normalização, os coeficientes são guardados. Para evitar que se perca o alcance, devemos pegar num grande pedaço de história e normalizar, depois aplicar estes coeficientes a novos dados

sobre dados não normalizados, a grelha não aprenderá, ou aprenderá mal. Essa é a sua natureza.
 
Maxim Dmitrievsky:

os coeficientes são retidos durante a normalização. Para evitar que se perca o alcance, precisamos de pegar num grande pedaço de história e normalizar, depois aplicar estes coeficientes a novos dados

Não aprenderá com dados não normalizados, ou aprenderá mal. Essa é a sua peculiaridade.

Tudo isto é lógico e compreensível, mas a grelha está a ser treinada! Além disso, há informação de que a utilização de dados não normalizados é mais complicada para a aprendizagem, mas não é crítica.

E como não sair dos limites? Por exemplo, existe um preço. Há uma gama de preços sobre os dados de formação e teste - tomar 123-324. Mas o preço sobe para 421. Como se insere nessa mesma gama?

Mas estamos a afastar-nos do cerne da questão - porque é que, com treino e testes normais, a previsão é alguma coisa?

 

Caros amigos, mais uma vez os meus esquis não se estão a mexer... Estou a pedir ajuda.

Decidi esboçar um pequeno testador para testar a previsão da rede treinada.

# Загрузка данных
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]))

Aqui está tudo bem.

[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

E a próxima coisa que sabe...

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}]')

jurar

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,)

O que é que está errado?

 

Tendo pesquisado na web e analisado o artigo, com base no qual escrevi o meu código, cheguei a uma conclusão decepcionante de que cada autor de qualquer artigo "para principiantes" é obrigado a esquecer-se de mencionar algo importante...

E aqui verificou-se queo StandardScaler é utilizado na formação da rede.Mas o artigo não diz uma palavra sobre o que é e porque é que é necessário.

Além disso, oStandardScaler é uma padronização. Além disso, quero saber como posso implementar a mesma padronização para um único vector de entrada e ainda menos.

Pior ainda, a "padronização" é realizada por colunas do conjunto de dados! Não, bem, só para estatísticas, tudo bem. Mas para previsões, é "***hole"! Quando chegam novos dados, tenho de voltar a treinar a rede apenas para obter os novos dados na gama de "normalização"?

Tretas!

Quando esta "nova rede" for formada, a situação pode já ter mudado drasticamente. Então, qual é o sentido da f*ck?

Lá se vai a Python com um monte de bibliotecas "afiadas"....

Ficaria muito grato se pudesse mudar a minha opinião.


P.S. Eu só quero acreditar que não perdi o meu tempo em Python por nada.
 
Сергей Таболин:

Tendo pesquisado na web e analisado o artigo, com base no qual escrevi o meu código, cheguei a uma conclusão decepcionante de que cada autor de qualquer artigo "para principiantes" é obrigado a esquecer-se de mencionar algo importante...

E aqui verificou-se queo StandardScaler é utilizado na formação da rede.Mas o artigo não diz uma palavra sobre o que é e porque é que é necessário.

Além disso, oStandardScaler é a padronização. Além disso, quero saber como posso implementar a mesma padronização para um único vector de entrada e ainda menos.

Pior ainda, a "padronização" é realizada por colunas do conjunto de dados! Não, bem, só para estatísticas, tudo bem. Mas para previsões, é "***hole"! Quando chegam novos dados, será que tenho de reciclar a rede apenas para obter os novos dados na gama de "normalização"?

Tretas!

Quando esta "nova rede" for formada, a situação pode já ter mudado drasticamente. Então, qual é o sentido da f*ck?

Lá se vai a Python com um monte de bibliotecas "afiadas"....

Ficar-lhe-ia muito grato se me fizesse mudar de ideias.


P.S. Eu só quero acreditar que não perdi o meu tempo em Python por nada.
Talvez por ser apenas o começo.
Mas recentemente fiquei interessado nas capacidades da python para o mt. E se é possível fazê-lo, ninguém respondeu. Acrescentada a isso, não funcionará em mql4. Decidi não perder o meu tempo (talvez a situação mude para melhor após algum tempo).
 

(Mal me consigo safar. )))

Mas agora tenho outra pergunta (para a qual comecei tudo):

Quando treinei a rede, obtive os seguintes resultados

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

Por outras palavras - o resultado é uma pechincha!

Comecei o meu testador. Obtive tais resultados

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

Bem, diga-me exactamente onde pode ver que a rede está treinada para corrigir 98% dos resultados????

 

Olá, ao ler algumas páginas da discussão não encontrou nada de concreto sobre a seguinte questão :


- Existe actualmente algo que funcione como os pacotes MetaTraderR ou MetaTrader5 para integração MT e R?


Saúde

 

Desculpe, vou continuar a minha epopéia... )))

Depois de ter obtido um pouco mais de conhecimento do mesmo google, cheguei a conclusões:

  1. Os dados devem ser "equilibrados". Por exemplo, se dos 1000 sinais de dados de entrada aparecerem apenas em 100, precisamos de pelo menos 1000 - ((1000 - 100) /3) = 700 dados "vazios" (que não formam sinais) para remover.
  2. O resto deve ser de preferência "normalizado". Traga-o para o intervalo 0-1. Mas aqui está uma dificuldade óbvia de escolher a "gama" de normalização. O que considerar como mínimo e o que considerar como máximo? Ainda não sei. Eu normalizo cada matriz de entrada apenas pelo seu alcance.

Ao cumprir estas duas condições, obtive uma redução notável na curva de aprendizagem da rede. Além disso, descobri que

  1. Algumas funções de perda descartadas anteriormente têm melhor desempenho.
  2. Os resultados com menos camadas ocultas tornaram-se dominantes.
  3. Resta verificar o número de épocas de formação.

Além disso, havia outra pergunta: qual deveria ser a resposta da rede?

  1. Um neurónio (0-1-2) (sem sinal de compra-venda)
  2. Dois neurónios [0-0],[1-0],[0-1]
  3. Três neurónios [0-0-1],[1-0-0-0],[0-1-0],[0-1-0
???