Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 1884

 
Evgeny Dyuka:
1. É isso mesmo, tens de passar por todas as opções. O problema é que é muito demorado.
2. Eu tentei, ficou pior.
3. Como é que sabes quais é que ela está a usar? É uma caixa negra, por isso alimento tudo.

Há otimizadores de hiperparâmetros, como o otimizador no testador de MT. Você o configura por 24 horas e ele o pega.

Estou entediado esperando que dê certo, mas esta é uma peculiaridade da NS, não há ciência exata, apenas experiência (minha e de outra pessoa) e intuição. Posso partilhar os meus resultados aqui ou em privado.

Eu coloquei um exemplo para treinamento mais cedo. A idéia é ensinar à rede a comprar sinais. Então reverta a entrada e a rede deve produzir sinais de venda. É uma classificação binária quer haja ou não um sinal. Você poderia ensinar a rede a reconhecer a compra e venda, mas imho isto é pior. O intervalo de produção é limitado a 0-1; se procurarmos apenas a compra, o intervalo é dividido em 2 classes (há uma compra e não há compra) e o limite pode ser movido em 0,8. Se procurarmos a compra ou a venda, 0-1 é dividido em 3 sectores: compra, venda e algo entre eles. Imho, procurar apenas por sinal de compra é: 2 vezes mais exemplos de treino (flip input), menor tamanho de rede (a tarefa é mais fácil, menos neurónios necessários), menos tempo de treino, solução mais fácil (pense apenas em 1 classe), mas isto é apenas teoria.

Eu tenho uma idéia, que a rede procuraria características por si só, você dá um preço, sinais desejados, e ela faz tudo sozinha. Eu comecei com lstm, parece ser perfeito, mas até agora não tanto. Eu quero tentar redes regulares, e se não, vou pensar no que vai acontecer a seguir. As CNNs são um pouco confusas, estou a ficar cansado de ajustar as configurações de camada e núcleo. Provavelmente, seria mais fácil alimentar as ondas numa rede normal. E se não me convém, terei que perder mais tempo selecionando sinais de entrada, mas neste caso tenho uma pergunta: é realmente necessário, seria mais fácil usar o sistema "clássico", seria mais compreensível, confiável, econômico e mais fácil de testar.

E como é que se analisam os resultados, só olhando para os números? É este o código que você usa?

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])

Você constrói 2 gráficos, erro na bandeja e teste, você pode usá-los para entender o que a rede está faltando e em que direção se mover.

 
Rorschach:

Também hesitei em esperar que contasse, mas esta é uma peculiaridade da NS, não há ciência exacta, apenas experiência (a dos outros e a minha própria) e intuição. Você pode compartilhar seus resultados aqui ou em particular.

Estamos a falar de fotos ou já é sobre o mercado?

E como você analisa os resultados, você só olha para os números? É este o código que você usa?

Você constrói dois gráficos, um para a bandeja e outro para o teste, e você pode usá-los para entender o que está faltando na rede e em que direção se mover.

Eu posso facilmente ver que estou no processo ))

No início eu o desenhei usando o algoritmo padrão

import matplotlib.pyplot as plt

Mas foi inútil. Por causa do grande barulho, a trama já estava na linha horizontal após 10 épocas.
Eu tenho a classificação binária e analiso o nível de certeza da rede em cada resposta, ou seja, por exemplo, a resposta correta é 0 1 e a rede dá 0,4 0,6 - esta é uma boa resposta, e mais frequentemente a resposta correta é 0 1 e a rede dá 0,49 0,51
Quando as respostas são milhares eu posso agrupá-las por certeza e fazer a análise.


 
Rorschach:

Como resultado na prática, este é o euro de hoje no M2, algo que a rede neural começa a entender, mas fraco até agora.
Azul é previsão para cima, amarelo é previsão para baixo.


 
Evgeny Dyuka:

É fácil ver que uma pessoa está no processo real ))

No início eu desenhei usando o padrão

Mas é de pouca utilidade, devido ao grande barulho que o gráfico faz, após 10 épocas, na linha horizontal.
Eu tenho a classificação binária e analiso o nível de certeza da rede em cada resposta, ou seja, por exemplo, a resposta correta é 0 1 e a rede dá 0,4 0,6 - esta é uma boa resposta, e mais frequentemente a resposta correta é 0 1 e a rede dá 0,49 0,51
Quando as respostas são milhares eu posso agrupá-las por certeza e fazer a análise.


Você pode postar os gráficos? Quanto mais épocas e quanto menor o tamanho da trave, mais vezes os pesos mudam. Além disso, faz sentido alterar o lerning_rate no optimizador por +-uma ordem de grandeza. Que otimizador você usa?

 
Rorschach:

Você pode postar os gráficos? Além das épocas, o tamanho do lote deve ser alterado; quanto mais épocas e quanto menor o tamanho do lote, mais vezes os pesos são alterados. Além disso, faz sentido mudar o lerning_rate no otimizador por +-uma ordem de magnitude. Que otimizador você usa?

Para a tabela, preciso de correr o tutorial, então... mas nada interessante - verticalmente para baixo e depois horizontalmente, sem declínio suave como nos tutoriais ))
Bach 128, se estamos a falar da mesma coisa. Deve ser sempre 128 é algo a ver com TPU, tal exigência.
Também parou de mudar de época, depois de 150, geralmente nada muda.
Não consigo pô-lo a trabalhar com o SGD.
 
Rorschach:

Aqui está a minha grelha, eu mudo dinamicamente o número de camadas aqui.

def make_model(arr_size, lays):
  sgd = SGD(lr=0.01, decay=1 e-6, momentum=0.9, nesterov=True)

  #res = 2 # количество ответов
  act = "softmax"
  #act = "sigmoid"
  #opt = sgd
  opt = 'adam'

  model = Sequential()

  if lays == 1:
    model.add(Dense(int((arr_size-res)*k), input_dim=(arr_size-res), activation='relu'))
    model.add(Dropout(dropout))

  if lays == 2:
    model.add(Dense(int((arr_size-res)*k), input_dim=(arr_size-res), activation='relu'))
    model.add(Dropout(dropout))
    model.add(Dense(int((arr_size-res)*0.5*k), activation='relu'))
    model.add(Dropout(dropout))

  if lays == 3:
    model.add(Dense(int((arr_size-res)*k), input_dim=(arr_size-res), activation='relu'))
    model.add(Dropout(dropout))
    model.add(Dense(int((arr_size-res)*0.5*k), activation='relu'))
    model.add(Dropout(dropout))
    model.add(Dense(int((arr_size-res)*0.3*k), activation='relu'))
    model.add(Dropout(dropout))

  if lays == 4:
    model.add(Dense(int((arr_size-res)*k), input_dim=(arr_size-res), activation='relu'))
    model.add(Dropout(dropout))
    model.add(Dense(int((arr_size-res)*0.7*k), activation='relu'))
    model.add(Dropout(dropout))
    model.add(Dense(int((arr_size-res)*0.5*k), activation='relu'))
    model.add(Dropout(dropout))
    model.add(Dense(int((arr_size-res)*0.3*k), activation='relu'))
    model.add(Dropout(dropout))

  #model.add(Dense(int((arr_size-res)*0.1*k), activation='relu'))
  #model.add(Dropout(dropout))

  model.add(Dense(res, activation=act))

  if res==1:
    ls="binary_crossentropy"
  else:
    ls="categorical_crossentropy"
  model.compile(loss=ls, optimizer=opt, metrics=['accuracy'])
  return model
 
Evgeny Dyuka:

Aqui está a minha grelha, eu mudo dinamicamente o número de camadas aqui.

Podias tentar outra coisa em vez do Dropout, reduzir o número de neurónios. Adicionar inicialização e normalização de pesos. Os dados de entrada são processados de alguma forma? Os meus resultados tornaram-se melhores após a multiplicação dos dados de entrada por ordem de grandeza. Parece que afinal tenho de me livrar da não-estacionariedade.

 
Rorschach:

Podias tentar outra coisa em vez do Dropout, reduzir o número de neurónios. Adicionar inicialização e normalização de pesos. Os dados de entrada são processados de alguma forma? Obtive melhores resultados depois de multiplicar os dados de entrada por uma ordem de magnitude, parece que precisamos de nos livrar da não-estacionariedade.

Nenhum pacote dará um resultado preciso. Qualquer NS só pode dar uma previsão probabilística para cima, para baixo ou desconhecida. O preço não obedece às redes neurais e pode facilmente ir contra elas. Uma opção de 65% já é aceitável.

 
Uladzimir Izerski:

Nenhum pacote dará um resultado preciso. Qualquer NS só pode dar uma previsão probabilística para cima, para baixo ou desconhecida. O preço não obedece às redes neurais e pode facilmente ir contra elas. Uma opção de 65% já é aceitável.

Aqui está 56%. Azul é como deve ser, vermelho é a resposta da rede. As porcentagens não significam nada.

aqui é 48%, o número é ainda mais baixo, mas pelo menos tem algum efeito.


 
Rorschach:

Podias tentar outra coisa em vez do Dropout, reduzir o número de neurónios. Adicionar inicialização e normalização de pesos. Os dados de entrada são processados de alguma forma? Obtive melhores resultados após a multiplicação dos dados de entrada por ordem de grandeza. Parece que afinal preciso de me livrar da não-estacionariedade.

Sim, tens de passar por todas elas, senão não o farás.
Tente jogar isto, é bom para entender como os parâmetros influenciam os resultados.
Tensorflow — Neural Network Playground
Tensorflow — Neural Network Playground
  • Daniel Smilkov and Shan Carter
  • playground.tensorflow.org
It’s a technique for building a computer program that learns from data. It is based very loosely on how we think the human brain works. First, a collection of software “neurons” are created and connected together, allowing them to send messages to each other. Next, the network is asked to solve a problem, which it attempts to do over and over...