私募

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

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

[复制链接]
发表于 2024-4-4 08:03:20 | 显示全部楼层 |阅读模式
1. 我们会用到什么模型呢?
$ [; @4 ~/ H' o! M4 [在之前的投票分类器中,我们用到了一个分类模型和一个回归模型。 在回归模型中,我们在用于计算分类时,用预测价格替代预测价格走势(下跌、上涨、不变)。 然而,在这种情况下,我们不能依据分类得到概率分布,而对于所谓的“软投票”这样是不允许的。: A$ ^9 B8 L) x$ w
我们已准备了 3 个分类模型。 在“如何在 MQL5 中集成 ONNX 模型的示例”一文中已用到两个模型。 第一个模型(回归)被转换为分类模型。 基于 10 个 OHLC 价格序列进行了培训。 第二个模型是分类模型。 基于 63 个收盘价序列进: ^% L& v4 c0 p* u' m4 [
//|                                             https://www.mql5.com |; a1 Z( a- @* r1 g
//+------------------------------------------------------------------+2 Z/ I' W3 N9 ^1 ?
//--- price movement prediction" r6 H1 R; }2 y1 e1 U
#define PRICE_UP   0
. I( L9 r/ Z  N# X% J#define PRICE_SAME 19 m* I& |# b" n
#define PRICE_DOWN 2
) H, V* d! x/ |) L; K$ w$ Z3 q//+------------------------------------------------------------------+: S+ F9 D& E# |- b
//| Base class for models based on trained symbol and period         |
  Y2 R- f6 {5 j9 s//+------------------------------------------------------------------+$ Y: l3 I4 F3 k/ i0 B* k& Z
class CModelSymbolPeriod
/ E$ b4 }$ ~2 {* t6 t* w{& Z5 Z: O& }2 I
protected:2 Y9 |' M  C" @# {. R
long              m_handle;           // created model session handle5 [2 ^( `+ {9 Q; r! `( I
string            m_symbol;           // symbol of trained data1 M2 d6 U/ G& A- @$ j
ENUM_TIMEFRAMES   m_period;           // timeframe of trained data3 W0 S& u6 X5 w6 _) f6 I
datetime          m_next_bar;         // time of next bar (we work at bar begin only)8 n0 `8 s. i9 x
double            m_class_delta;      // delta to recognize "price the same" in regression models6 t4 x, b5 ]; v9 T  Y, u  _
public:
5 l8 s; c) d5 ]9 m//+------------------------------------------------------------------+: ?" ~; `; P3 a: o& c. _
//| Constructor                                                      |# U7 o& q8 u) t4 Y9 g7 G8 u
//+------------------------------------------------------------------+
% v, S9 C0 ]0 x2 O* y, bCModelSymbolPeriod(const string symbol,const ENUM_TIMEFRAMES period,const double class_delta=0.0001)  h; d; L+ c7 h6 t0 g1 n( k# h
{
& T, m4 G8 H- i, ?1 `m_handle=INVALID_HANDLE;# ]) r7 ?2 z" P5 D& ]
m_symbol=symbol;
' x# d9 m$ S0 T2 U% N8 Bm_period=period;- `: _1 J6 x2 Q& T: o
m_next_bar=0;9 I( E1 G9 q; ^6 \% G* V# ~  E) f- p
m_class_delta=class_delta;) ?; w8 l2 L; H9 O2 n
}
$ B% }" D3 f+ t. [$ U//+------------------------------------------------------------------+
5 B" [* F6 q- G' M  Y- Q//| Destructor                                                       |
& ~# [+ Y) t: n# e' g& i//| Check for initialization, create model                           |
; H4 c. L0 Z3 a; K3 m//+------------------------------------------------------------------+
6 z: E2 Q+ l$ D2 Obool CheckInit(const string symbol,const ENUM_TIMEFRAMES period,const uchar& model[])
3 [& V- N% K3 U! T8 f: {{
$ i" Z" K; g9 v+ s//--- check symbol, period
6 }) H- ?" ^$ X/ L; C" w; Cif(symbol!=m_symbol || period!=m_period)) K: J8 P4 L  G# |$ u. N% X
{
# R3 \" D% Y4 ?6 K2 _PrintFormat("Model must work with %s,%s",m_symbol,EnumToString(m_period));( l1 H; A' v# P" o( p; g
return(false);7 I6 ?- v: y' e% V% r. Z3 R
}
4 r! m+ [% H* J- b" L; H//--- create a model from static buffer
# [6 n/ o0 S6 u" Cm_handle=OnnxCreateFromBuffer(model,ONNX_DEFAULT);
& F- m4 f3 w1 y' dif(m_handle==INVALID_HANDLE)  c+ X. L2 W$ m& r( M, \
{
7 v& C- _+ _- d, Z7 \$ H, bPrint("OnnxCreateFromBuffer error ",GetLastError());  P; V+ d! _. q0 n2 e, }, f4 S
return(false);
9 \8 d0 X$ |0 x. k; N3 ]' E( i8 B}
% \5 w1 T. j  J//--- ok
2 V% Z. k$ q4 b# Y3 {return(true);# r/ @7 N! _# g. t, H
}8 u4 _3 U. T& ]
//+------------------------------------------------------------------+$ \: B3 |& {# T# a. S! [' q! F
m_next_bar=TimeCurrent();& p) |: r/ v& a  W  E3 r
m_next_bar-=m_next_bar%PeriodSeconds(m_period);
% C& k4 l/ g, gm_next_bar+=PeriodSeconds(m_period);: a6 r. z0 a+ M% ]" P
//--- work on new day bar# I' ~* s1 d! ~* X7 ^. w4 j3 u
return(true);
1 m: P4 D( _% n! R, x0 N}8 j2 A) y( V) t; u. }, t
//+------------------------------------------------------------------+
4 `. x, F% G6 C, E9 G" S, R//| virtual stub for PredictPrice (regression model)                 |. V6 V. d. V) B' |% h5 ^4 o4 R1 r
//+------------------------------------------------------------------+
- W4 f2 g3 h) I6 P6 x0 Zvirtual double PredictPrice(void)
. v2 r% b: T1 j" A3 J7 Z& W{/ X  x8 P6 r5 `& x& o
return(DBL_MAX);3 L) V% W3 T+ F- N: O3 \
}
* }0 g5 }5 v  n" S+ L' Y//+------------------------------------------------------------------+0 j- F3 e7 X& o1 B+ L% Q
//| Predict class (regression -> classification)                     |. \, A+ a0 T/ U+ B- s( Q6 f
//+------------------------------------------------------------------+! F% f, T3 o. E+ W. ]7 j
virtual int PredictClass(void)
9 S4 s* m+ W; h/ B{+ z$ {) ]# {9 A; A# l9 A
double predicted_price=PredictPrice();
# q) c" y- ~* m7 H% c) @if(predicted_price==DBL_MAX)5 D4 @. H: L5 ~- p" p! N  h( P; i" H
return(-1);7 H9 v, [" k2 p9 R
int    predicted_class=-1;
/ a3 k) s7 K* [$ I( ^8 B6 i' Ldouble last_close=iClose(m_symbol,m_period,1);' t! b% M1 l. @
//--- classify predicted price movement
. Q8 C+ Q; k- \+ b# Q3 udouble delta=last_close-predicted_price;7 O3 ]) i6 f$ V' P) b* V2 `
if(fabs(delta)<=m_class_delta)
* _) ]/ H" f! w; L7 s8 ~predicted_class=PRICE_SAME;1 |, ]- F8 Y; A( q: Q% O% j$ c
else
4 {+ M& j8 N& y* `/ N" m  g% Mprivate:, F! G$ D& \4 j8 R
int               m_sample_size;6 \$ U+ X+ `; ?' R+ b
//+------------------------------------------------------------------+
! B; V' Y9 ^( n. rvirtual bool Init(const string symbol, const ENUM_TIMEFRAMES period)
" z0 X" b1 `) _) j; m: k& j6 J{
( Q# Z" i8 r$ n. \, @0 T//--- check symbol, period, create model& |7 n" @& |: S' G% L* x) k
if(!CModelSymbolPeriod::CheckInit(symbol,period,model_eurusd_D1_10_class))# j  \& z  x7 m
{% b* `0 o1 x  ~: `3 l1 k8 P. v3 j. I
Print("model_eurusd_D1_10_class : initialization error");9 K5 o$ }9 g1 Y
return(false);
9 Y& I  S; e5 m# b}0 D/ r% U' W4 E$ {( @) u
//--- since not all sizes defined in the input tensor we must set them explicitly% Z- C- B: {6 f" i
//--- first index - batch size, second index - series size, third index - number of series (OHLC)
  c7 B" ?3 |' _5 E1 n% Cconst long input_shape[] = {1,m_sample_size,4};
1 j" m2 i$ z% ~3 t* hif(!OnnxSetInputShape(m_handle,0,input_shape))
9 H4 M, G! Q3 A$ T& O8 e{
6 G( j/ }) Q" @1 B$ I; QPrint("model_eurusd_D1_10_class : OnnxSetInputShape error ",GetLastError());8 D7 Y* o# A: c  s% z8 E4 i
return(false);
9 a: t' F) X5 Z6 Q% P2 v3 [) o}# V# Y6 H$ N6 i- q  x& U
//--- since not all sizes defined in the output tensor we must set them explicitly7 Z3 S* }3 S. Z2 _6 k( S9 B
//--- first index - batch size, must match the batch size of the input tensor' L4 U, Z( Y2 b. Y, S
//--- second index - number of classes (up, same or down)7 o0 t8 @5 ]  P9 p& B
const long output_shape[] = {1,3};
% A( p9 V% a7 S+ a- f" w# r% Fif(!OnnxSetOutputShape(m_handle,0,output_shape))' t. C- L' Z+ i
{: H1 D/ m0 N0 H0 F8 X  a6 F
Print("model_eurusd_D1_10_class : OnnxSetOutputShape error ",GetLastError());8 H+ M5 B+ m5 v9 z& U$ C1 a
return(false);, V* Q! ]$ S1 r7 R
}" ?* A2 k1 A* D
//--- ok* [5 e6 F4 ?1 C+ R4 Y
return(true);
# \/ D9 C4 x+ `: i% e}
6 O* a/ C9 v7 B6 g) O2 G//+------------------------------------------------------------------+9 |" W% ~9 g0 _" C
//| Predict class                                                    |: U. M' D3 D+ [( F. C
//+------------------------------------------------------------------+! n4 v1 e" ~+ t0 L" V
virtual int PredictClass(void)
0 M- t1 h3 x# y{
http://www.simu001.cn/x287997x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-29 17:58 , Processed in 0.611904 second(s), 32 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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