私募

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

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

[复制链接]
发表于 2024-4-4 08:03:20 | 显示全部楼层 |阅读模式
1. 我们会用到什么模型呢?
3 Z/ u! K' {+ d0 D# C. \, `2 y在之前的投票分类器中,我们用到了一个分类模型和一个回归模型。 在回归模型中,我们在用于计算分类时,用预测价格替代预测价格走势(下跌、上涨、不变)。 然而,在这种情况下,我们不能依据分类得到概率分布,而对于所谓的“软投票”这样是不允许的。
' R. D  G9 M8 H" d$ I; v我们已准备了 3 个分类模型。 在“如何在 MQL5 中集成 ONNX 模型的示例”一文中已用到两个模型。 第一个模型(回归)被转换为分类模型。 基于 10 个 OHLC 价格序列进行了培训。 第二个模型是分类模型。 基于 63 个收盘价序列进
, T- E% t7 ?; k% q//|                                             https://www.mql5.com |, N! Q6 r3 L  R1 g1 t- U9 P( H3 Q
//+------------------------------------------------------------------+. \/ V# F( U) N8 W* ~  o  e
//--- price movement prediction" W+ S4 t, P2 {8 A) |# j6 u8 G& t
#define PRICE_UP   0  L5 a( l$ o  m- z# x7 O5 h
#define PRICE_SAME 1. |6 ]3 Z; V# Z( y7 A8 s+ {+ ~
#define PRICE_DOWN 2
* }2 h/ ]# ~7 b- D- [! [; Z//+------------------------------------------------------------------+4 w9 H; H' I/ |5 X5 E4 j
//| Base class for models based on trained symbol and period         |
9 f! }2 j% k4 t5 L8 N1 g//+------------------------------------------------------------------+
( p5 e- x! K" q/ k6 sclass CModelSymbolPeriod- G. Y: r$ h) F8 O, L( q: L
{; `+ p/ [% Y  U7 ^& Q/ ^
protected:
/ ~0 o0 i6 y. ]+ w  t5 j1 Llong              m_handle;           // created model session handle
3 @" k" i! u% @% t6 pstring            m_symbol;           // symbol of trained data& J8 O( _; B. I  ^8 F8 c
ENUM_TIMEFRAMES   m_period;           // timeframe of trained data4 r) G- W/ Z7 A+ o  p
datetime          m_next_bar;         // time of next bar (we work at bar begin only)1 z# X7 P% }/ x4 z1 A
double            m_class_delta;      // delta to recognize "price the same" in regression models
3 B- U( |3 v+ n3 |4 O/ Fpublic:
5 v5 Y2 f: l- D  I" i7 y6 L  _1 {//+------------------------------------------------------------------+( \5 a0 W8 m( G) D! [
//| Constructor                                                      |1 _( |3 w# w& q3 ?, ~6 K
//+------------------------------------------------------------------+$ F8 f: G0 A% _6 g/ ]- Z. H
CModelSymbolPeriod(const string symbol,const ENUM_TIMEFRAMES period,const double class_delta=0.0001)* B# ?# w- ]2 f4 W& F" v1 h( A
{. Z! |( H0 R; q5 z/ T
m_handle=INVALID_HANDLE;
4 g) @( D; w8 \9 \8 |; {4 X& T1 xm_symbol=symbol;
4 S$ b$ P8 |" Z) F: j5 h- S  a# [m_period=period;
9 f2 w3 m, K  s- `$ h: T# \m_next_bar=0;
. N, P& b. V4 p; M3 rm_class_delta=class_delta;$ r3 i6 x% y- r* W; W0 l1 P' N( d" S
}! t* E( H7 _- N: O2 u
//+------------------------------------------------------------------+# M6 S- @: |8 U6 B4 w/ ^+ W
//| Destructor                                                       |
3 H* J" A! W# }6 ^8 K; ?/ l//| Check for initialization, create model                           |4 G' E; X! y1 W6 y8 F
//+------------------------------------------------------------------+7 J6 I9 L4 X9 \; h  Q/ u
bool CheckInit(const string symbol,const ENUM_TIMEFRAMES period,const uchar& model[])1 P) V$ e- ~2 V' \  S
{/ l, G" K8 Q6 \9 l8 \% V! }9 R
//--- check symbol, period3 t- g5 b4 f' q- C& {
if(symbol!=m_symbol || period!=m_period)" s; K; \8 \% h1 ?1 e& Q! V% h
{( n& J- R  n0 V) m/ J& @
PrintFormat("Model must work with %s,%s",m_symbol,EnumToString(m_period));
7 `* O( g9 F" y# ^return(false);- y6 a* g$ H8 e3 `: V- q( i
}
  W" X5 x2 O* X, \& y- P$ P: X//--- create a model from static buffer
  [- H( X3 O% dm_handle=OnnxCreateFromBuffer(model,ONNX_DEFAULT);4 x) @$ n+ H8 \6 y
if(m_handle==INVALID_HANDLE)* ]. V& i" ~  |1 H6 K/ \: z
{) p0 ?6 z4 G; i2 Q! a
Print("OnnxCreateFromBuffer error ",GetLastError());5 [2 p5 ~3 a$ y  k8 K" x; Y" Y0 d
return(false);
: Q# x; }. r' j* W5 _5 U}
9 M! h4 g6 Z' J/ U7 K! K: v//--- ok3 X4 k# a* R9 b/ k
return(true);0 L& Z; W/ M$ w( V, s
}
4 h9 v2 I% _! `" j//+------------------------------------------------------------------+
! @5 |0 b9 x4 c0 j3 i& c2 u2 S$ Hm_next_bar=TimeCurrent();
6 A4 u! o( V) M+ f! @1 a! r4 Zm_next_bar-=m_next_bar%PeriodSeconds(m_period);/ Y9 z& ~; r4 B8 l9 o* T2 x
m_next_bar+=PeriodSeconds(m_period);* G/ O: j7 v  o
//--- work on new day bar( D9 F4 Q+ \" o% K0 o- [$ `
return(true);+ \5 @! ~; G6 I  W4 r
}
( X4 i- V4 p( d6 [. O4 s# ^//+------------------------------------------------------------------+
  q6 l' t1 g0 @+ X# m//| virtual stub for PredictPrice (regression model)                 |# X8 H/ {* W* V: ^0 r9 P3 K
//+------------------------------------------------------------------+
$ ]6 v! p4 S, G0 e! b5 {virtual double PredictPrice(void)" g1 ~. J; w# ?7 N9 I  v; A
{
. ]6 F. r- n! N- E# r) Oreturn(DBL_MAX);
/ G# F6 D4 f8 V1 C}1 _, n4 S* }6 m3 L; I$ a
//+------------------------------------------------------------------+
- F( d( a% x+ P$ K! n( G& I# Z//| Predict class (regression -> classification)                     |) f* \1 G* t* R) P2 [' J- s
//+------------------------------------------------------------------+
: F$ z, |9 H6 y# Ovirtual int PredictClass(void)
6 x9 N% u0 @9 \8 o{7 X) n) m, ~: C+ r% C( z1 t  B
double predicted_price=PredictPrice();
5 t, z- O& L8 Q9 j' \) ^7 oif(predicted_price==DBL_MAX)$ i! g3 r; R0 y
return(-1);
! b8 Y  c: P4 ^int    predicted_class=-1;
; m3 h! J0 {  ]5 }  H# [: q# H' Y! edouble last_close=iClose(m_symbol,m_period,1);
) s: O) g* w  ~9 ]& q- L& P//--- classify predicted price movement, W' x& s1 T; Y3 ?
double delta=last_close-predicted_price;6 e. m9 u% l7 i1 Y& {% q
if(fabs(delta)<=m_class_delta)/ \& c7 ?0 G; i9 v6 m- m) H
predicted_class=PRICE_SAME;
# m' j3 {1 U0 J0 ?else; r( f" _1 r* _5 ^5 A" S
private:% Y: V7 ^1 A0 \& }# \4 I0 F
int               m_sample_size;
$ x. c, m( {( o: I6 ]: c//+------------------------------------------------------------------+
. E7 |2 ^( _0 b: v( E5 V. xvirtual bool Init(const string symbol, const ENUM_TIMEFRAMES period)" L* E$ C0 }& b3 i
{0 a, l- l  X$ u+ [7 K
//--- check symbol, period, create model
' Z. O6 ], ^5 a& Kif(!CModelSymbolPeriod::CheckInit(symbol,period,model_eurusd_D1_10_class))/ X2 G% r" x2 l5 b0 x5 P1 X
{
9 s/ c9 q; }. k  E4 HPrint("model_eurusd_D1_10_class : initialization error");7 W3 R* W8 h; y- z2 r0 s9 t
return(false);
8 t2 y4 X6 |! M1 n8 ~! b+ }}
9 [( Y& O1 v& o1 d- ?  {# B/ P6 y//--- since not all sizes defined in the input tensor we must set them explicitly9 j; o% h+ }3 c' [
//--- first index - batch size, second index - series size, third index - number of series (OHLC)$ L+ U/ ?  C) m  F5 j: D4 h* n
const long input_shape[] = {1,m_sample_size,4};* Q" k- w+ y  e
if(!OnnxSetInputShape(m_handle,0,input_shape))
% d/ r. X, ?( z) x, Z, C- v{
0 d9 R- ~) Q9 U5 Y  MPrint("model_eurusd_D1_10_class : OnnxSetInputShape error ",GetLastError());7 b5 c9 {! O6 t6 `4 h3 w0 o3 u
return(false);0 C& k6 @  F. a' Z- ?  M) Q
}
* z0 h& q6 Z" {& {//--- since not all sizes defined in the output tensor we must set them explicitly
0 o  z! A& E( p, S4 G0 b//--- first index - batch size, must match the batch size of the input tensor
* R/ G4 U- T, h3 U$ G" [//--- second index - number of classes (up, same or down)% B5 C1 r7 @: l; A6 O% g6 |
const long output_shape[] = {1,3};, t( i2 I# h1 d1 o
if(!OnnxSetOutputShape(m_handle,0,output_shape))) B/ z" p7 H& {3 c  \
{/ v0 S) g* R3 H: B+ a7 C1 j: `
Print("model_eurusd_D1_10_class : OnnxSetOutputShape error ",GetLastError());7 Y$ K. _# l2 X7 s3 x
return(false);2 P; X) ]2 ?8 X; x
}
5 Z. w: E- R$ Z3 v) ?: K//--- ok
& i% M! [% A% ?) Dreturn(true);. h8 O" c( Y, v0 d' a
}
4 q$ g' c2 o; [//+------------------------------------------------------------------+
# U. b% e1 K4 X/ _+ f9 x6 |$ o//| Predict class                                                    |6 }5 W" V) Q% j* F& L  L! M/ o
//+------------------------------------------------------------------+# u  n$ P# @% K& f
virtual int PredictClass(void)
" ]' K& V+ C& q/ v0 }" o' O8 q9 ^{
http://www.simu001.cn/x287997x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-7-4 12:00 , Processed in 0.375880 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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