私募

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz

期货量化软件:赫兹量化中包装 ONNX 模型

[复制链接]
发表于 2024-4-4 08:03:20 | 显示全部楼层 |阅读模式
1. 我们会用到什么模型呢?( {; \; H1 e9 X  r0 o
在之前的投票分类器中,我们用到了一个分类模型和一个回归模型。 在回归模型中,我们在用于计算分类时,用预测价格替代预测价格走势(下跌、上涨、不变)。 然而,在这种情况下,我们不能依据分类得到概率分布,而对于所谓的“软投票”这样是不允许的。# U' v7 P8 |6 r5 h
我们已准备了 3 个分类模型。 在“如何在 MQL5 中集成 ONNX 模型的示例”一文中已用到两个模型。 第一个模型(回归)被转换为分类模型。 基于 10 个 OHLC 价格序列进行了培训。 第二个模型是分类模型。 基于 63 个收盘价序列进: F8 t% E: p3 I  K" V
//|                                             https://www.mql5.com |
/ Q% V  v0 b$ ]0 m//+------------------------------------------------------------------+% ^3 \) e6 s; X
//--- price movement prediction
$ U8 K- ]! Y% [8 ?#define PRICE_UP   0
7 S& [, ^5 R1 P7 y; K. b* N#define PRICE_SAME 18 D$ B8 @4 d5 k; [, m2 P. T8 t
#define PRICE_DOWN 2% {! ^/ H3 |: M- M0 n; e: @
//+------------------------------------------------------------------+
5 n5 R$ D4 S3 x! [$ z//| Base class for models based on trained symbol and period         |- T: ^0 A/ k% I: R4 x1 P5 `
//+------------------------------------------------------------------+
/ _2 j: w2 G" x2 J5 {. iclass CModelSymbolPeriod
; J% G1 Y6 S- _' b{) @& k8 n6 X% A. `
protected:
6 }0 i) P1 z) L0 J8 ~; _, Nlong              m_handle;           // created model session handle+ K. r5 L. Z3 K6 s; j6 m7 f, o
string            m_symbol;           // symbol of trained data
& ?+ q: i+ Q8 D1 C1 tENUM_TIMEFRAMES   m_period;           // timeframe of trained data6 D' Z7 Z: a1 g  T
datetime          m_next_bar;         // time of next bar (we work at bar begin only)8 X# m* M, b/ w6 N5 ^( V; B1 G
double            m_class_delta;      // delta to recognize "price the same" in regression models2 \' `, R6 r( V$ ~& g
public:
# I0 Q4 F8 O. f& s( U* ~//+------------------------------------------------------------------+
- Z0 T* o, Z9 f& h//| Constructor                                                      |: f! ]# E3 I( \$ p$ @( S3 z- t
//+------------------------------------------------------------------+' S9 S( Q7 z8 B. d9 B
CModelSymbolPeriod(const string symbol,const ENUM_TIMEFRAMES period,const double class_delta=0.0001)0 I, j: M- i- j1 l0 X5 }# v
{( ?. f! c) ^0 @- Z6 A4 Q7 ~
m_handle=INVALID_HANDLE;
( q0 F# g; V8 S9 \: |2 }  q7 hm_symbol=symbol;
6 `: }1 o* m% d# ~% E4 m& ^m_period=period;
4 z$ E# I; W: ~! V* A) Um_next_bar=0;
- o+ O( H0 X( K% e4 f- S1 sm_class_delta=class_delta;% Q# I8 e# F7 `& N" X& c
}0 E9 e4 U4 W  i& q  D7 J. ^
//+------------------------------------------------------------------+
$ k+ v  b' Y5 k5 V% @4 J//| Destructor                                                       |2 s$ {4 Y$ u" A
//| Check for initialization, create model                           |
+ ^# p) K8 Q# m1 `* M, }2 k//+------------------------------------------------------------------+0 P9 m2 n7 U( s6 j; n
bool CheckInit(const string symbol,const ENUM_TIMEFRAMES period,const uchar& model[])5 S, [# c% a0 H+ k9 C. w
{
) Y' w6 V4 a" [2 ]//--- check symbol, period
, A" K) S- o, I+ b% [2 D8 Y( _if(symbol!=m_symbol || period!=m_period)
" ~+ y7 K5 d8 V7 c0 I1 b  J{6 |' a  |1 v$ w# y; b
PrintFormat("Model must work with %s,%s",m_symbol,EnumToString(m_period));
, c; j1 [# N; u, f" h! E; Qreturn(false);
9 P2 p" ?3 R4 d9 h/ L; k& S4 Z}- I" `$ g) Y6 Y5 S0 M# f3 k8 b
//--- create a model from static buffer
) H8 ~8 G/ `: n0 D7 W" jm_handle=OnnxCreateFromBuffer(model,ONNX_DEFAULT);1 v" R6 ~+ A/ ^$ _
if(m_handle==INVALID_HANDLE)
2 S7 M' X) G6 `$ c* ?{$ ~" p6 O0 o) ~0 F
Print("OnnxCreateFromBuffer error ",GetLastError());  {+ @) g; n1 o5 l  \
return(false);
, C5 t2 M# F- z}
* a5 c# H- k* g1 X6 e% R- L//--- ok
2 k) |0 h" m7 a2 C6 K9 E9 jreturn(true);9 C7 H1 w5 s9 i! w: J; {
}- x1 K+ M4 y9 a$ c3 k5 p
//+------------------------------------------------------------------+
7 Z& v# C. B2 J* H0 Q; k  n+ _m_next_bar=TimeCurrent();; p- t' i3 |/ o) u
m_next_bar-=m_next_bar%PeriodSeconds(m_period);; Y1 E2 D0 `# f; a; _* R
m_next_bar+=PeriodSeconds(m_period);
# E$ }. k1 Z* F: E# J& I+ F//--- work on new day bar
# ~' _* e! k) @; |4 V# U3 P. Preturn(true);# h; a' l& v; x+ J
}
7 L2 H" E2 P" L8 V& k6 I//+------------------------------------------------------------------+! N7 H  K8 K' D/ J* r
//| virtual stub for PredictPrice (regression model)                 |
3 b5 E+ O+ b' G//+------------------------------------------------------------------+
# Z+ Q0 P! D, Z- z6 J) jvirtual double PredictPrice(void)
3 y: I2 j( n6 r7 J& V: I1 s: P{
1 F9 F3 Z% M6 B9 oreturn(DBL_MAX);
! }+ C4 {2 O- [}
" T$ C! E& L" r& |. a* Q+ {//+------------------------------------------------------------------+9 w# ~& N9 k, d. p" z. s' m& O
//| Predict class (regression -> classification)                     |- \( U8 c2 j4 n7 E1 B5 ]" z+ F
//+------------------------------------------------------------------+7 h3 ?( V( D) ~8 f
virtual int PredictClass(void)1 D! M" o$ Q; S) H
{
0 W1 X- z! g, h2 y, Wdouble predicted_price=PredictPrice();: i* |# P9 d& W" h! k1 I3 G
if(predicted_price==DBL_MAX)
! ?3 b7 q+ H9 o/ q; vreturn(-1);
9 Q. C( M3 h- i/ H; ^$ bint    predicted_class=-1;+ P9 N: a$ C' V
double last_close=iClose(m_symbol,m_period,1);
! w/ `. Y& @0 ]# \  f$ ?//--- classify predicted price movement
& E6 t0 I6 z) Bdouble delta=last_close-predicted_price;8 d, l, J4 B, t2 Z# _) L
if(fabs(delta)<=m_class_delta)3 D2 J: d+ m, a8 P' |- O
predicted_class=PRICE_SAME;; F. J% U& `+ a, d  S/ ?( ]
else
4 C" L' A1 B7 ?8 Rprivate:0 X' h& @% G. V
int               m_sample_size;
# _) _: u) {( z! e9 d/ L% L//+------------------------------------------------------------------+
1 o2 ?+ T; g8 w- wvirtual bool Init(const string symbol, const ENUM_TIMEFRAMES period)
2 s* w6 n  n+ j+ E. `+ v: b! z* r{: j7 Z8 P7 Z- h/ V1 ^9 w
//--- check symbol, period, create model, }# O/ X% F+ d$ z7 z
if(!CModelSymbolPeriod::CheckInit(symbol,period,model_eurusd_D1_10_class))
) r; r4 o: h, E5 J{
4 R  H/ _( t3 M. _3 `Print("model_eurusd_D1_10_class : initialization error");
( D  }2 o: e8 N( Creturn(false);
8 L2 e3 p3 M# e% D5 P}
" B. l9 U# L3 Q* W4 A" U! x; c//--- since not all sizes defined in the input tensor we must set them explicitly. f1 R7 n8 _! P1 ?* l- W4 J
//--- first index - batch size, second index - series size, third index - number of series (OHLC)+ D, T+ O! @. b4 F. F3 ^
const long input_shape[] = {1,m_sample_size,4};/ G6 D! F  k" Z6 A$ q
if(!OnnxSetInputShape(m_handle,0,input_shape)), e9 N" M4 y  g
{
# v  p' w' j3 p" r. C  QPrint("model_eurusd_D1_10_class : OnnxSetInputShape error ",GetLastError());# K3 u& `* |2 C  e
return(false);/ Q* }+ ?% _3 y
}# c* w2 w1 v+ q# {; ~) ]8 o
//--- since not all sizes defined in the output tensor we must set them explicitly
- Z' X/ w& G; z//--- first index - batch size, must match the batch size of the input tensor, M, z* k5 Y9 I8 T# R( G
//--- second index - number of classes (up, same or down)2 ^. A! L( F' v) d9 d7 D
const long output_shape[] = {1,3};6 V  v7 o1 K, N4 Q4 M
if(!OnnxSetOutputShape(m_handle,0,output_shape)), n& ^1 m/ X' K: M6 n. R+ y
{
; T4 G# E3 e" x6 m/ M! S" `3 [# A5 dPrint("model_eurusd_D1_10_class : OnnxSetOutputShape error ",GetLastError());
  m3 p4 v4 f: F1 e+ |& O! \2 Jreturn(false);
! g) H. e; {& `! W/ R}4 {, x5 k  L: w1 P/ j) X, T* @7 z! m6 D
//--- ok9 q! w$ K0 a9 B. Q" v/ D
return(true);
( T2 X2 D3 C7 z, w% \/ n}+ S5 w7 W, o/ v
//+------------------------------------------------------------------+# o+ G' O7 q: L: [( k- ~) n0 K
//| Predict class                                                    |
0 j8 t1 _, @; p//+------------------------------------------------------------------+
1 ~; [) j9 r! r! b/ F" r; T# Tvirtual int PredictClass(void)
" g# U# H% j& @{
http://www.simu001.cn/x287997x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|Archiver| ( 桂ICP备12001440号-3 )|网站地图

GMT+8, 2024-4-26 17:25 , Processed in 0.361274 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表