交易中的机器学习:理论、模型、实践和算法交易 - 页 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 格式保存模型。虽然不通用,但便宜又省事)
 
我想起了关于时间等周期性标志的讨论。在我看来,我们应该将它们转化为有规律的标志,只需选择可能模式中发生最强烈变化的起点即可。您可以利用市场考虑因素(本例中为时段安排)或类似 东西,或者训练一个树状模型,并选择该特征的第一个分割点。
Один из методов псевдо-адаптации.
Один из методов псевдо-адаптации.
  • 2023.01.30
  • www.mql5.com
Любой скальпер знает, что круглосуточная торговля - глупость. Есть интервалы, где достигается высокая и стабильная прибыльность, поэтому различными способами находят эти интервалы. Например, при
 
Aleksey Nikolayev #:
我想起了关于时间等周期性标志的讨论。在我看来,我们应该将它们转化为有规律的标志,只需选择可能模式中发生最强烈变化的起点即可。你可以利用市场因素(在本例中为时段安排)或类似 东西,或者训练一个树状模型,然后根据这一特征选取第一个分割点。
你可以用波动率来代替增量,因为它能准确反映市场周期。然后通过 2 个模型运行,其中一个模型会过滤掉不好的情况(就像我在上一篇文章中所做的)。结果有时还不错,只是需要重新训练几次。这种方法可能比 bestinterval 更有效。

Mac 上的 ZY onnx 从示例开始,这很酷,但我还没有检查过误差。
有必要像你的例子那样输入二维矩阵吗?使用带属性的一维数组似乎更符合逻辑。它可能会抱怨矩阵的形式不对。例如,你应该给出一个二维矩阵而不是一维矩阵,其中每个条目都在二维中,即嵌套数组,每个数组包含一个值。

有一个从 python 翻译成 mql 的 catbust 例子,lgbm 似乎也好不到哪里去
 
Maxim Dmitrievsky #:
Mac 上的 ZY onnx 从示例中启动,这很酷,但我还没有检查过弹跳情况。
有必要像你的示例那样输入一个二维矩阵吗?使用带属性的一维数组似乎更符合逻辑。它可能会抱怨矩阵的形式不对。例如,你应该给出一个二维矩阵而不是一维矩阵,其中每个条目都在第二个维度,即嵌套数组,每个数组包含一个值。

用 python 训练时,我在数据集的前五行测试了模型。然后在 python 中运行 ONNX 时,我也在前五行测试了输出结果。不管怎么看,它都是一个矩阵。在 MT5 变体中,我只是将这五行复制为矩阵。在 Renat 的示例中,输入也是一个十行四列的矩阵。

在加载模型时,问题就已经出现了,因为输出的维数是负数。顺便说一下,我们应该看看 Renate 示例中的输出结果。

OnnxTypeInfo otype;
OnnxGetInputTypeInfo(h, 0, otype);
ArrayPrint(otype.dimensions);                   // -1 8
OnnxGetOutputTypeInfo(h, 0, otype);
ArrayPrint(otype.dimensions);                   // -1 1
 
Maxim Dmitrievsky #:
你可以用波动率来代替增量,它能准确反映市场周期。并通过 2 个模型运行,其中一个模型会过滤掉不好的情况(就像我在上一篇文章中所做的)。结果有时很不错,你只需要重新训练几次。这种方法可能比 bestinterval 更有效。

不,我只是在说处理循环变量的一般方法。它们需要经过 "切片 "才能变成普通变量。但你可以用不同的方法做到这一点,不一定是形式上的零。

除了每日时间,循环变量也会出现,例如,在为两个符号的投资组合寻找权重时。

 
Aleksey Nikolayev LightGBM 的 CLI 版本,并用 C 语言以 if-else 格式保存模型。这不是万能的,但便宜又省事)。
还有一个软件包 intrees,你可以从许多村庄模型中提取规则。
福雷斯特、助推器......
 
Maxim Dmitrievsky #:
对于 catbusta,有一个从 python 翻译到 mql 的例子,lgbm 似乎也好不到哪里去。

对 Yandex 的未来略有怀疑)。

此外,lgbm 应该能更好地与 sysharp 和其他微软产品集成,如果它突然变得相关的话)。

 
mytarmailS #:
此外,还有 intrees 软件包,可以从许多村庄模型中提取规则。
森林、助推器...

您能演示一个具有此功能的脚本吗?

 
Aleksey Nikolayev #:

对 Yandex 的未来略有怀疑)。

它们基于什么?