私募

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

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

[复制链接]
发表于 2024-4-4 08:03:20 | 显示全部楼层 |阅读模式
1. 我们会用到什么模型呢?& s$ b6 L; b0 m. l
在之前的投票分类器中,我们用到了一个分类模型和一个回归模型。 在回归模型中,我们在用于计算分类时,用预测价格替代预测价格走势(下跌、上涨、不变)。 然而,在这种情况下,我们不能依据分类得到概率分布,而对于所谓的“软投票”这样是不允许的。. s+ I- B/ F/ d8 X; B
我们已准备了 3 个分类模型。 在“如何在 MQL5 中集成 ONNX 模型的示例”一文中已用到两个模型。 第一个模型(回归)被转换为分类模型。 基于 10 个 OHLC 价格序列进行了培训。 第二个模型是分类模型。 基于 63 个收盘价序列进
# }  r' k, v9 g* w' ~//|                                             https://www.mql5.com |
; q" ~+ H4 s. A) L; d+ q- k//+------------------------------------------------------------------+
% Q- i* Y# Y7 X6 p- V//--- price movement prediction! [( `1 n+ }; D! i) L8 F
#define PRICE_UP   00 U+ P; [, a  ^. V
#define PRICE_SAME 1
4 ~7 |/ }* [4 b9 j; c0 U#define PRICE_DOWN 2
1 B( F! W9 j+ N//+------------------------------------------------------------------+/ g1 ^% G& g, T0 G- }: |( L, D1 Z
//| Base class for models based on trained symbol and period         |
* d. X8 v* i$ h# y0 I//+------------------------------------------------------------------+
# @" S4 Q7 F9 }& g# s$ ?class CModelSymbolPeriod; r. n8 L. @8 p; Z: _0 g4 b6 r
{
! O% L* D$ G! [4 Eprotected:
% s  X  b0 T1 }/ `6 ylong              m_handle;           // created model session handle( H$ B" U8 U% l$ O" |5 Q! o
string            m_symbol;           // symbol of trained data
6 V/ L4 j% }6 x8 t) gENUM_TIMEFRAMES   m_period;           // timeframe of trained data
0 ~% E: w1 C4 Q: h" Jdatetime          m_next_bar;         // time of next bar (we work at bar begin only)9 s4 c( F3 z2 h& O# _2 V
double            m_class_delta;      // delta to recognize "price the same" in regression models% {' w4 t9 y" X2 Y8 u& a
public:
( w5 _  t8 X( w& t) f//+------------------------------------------------------------------+1 v. T8 I  v9 l4 w: `/ F
//| Constructor                                                      |$ n4 l/ d: C4 p3 P& ?
//+------------------------------------------------------------------+
* U  e9 F& v6 _- gCModelSymbolPeriod(const string symbol,const ENUM_TIMEFRAMES period,const double class_delta=0.0001)
; h% W- x0 H5 l* \$ z" |6 {{
7 {5 s# w% W# B2 @m_handle=INVALID_HANDLE;" M( G& s6 C0 R5 `7 r
m_symbol=symbol;. i4 |# L# ?* P, G6 t
m_period=period;
: Z7 Y6 `8 u& j7 w8 m# U* ym_next_bar=0;
% u2 |9 |7 P' T- \$ H9 K5 G& {m_class_delta=class_delta;9 o, }4 ], N( ^! m% o/ X
}4 H+ D3 p. x0 L
//+------------------------------------------------------------------+
* E& |8 E/ ?! O- J5 P//| Destructor                                                       |4 z: ^7 U( h0 v$ Z4 Z8 N2 f: q
//| Check for initialization, create model                           |
# n; b: B5 W6 `- @' _+ T//+------------------------------------------------------------------+3 t! X" ?6 c( x5 X
bool CheckInit(const string symbol,const ENUM_TIMEFRAMES period,const uchar& model[]); x2 Z$ T- T+ O! E1 I& Z) |5 \
{
1 \) C3 E3 F, k) t//--- check symbol, period: G# D* `# v" J# \
if(symbol!=m_symbol || period!=m_period)
- t: ?1 Y2 ^9 T- E4 f4 I( L! E{* w6 Z5 K& m3 {$ S* M+ b7 t( U
PrintFormat("Model must work with %s,%s",m_symbol,EnumToString(m_period));1 F2 m* B' p" L% B$ ~! j3 m- s
return(false);: I( W" M/ T3 S: Y! Q! }& I
}/ U6 e1 f3 D4 x, h" Z
//--- create a model from static buffer
9 w8 Q9 ^" t* g- ym_handle=OnnxCreateFromBuffer(model,ONNX_DEFAULT);
8 q% \5 p4 x: x' ~" J' z2 J: W0 hif(m_handle==INVALID_HANDLE)8 _# T' i) z% v; F% j
{0 `) y6 B& Y5 k" B: z$ D1 z
Print("OnnxCreateFromBuffer error ",GetLastError());
! h( @( K' s  U, c; O; Z1 m3 ]return(false);
3 Q8 u0 F8 r/ K; `4 p" q}
* J% t% P8 b4 W4 k/ I$ A; a& ]//--- ok9 H5 B* f, i; H" f& N; u
return(true);
/ x" ]! C5 e/ t. @/ b5 j  b! a- P}4 i2 _- \% S5 U6 G( p. ~) T) I/ Y
//+------------------------------------------------------------------+
0 A; G5 d: ]" X* P# pm_next_bar=TimeCurrent();
2 S2 n' R" C0 {4 ?1 M( Jm_next_bar-=m_next_bar%PeriodSeconds(m_period);
3 Z3 r$ v0 o& e) U+ rm_next_bar+=PeriodSeconds(m_period);% K+ `2 v  q4 h% y
//--- work on new day bar! i5 q" l- K  P' B
return(true);1 U. H9 ?$ `4 @2 ^  J3 Y; E
}9 p; t) O3 Y% T! c8 p: Q
//+------------------------------------------------------------------+# p/ q4 Q5 m9 ~. E
//| virtual stub for PredictPrice (regression model)                 |# R9 l/ k& _9 ^1 ?9 l$ H
//+------------------------------------------------------------------+6 z. [3 \) G( e/ s* Y
virtual double PredictPrice(void)
2 [, W4 v7 r0 d# i{
  G& Y3 O1 E& z9 ?  [. C* f& N8 Sreturn(DBL_MAX);$ K5 x0 q$ f& E. ~: i
}
6 C# ]$ X( s/ L- [% }% [6 c//+------------------------------------------------------------------+: j( k( {/ l( V% Y1 d; p
//| Predict class (regression -> classification)                     |
! w, V7 t$ Q4 m6 Y( u//+------------------------------------------------------------------+( \& B6 P& D5 d8 @0 E: a; b
virtual int PredictClass(void)
0 q1 d- y6 r/ U* d) F{
* ?  C7 y4 j6 }/ x% ~# ^double predicted_price=PredictPrice();; B3 ]3 E1 `2 F# W# h9 m
if(predicted_price==DBL_MAX)3 l0 [, p- S* A2 W$ C% S1 q& s# Y
return(-1);4 O' e6 T& K7 m6 S( h$ R
int    predicted_class=-1;
" R' ]! L8 R- Z, O$ x, i8 `$ Udouble last_close=iClose(m_symbol,m_period,1);* _( A5 H( S! ^
//--- classify predicted price movement1 d: J) Q6 V: `, }- Z' v# W2 v
double delta=last_close-predicted_price;; k7 X  v' u$ y, l! ?4 u( `6 M
if(fabs(delta)<=m_class_delta)# {) u  J( L. l' d7 y5 s( F1 Q
predicted_class=PRICE_SAME;
( M+ Q& L% s3 {# E2 i: [. ielse
; {5 J1 q! u1 U1 f# _private:
. w2 h2 U; B7 G$ c0 u$ S5 X1 Q- L  Hint               m_sample_size;& \$ A% g8 f. Q$ R% `
//+------------------------------------------------------------------+
& p& ?7 Z7 O) D9 I  ?9 x5 fvirtual bool Init(const string symbol, const ENUM_TIMEFRAMES period)7 d' P8 X7 L) S
{
. p9 S! i( h- t% e$ T//--- check symbol, period, create model
  a2 }) `5 S" {3 R" j9 g$ hif(!CModelSymbolPeriod::CheckInit(symbol,period,model_eurusd_D1_10_class))
6 {. I' `1 l" X# J* V{. w- P5 c; E2 v, B/ o) c9 w) ?
Print("model_eurusd_D1_10_class : initialization error");+ A% p. W: g7 [  n/ h: ~
return(false);9 L. d) O! |9 `
}
. y* x% ]5 t( ?& H! ^( W/ Q//--- since not all sizes defined in the input tensor we must set them explicitly& E# k2 Y  P: J: ]# {
//--- first index - batch size, second index - series size, third index - number of series (OHLC)
  f8 O8 l  a2 H2 H/ V5 kconst long input_shape[] = {1,m_sample_size,4};
; K4 Z( a  C. l' V/ Zif(!OnnxSetInputShape(m_handle,0,input_shape))
* X; U+ D+ p: V+ L1 F{9 x" z+ S; p+ h+ s$ s$ D9 S; z
Print("model_eurusd_D1_10_class : OnnxSetInputShape error ",GetLastError());# `: h1 ]3 g# B: [% V4 K6 A
return(false);
, i( \, U4 x3 t2 X! o}" c5 T- J1 y' w. G) ?  J) C
//--- since not all sizes defined in the output tensor we must set them explicitly9 c" e3 o# X; p& d
//--- first index - batch size, must match the batch size of the input tensor
( W# G9 V- M/ ^: N9 }7 I//--- second index - number of classes (up, same or down)0 b' e3 L. E1 `: O3 v; R4 S
const long output_shape[] = {1,3};- ]) t7 r3 {; K! X
if(!OnnxSetOutputShape(m_handle,0,output_shape))
+ [" t8 K0 d  A2 X- P{/ s$ h8 q" D& P' s2 b0 |
Print("model_eurusd_D1_10_class : OnnxSetOutputShape error ",GetLastError());
9 G4 G4 m; Z/ D8 w' Y0 vreturn(false);; `2 X* ]# ]6 h* ]8 d* ?, e2 n4 n4 x
}
1 N5 Y! I& I- h' `% @. }//--- ok
9 O9 V% Z/ ~* N! W% P  ^" kreturn(true);; e6 ?. {7 J. i% t) a) }
}; ?$ {* `6 @5 @  c- a1 P
//+------------------------------------------------------------------+) q% b' A, t: L) ~6 ?- ~/ K* u
//| Predict class                                                    |
* m6 V2 f$ B9 P2 v  [  q2 n//+------------------------------------------------------------------+
6 s# ]9 i9 A: B' o  |/ h9 O8 `virtual int PredictClass(void)
/ l) L0 O, e! f{
http://www.simu001.cn/x287997x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-4 10:29 , Processed in 0.412165 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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