私募

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

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

[复制链接]
发表于 2024-4-4 08:03:20 | 显示全部楼层 |阅读模式
1. 我们会用到什么模型呢?
; L2 s% ?, M/ s, I1 x/ F2 I9 V, D在之前的投票分类器中,我们用到了一个分类模型和一个回归模型。 在回归模型中,我们在用于计算分类时,用预测价格替代预测价格走势(下跌、上涨、不变)。 然而,在这种情况下,我们不能依据分类得到概率分布,而对于所谓的“软投票”这样是不允许的。
- g; ~  L7 }0 [- g% V* b4 f. G" W我们已准备了 3 个分类模型。 在“如何在 MQL5 中集成 ONNX 模型的示例”一文中已用到两个模型。 第一个模型(回归)被转换为分类模型。 基于 10 个 OHLC 价格序列进行了培训。 第二个模型是分类模型。 基于 63 个收盘价序列进
& S. f& r" S& Q. i6 c, B' r8 V( c//|                                             https://www.mql5.com |5 x, e8 s/ X' i
//+------------------------------------------------------------------+
$ f- W( G7 K5 S/ z//--- price movement prediction0 M+ P% a9 r- G% G; R* x' z/ {" X; p
#define PRICE_UP   0" }: B( g- L; N
#define PRICE_SAME 1
, w# \: O7 A$ k: `- z#define PRICE_DOWN 2
" m- r$ ]* x2 `//+------------------------------------------------------------------+3 G7 C" L6 W/ `$ R9 C/ g
//| Base class for models based on trained symbol and period         |* |2 ~$ i6 o2 O% {0 B. R' N3 F6 k7 i! A
//+------------------------------------------------------------------+
1 q" S1 J8 e) j+ n- N* K+ I6 Rclass CModelSymbolPeriod
9 t, V7 l$ j. o" P{( g) @$ A& i% u( Y* T+ H
protected:; {. M9 H, S8 Q6 F
long              m_handle;           // created model session handle! v4 n$ A, W7 e4 f! m, Q
string            m_symbol;           // symbol of trained data
" v7 F$ }$ A. |& k( v& S% u0 N' oENUM_TIMEFRAMES   m_period;           // timeframe of trained data3 }$ ?: r' G6 g# u) p
datetime          m_next_bar;         // time of next bar (we work at bar begin only)& V- d, o& C  x1 U+ c
double            m_class_delta;      // delta to recognize "price the same" in regression models
4 [2 ?# Z- X& f8 N* ~. g% wpublic:7 x5 Y( M) [; B* q; ~
//+------------------------------------------------------------------+
% R' Z" O# i) L  E7 ?3 g//| Constructor                                                      |
- D+ X! R/ [) L% [" e( i9 S. X//+------------------------------------------------------------------+" N4 [8 H, _; v6 C
CModelSymbolPeriod(const string symbol,const ENUM_TIMEFRAMES period,const double class_delta=0.0001)) }" ^6 w: E" |+ \! h0 J
{* q" [. z; D" R& M
m_handle=INVALID_HANDLE;: U7 `3 o7 d( f
m_symbol=symbol;( w' _7 L$ X3 J, D7 X
m_period=period;
8 a  Q8 v8 G' l0 X, hm_next_bar=0;
$ z- z& [# q: N2 ~8 Tm_class_delta=class_delta;$ G5 h/ I) }7 q' l# S3 t
}
  c5 i9 {) o: C//+------------------------------------------------------------------+& H8 p0 a, N8 b% m9 b6 ~! ]( i
//| Destructor                                                       |, [; v6 ^# O* m1 p; Z
//| Check for initialization, create model                           |9 W* Z& b& C8 W& D& U2 N; s: g
//+------------------------------------------------------------------+
$ m) T, X# ^/ u9 e, @bool CheckInit(const string symbol,const ENUM_TIMEFRAMES period,const uchar& model[])
2 w3 d( {8 b# D$ m{
$ F# P! J" _3 ~4 i//--- check symbol, period
1 K  t4 P, f5 x3 A* [if(symbol!=m_symbol || period!=m_period)
: w# Q: O' |. n# R  |{
4 Z  Q# X# K/ C! H1 {" U) P# |PrintFormat("Model must work with %s,%s",m_symbol,EnumToString(m_period));
  B+ M+ L4 N9 y) f+ C( Xreturn(false);
8 s: R/ }; {" i! V, H' ~7 K7 z, g}
6 j( o& G  q. a) h0 B//--- create a model from static buffer
6 \6 M0 D& A, [$ U" mm_handle=OnnxCreateFromBuffer(model,ONNX_DEFAULT);! V0 z) F' }) F) h: J! ^
if(m_handle==INVALID_HANDLE)
$ R6 r1 w: l' r( J7 J{
$ I* ^6 `$ D0 A) o9 L- S4 XPrint("OnnxCreateFromBuffer error ",GetLastError());8 z& K; g* A$ m7 V! T6 W) s' P
return(false);
! L# B% H( }/ n  [9 x9 K: d}
, Z, a/ x" }$ l, ]. Z//--- ok' H- [7 o, _  Y- Q; f' G
return(true);, y: J/ P' P1 o6 i9 c9 D
}6 L. a6 B9 A. J* y
//+------------------------------------------------------------------+2 h2 k# \% ]5 A6 s1 }5 w* E
m_next_bar=TimeCurrent();) e0 w8 a3 f: a1 a
m_next_bar-=m_next_bar%PeriodSeconds(m_period);, l7 F9 k  F& S2 x. X! k$ d5 d) t% q
m_next_bar+=PeriodSeconds(m_period);) z+ a/ N! |$ \5 a' {/ L! x
//--- work on new day bar  O) b- N8 `5 ~+ q4 @4 I1 W  X
return(true);
3 J9 \0 s  ^+ \7 e. u! V2 |$ Z4 x: }7 u}8 e8 e6 d* t2 T
//+------------------------------------------------------------------+$ G0 z: {: [- I
//| virtual stub for PredictPrice (regression model)                 |
$ K2 ^/ H) F, i0 P2 E* e$ r: Y5 G//+------------------------------------------------------------------+
/ M5 L- ?* I6 gvirtual double PredictPrice(void)
" |/ E$ V8 X# I' Z1 K{
2 u# g& j$ R2 H) R# x/ N5 nreturn(DBL_MAX);1 m* C0 W$ u: L! q- g
}5 _, j' Q* Q+ ]
//+------------------------------------------------------------------+1 ^, }! ]$ |) v0 o$ f7 ^
//| Predict class (regression -> classification)                     |
8 |  Y2 |* E9 y+ M) E//+------------------------------------------------------------------+
5 e$ K# _& j" k2 O7 S1 svirtual int PredictClass(void)9 a2 G9 h9 [) X% _+ R% X
{. T, F  Y! E3 V  Q  L
double predicted_price=PredictPrice();# D9 o3 p! a8 s8 @6 S
if(predicted_price==DBL_MAX)# N' n/ G; p! Q5 ]
return(-1);
! x' s8 v3 `& z  j( M2 O+ Y, w! oint    predicted_class=-1;9 o+ x' L! l8 _
double last_close=iClose(m_symbol,m_period,1);: V4 U) |& e6 f
//--- classify predicted price movement5 N# u. ]- o, N7 N5 R: w$ v
double delta=last_close-predicted_price;; m- N; K. j/ D) B
if(fabs(delta)<=m_class_delta)0 O' y+ a& S; v6 F, p+ V: `
predicted_class=PRICE_SAME;
1 P& X$ y  F8 }2 L+ j( U* K% Q. }else7 _  l: B& G) [+ \1 n
private:
" ^& V" U' a- jint               m_sample_size;
2 l! [+ V$ Y6 D& ?" W2 G. J//+------------------------------------------------------------------+& d' @! W1 }* A! u3 v) ]3 g
virtual bool Init(const string symbol, const ENUM_TIMEFRAMES period)
# b3 Y" N* ?  C* P{5 A( I7 U- `9 y4 F4 ~, _* c+ q
//--- check symbol, period, create model
/ w' W$ g$ F- B# Z" Fif(!CModelSymbolPeriod::CheckInit(symbol,period,model_eurusd_D1_10_class))  v9 g* G3 Q6 R( H
{+ O8 d+ O' q' G" V
Print("model_eurusd_D1_10_class : initialization error");5 _/ S6 h! h. [% s% i- j
return(false);9 Z5 |- M7 y3 E0 u/ U, g3 m
}# r4 k, O/ j- d) m3 e& g# T' `
//--- since not all sizes defined in the input tensor we must set them explicitly0 q& |6 r% ]3 P- A
//--- first index - batch size, second index - series size, third index - number of series (OHLC)
$ t8 i6 N. P; q9 m! y1 vconst long input_shape[] = {1,m_sample_size,4};- L6 j5 o- |, d! ^- V6 m
if(!OnnxSetInputShape(m_handle,0,input_shape))/ Q6 i& T8 s! [- `
{
: A% v2 H! J+ N# s1 j. xPrint("model_eurusd_D1_10_class : OnnxSetInputShape error ",GetLastError());) y; N* D9 o, @7 y
return(false);" `" s8 P1 R% J! w
}9 |1 a( P8 x( b, P9 f
//--- since not all sizes defined in the output tensor we must set them explicitly5 l) k# [; l( O; J+ z
//--- first index - batch size, must match the batch size of the input tensor
2 ]& j& K3 r. w) N: O# A2 p: c//--- second index - number of classes (up, same or down)" P9 w. \; \4 b
const long output_shape[] = {1,3};
' {5 z9 X  o* E1 }! G3 Kif(!OnnxSetOutputShape(m_handle,0,output_shape)); G3 Z* {% r1 `3 p2 E: g6 V
{) e4 d+ k) Z& D3 |
Print("model_eurusd_D1_10_class : OnnxSetOutputShape error ",GetLastError());
' k, }5 N5 c' ?' ~- V  G: j* wreturn(false);
. g) ~! }; q% u1 X# S}
7 d1 {. S8 U/ O//--- ok" \. ?9 u# j7 d* i5 D( K9 z, z2 z- M
return(true);& \' T' d' y/ N& ]! |$ d6 v' e
}
% w4 G% i( _6 M//+------------------------------------------------------------------+' c0 ~0 B/ K" [% \/ Z* d8 b
//| Predict class                                                    |4 P/ [! W" ]( {- \  }
//+------------------------------------------------------------------+9 T9 `: B" \. H* O3 ^
virtual int PredictClass(void). {- w  Z+ s# y1 j1 |2 z1 R
{
http://www.simu001.cn/x287997x1x1.html
最好的私募社区 | 第一私募论坛 | http://www.simu001.cn

精彩推荐

回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-12-2 04:07 , Processed in 0.430876 second(s), 31 queries .

Powered by www.simu001.cn X3.4

Copyright © 2001-2021, Tencent Cloud.

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