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

 

A saída para o MT5 do modelo ONNX treinado no LightGBM não funciona. Erros 5808 e 5805 ao definir a forma dos parâmetros. Mas o problema parece estar na definição das dimensões dos parâmetros - são obtidos valores negativos (destacados no código). Talvez eu tenha bagunçado alguma coisa. No Python 3.10, tudo parece estar normal.

Saída MQL5:

void OnStart()
  {
   long h = OnnxCreate("model.onnx", FILE_COMMON);
   
   //Print(OnnxGetInputCount(h));
   //Print(OnnxGetOutputCount(h));
   //Print(OnnxGetInputName(h, 0));
   //Print(OnnxGetOutputName(h, 0));
   OnnxTypeInfo otype;
   OnnxGetInputTypeInfo(h, 0, otype);
   ArrayPrint(otype.dimensions);                   // -1 8
   //Print(otype.element_type, " ", otype.type);
   OnnxGetOutputTypeInfo(h, 0, otype);
   ArrayPrint(otype.dimensions);                   // -1 1
   //Print(otype.element_type, " ", otype.type);
   
   matrix mx={{8.32520000 e+00, 4.10000000 e+01, 6.98412698 e+00, 1.02380952 e+00,
               3.22000000 e+02, 2.55555556 e+00, 3.78800000 e+01,-1.22230000 e+02},
              {8.30140000 e+00, 2.10000000 e+01, 6.23813708 e+00, 9.71880492 e-01,
               2.40100000 e+03, 2.10984183 e+00, 3.78600000 e+01,-1.22220000 e+02},
              {7.25740000 e+00, 5.20000000 e+01, 8.28813559 e+00, 1.07344633 e+00,
               4.96000000 e+02, 2.80225989 e+00, 3.78500000 e+01,-1.22240000 e+02},
              {5.64310000 e+00, 5.20000000 e+01, 5.81735160 e+00, 1.07305936 e+00,
               5.58000000 e+02, 2.54794521 e+00, 3.78500000 e+01,-1.22250000 e+02},
              {3.84620000 e+00, 5.20000000 e+01, 6.28185328 e+00, 1.08108108 e+00,
               5.65000000 e+02, 2.18146718 e+00, 3.78500000 e+01,-1.22250000 e+02}};
   matrix my={{0.0},{0.0},{0.0},{0.0},{0.0}};   
   
   const long  ExtInputShape [] = {1,5,8};
   const long  ExtOutputShape[] = {1,5};
   Print(OnnxSetInputShape(h,0,ExtInputShape));
   Print(GetLastError());                            // 5808
   ResetLastError();
   Print(OnnxSetOutputShape(h,0,ExtOutputShape));
   Print(GetLastError());                            // 5805
   
   OnnxRun(h, ONNX_DEBUG_LOGS | ONNX_NO_CONVERSION, mx, my);
   //Print(mx);
   //Print(my);
   OnnxRelease(h);
  }

Aprendendo em python:

from lightgbm import LGBMRegressor
from sklearn.datasets import fetch_california_housing
import onnxmltools
from onnxconverter_common import *

housing = fetch_california_housing()
X, Y = housing.data, housing.target

model = LGBMRegressor()
model.fit(X, Y)
Yreal, Ypredict = Y[:5], model.predict(X[:5])
print(Yreal)
print(Ypredict)

initial_type = [('input', FloatTensorType([None, len(X[0])]))]
onnx_model = onnxmltools.convert_lightgbm(model, name='LightGBM', initial_types=initial_type)
onnxmltools.utils.save_model(onnx_model, 'model.onnx')

Saída em Python:

import numpy as np
import onnxruntime as ort
from sklearn.datasets import fetch_california_housing

housing = fetch_california_housing()
X, Y = housing.data, housing.target
Xtest, Yreal = X[:5], Y[:5]

sess = ort.InferenceSession("model.onnx", providers=ort.get_available_providers())
input_name = sess.get_inputs()[0].name
Ypredict = sess.run(None, {input_name: Xtest.astype(np.float32)})[0]

print(Xtest)
print(Yreal)
print(Ypredict)
 
Parece um pouco cedo para mudar para python. É melhor aprender a versão CLI do LightGBM e salvar os modelos no formato if-else em C. Não é universal, mas é barato e seguro)
 
Lembrei-me da discussão sobre sinais cíclicos, como a hora do dia. Na minha opinião, deveríamos traduzi-los em sinais regulares, simplesmente selecionando o ponto de partida em que ocorre a mudança mais forte no possível padrão. Você pode usar considerações de mercado (horário da sessão, neste caso) ou algo do gênero, ou treinar um modelo de árvore e pegar o ponto da primeira divisão nesse recurso.
Один из методов псевдо-адаптации.
Один из методов псевдо-адаптации.
  • 2023.01.30
  • www.mql5.com
Любой скальпер знает, что круглосуточная торговля - глупость. Есть интервалы, где достигается высокая и стабильная прибыльность, поэтому различными способами находят эти интервалы. Например, при
 
Aleksey Nikolayev #:
Lembrei-me da discussão sobre sinais cíclicos, como a hora do dia. Na minha opinião, deveríamos traduzi-los em sinais regulares, simplesmente selecionando o ponto de partida em que ocorre a mudança mais forte no possível padrão. Você pode usar considerações de mercado (cronograma da sessão, nesse caso) ou algo parecido, ou treinar um modelo de árvore e escolher o ponto da primeira divisão com base nesse recurso.
Você poderia usar a volatilidade em vez de incrementos, pois ela reflete com precisão os ciclos do mercado. E executá-lo por meio de dois modelos, um dos quais filtra os casos ruins (como fiz no último artigo). Os resultados às vezes são decentes, basta treinar novamente algumas vezes. Potencialmente, essa abordagem dará mais resultados do que o bestinterval.

O ZY onnx no mac começou com o exemplo, o que é legal, mas ainda não verifiquei os resultados
É necessário inserir uma matriz bidimensional como no seu exemplo? Parece mais lógico usar uma matriz unidimensional com atributos. Ele pode reclamar da forma errada da matriz. Por exemplo, em vez de uma unidimensional, você deve fornecer uma bidimensional, em que cada entrada está na segunda dimensão, ou seja, matrizes aninhadas contendo um valor cada.

Há um exemplo de tradução para mql do python para o catbust; o lgbm parece não ser melhor
 
Maxim Dmitrievsky #:
O ZY onnx no mac começou com o exemplo, o que é legal, mas ainda não verifiquei os resultados
É necessário inserir uma matriz bidimensional como no seu exemplo? Parece mais lógico usar uma matriz unidimensional com atributos. Ele pode reclamar da forma errada da matriz. Por exemplo, em vez de uma unidimensional, você deve fornecer uma bidimensional, em que cada entrada está na segunda dimensão, ou seja, matrizes aninhadas contendo um valor cada.
.

Bem, ao treinar em python, testei o modelo nas primeiras cinco linhas do conjunto de dados. Em seguida, ao executar o ONNX em python, também testei a saída nas mesmas cinco primeiras linhas. Não importa como você olhe para ela, ainda é uma matriz. Na variante MT5, eu apenas copiei essas mesmas cinco linhas como uma matriz. E no exemplo de Renat, a entrada também é uma matriz de dez linhas e quatro colunas.

O problema, na minha opinião, já está no carregamento do modelo, porque os números negativos nas dimensões são gerados. A propósito, devemos ver o que será gerado no exemplo de Renate.

OnnxTypeInfo otype;
OnnxGetInputTypeInfo(h, 0, otype);
ArrayPrint(otype.dimensions);                   // -1 8
OnnxGetOutputTypeInfo(h, 0, otype);
ArrayPrint(otype.dimensions);                   // -1 1
 
Maxim Dmitrievsky #:
Você pode usar a volatilidade em vez de incrementos, pois ela reflete com precisão os ciclos do mercado. E execute-a por meio de dois modelos, um dos quais filtra os casos ruins (como fiz no último artigo). Os resultados às vezes são decentes, basta treinar novamente algumas vezes. Potencialmente, essa abordagem renderá mais do que o bestinterval.

Não, estou apenas falando sobre a abordagem geral das variáveis cíclicas. Elas precisam ser "fatiadas" para serem transformadas em variáveis comuns. Mas você pode fazer isso de diferentes maneiras, não necessariamente no zero formal.

Além do tempo diário, as variáveis cíclicas ocorrem, por exemplo, ao procurar pesos para uma carteira de dois símbolos.

 
Aleksey Nikolayev LightGBM e salvar os modelos no formato if-else em C. Não é universal, mas é barato e seguro).
Há também um pacote intrees, no qual você pode extrair regras de muitos modelos de vilas.
Forrests, boosts...
 
Maxim Dmitrievsky #:
Bem, para o catbusta, há um exemplo de tradução para mql a partir do python; o lgbm parece não ser melhor

Há pequenas dúvidas sobre o futuro do Yandex)

Além disso, o lgbm deve se integrar melhor com o sysharp e outras criações da Microsoft, se isso se tornar relevante de repente)

 
mytarmailS #:
Há também o pacote intrees, no qual você pode extrair regras de vários modelos de aldeias.
Florestas, reforços...

Você pode demonstrar um script com essa funcionalidade?

 
Aleksey Nikolayev #:

Há pequenas dúvidas sobre o futuro da Yandex)

Em que eles se baseiam?