私募

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

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

[复制链接]
发表于 2024-4-4 08:03:20 | 显示全部楼层 |阅读模式
1. 我们会用到什么模型呢?) b  D( p/ Y6 Y& ^( H1 d
在之前的投票分类器中,我们用到了一个分类模型和一个回归模型。 在回归模型中,我们在用于计算分类时,用预测价格替代预测价格走势(下跌、上涨、不变)。 然而,在这种情况下,我们不能依据分类得到概率分布,而对于所谓的“软投票”这样是不允许的。
6 W, C: t3 C8 W/ C我们已准备了 3 个分类模型。 在“如何在 MQL5 中集成 ONNX 模型的示例”一文中已用到两个模型。 第一个模型(回归)被转换为分类模型。 基于 10 个 OHLC 价格序列进行了培训。 第二个模型是分类模型。 基于 63 个收盘价序列进6 S7 D8 l9 u% m  _3 [0 O6 \
//|                                             https://www.mql5.com |4 n4 s4 }5 `$ U+ y, X, x
//+------------------------------------------------------------------+8 l  J. G! e2 w: x
//--- price movement prediction
! B9 l2 V# L" _3 I7 D#define PRICE_UP   04 \2 h2 r4 C7 [# i3 t+ V- C* S7 E
#define PRICE_SAME 1; v# ~( ^. e* }" |6 t  y, \
#define PRICE_DOWN 2
) M5 X" W  d8 F! x% h//+------------------------------------------------------------------+
9 e. P3 C  G* q3 x& J4 W//| Base class for models based on trained symbol and period         |2 m3 I! z5 c0 G5 {2 k
//+------------------------------------------------------------------+
% l7 z, t9 x, N' Iclass CModelSymbolPeriod
# a* ]: X* ]3 `1 n2 p{8 m+ J* h* F1 X) Z
protected:6 w, F7 ^$ m, y8 f
long              m_handle;           // created model session handle* l4 o" W0 S& u) @: o3 j" u" [* [
string            m_symbol;           // symbol of trained data
1 W; o7 ]1 K1 }) L3 f7 g( `. BENUM_TIMEFRAMES   m_period;           // timeframe of trained data
' W: H2 A( \; c# E) V. _datetime          m_next_bar;         // time of next bar (we work at bar begin only)% Q. E9 M5 R# [# O  p1 u
double            m_class_delta;      // delta to recognize "price the same" in regression models
, P8 E4 c8 C1 l7 B2 y! Y3 f& Qpublic:
  n* _9 F2 I7 ~  D/ C2 }4 w8 ^//+------------------------------------------------------------------+# G9 h$ c$ Z* J2 D/ I# F8 M( ~
//| Constructor                                                      |
5 Q* ~6 I0 C/ e9 o/ d//+------------------------------------------------------------------+
1 s9 a8 @4 v4 d& LCModelSymbolPeriod(const string symbol,const ENUM_TIMEFRAMES period,const double class_delta=0.0001)
% I  m$ `$ v  g1 H* @, U% y4 N{
! `% @( ~3 p9 m4 E% c- Q4 j+ U6 zm_handle=INVALID_HANDLE;
" h; d* k& I/ k, t8 I4 b" Im_symbol=symbol;, Y2 J1 P( j$ S6 p+ C
m_period=period;+ C  U2 m& U! }
m_next_bar=0;, ]" |# u- g7 K$ ~' d
m_class_delta=class_delta;" G4 u' j5 p. x: T" C
}; ^* w/ y- w* V
//+------------------------------------------------------------------+; o+ T- \: j6 v% C1 ^. x
//| Destructor                                                       |
- _3 G0 I" F# d" y//| Check for initialization, create model                           |5 k8 r7 R/ i, a, U% n: f! I
//+------------------------------------------------------------------+
+ \4 i" Y6 T3 @0 j: \" }bool CheckInit(const string symbol,const ENUM_TIMEFRAMES period,const uchar& model[])
: P/ U  U. ?8 o( b0 d" p{2 z4 t9 w& h" O/ t7 Z; ?% g; g- b
//--- check symbol, period% r2 A% N) @4 s. K5 R' J: P
if(symbol!=m_symbol || period!=m_period)4 ]7 @# o9 }7 M# C' C
{& F+ X, d. t/ x! z
PrintFormat("Model must work with %s,%s",m_symbol,EnumToString(m_period));# t8 q+ B$ @5 e& L/ J( V
return(false);9 D$ @3 c" j3 Q& }* J# @( r
}
9 F) K! v% G( N% N; N3 f//--- create a model from static buffer7 L7 Q2 I* c3 S$ ?
m_handle=OnnxCreateFromBuffer(model,ONNX_DEFAULT);
" Z+ R+ _' P% n2 }3 u, Y9 bif(m_handle==INVALID_HANDLE)
: @/ v8 f% V  b% }5 `6 I{
  N, l$ a/ C3 F: p. [* JPrint("OnnxCreateFromBuffer error ",GetLastError());& G7 Y# b. J2 A8 E  H1 T" l4 {+ R% Z
return(false);" T" u: L, J. {$ o, {
}
  T  V5 |6 \" Y2 v* X! c//--- ok/ s. {1 q7 c% a5 a( u4 u
return(true);
/ E' p: ]4 F8 R, B}$ \, @, L" d; J5 {- }, b
//+------------------------------------------------------------------+
' a& `$ N( k" i% s# wm_next_bar=TimeCurrent();/ y! x0 [6 _+ M$ Y) x" \
m_next_bar-=m_next_bar%PeriodSeconds(m_period);9 V- L( @5 L! [7 I3 H4 c# K0 |+ T
m_next_bar+=PeriodSeconds(m_period);3 h, K  t% f/ v) t) L  Z2 c
//--- work on new day bar7 V# Z9 s! ?7 T. \; Q7 @
return(true);+ X- f% A: ?; l6 y! L1 r7 a  b: O" t
}
2 H6 F' l4 E3 k: i; ]5 M//+------------------------------------------------------------------+1 b% @; L6 X4 d! f/ V2 L
//| virtual stub for PredictPrice (regression model)                 |( `# ?  G% b2 |  l6 ]
//+------------------------------------------------------------------+
4 [7 ^' }& Y1 C" [0 k* ~5 Evirtual double PredictPrice(void)1 o# j+ N% N! H4 l
{$ e$ ^; y# k3 ~* n6 z
return(DBL_MAX);1 j9 n4 X8 i$ s9 [" H3 W8 [
}
7 U7 A3 ], m0 Z# [7 b+ ~//+------------------------------------------------------------------+. L. _4 q9 }! b
//| Predict class (regression -> classification)                     |
4 z6 n( Q2 T) L//+------------------------------------------------------------------+: a- H0 Q9 B/ \5 j8 N  F
virtual int PredictClass(void)
, ]% p" K. n0 k3 L; {% n{
* \* P* W5 F- c6 a# _double predicted_price=PredictPrice();( w  }7 E, _4 b5 D- t5 }0 E  A5 A$ g
if(predicted_price==DBL_MAX)5 C4 T, N4 W+ H/ Y/ o
return(-1);
! e  c/ w1 v+ u3 n; ~# L  eint    predicted_class=-1;
& L8 ^+ ], Y5 V$ i+ r6 `% `0 Vdouble last_close=iClose(m_symbol,m_period,1);! D# R# H- A  ]2 Q, @; R9 [( P
//--- classify predicted price movement" _+ [% P1 J3 C6 q# {
double delta=last_close-predicted_price;
) `& I7 l4 P5 h! |9 mif(fabs(delta)<=m_class_delta)& C( L4 {! u$ E9 u! Y6 I; _# b
predicted_class=PRICE_SAME;, Z4 Z( j( s# K2 q
else
# C! h6 @2 a, g4 Lprivate:
& W0 P# ~4 X$ z: h) B4 ^int               m_sample_size;
( s2 v/ c  x& _; {//+------------------------------------------------------------------+6 ^' Z# m7 a: E' x
virtual bool Init(const string symbol, const ENUM_TIMEFRAMES period)4 U; ~& `; d  n  k' Z: O
{' ?* C9 ~1 O9 D/ A5 A) u
//--- check symbol, period, create model
: j" p, ]* J! _: u8 |( u# _if(!CModelSymbolPeriod::CheckInit(symbol,period,model_eurusd_D1_10_class))
7 x& T3 Y, z( h/ n2 C- q% p{
3 D1 k* Y3 B2 `6 e' h" mPrint("model_eurusd_D1_10_class : initialization error");) ?* b0 m( m* p: [* i' ?: O! h
return(false);
$ S0 G: j: |4 I: J/ }}" A* X) h1 Z! E; u" {" D% f5 s
//--- since not all sizes defined in the input tensor we must set them explicitly
0 y  u3 ~% v& l6 E, s//--- first index - batch size, second index - series size, third index - number of series (OHLC)
  S- U4 Z$ C' V, pconst long input_shape[] = {1,m_sample_size,4};
! M0 ~3 N! U8 B! t- @3 ^if(!OnnxSetInputShape(m_handle,0,input_shape)); K2 d# e9 z" w) _6 ]4 \
{
' I- F: V( X: a# Z/ J0 QPrint("model_eurusd_D1_10_class : OnnxSetInputShape error ",GetLastError());2 h2 w3 N) D# v/ g8 T' Y4 d
return(false);/ z  A6 M* |0 p( t* Y, u% v# |
}
4 m! w) B# L. A/ |. R# o, J8 X//--- since not all sizes defined in the output tensor we must set them explicitly- _3 n5 F+ h# E: S; d
//--- first index - batch size, must match the batch size of the input tensor4 A; |( A& h2 R3 |  @9 ]3 ]
//--- second index - number of classes (up, same or down)7 n4 y- o4 S6 ~; f, T* L* E
const long output_shape[] = {1,3};, ]& }' T3 w$ d0 ~
if(!OnnxSetOutputShape(m_handle,0,output_shape))
3 v2 E. W3 P" M# e6 o" C{# C+ o% m: j* J& k0 [% p; O
Print("model_eurusd_D1_10_class : OnnxSetOutputShape error ",GetLastError());, ], ^& [" J# @$ A
return(false);
  W! q: \; t( K8 }4 Z}
% q% A. P, o  x/ |//--- ok
  Z7 S/ [7 _. A& v" _return(true);
& O& {+ z' g6 B2 k: O$ \/ a1 y}) F5 k) Z( f# X4 k2 W
//+------------------------------------------------------------------+, |" `& s+ E. J% A0 I: i
//| Predict class                                                    |) U. Y4 C- p" @  t1 ^* g: Z
//+------------------------------------------------------------------+0 x% Q( l, B; G; a
virtual int PredictClass(void)
- Y7 p2 ]  T6 j/ {2 k" E8 w{
http://www.simu001.cn/x287997x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-21 22:44 , Processed in 1.416976 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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