私募

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

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

[复制链接]
发表于 2024-4-4 08:03:20 | 显示全部楼层 |阅读模式
1. 我们会用到什么模型呢?
8 _. n4 ?+ ^5 g在之前的投票分类器中,我们用到了一个分类模型和一个回归模型。 在回归模型中,我们在用于计算分类时,用预测价格替代预测价格走势(下跌、上涨、不变)。 然而,在这种情况下,我们不能依据分类得到概率分布,而对于所谓的“软投票”这样是不允许的。, I* J& S( d9 G9 K9 T: e6 _
我们已准备了 3 个分类模型。 在“如何在 MQL5 中集成 ONNX 模型的示例”一文中已用到两个模型。 第一个模型(回归)被转换为分类模型。 基于 10 个 OHLC 价格序列进行了培训。 第二个模型是分类模型。 基于 63 个收盘价序列进
! z/ j* H2 w& s9 j  I//|                                             https://www.mql5.com |1 p- \0 r& ~& o3 }( o. t
//+------------------------------------------------------------------+
1 n4 I. O# _- j) i9 i//--- price movement prediction
' x. {1 T+ k0 \9 |/ |8 v#define PRICE_UP   0
2 H3 v2 f/ Q" T#define PRICE_SAME 1
3 l9 t# u& ~) m8 k# `+ O#define PRICE_DOWN 2: y& f  ^, D" U
//+------------------------------------------------------------------+/ ]: P8 R" Z8 |; \. k
//| Base class for models based on trained symbol and period         |
. k/ ^/ d3 T& a+ V' a% D1 X//+------------------------------------------------------------------+
. o& V! j: j( T: L% V9 _! \. wclass CModelSymbolPeriod% Z* H+ z9 Q6 `
{' F/ @  {& h: X" v/ p! L
protected:* g# @! G2 S4 l8 F
long              m_handle;           // created model session handle# V0 k& P( t2 u- o! F& a  T" s/ Q! H5 B
string            m_symbol;           // symbol of trained data
. \% j1 v3 _, eENUM_TIMEFRAMES   m_period;           // timeframe of trained data) |, U1 K+ h. a9 @! W
datetime          m_next_bar;         // time of next bar (we work at bar begin only)
) r7 D+ O" v# L/ `double            m_class_delta;      // delta to recognize "price the same" in regression models6 w6 z/ O  R' \2 F: ]# d
public:, ^" [  r% d' j, q8 u& C
//+------------------------------------------------------------------+
. K1 w1 D. r$ n& X0 P1 k0 o//| Constructor                                                      |* f9 k' x* F# _. L% a  A) {, v
//+------------------------------------------------------------------+: [( y9 m* @  p" M! w0 D
CModelSymbolPeriod(const string symbol,const ENUM_TIMEFRAMES period,const double class_delta=0.0001)
2 h6 n8 H. ]1 r' ^& b. B' s9 b{/ _3 S0 \( u" s/ A7 a) }+ C
m_handle=INVALID_HANDLE;
; R' o% ~- o; u. i' M3 {. d& ~6 Im_symbol=symbol;. `' b/ m1 S' t- X, j0 w0 s+ ^
m_period=period;
7 B- g1 k8 }* @  nm_next_bar=0;
$ K% p9 v+ @' K: q$ ]; }! cm_class_delta=class_delta;7 A1 \5 o; `4 P' p: Z
}
4 i: |/ C. K5 P* ^0 X' F//+------------------------------------------------------------------+0 R2 ?& y; |, @* a- L9 q
//| Destructor                                                       |7 n4 L# U" R2 I' B0 o
//| Check for initialization, create model                           |
" r! r  j  z% g3 l) U- Y( x//+------------------------------------------------------------------+/ F+ a; _4 a  H9 @
bool CheckInit(const string symbol,const ENUM_TIMEFRAMES period,const uchar& model[])
4 M5 {; v1 x. t5 e{( x( |* F' M) Q/ Z4 r6 K6 R0 @
//--- check symbol, period% R* _. e! r  [
if(symbol!=m_symbol || period!=m_period): Y2 @. B: O) N  T1 Y
{
/ h6 }, D& D, z" a6 C# K3 J% ~PrintFormat("Model must work with %s,%s",m_symbol,EnumToString(m_period));
  E- f+ B- v2 l6 oreturn(false);
, \2 Y, b; i- b  Z1 e}
# h8 p' Y* Z7 j6 {//--- create a model from static buffer! s8 ?: L0 E. M; O$ L; j9 A9 ], |
m_handle=OnnxCreateFromBuffer(model,ONNX_DEFAULT);
- A! j% v0 p# Vif(m_handle==INVALID_HANDLE)' D3 v7 T- a9 n3 a' @
{
8 C% }+ M! `. ~0 `- u0 V' jPrint("OnnxCreateFromBuffer error ",GetLastError());
; L, c" t/ K; V5 ^/ X" Jreturn(false);
4 l: e9 L" \. O# _. t7 a' a}( N  M, `9 ~9 a  v* `0 {  ]
//--- ok( D( G5 W. V/ `+ p% C$ @. u+ p4 ]
return(true);2 X) B6 P6 ~" U
}
) C  i; h0 y$ |, @//+------------------------------------------------------------------++ h6 J9 F/ A. F$ X2 ?- J+ Y) j
m_next_bar=TimeCurrent();6 u$ t4 b1 ~7 v
m_next_bar-=m_next_bar%PeriodSeconds(m_period);) r% f. v4 E- Q: o" w) F; v+ a5 u
m_next_bar+=PeriodSeconds(m_period);$ |. n4 Y% q, I) X  X# g& a
//--- work on new day bar
6 ^) y: t% F8 U9 K/ I; C3 hreturn(true);6 x: C9 J. h  U9 X
}
9 X* b* M' X' z  X. D% ^//+------------------------------------------------------------------+2 N6 V/ M# z* Y2 H
//| virtual stub for PredictPrice (regression model)                 |
3 t5 O/ c, R# a//+------------------------------------------------------------------+
& l2 }, x; [, v9 B4 cvirtual double PredictPrice(void)
8 @5 t% A( V. B8 S  a! u{) ^4 c8 }0 T; Q
return(DBL_MAX);& z4 g. C7 ]* ~1 @$ U: o* E
}
0 d* ~" k5 l0 a5 }/ ?9 t) L# l  [, V//+------------------------------------------------------------------+. M  E# C4 E; ?' R
//| Predict class (regression -> classification)                     |8 o# Y! ^$ g' o8 }  Z0 I2 _
//+------------------------------------------------------------------+0 d5 I" x. H# p2 Q( Q+ {+ |
virtual int PredictClass(void)
! h5 e. b& o2 H8 D{; F+ S8 s5 G3 x
double predicted_price=PredictPrice();
! ~7 E; _; q) X# aif(predicted_price==DBL_MAX)
0 b& l: P$ [4 _' {  q) _' preturn(-1);
4 f5 T1 |" o$ S0 t* ]) g4 uint    predicted_class=-1;
( d4 o$ T8 Q1 d+ R5 C8 Ydouble last_close=iClose(m_symbol,m_period,1);5 r$ K7 o5 _7 [2 N
//--- classify predicted price movement1 y" @/ w  `$ i) a$ u+ a' [
double delta=last_close-predicted_price;0 E0 h: [2 Z7 O$ m
if(fabs(delta)<=m_class_delta)
2 y% l9 j/ R' T. E, cpredicted_class=PRICE_SAME;& F/ m3 B& |( j* s& B6 V1 y
else/ M/ u7 W( F0 o- E- |) s
private:% h' }. X  P2 v
int               m_sample_size;# M3 |- u: F6 _# R+ e; @' N$ s1 N& T
//+------------------------------------------------------------------+: C, A4 Z& b, s4 i$ ]
virtual bool Init(const string symbol, const ENUM_TIMEFRAMES period)
/ `# v% I9 n; e3 X+ ?{
4 p5 B* H4 H4 E. `4 ~//--- check symbol, period, create model
/ j1 N* @7 b/ C, [, k9 T6 rif(!CModelSymbolPeriod::CheckInit(symbol,period,model_eurusd_D1_10_class))5 r/ b& k. h3 P  C. f7 O1 |2 ?9 Q
{7 L! Q4 d* a( ~
Print("model_eurusd_D1_10_class : initialization error");, L$ i" N" a) `4 }5 Y
return(false);
2 S# }+ Z3 u6 }) s: N}# K# I. ^) |9 D& i# }' @8 m2 _- s
//--- since not all sizes defined in the input tensor we must set them explicitly
$ G9 O  m* c7 x: e- H" p//--- first index - batch size, second index - series size, third index - number of series (OHLC)
2 ^6 S. B6 i" \: v7 G$ N) G; nconst long input_shape[] = {1,m_sample_size,4};+ _& ?# a% H3 V: L, F+ m. [
if(!OnnxSetInputShape(m_handle,0,input_shape))$ z' w# N# g: b+ I
{
% f! e8 ^2 F1 d$ ]( ~Print("model_eurusd_D1_10_class : OnnxSetInputShape error ",GetLastError());
" f) o- g+ u& @$ H, h4 Qreturn(false);. ]& {1 u. L% D/ a# m
}9 v8 Q' q# }  J0 k6 Q
//--- since not all sizes defined in the output tensor we must set them explicitly: P2 _* r: L! c( }
//--- first index - batch size, must match the batch size of the input tensor
$ o- v* m9 @- `7 Z& g! F1 f$ I//--- second index - number of classes (up, same or down)- ^0 Q3 n8 T$ k+ r/ S, H" d1 x$ }
const long output_shape[] = {1,3};5 {# O$ C! S( }
if(!OnnxSetOutputShape(m_handle,0,output_shape))4 i$ p/ U7 K) `$ J0 q; @9 v7 ]
{1 V8 q7 u- c7 b$ ], [. K& l/ q
Print("model_eurusd_D1_10_class : OnnxSetOutputShape error ",GetLastError());+ p- `; i0 c  w; [
return(false);$ v/ L) g0 k/ Y" _& y0 D
}
2 t' w5 {! T+ W) C' p3 U3 p0 w3 {//--- ok
; c: E2 \7 \& u( ^0 f. C% mreturn(true);
+ e# O$ f& r  M1 N# h: D, ]) W}
# M; r8 b. n/ b//+------------------------------------------------------------------+
4 z3 J2 T0 E1 x//| Predict class                                                    |
& C, f1 _/ ]0 B$ b: i+ d//+------------------------------------------------------------------+
# L. ]! S2 r6 p5 {6 Fvirtual int PredictClass(void)
2 f/ g7 g$ W; q5 M( t{
http://www.simu001.cn/x287997x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-1 23:45 , Processed in 0.452299 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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