私募

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

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

[复制链接]
发表于 2024-4-4 08:03:20 | 显示全部楼层 |阅读模式
1. 我们会用到什么模型呢?+ K3 z, v( x% I# {. I' H$ C
在之前的投票分类器中,我们用到了一个分类模型和一个回归模型。 在回归模型中,我们在用于计算分类时,用预测价格替代预测价格走势(下跌、上涨、不变)。 然而,在这种情况下,我们不能依据分类得到概率分布,而对于所谓的“软投票”这样是不允许的。5 j" j0 w* J$ Z" z% @8 S
我们已准备了 3 个分类模型。 在“如何在 MQL5 中集成 ONNX 模型的示例”一文中已用到两个模型。 第一个模型(回归)被转换为分类模型。 基于 10 个 OHLC 价格序列进行了培训。 第二个模型是分类模型。 基于 63 个收盘价序列进
/ W7 V% K8 @" c3 V# L2 F: }//|                                             https://www.mql5.com |
! f2 n5 D4 y( V% Q1 M% r; R//+------------------------------------------------------------------+
$ ?2 a6 G3 f+ h7 \! K9 L- g6 m//--- price movement prediction
. c, M0 B: I& o. G#define PRICE_UP   0
9 Q+ p$ [6 v( W8 u! n) A#define PRICE_SAME 1
; C2 b# q7 q' n" H7 O- Y#define PRICE_DOWN 2
# d: F% p3 o. [8 k//+------------------------------------------------------------------+
) H, X% x) d2 D& |: U( D9 k//| Base class for models based on trained symbol and period         |
) a& L! L# w" ^$ L. T* ]! C//+------------------------------------------------------------------+$ p4 f1 F9 ?( E" o
class CModelSymbolPeriod
) K. i4 d9 t2 p/ {, I+ L6 j7 n& q' A{
/ |# a8 n. w3 F) N0 t) Lprotected:$ j1 H& g& Z8 L$ t$ F; M& u
long              m_handle;           // created model session handle0 N, g2 I1 _" e: k2 X8 |* a+ T
string            m_symbol;           // symbol of trained data
0 \6 H( D% ]8 v; h6 |& c& XENUM_TIMEFRAMES   m_period;           // timeframe of trained data: b' ~6 r! t& V, d1 i6 U6 d* ^: B! R
datetime          m_next_bar;         // time of next bar (we work at bar begin only)/ K$ ^; d/ m8 E
double            m_class_delta;      // delta to recognize "price the same" in regression models/ M+ O* g6 E" v+ \( ~, D
public:
" \/ w- d/ ~  S) B5 e3 o$ o//+------------------------------------------------------------------+) ^: `2 j* G, ^+ G' C. `
//| Constructor                                                      |
( v2 k% y) G1 w# `) [6 C% C% W//+------------------------------------------------------------------+4 L! ?4 o3 o7 S& Q8 \
CModelSymbolPeriod(const string symbol,const ENUM_TIMEFRAMES period,const double class_delta=0.0001)# B5 ]# ]$ y, f" ?
{  s% C; {# N) |. [& A: f9 Z
m_handle=INVALID_HANDLE;
9 T, S* K. x$ S; Im_symbol=symbol;
- F: o2 H2 g$ Z  i# n+ Cm_period=period;
! n. m" T  n% i, f: }m_next_bar=0;
" u* d# n) ~6 d4 a7 d* Lm_class_delta=class_delta;* T: p; M4 ^( `6 _! \
}$ I. t5 h' l) Q6 Z
//+------------------------------------------------------------------+
, D# R8 b9 O: P1 Q$ \& t//| Destructor                                                       |% T2 \/ B+ s1 H% C3 l8 A& X# s5 x. i
//| Check for initialization, create model                           |) \1 L* F; A! ~9 m+ J! O3 j
//+------------------------------------------------------------------+0 j5 H% z$ w& [; [" E
bool CheckInit(const string symbol,const ENUM_TIMEFRAMES period,const uchar& model[])
" D6 F4 M; j+ P& n! ]{. c2 h- t! E3 T' s7 j
//--- check symbol, period
  C0 S3 W; Y  Kif(symbol!=m_symbol || period!=m_period)0 X# D" Q- y; Z; \# j- L) C! L
{: J& `9 g* ?/ y2 q4 V6 }1 b9 s
PrintFormat("Model must work with %s,%s",m_symbol,EnumToString(m_period));: u/ f) e( X7 c5 T
return(false);6 P* X# H: g6 {7 o2 f9 @
}" I5 s7 l0 z4 F9 Q
//--- create a model from static buffer
* `) X/ I+ E& P& z$ P, O" Em_handle=OnnxCreateFromBuffer(model,ONNX_DEFAULT);
3 k' b& L9 y7 n8 c+ I5 t6 `if(m_handle==INVALID_HANDLE)7 c+ t5 U9 N+ Z9 L
{
2 Z: |) y  T/ ~$ T" N" L: rPrint("OnnxCreateFromBuffer error ",GetLastError());. V/ h4 ?! a5 I
return(false);! W& N3 K/ W4 T) }) Q+ M
}
0 g3 W; R# X7 }. w) g# n! x. b//--- ok" g# S* S/ ^3 }/ _6 r9 L% L
return(true);
; [1 I, t# y; P6 k' z: T}
+ A$ |- k' F, K% a# p//+------------------------------------------------------------------+
. A; o: }. k3 A2 I, Q0 u9 S' Cm_next_bar=TimeCurrent();1 m) h6 V  ?- U" Y. B
m_next_bar-=m_next_bar%PeriodSeconds(m_period);! Q6 D9 k! C' r/ a
m_next_bar+=PeriodSeconds(m_period);
7 T% r3 u6 k( U. i+ ?//--- work on new day bar
  A# D: k9 X9 b- G0 Z" t& R+ ^! }return(true);" v0 i, V5 Y: R% R1 G
}% e6 Z$ Q' L/ q( [
//+------------------------------------------------------------------+7 ~) M! E5 W# h7 y4 U
//| virtual stub for PredictPrice (regression model)                 |7 X. m# I( N, |9 ^5 z" s
//+------------------------------------------------------------------+  f) w+ m7 A7 n: K1 |' S% h
virtual double PredictPrice(void). ?( L) Z! w1 T2 N% `
{# I1 Z" p1 C7 V
return(DBL_MAX);; ^% _/ v8 E6 r6 B9 z4 N
}. ]& E9 d( W/ h7 Y( O& H
//+------------------------------------------------------------------+
3 E; V; X/ r7 F8 F* R: R1 j7 L( W//| Predict class (regression -> classification)                     |' v4 j6 x2 Y- H& y, ~' R% g. W& I
//+------------------------------------------------------------------+: d6 s. `3 y! l+ A  i& m& G. m
virtual int PredictClass(void)& P% s+ A! u' _  C+ v5 e9 ^1 g7 Y
{
/ P; Z7 z9 W* {( J$ [double predicted_price=PredictPrice();% p" C' w  T4 p
if(predicted_price==DBL_MAX)
, p4 I$ B% `8 M1 |return(-1);
/ @, s  ]$ v" y  Q5 c: y% E7 gint    predicted_class=-1;
$ H7 E5 {, K  r8 u/ Rdouble last_close=iClose(m_symbol,m_period,1);9 O$ c* q* Z# ?/ b- {  `
//--- classify predicted price movement
' B$ I  @+ ^: f3 m) A9 wdouble delta=last_close-predicted_price;
0 U" [, M$ ?7 _1 {if(fabs(delta)<=m_class_delta)
+ q/ F" W3 @% I" }: X, npredicted_class=PRICE_SAME;: g  n0 z# V' M( D& j
else$ C* D  z8 N! r( Y6 C3 v
private:& w' Q* ]/ I9 m" U) ^! ^
int               m_sample_size;) [; M& h) ^: H. B# g
//+------------------------------------------------------------------+- }( f4 ?9 j- t) q3 J4 w) {7 @" n
virtual bool Init(const string symbol, const ENUM_TIMEFRAMES period)- _  C3 P' n" O4 T
{
* W8 O8 }8 u' z/ X//--- check symbol, period, create model2 H9 [/ I) x- K+ g- \
if(!CModelSymbolPeriod::CheckInit(symbol,period,model_eurusd_D1_10_class))+ ?8 L, D# j. o1 X) i4 k" ]  `
{
* M! ]  j0 q% R" [# W3 X5 m5 dPrint("model_eurusd_D1_10_class : initialization error");0 E  q; @% `9 y
return(false);+ v2 Q  @9 b& h; r9 j0 S
}
7 P& E  M7 w! T; `: q/ P//--- since not all sizes defined in the input tensor we must set them explicitly
  G' ^# {9 ^) E6 m2 G- f8 z//--- first index - batch size, second index - series size, third index - number of series (OHLC)
: G  v: P" o- J* M. T* L  k: |const long input_shape[] = {1,m_sample_size,4};* o$ B% E8 H  s; t! N9 C
if(!OnnxSetInputShape(m_handle,0,input_shape))
0 Z  j& r7 x) r* p1 }! G{
8 Z0 R3 z% d8 Y/ q' ?: }Print("model_eurusd_D1_10_class : OnnxSetInputShape error ",GetLastError());
1 t6 o. Y( _0 e- e$ M' Sreturn(false);
( j; J, b2 r& O, z! c* j}( e3 C( M  n& m; O# s
//--- since not all sizes defined in the output tensor we must set them explicitly5 d" M  i; P  D; ^4 M0 O( A
//--- first index - batch size, must match the batch size of the input tensor
4 M& u- a) J5 h" n//--- second index - number of classes (up, same or down)  k6 f' t! t7 e' T% y  v0 j1 v/ z* {' H
const long output_shape[] = {1,3};
5 o" T1 s' I/ Xif(!OnnxSetOutputShape(m_handle,0,output_shape))7 X5 c# z# ], r& {, {9 h; T
{
: j  |+ A+ ~; z* i) I) fPrint("model_eurusd_D1_10_class : OnnxSetOutputShape error ",GetLastError());/ k6 c' q: y" \2 k: |
return(false);
# ]% K! T! [9 `}
; _. u5 z2 u0 u+ R9 H) ?; t//--- ok
0 H6 `" W( W! }8 ?. Z8 [return(true);. i8 b/ q" z/ U# T) g/ t) W  Z
}& C9 m% v8 H1 ^5 |) Y
//+------------------------------------------------------------------+
* G, H) ?2 ?  h2 P, Y) h! L//| Predict class                                                    |0 _1 v  E/ M( ?/ z  f
//+------------------------------------------------------------------+' z8 t- s# H0 W
virtual int PredictClass(void)2 m5 F9 L( w. |' K
{
http://www.simu001.cn/x287997x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-26 15:52 , Processed in 2.424841 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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