トレーディングにおける機械学習:理論、モデル、実践、アルゴトレーディング - ページ 2953

 

LightGBM で学習した ONNX モデルから MT5 への出力が機能しない。パラメータの形式を設定する際に、エラー5808と5805が発生する。しかし、問題はパラメータの次元の定義にあるようで、負の値が得られている(コードでハイライトされている)。多分、私は何かを台無しにした。Python 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);
  }

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

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)
 
pythonに切り替えるのは少し早いようだ。LightGBMの CLIバージョンを学び、C言語でif-else形式でモデルを保存したほうがいい。万能ではないが、安上がりで簡単だ。)
 
私は、時刻のような周期的な兆候についての議論を思い出した。IMHOは、可能性のあるパターンで最も強い変化が発生する起点となるポイントを選択するだけで、それらを規則的なものに変換すべきだと思います。マーケットを考慮する(この場合はセッションのスケジュール)とか、ツリーモデルを訓練してこの特徴で最初に分岐するポイントを取るとか
Один из методов псевдо-адаптации.
Один из методов псевдо-адаптации.
  • 2023.01.30
  • www.mql5.com
Любой скальпер знает, что круглосуточная торговля - глупость. Есть интервалы, где достигается высокая и стабильная прибыльность, поэтому различными способами находят эти интервалы. Например, при
 
Aleksey Nikolayev #:
私は、時刻のような周期的な兆候についての議論を思い出した。IMHOは、可能性のあるパターンで最も強い変化が発生する起点を選択するだけで、それらを規則的なものに変換する必要があります。マーケットを考慮したもの(この場合はセッションスケジュール)などを 使うか、ツリーモデルを訓練し、この特徴に基づいて最初の分岐点を取ることができます。
インクリメントの代わりにボラティリティを使うこともできます。そしてそれを2つのモデルで実行し、一方は悪いケースをフィルタリングする(前回の記事で行ったように)。結果は時にまともで、数回再学習する必要があるだけだ。このアプローチでは、bestinterval以上の結果が得られる可能性がある。

MacのZY onnxは例から始めた。
例のように2次元の行列を入力する必要があるのでしょうか?属性を持つ1次元の配列を使う方が論理的だと思います。行列の形式が間違っていると文句を言われるかもしれません。例えば、1次元の行列の代わりに2次元の行列を入力し、各エントリが2次元になるようにします。

pythonからmqlへの変換の例として、catbustがあります。
 
Maxim Dmitrievsky #:
マックでのZY onnxは例題から始まった。
例のように2次元の行列を入力する必要があるのでしょうか?属性を持つ1次元の配列を使う方が論理的だと思います。行列の形式が間違っていると文句を言われるかもしれません。例えば、1次元の代わりに2次元のものを与えるべきで、各エントリは2番目の次元にあります。つまり、それぞれ1つの値を含むネストされた配列です。

さて、pythonでトレーニングするとき、データセットの最初の5行でモデルをテストしました。そしてONNXをpythonで実行するとき、同じ最初の5行で出力をテストした。どう見ても行列です。MT5のバリアントでは、この同じ5行を行列としてコピーしただけです。そしてRenatの例では、入力も10行4列の行列です。

そこで問題になるのは、IMHOではモデルをロードするときにすでに、次元に負の数が出力されることです。ところで、Renateの例では何が出力されるのか見てみよう。

OnnxTypeInfo otype;
OnnxGetInputTypeInfo(h, 0, otype);
ArrayPrint(otype.dimensions);                   // -1 8
OnnxGetOutputTypeInfo(h, 0, otype);
ArrayPrint(otype.dimensions);                   // -1 1
 
Maxim Dmitrievsky #:
増分の代わりにボラティリティを使えば、市場サイクルを正確に反映できる。そしてそれを2つのモデルで実行し、そのうちの1つは悪いケースをフィルタリングする(前回の記事でやったように)。結果は、数回再学習するだけで、まともなものになることもある。このアプローチでは、bestinterval以上の結果が得られる可能性がある。

環状変数に対する一般的なアプローチについて話しているだけだ。普通の変数に変えるには「スライス」する必要がある。しかし、必ずしも形式的にゼロにする必要はなく、さまざまな方法でそれを行うことができる。

例えば、2つのシンボルからなるポートフォリオのウェイトを探すときなどだ。

 
Aleksey Nikolayev LightGBMの CLIバージョンを学び、C言語でif-else形式でモデルを保存したほうがいい。万能ではありませんが、安くて簡単です)。
intreesというパッケージもあり、そこでは多くの村のモデルからルールを引き出すことができる。
フォレスト、ブースト...
 
Maxim Dmitrievsky #:
catbustaについては、pythonからmqlへの翻訳の例がある。

Yandexの将来性に若干の疑問がある)

また、lgbmはsysharpや他のマイクロソフトの作品ともっとうまく統合できるはずです。)

 
mytarmailS #:
また、多くの村のモデルからルールを引き出せるイントレ・パッケージもある。
フォレスト、ブースト...

この機能を使ったスクリプトを実演していただけますか?

 
Aleksey Nikolayev #:

ヤンデックスの将来には若干の疑問がある)

その根拠は?

理由: