私募

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

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

[复制链接]
发表于 2024-4-4 08:03:20 | 显示全部楼层 |阅读模式
1. 我们会用到什么模型呢?
7 I8 c* D( h. K4 A在之前的投票分类器中,我们用到了一个分类模型和一个回归模型。 在回归模型中,我们在用于计算分类时,用预测价格替代预测价格走势(下跌、上涨、不变)。 然而,在这种情况下,我们不能依据分类得到概率分布,而对于所谓的“软投票”这样是不允许的。& B3 g: q  V- j& B, I9 R! {
我们已准备了 3 个分类模型。 在“如何在 MQL5 中集成 ONNX 模型的示例”一文中已用到两个模型。 第一个模型(回归)被转换为分类模型。 基于 10 个 OHLC 价格序列进行了培训。 第二个模型是分类模型。 基于 63 个收盘价序列进
! y0 B* w0 m- ]! a' p4 R& _//|                                             https://www.mql5.com |
, \+ S$ s0 k( R8 f: ]3 D) r//+------------------------------------------------------------------+4 X7 `6 U; z+ x; o- F7 o3 U
//--- price movement prediction
: n' \, j' p& L% a#define PRICE_UP   0% G0 f, P% j( {8 [: t: H8 e
#define PRICE_SAME 10 j! l. b& r1 t* q/ O* H: o$ m
#define PRICE_DOWN 22 ]0 e: T3 ]& {6 T5 I
//+------------------------------------------------------------------+/ C4 A1 P" p& z8 P4 R$ y
//| Base class for models based on trained symbol and period         |
# w" O; j) \) t* j5 O8 v; p//+------------------------------------------------------------------+6 h/ C7 z6 C$ A8 c: s% }& X- O
class CModelSymbolPeriod; G7 i7 R: ]6 C) t6 J! x
{* Q2 H0 U0 A4 y  l
protected:
7 ]0 i; F* k! `: j3 ?long              m_handle;           // created model session handle
. {7 Y) c6 l7 ]string            m_symbol;           // symbol of trained data
" T$ V" o. ?/ ?1 k# XENUM_TIMEFRAMES   m_period;           // timeframe of trained data
0 n& ~1 |; {! T. g0 s: w' A( odatetime          m_next_bar;         // time of next bar (we work at bar begin only)7 H! O( S1 H, J2 n5 z, y  q# _0 I
double            m_class_delta;      // delta to recognize "price the same" in regression models; Z$ S( A% H9 k+ R6 |/ ?
public:# ~4 q3 [) q8 {+ Y# ~2 {; d5 C  W
//+------------------------------------------------------------------+8 D8 j! c  d# v' R# Q
//| Constructor                                                      |$ g" T* [0 |% g4 p: N
//+------------------------------------------------------------------+
5 m' l9 o$ O, X3 i+ a% t) }' UCModelSymbolPeriod(const string symbol,const ENUM_TIMEFRAMES period,const double class_delta=0.0001)4 i  l5 H# S2 a
{- u8 x+ V, u  F5 D( [
m_handle=INVALID_HANDLE;
6 f3 `2 U0 r! L' @5 l  cm_symbol=symbol;
" `+ l8 J9 D  t( w6 G3 ~1 ^6 gm_period=period;
7 H8 r0 l7 x# {1 y4 z4 }$ C9 _m_next_bar=0;
6 h. |# I* w9 w4 z# nm_class_delta=class_delta;
& q. Z3 B% m; Y0 P$ V# q# C}
$ \2 i% F  k; ~: Q1 I! k//+------------------------------------------------------------------+2 b/ ~+ r" C& ]  X1 b
//| Destructor                                                       |  e9 k+ P' Y5 y5 i3 q
//| Check for initialization, create model                           |2 Q9 U: y, p) ^: R1 ?6 L
//+------------------------------------------------------------------+
$ U$ i8 }" ~; P/ |0 r7 D/ d2 e$ @7 tbool CheckInit(const string symbol,const ENUM_TIMEFRAMES period,const uchar& model[])$ r7 k+ M8 `' c, @/ ~% T
{
$ T6 L4 |) _% C6 T( b//--- check symbol, period
. _$ p, v& R4 \5 y3 Zif(symbol!=m_symbol || period!=m_period)
4 r, f7 C% e/ g, V- k/ D: {$ i{
+ }3 O8 w/ f$ f) c# APrintFormat("Model must work with %s,%s",m_symbol,EnumToString(m_period));
! [" I% |- z# |1 ]# U. vreturn(false);& O/ E) j, Q+ _5 o; c' q
}
. Y  ]2 I" }3 @% ^0 O//--- create a model from static buffer
& B& _( H7 Y+ S9 l$ sm_handle=OnnxCreateFromBuffer(model,ONNX_DEFAULT);& m/ t0 ~/ ?7 i5 {2 ?
if(m_handle==INVALID_HANDLE)
, o/ d; M' a1 w5 W; T{* ?0 |8 {+ l+ L, w1 k1 ?
Print("OnnxCreateFromBuffer error ",GetLastError());' Y5 ?$ ]! Q4 H9 R9 P% w6 u0 ?  r4 O
return(false);
* _) s  r% G6 D8 I}
: F6 `- i  d5 L, r1 O//--- ok6 X. `& j. j4 s# x
return(true);  C  }! q* V' V  r# m2 L9 {8 ^
}
3 C9 Q) u& L4 Q; d# l0 M/ m% u/ u//+------------------------------------------------------------------+6 ]9 F7 s9 t) {+ R2 \- X& p- p
m_next_bar=TimeCurrent();) Q* y7 P$ p  p5 q- O
m_next_bar-=m_next_bar%PeriodSeconds(m_period);4 h& E& s: p3 p, P, v5 V
m_next_bar+=PeriodSeconds(m_period);
. h8 Y" X- Y  U//--- work on new day bar
/ |- ]/ R5 ]# q, V* _" x8 E( oreturn(true);9 X( H% y1 r* N8 l% @0 g
}
# }* W2 }, A6 t/ w//+------------------------------------------------------------------+
& {' U9 Z( v, ^: R/ P( [" H//| virtual stub for PredictPrice (regression model)                 |
0 W) o) [$ K) h* F: Y; f//+------------------------------------------------------------------+" ?0 j' N2 N% @2 v' b0 C- z
virtual double PredictPrice(void)
" ]: |/ R- h4 g9 n8 @3 O; p{$ Q8 a' u4 W! A+ l$ n
return(DBL_MAX);
( F& @) r+ \, ?' a3 |6 q! {9 D}
5 Z/ G8 R! {$ V: H3 g0 J//+------------------------------------------------------------------+* c) r/ U/ Q' U' V" A
//| Predict class (regression -> classification)                     |3 D% W" E4 X2 F" a8 u3 g8 o* k
//+------------------------------------------------------------------+1 i/ G; i, Z+ _* i. k
virtual int PredictClass(void)) v! M) V7 K5 w* z
{( |/ V) s1 @2 f; N/ D' ]' {: m
double predicted_price=PredictPrice();
* }8 \' o! a$ H: y7 M2 q0 Lif(predicted_price==DBL_MAX)
5 @( ?* J( U6 E2 C; s2 S* mreturn(-1);
; w$ k" E9 {8 L% J# wint    predicted_class=-1;
8 H4 h1 H4 R; V8 I* a+ b. ~7 Edouble last_close=iClose(m_symbol,m_period,1);8 A/ q. k  i( Y- x( ?
//--- classify predicted price movement% F" z) i+ i, A& c- S# v. F
double delta=last_close-predicted_price;9 L; R* A/ i# u4 \- b
if(fabs(delta)<=m_class_delta)
0 L: L9 x6 u1 ~  m8 p$ Rpredicted_class=PRICE_SAME;7 J4 u% [/ `+ h- c0 F
else
- v! p9 F8 U) }+ r! hprivate:) Z  I) Q- Q: H7 m* v
int               m_sample_size;
0 W( `/ Z2 `( c9 z3 ?4 b& l//+------------------------------------------------------------------+6 e: r% u2 H" v9 [) G( e% ~
virtual bool Init(const string symbol, const ENUM_TIMEFRAMES period)" y7 }% V6 T( B# ^+ s
{) Y( L! m, w7 M  l, _0 _
//--- check symbol, period, create model
9 e6 F/ S$ t  e1 A6 q  N8 M: {if(!CModelSymbolPeriod::CheckInit(symbol,period,model_eurusd_D1_10_class))" z! P7 E0 P' M" T# A- G' r4 [
{
4 F) Y. L5 P. u% E' @; iPrint("model_eurusd_D1_10_class : initialization error");* y6 ]; E% u8 @- p, ?& O
return(false);; _  G, Q2 M5 T/ Z  S
}
% z2 Y2 N- x+ w9 y0 C$ i//--- since not all sizes defined in the input tensor we must set them explicitly
' Y+ ^+ e" Z% G5 N: w//--- first index - batch size, second index - series size, third index - number of series (OHLC)
4 f' c5 l, m0 R- P* e6 M; T7 sconst long input_shape[] = {1,m_sample_size,4};
) Y! c6 e4 W  R) sif(!OnnxSetInputShape(m_handle,0,input_shape))
" u' E. h: y: O& a/ V; s7 _{5 H( [8 {. H+ r
Print("model_eurusd_D1_10_class : OnnxSetInputShape error ",GetLastError());5 N& |" B1 Z  H$ C6 h8 u
return(false);9 G) f0 S# r  V7 O- r
}# N. L3 B$ U, m: @
//--- since not all sizes defined in the output tensor we must set them explicitly
3 D$ W6 X. v4 n2 u6 f$ d//--- first index - batch size, must match the batch size of the input tensor
" I3 E6 h, O- [8 z2 S- }//--- second index - number of classes (up, same or down)
' ~4 c% G$ j7 y1 K0 x5 P6 @0 iconst long output_shape[] = {1,3};' h7 \6 L" H" z5 A4 R+ x  e' H
if(!OnnxSetOutputShape(m_handle,0,output_shape))+ H( D) }$ J% L' k; ?7 S3 z
{6 J* `" D) p$ V( X- U7 D0 ~
Print("model_eurusd_D1_10_class : OnnxSetOutputShape error ",GetLastError());9 P2 q9 w: Y: q/ Z2 `% N( \( A
return(false);
# h7 S# c) t! U( O8 M}! Q8 V+ I- z# a( n1 q8 _) ]: H+ j
//--- ok
' d9 \- e. o* O. S( q4 ~7 T: Preturn(true);! [4 i% [! X/ D+ F: _0 w
}; N# p. l$ ~) \0 B. Y& K; L* ?
//+------------------------------------------------------------------+/ [( L+ d1 G7 C7 [0 K. q
//| Predict class                                                    |
2 B5 h+ d& L) T//+------------------------------------------------------------------+
* N) {/ r7 w* J# ovirtual int PredictClass(void): e+ K% y0 q0 i% F: Y% o0 i8 }' z
{
http://www.simu001.cn/x287997x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-8 07:20 , Processed in 0.392542 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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