私募

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

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

[复制链接]
发表于 2024-4-4 08:03:20 | 显示全部楼层 |阅读模式
1. 我们会用到什么模型呢?
1 f" E. M) m, J在之前的投票分类器中,我们用到了一个分类模型和一个回归模型。 在回归模型中,我们在用于计算分类时,用预测价格替代预测价格走势(下跌、上涨、不变)。 然而,在这种情况下,我们不能依据分类得到概率分布,而对于所谓的“软投票”这样是不允许的。
( n/ }' j/ g5 v" k我们已准备了 3 个分类模型。 在“如何在 MQL5 中集成 ONNX 模型的示例”一文中已用到两个模型。 第一个模型(回归)被转换为分类模型。 基于 10 个 OHLC 价格序列进行了培训。 第二个模型是分类模型。 基于 63 个收盘价序列进
- }1 v! T# l/ N" y  G% `4 V( H//|                                             https://www.mql5.com |, a: g1 o5 ^5 d- n# ?( j
//+------------------------------------------------------------------+4 [1 g1 x9 S' s6 F5 Q8 K
//--- price movement prediction" j8 B7 a4 i" Y4 }
#define PRICE_UP   0
% H, C& P. @7 U4 }( f#define PRICE_SAME 1
- l7 @! s, X2 p8 X  @1 g7 Z#define PRICE_DOWN 2
0 L1 q& x  D9 s3 K//+------------------------------------------------------------------+: D! s( [9 i7 n. s4 e* [9 }, {
//| Base class for models based on trained symbol and period         |3 e/ Q1 k( V4 ]( f0 W
//+------------------------------------------------------------------+
2 W( }# c% }' ~. t$ Wclass CModelSymbolPeriod6 A1 @$ V- J% T' V/ }; Z  z
{
; v( _3 i( K* ~9 a1 e; Dprotected:. i4 j% h: _' s  g# i
long              m_handle;           // created model session handle' U& k$ U/ i' L
string            m_symbol;           // symbol of trained data
: Y- ~7 U5 f1 X( r: r- _' B5 pENUM_TIMEFRAMES   m_period;           // timeframe of trained data6 G. e  J# x6 S+ U" S3 L: R: z* \
datetime          m_next_bar;         // time of next bar (we work at bar begin only)
3 ?; W5 m$ p! z3 odouble            m_class_delta;      // delta to recognize "price the same" in regression models# s9 P; X$ ]5 S) R
public:- ]7 I& f8 L$ L( D
//+------------------------------------------------------------------+/ p7 ^5 f2 [' E1 F
//| Constructor                                                      |) t  t4 S4 V, \, J/ w/ R' X' Q
//+------------------------------------------------------------------+) S/ G( I* c1 J6 G$ G4 j
CModelSymbolPeriod(const string symbol,const ENUM_TIMEFRAMES period,const double class_delta=0.0001)7 Z" W6 b: g% N/ g1 P  @# L$ ~+ ]
{8 Z/ O. ?7 G9 z+ T7 G1 y; ^
m_handle=INVALID_HANDLE;5 G" }0 Y9 w! l. T+ q  G
m_symbol=symbol;
* s- O( X) R3 b& T+ Sm_period=period;& k( t8 l3 S' Q( C
m_next_bar=0;1 p) y2 {4 G& Q  J
m_class_delta=class_delta;- ?- }1 L+ a1 M
}! F: k- X& Z6 \8 e7 o9 T# O
//+------------------------------------------------------------------+
. j0 e* \+ Z( e( V+ q$ i/ I//| Destructor                                                       |
% n9 ?* ~: }/ S6 G+ }//| Check for initialization, create model                           |4 P5 D+ {5 P$ m: q8 f8 |; S) N- C
//+------------------------------------------------------------------+
0 \- g' s4 |' q, Q- b$ o' fbool CheckInit(const string symbol,const ENUM_TIMEFRAMES period,const uchar& model[])( }, q' o; l1 A& p* E4 \8 R
{
) s; k4 Q+ j4 e- F//--- check symbol, period
) s; A- [1 K7 F8 b+ vif(symbol!=m_symbol || period!=m_period)/ X3 J) B  {" H. G* w
{) }6 b* j  p: Z. k- z9 L
PrintFormat("Model must work with %s,%s",m_symbol,EnumToString(m_period));+ @7 u& e9 l& v" H8 p1 m
return(false);/ ~' ~$ u+ r& j" J/ F) t! y
}
' N& F5 p0 v, H1 j' u, s) u//--- create a model from static buffer/ A7 z1 H# i9 v0 B
m_handle=OnnxCreateFromBuffer(model,ONNX_DEFAULT);
: }3 H! |) I- h+ Bif(m_handle==INVALID_HANDLE)
8 e; S' o8 p/ W1 `8 A{
( G4 w' s0 g* P* o8 h% cPrint("OnnxCreateFromBuffer error ",GetLastError());# p- I; q/ o7 T* Z0 T. Q
return(false);
# A+ [( \: n0 c) M! p}4 z+ Q& w" G( E$ t4 {- c
//--- ok/ `  U% j. U. l7 E1 ^
return(true);" ]( l- o0 O5 p  T
}8 `: Q5 k% X2 v5 Q+ f4 w/ N
//+------------------------------------------------------------------+8 q2 ], b% e$ f" N: `, _
m_next_bar=TimeCurrent();2 S9 o2 m& ~, u4 ]' p4 }
m_next_bar-=m_next_bar%PeriodSeconds(m_period);
3 U  U( f$ z) `1 p+ c2 p' Qm_next_bar+=PeriodSeconds(m_period);' f8 ~9 C3 h$ w, c7 [
//--- work on new day bar
2 h- G+ V: E+ {3 X2 ]+ B: a! areturn(true);- p% Z5 L& J+ n" q, o) Z& r: n0 M
}8 P- l8 w) K! u* }7 A4 p$ D
//+------------------------------------------------------------------+
* T. m. I+ L. u, ]+ A- G+ q//| virtual stub for PredictPrice (regression model)                 |' w( O0 F  o* p: y* G9 e, o: a# o
//+------------------------------------------------------------------+  A) x# A: R& c3 B! B
virtual double PredictPrice(void)
3 _! ^9 i& C3 \- n% ?{
  \3 Z2 y5 Y' h' f& Oreturn(DBL_MAX);0 x- a" e! I% M
}
) P: ~/ t9 Q1 v//+------------------------------------------------------------------+# T+ o% r8 ~4 X
//| Predict class (regression -> classification)                     |
+ e; `2 E% a; S' D- P( |0 b3 F//+------------------------------------------------------------------+
. v/ a) e" x% P- avirtual int PredictClass(void)
. C( B& B8 K' `{6 B" o2 I; S) d
double predicted_price=PredictPrice();) g! x# s: g4 Q$ A1 E
if(predicted_price==DBL_MAX)3 [% Y6 G. k/ D0 S# }
return(-1);- c4 \5 |( ]9 s# w0 ?
int    predicted_class=-1;* k' a9 z) u0 J4 R  m
double last_close=iClose(m_symbol,m_period,1);
) R: e4 @4 I+ y. a% U4 k) [//--- classify predicted price movement. D; c3 X5 q& d6 X4 I
double delta=last_close-predicted_price;" {: {- \  Z5 E- m4 ~
if(fabs(delta)<=m_class_delta)& W$ k0 |" x- F; D- O
predicted_class=PRICE_SAME;
& p- R0 Q* b& \6 g+ F2 m2 relse
( K4 L9 G5 B% f3 L) z* Dprivate:" U  @* M: g3 A1 o2 R: v
int               m_sample_size;
6 E* r. T2 p7 J; J1 y9 o3 e//+------------------------------------------------------------------+- C" h# n0 n; `. t7 U8 \. p, G3 I
virtual bool Init(const string symbol, const ENUM_TIMEFRAMES period)
1 j' C. c& G3 Y5 B1 I6 h* b{
+ l1 o; s0 Q4 O  I1 J3 s//--- check symbol, period, create model3 d6 @6 u, k7 s3 l( N/ a8 P
if(!CModelSymbolPeriod::CheckInit(symbol,period,model_eurusd_D1_10_class))" a0 \1 ~9 r8 h" s; \3 v; y
{4 v( S) g" ]3 h+ V' P: r7 \7 H) [3 O
Print("model_eurusd_D1_10_class : initialization error");" d( z6 K& ~3 H' q* Y! m1 |
return(false);
; F3 F6 t' `) ~/ c& `}$ d. ]+ P, L4 @2 a' [3 a8 Q
//--- since not all sizes defined in the input tensor we must set them explicitly0 _( N) Y5 t! a% D3 X# h  H! W! ~9 r
//--- first index - batch size, second index - series size, third index - number of series (OHLC)5 t% S: Y) \) o- C6 A7 t
const long input_shape[] = {1,m_sample_size,4};8 o7 Y3 ^; [. b
if(!OnnxSetInputShape(m_handle,0,input_shape))
8 E+ `' R" M8 M{
, P* I6 t1 y. y# e& ]- T' IPrint("model_eurusd_D1_10_class : OnnxSetInputShape error ",GetLastError());
' G  M/ c8 s4 }& m& m* [return(false);
6 G; [" ?( M' K% h}
) Z9 j1 w1 E- K. @//--- since not all sizes defined in the output tensor we must set them explicitly
# M* r! k! M4 ~% |+ i7 G//--- first index - batch size, must match the batch size of the input tensor
- E0 y3 h7 x8 X; ?) k% B6 V, K//--- second index - number of classes (up, same or down)6 e6 U$ V& V3 N# N. l7 h' h
const long output_shape[] = {1,3};- K8 {1 @" ^& r1 M8 _" b6 x
if(!OnnxSetOutputShape(m_handle,0,output_shape))
0 s& M! D9 u6 q9 n1 @! t$ j( G0 E# l{$ @4 p+ s) g7 e3 Z; d- T
Print("model_eurusd_D1_10_class : OnnxSetOutputShape error ",GetLastError());1 M# K. Y* \2 {' M& a% W1 F
return(false);
0 n$ [, {+ l# S% K: g( o8 s}: T2 k$ B2 o* W5 @' R+ M2 L
//--- ok
2 [  e* ^  p. f0 e1 C5 S) [/ |return(true);
) s2 Z) @; W' N% \}/ r( U4 L% V  H& c; B
//+------------------------------------------------------------------+, ~1 t; D  E  y2 V
//| Predict class                                                    |
! |* k/ `6 a7 M  B& B0 N//+------------------------------------------------------------------+
1 m, B& W3 }* p$ ^' A$ Avirtual int PredictClass(void)6 n3 c. w, x) P
{
http://www.simu001.cn/x287997x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-9 07:10 , Processed in 0.662527 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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