트레이딩의 머신러닝: 이론, 모델, 실전 및 알고리즘 트레이딩 - 페이지 2953

 

LightGBM에서 학습된 ONNX 모델에서 MT5로 출력하는 것이 작동하지 않습니다. 매개변수 형식을 설정할 때 오류 5808 및 5805가 발생합니다. 그러나 문제는 매개 변수 치수의 정의에 있는 것 같습니다. 음수 값이 얻어집니다(코드에서 강조 표시됨). 어쩌면 내가 뭔가를 망쳤을 수도 있습니다. 파이썬 3.10에서는 모든 것이 정상인 것 같습니다.

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);
  }

파이썬에서 학습 중입니다:

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

파이썬으로 출력합니다:

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)
 
파이썬으로 전환하기에는 조금 이른 것 같습니다. LightGBM의 CLI 버전을 배우고 C에서 if-else 형식으로 모델을 저장하는 것이 좋습니다. 보편적이지는 않지만 저렴하고 건방진)
 
시간대와 같은 주기적 신호에 대한 논의가 기억났습니다. IMHO에서는 가능한 패턴에서 가장 강한 변화가 발생하는 시작 지점을 선택하기만 하면 주기적 신호로 변환할 수 있습니다. 시장 고려 사항(이 경우 세션 일정) 등을 사용하거나 트리 모델을 학습시키고 이 기능의 첫 번째 분할 지점을 취할 수 있습니다.
Один из методов псевдо-адаптации.
Один из методов псевдо-адаптации.
  • 2023.01.30
  • www.mql5.com
Любой скальпер знает, что круглосуточная торговля - глупость. Есть интервалы, где достигается высокая и стабильная прибыльность, поэтому различными способами находят эти интервалы. Например, при
 
Aleksey Nikolayev #:
시간대와 같은 주기적 신호에 대한 논의가 기억났습니다. IMHO에서는 가능한 패턴에서 가장 강한 변화가 발생하는 시작 지점을 선택하기만 하면 주기적 신호로 변환할 수 있습니다. 시장 고려 사항(이 경우 세션 일정) 등을 사용하거나 트리 모델을 훈련시키고 이 기능을 기반으로 첫 번째 분할 지점을 취할 수 있습니다.
증분 대신 변동성을 사용하면 시장 주기를 정확하게 반영할 수 있습니다. 그리고 두 개의 모델을 통해 실행하고, 그 중 하나는 지난 글에서 했던 것처럼 나쁜 경우를 걸러냅니다. 결과는 때때로 괜찮은 편이며, 몇 번만 다시 훈련하면 됩니다. 잠재적으로이 접근 방식은 최상의 간격 이상을 제공 할 것입니다.

Mac의 ZY onnx는 예제에서 시작했는데 멋지지만 아직 부스팅을 확인하지 않았습니다.
예제에서와 같이 2 차원 행렬을 입력해야합니까? 속성이 있는 1차원 배열을 사용하는 것이 더 논리적으로 보입니다. 행렬의 잘못된 형태에 대해 불만을 제기할 수 있습니다. 예를 들어 1차원 배열 대신 각 항목이 2차원에 있는 2차원 배열, 즉 각각 1개의 값을 포함하는 중첩 배열을 제공해야 합니다.

catbust를 위해 파이썬에서 mql로 번역하는 예가 있는데, lgbm은 더 좋지 않은 것 같습니다.
 
Maxim Dmitrievsky #:
Mac의 ZY onnx는 예제에서 시작했는데 멋지지만 아직 부스팅을 확인하지 않았습니다.
예제에서처럼 2차원 행렬을 입력해야 하나요? 속성이 있는 1차원 배열을 사용하는 것이 더 논리적으로 보입니다. 행렬의 잘못된 형태에 대해 불만을 제기할 수 있습니다. 예를 들어 1차원 배열 대신 각 항목이 2차원에 있는 2차원 배열, 즉 각각 1개의 값을 포함하는 중첩 배열을 제공해야 합니다(
).

파이썬으로 훈련할 때 데이터 세트의 처음 다섯 행에 대해 모델을 테스트했습니다. 그런 다음 파이썬에서 ONNX를 실행할 때도 동일한 처음 다섯 줄에서 출력을 테스트했습니다. 어떻게 보더라도 여전히 행렬입니다. MT5 변형에서는 동일한 다섯 줄을 행렬로 복사했습니다. Renat의 예에서도 입력은 10개의 행과 4개의 열로 이루어진 행렬입니다.

문제는 이미 모델을 로드할 때 차원에 음수가 출력되기 때문입니다. 그런데 Renate의 예제에서는 무엇이 출력되는지 살펴봐야 합니다.

OnnxTypeInfo otype;
OnnxGetInputTypeInfo(h, 0, otype);
ArrayPrint(otype.dimensions);                   // -1 8
OnnxGetOutputTypeInfo(h, 0, otype);
ArrayPrint(otype.dimensions);                   // -1 1
 
Maxim Dmitrievsky #:
증분 대신 변동성을 취할 수 있으며 시장 주기를 정확하게 반영합니다. 그리고 두 가지 모델을 통해 실행하고, 그 중 하나는 지난 기사에서 했던 것처럼 나쁜 사례를 걸러냅니다. 결과는 때때로 괜찮은 편이며, 몇 번만 다시 훈련하면 됩니다. 잠재적으로 이 접근 방식은 최적 간격 이상의 결과를 얻을 수 있습니다.

아니요, 저는 순환 변수에 대한 일반적인 접근 방식에 대해 이야기하고 있을 뿐입니다. 주기적 변수를 일반 변수로 바꾸려면 "슬라이스"해야 합니다. 하지만 반드시 형식적인 0이 아니라 다양한 방법으로 할 수 있습니다.

예를 들어 일별 시간 외에도 두 종목으로 구성된 포트폴리오의 가중치를 찾을 때 주기적 변수가 발생할 수 있습니다.

 
Aleksey Nikolayev LightGBM의 CLI 버전을 배우고 C에서 if-else 형식으로 모델을 저장하는 것이 좋습니다. 보편적이지는 않지만 저렴하고 능숙합니다).
패키지 인트리도 있으며, 거기에서 많은 마을 모델에서 규칙을 가져올 수 있습니다.
포레스트, 부스트...
 
Maxim Dmitrievsky #:
고양이 부스타의 경우 파이썬에서 mql로 번역하는 예제가 있는데, LGBM은 더 좋지 않은 것 같습니다.

Yandex의 미래에 대해 약간의 의구심이 있습니다.)

또한 lgbm은 갑자기 관련성이 높아지면 sysharp 및 기타 마이크로 소프트 창작물과 더 잘 통합되어야합니다.)

 
mytarmailS #:
여러 마을 모델에서 규칙을 가져올 수 있는 인트리 패키지도 있습니다.
포레스트, 부스트...

이 기능이 포함된 스크립트를 시연할 수 있나요?

 
Aleksey Nikolayev #:

Yandex의 미래에 대해 약간의 의구심이 있습니다.)

그 근거는 무엇인가요?

사유: