私募

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

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

[复制链接]
发表于 2024-4-4 08:03:20 | 显示全部楼层 |阅读模式
1. 我们会用到什么模型呢?/ M, c% |5 l& `- I: J
在之前的投票分类器中,我们用到了一个分类模型和一个回归模型。 在回归模型中,我们在用于计算分类时,用预测价格替代预测价格走势(下跌、上涨、不变)。 然而,在这种情况下,我们不能依据分类得到概率分布,而对于所谓的“软投票”这样是不允许的。
1 L6 A$ I2 H# Y( D. s9 y我们已准备了 3 个分类模型。 在“如何在 MQL5 中集成 ONNX 模型的示例”一文中已用到两个模型。 第一个模型(回归)被转换为分类模型。 基于 10 个 OHLC 价格序列进行了培训。 第二个模型是分类模型。 基于 63 个收盘价序列进* Z6 s$ J$ ~$ r( z9 Y% n
//|                                             https://www.mql5.com |
" {# p' J, B9 E, ^. u; Q: f//+------------------------------------------------------------------+  F' C+ ^4 |: q/ o4 r' W0 X& r1 {
//--- price movement prediction& ?: W, \/ H& J) T' o, Y: h
#define PRICE_UP   03 `: _7 @7 ]2 f( R$ u
#define PRICE_SAME 1
0 f3 _; O1 I  C; r" @#define PRICE_DOWN 2: L* w9 [& o/ A0 V8 ?
//+------------------------------------------------------------------+. t; G+ X! ?' {* B* x0 r& F& f2 B
//| Base class for models based on trained symbol and period         |. C" N7 K: w( K* V
//+------------------------------------------------------------------+0 M4 @& r, v. U4 W) Q6 J
class CModelSymbolPeriod+ L9 c; N  \( F  r0 x" n
{/ b3 T; f# _9 Q* O
protected:* y, u5 B7 j/ B9 D4 `4 k- Y
long              m_handle;           // created model session handle' N9 K) _# C# h2 `  i) W; g* l, j
string            m_symbol;           // symbol of trained data
  W/ p& ]5 v$ S6 K+ bENUM_TIMEFRAMES   m_period;           // timeframe of trained data$ P  ~; w) \+ }) H0 d% ?
datetime          m_next_bar;         // time of next bar (we work at bar begin only)8 ]1 q+ D0 P& C6 k1 I6 J" S) i5 y
double            m_class_delta;      // delta to recognize "price the same" in regression models4 R4 q2 U9 a6 X; e# H9 z
public:: ^6 c9 @7 Q/ M% d& q! z, A
//+------------------------------------------------------------------+
4 l# N6 a& _) Q. i2 m1 p//| Constructor                                                      |& k/ n0 @) |! y1 Y/ W
//+------------------------------------------------------------------+
, c: ~# k) X9 iCModelSymbolPeriod(const string symbol,const ENUM_TIMEFRAMES period,const double class_delta=0.0001)
, ?* E1 `# f4 d{
4 @) v, C5 Y! r8 w* h! `' y! {, Vm_handle=INVALID_HANDLE;* ^& D& r0 w' L: t, K# w8 N
m_symbol=symbol;" c5 |* _6 j) I( O% b- V. |
m_period=period;
- U/ V8 n; W6 S/ H: e& i) S% |& lm_next_bar=0;
4 b- W; w% m0 |m_class_delta=class_delta;
8 I; y& K- J( J( F}: y/ D& [9 v: F1 t3 E
//+------------------------------------------------------------------+
: o/ c' B5 ]7 N9 _9 Y//| Destructor                                                       |
5 V2 Z" _. c+ {2 P0 }$ P& E//| Check for initialization, create model                           |
  U+ T9 d# S5 i/ |9 S2 v) C//+------------------------------------------------------------------+
- o3 T3 \9 V) Z- ^6 wbool CheckInit(const string symbol,const ENUM_TIMEFRAMES period,const uchar& model[])1 V! O! z& Z6 P( y# y% A
{; Y2 i. r, X6 n( L! W7 n
//--- check symbol, period
: \# m3 m/ H! m( s1 v1 Hif(symbol!=m_symbol || period!=m_period). `* [* G5 x4 @) Z/ q
{# |  N6 C2 K- Y6 H" P+ G" D9 s
PrintFormat("Model must work with %s,%s",m_symbol,EnumToString(m_period));
3 c+ u2 U2 D' C$ Vreturn(false);
* L2 K) g; B! n/ [9 J}/ P0 D& M+ K4 G) c' F# @
//--- create a model from static buffer/ T2 w! x+ r  G! O3 n( O: _
m_handle=OnnxCreateFromBuffer(model,ONNX_DEFAULT);5 Y5 G. x" k* o0 V: S. G2 @
if(m_handle==INVALID_HANDLE)
) v* h% m! O6 U% m{
6 @# P% g" x6 k4 \1 e4 D, n/ [Print("OnnxCreateFromBuffer error ",GetLastError());* ?  h2 F, ^0 M: n/ V
return(false);5 m, [7 A! v4 _1 p4 Q9 e$ ]
}
+ `: l" C2 O3 ?3 l4 H$ E//--- ok( N' ]8 W, t. W+ ?
return(true);6 h( }- j4 M: Y5 A" C
}9 t  A9 y6 c# ?+ p
//+------------------------------------------------------------------+& _! o% ]) h3 F6 }% d1 @
m_next_bar=TimeCurrent();1 K+ N. m) Q7 D: L
m_next_bar-=m_next_bar%PeriodSeconds(m_period);
# k/ Y' p0 J  Z5 a/ g0 pm_next_bar+=PeriodSeconds(m_period);
4 A" V* |3 \9 K' I: e. N//--- work on new day bar+ H. @5 p1 V2 U; x% n
return(true);0 J3 N1 {# v% I
}2 _% Y% G; W7 z* ~7 u6 H  x5 s
//+------------------------------------------------------------------+
/ q9 ]8 H- z! F5 j  p) U2 a+ M6 M" {//| virtual stub for PredictPrice (regression model)                 |
$ l; ]7 X6 c( j4 T* N0 l//+------------------------------------------------------------------+2 X* z/ x) A" f7 `# ]
virtual double PredictPrice(void)5 Q3 A3 l" [1 p( @- m! d9 }
{
; u. q. D8 M1 n/ d) i/ preturn(DBL_MAX);
# q1 X) r; j) o) `& w& A, T: I}
' `8 o/ @9 `2 B1 Q5 l; m! [//+------------------------------------------------------------------+2 n6 R# i# f* Z
//| Predict class (regression -> classification)                     |0 ]7 T# H% y. v# ]
//+------------------------------------------------------------------+
( n/ z; q: \5 v) V3 |+ H, Svirtual int PredictClass(void)
" G( |4 W  [- u6 r7 x{3 q$ N% K; n! |
double predicted_price=PredictPrice();
9 K9 o5 l7 O. L1 O" k# H% qif(predicted_price==DBL_MAX)$ d, R" q- m% Q# ~9 \
return(-1);; F5 H3 S+ @; o' [+ b( E' ~
int    predicted_class=-1;
( m4 q. J  g, h; G6 {5 jdouble last_close=iClose(m_symbol,m_period,1);
* `3 ~, }! S" t$ Q//--- classify predicted price movement
- u! q$ ^0 K* z" W# A% J' D. wdouble delta=last_close-predicted_price;1 J& O( v9 j: B8 V' w0 g2 B
if(fabs(delta)<=m_class_delta)
- i$ m% t+ D( h5 v3 G/ Xpredicted_class=PRICE_SAME;7 G: y: o- H9 e' t0 B4 ^& {2 q9 X/ J
else
. W3 y5 }  s% n# [private:
# ]% T  F2 {6 Zint               m_sample_size;
6 _, N. ^, j+ w5 V' ?- O  q& z//+------------------------------------------------------------------+! ^% m2 B. Y: w- O6 n1 m
virtual bool Init(const string symbol, const ENUM_TIMEFRAMES period)/ A7 z; i+ O0 s# F! G+ g" W, r" P- c
{
, z3 L3 O$ m5 A; S' K% f//--- check symbol, period, create model
0 D5 h" i. v  S8 y' x3 D8 sif(!CModelSymbolPeriod::CheckInit(symbol,period,model_eurusd_D1_10_class))
* X5 H) F0 W8 E: ?/ Z( H9 O- x# A{  q8 _" L" _% e8 e2 D/ a
Print("model_eurusd_D1_10_class : initialization error");3 n* [2 S/ `* d! B! Y
return(false);# m5 t5 W: D% D
}
$ S: H( H& c! I//--- since not all sizes defined in the input tensor we must set them explicitly3 `, e3 f0 `: m. C0 j; V  j2 `
//--- first index - batch size, second index - series size, third index - number of series (OHLC)! {7 `. z9 N# a2 N8 V& A6 z  z2 H5 Q
const long input_shape[] = {1,m_sample_size,4};/ x/ N* C9 F5 p. i
if(!OnnxSetInputShape(m_handle,0,input_shape))
5 T' a5 q( t  y{
$ w0 G) y- A, m; k4 p5 D& B; k) jPrint("model_eurusd_D1_10_class : OnnxSetInputShape error ",GetLastError());
% Q4 T2 N+ C+ s4 I7 P# V- t* M; W6 ^return(false);5 R& x- U! B. J6 a; ^
}0 A% \9 t% e( y! Y
//--- since not all sizes defined in the output tensor we must set them explicitly6 r* F( Y6 w# I5 i* c! b; b
//--- first index - batch size, must match the batch size of the input tensor
  W: N2 ^1 E% p//--- second index - number of classes (up, same or down): G9 I! N: l( A. J* A/ B1 S1 i8 t% \
const long output_shape[] = {1,3};
/ i. r, k; [) x3 G4 V$ ?8 L2 Vif(!OnnxSetOutputShape(m_handle,0,output_shape))' _- a& a! O; n- G( w* r8 A9 Q
{
: ^5 ?2 o4 e) v9 l6 w1 r$ N( GPrint("model_eurusd_D1_10_class : OnnxSetOutputShape error ",GetLastError());/ l! @7 y' M+ I6 m% D# J
return(false);- E$ P5 z8 R! X3 E9 U: a! k
}0 n5 \& L, F) N
//--- ok5 |; `  ^( V3 Q
return(true);
: n; q. u) v: X2 }1 s}/ K# i/ M- t' y9 d- n0 N
//+------------------------------------------------------------------+
7 V: E4 D; A: {! m$ T//| Predict class                                                    |
& B2 H1 c. L8 A/ ]2 o9 o( S* @//+------------------------------------------------------------------+
. _$ q" W, k" }3 S& ]' E9 f3 Mvirtual int PredictClass(void)& b$ u, W( l+ S3 u" W. x
{
http://www.simu001.cn/x287997x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-11 19:01 , Processed in 0.679671 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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