私募

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

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

[复制链接]
发表于 2024-4-4 08:03:20 | 显示全部楼层 |阅读模式
1. 我们会用到什么模型呢?+ G, m) _. l' O* g% N
在之前的投票分类器中,我们用到了一个分类模型和一个回归模型。 在回归模型中,我们在用于计算分类时,用预测价格替代预测价格走势(下跌、上涨、不变)。 然而,在这种情况下,我们不能依据分类得到概率分布,而对于所谓的“软投票”这样是不允许的。
6 f. V) S9 q. R- U2 u3 {我们已准备了 3 个分类模型。 在“如何在 MQL5 中集成 ONNX 模型的示例”一文中已用到两个模型。 第一个模型(回归)被转换为分类模型。 基于 10 个 OHLC 价格序列进行了培训。 第二个模型是分类模型。 基于 63 个收盘价序列进% p7 ]% T& r$ j2 R) Q% h
//|                                             https://www.mql5.com |
( }0 w9 s9 k# q* m' n//+------------------------------------------------------------------+
! u/ A. {) ~& \//--- price movement prediction0 V# x1 S1 c; @) G; p
#define PRICE_UP   0' Y, _) J8 S5 u  \( b; v& ]
#define PRICE_SAME 1
" H# l( Z8 o; T* [' {#define PRICE_DOWN 2
6 g; N( P) ^2 y# m5 N" r//+------------------------------------------------------------------+
5 j6 E) Q  M  R) U9 y9 O//| Base class for models based on trained symbol and period         |$ Y: f& R! f& j) E, {" @( Z0 B; A
//+------------------------------------------------------------------+/ j9 P2 \" G* c7 g0 I, q- g$ ^: [
class CModelSymbolPeriod0 d* Q. L$ j. `. O
{$ }; t- x$ Q$ W& X. z" ^& i& G
protected:) y0 }1 _  f$ g. [3 Z* ?5 E+ _
long              m_handle;           // created model session handle& r7 E2 o( w7 _" U( S1 @. Z& P
string            m_symbol;           // symbol of trained data- U# E- T$ F4 c& J' W
ENUM_TIMEFRAMES   m_period;           // timeframe of trained data
/ J4 }* a( U, D7 E' p/ zdatetime          m_next_bar;         // time of next bar (we work at bar begin only)
9 d, N6 i& S# J. G  A( Gdouble            m_class_delta;      // delta to recognize "price the same" in regression models
8 h/ i7 C- w: l! opublic:
  K' u4 i6 A( H5 u//+------------------------------------------------------------------+
- j, T0 A# L# b; f1 E7 f1 e//| Constructor                                                      |# b- j7 r) m; m3 U3 H
//+------------------------------------------------------------------+
, C& A' u" \" o) I9 OCModelSymbolPeriod(const string symbol,const ENUM_TIMEFRAMES period,const double class_delta=0.0001)% m. y7 B; T& v- j; ~$ Z! D
{
* u# {, G3 S7 x. X7 jm_handle=INVALID_HANDLE;* c# Z) i% D0 B) r
m_symbol=symbol;
" R" R8 [4 ^2 k8 W( lm_period=period;8 X7 K/ O) K# D3 n5 }) E
m_next_bar=0;
* A5 _. Z0 W( s  _6 \- p1 Xm_class_delta=class_delta;$ L/ C/ X  i* x( C7 r0 |  @
}
( d, ~$ L3 M! _5 q//+------------------------------------------------------------------+
& V$ Z% Z; S' H//| Destructor                                                       |5 e& v* b3 i1 U0 Y! T9 c
//| Check for initialization, create model                           |
* V1 Q$ }6 i2 `+ ~' @//+------------------------------------------------------------------+
( u/ A. d3 _0 L1 Z9 @6 H6 H0 ]' [bool CheckInit(const string symbol,const ENUM_TIMEFRAMES period,const uchar& model[])) ?- H- r  J- z  T9 m; P
{
4 C" b2 u, }9 [/ q8 z6 Q//--- check symbol, period
- E+ |+ p+ b' X* p6 }, yif(symbol!=m_symbol || period!=m_period)
+ r2 y/ E* }' G; Y8 ^{' d  y' k2 q  \; y7 p$ C
PrintFormat("Model must work with %s,%s",m_symbol,EnumToString(m_period));; d8 U0 ^3 P' P. R
return(false);' Y4 F6 |- _, z# U8 X9 v
}
7 }  n$ w6 ^  A. O. k, u//--- create a model from static buffer
3 V' _0 v) j3 T4 ~m_handle=OnnxCreateFromBuffer(model,ONNX_DEFAULT);8 u/ P- C) X( i' \- R
if(m_handle==INVALID_HANDLE)
: P" d& h; ^+ u( R* Y. m{$ L7 I8 y) L% ^. E
Print("OnnxCreateFromBuffer error ",GetLastError());
' ~, f( R) n6 V& ]+ e# {return(false);- n* }* K/ P# x! G. I: Q
}- \9 C3 w& k6 P$ O, q
//--- ok
" f4 B/ ]; O( T( b9 f, `% F) Rreturn(true);' |( Q- T1 u+ ^; }/ I9 I8 V6 z
}
$ d& ?. W$ F- j  r5 H//+------------------------------------------------------------------++ |3 J" ^: c4 W/ Q1 b* m' n
m_next_bar=TimeCurrent();  o( D& W& b. ]$ M! V1 [, Q, ], y+ X$ ^
m_next_bar-=m_next_bar%PeriodSeconds(m_period);8 W% U4 T- a: q4 i
m_next_bar+=PeriodSeconds(m_period);
0 X/ p' Q8 ?- V. R5 Q  m//--- work on new day bar
* z6 R" M* N/ e5 q; a5 Jreturn(true);
' Z$ Q" b, a4 x0 _7 v}' Q6 A2 O+ ~. W
//+------------------------------------------------------------------+
1 K  N" g1 W1 X& H  C//| virtual stub for PredictPrice (regression model)                 |! X; q: V( m9 E' c4 b
//+------------------------------------------------------------------+! U6 H4 [1 F( g7 y% R, a
virtual double PredictPrice(void)
! ^9 d/ m# h- }7 U9 D{
2 S- g' |& J: m3 R0 B$ Q# p' d" dreturn(DBL_MAX);
+ e+ K8 w+ T0 P8 F0 o}" P$ F8 t: Q# T8 e0 P8 Z: {
//+------------------------------------------------------------------+6 q% y. M5 |3 a8 n" E+ j
//| Predict class (regression -> classification)                     |
7 h; V! B8 x5 Z! L) w3 e9 x//+------------------------------------------------------------------+
7 ~+ R5 e& s0 T/ ivirtual int PredictClass(void)
# h/ I* C$ Z+ Y+ j2 g2 j! E{
$ z7 L  G$ a* M9 @9 t7 o: v# Ddouble predicted_price=PredictPrice();
" @4 L: }# ~$ ?% j8 aif(predicted_price==DBL_MAX)0 Y( ^& y9 F8 ?8 z. Q. w
return(-1);1 j7 W; T  y  d- q: F" N
int    predicted_class=-1;! ^! G0 T6 \. e8 ]- i; l' e! D
double last_close=iClose(m_symbol,m_period,1);+ @# m. {! I! }* |; X& ^
//--- classify predicted price movement8 \! ]2 V: n; ]9 |
double delta=last_close-predicted_price;
- X& I! y2 Q2 j2 ~0 v: @, x1 z0 Rif(fabs(delta)<=m_class_delta)
9 G! j+ n3 ]: H% Q2 e" Zpredicted_class=PRICE_SAME;. z" c0 d6 a- C8 u6 p3 }7 v. j
else
) T4 x2 q; o; }; a- J" i. Rprivate:
% o( P- p& F7 L" Jint               m_sample_size;' I' o$ `- Q9 g1 l' H
//+------------------------------------------------------------------+; w% Z) k+ Y# S/ K
virtual bool Init(const string symbol, const ENUM_TIMEFRAMES period)- L; h5 u9 y& A/ V
{
7 @: U& D, N: B* E//--- check symbol, period, create model
/ e, [; I! X: X& u; Oif(!CModelSymbolPeriod::CheckInit(symbol,period,model_eurusd_D1_10_class))
6 u. Q- n  ~+ d0 T{
* z* j+ r: q0 z8 CPrint("model_eurusd_D1_10_class : initialization error");
6 S0 Z* Q7 L) U9 _; T# Z; Ireturn(false);
3 y- L. a- ^, @( E. ^. W4 z}
1 u8 l( m3 I1 E' Y" j( D1 K8 G: G//--- since not all sizes defined in the input tensor we must set them explicitly. Y4 l) E+ r; o! `
//--- first index - batch size, second index - series size, third index - number of series (OHLC)1 f# g9 s& G  ]. J# q9 h  R
const long input_shape[] = {1,m_sample_size,4};
1 o( v% K, R9 D* g  P, F9 vif(!OnnxSetInputShape(m_handle,0,input_shape))+ R2 T1 x! f! ]2 b3 K% y
{
4 Z1 ?- }4 Y/ y- \9 b$ zPrint("model_eurusd_D1_10_class : OnnxSetInputShape error ",GetLastError());2 V0 C) p" _" L. |. B
return(false);0 j8 K& s# z; I) R" M
}
4 S) N3 B* H# R2 x) [5 I4 C//--- since not all sizes defined in the output tensor we must set them explicitly
2 v' J& |2 O4 U( H, ?//--- first index - batch size, must match the batch size of the input tensor
& @) p6 U  J  @//--- second index - number of classes (up, same or down)5 }) _3 h5 _* z) s! u0 @! u+ ~% ^
const long output_shape[] = {1,3};
3 {* ?. f6 c, ?+ @: ^0 ]( \if(!OnnxSetOutputShape(m_handle,0,output_shape))' V6 E( y3 S. Q; ~2 y. F) N( z
{' m' `5 ~6 h4 ]9 d8 ]. T
Print("model_eurusd_D1_10_class : OnnxSetOutputShape error ",GetLastError());
6 x0 z% Z, R1 @& |) |( }: Greturn(false);
. a# w2 z8 d, G}) C6 q0 {) d7 K4 @) Q6 V1 ]  l
//--- ok+ J( g; I  r7 X; ~
return(true);5 V( ?; d& }6 o$ P  X; D- |3 k) l
}
% Y! {0 ~6 ?! x1 F5 ^; V* D//+------------------------------------------------------------------+
! n! M7 ?5 _0 t* |8 q  d5 u//| Predict class                                                    |6 i, o* h+ b6 J1 i7 W, P! Z
//+------------------------------------------------------------------+
% X+ J% f( k% V6 A2 z0 C9 evirtual int PredictClass(void)5 E+ b2 H1 X3 `
{
http://www.simu001.cn/x287997x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-11-30 06:02 , Processed in 0.400180 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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