Bladeren bron

已基本实现等价python的phi算法

skyffire 8 maanden geleden
bovenliggende
commit
62c124ddd0
1 gewijzigde bestanden met toevoegingen van 35 en 202 verwijderingen
  1. 35 202
      strategy/src/predictor.rs

+ 35 - 202
strategy/src/predictor.rs

@@ -168,7 +168,7 @@ impl Predictor {
             mu: Default::default(),
             sigma: Default::default(),
             phi: Default::default(),
-            weights: Self::calculate_weights(60),
+            weights: Self::calculate_weights(12),
 
             mid_price: Default::default(),
             ask_price: Default::default(),
@@ -295,7 +295,7 @@ impl Predictor {
                     r.rescale(8);
                     self.r_vec.push_back(r);
 
-                    self.phi = Self::calculate_convolve(&self.r_vec, &self.weights);
+                    self.phi = Self::calculate_phi(&self.r_vec, &self.weights).iter().last().unwrap().clone();
                 }
             }
 
@@ -652,25 +652,36 @@ impl Predictor {
         weights
     }
 
-    fn calculate_convolve(signal: &VecDeque<Decimal>, kernel: &VecDeque<Decimal>) -> Decimal {
-        let reversed_weights: Vec<Decimal> = kernel.iter().rev().cloned().collect();
-        let m = reversed_weights.len();
-        let n = signal.len();
-        let mut result = Decimal::ZERO;
-
-        for t in 0..n {
-            let window_size = m.min(n - t);
-            let mut sum = Decimal::ZERO;
-            for j in 0..window_size {
-                let i = t + j;
-                let a_val = signal.get(i).unwrap(); // 索引安全由window_size保证
-                let w_val = &reversed_weights[j];
-                sum += a_val * w_val;
+    fn calculate_phi(r_vec: &VecDeque<Decimal>, weights: &VecDeque<Decimal>) -> VecDeque<Decimal> {
+        let window_size = weights.len();
+
+        // 反转权重 (weights_reversed)
+        let mut weights_reversed: VecDeque<Decimal> = VecDeque::with_capacity(window_size);
+        for i in (0..window_size).rev() {
+            weights_reversed.push_back(weights[i]);
+        }
+
+        let mut phi: VecDeque<Decimal> = VecDeque::with_capacity(r_vec.len());
+
+        // 对r_vec中的每个元素计算滑动窗口加权和
+        for i in 0..r_vec.len() {
+            let window_start = if i >= window_size { i - window_size + 1 } else { 0 };
+            let current_window_size = i - window_start + 1;
+
+            // 获取当前窗口
+            let mut weighted_sum = Decimal::ZERO;
+
+            // 计算加权和,只使用i及之前的值
+            for j in 0..current_window_size {
+                let r_index = window_start + j;
+                let weight_index = weights_reversed.len() - current_window_size + j;
+                weighted_sum += r_vec[r_index] * weights_reversed[weight_index];
             }
-            result = sum;
+
+            phi.push_back(weighted_sum);
         }
 
-        result
+        phi
     }
 
     // 最小二乘法拟合函数,支持VecDeque
@@ -801,7 +812,7 @@ impl Predictor {
 
 #[tokio::test]
 async fn test_calculate_convolve() {
-    let data: VecDeque<Decimal> = VecDeque::from([
+    let prices: VecDeque<Decimal> = VecDeque::from([
         dec!(2.2697), dec!(2.2697), dec!(2.2696), dec!(2.2697), dec!(2.2698), dec!(2.2693), dec!(2.2694), dec!(2.2693), dec!(2.2698), dec!(2.2693),
         dec!(2.2694), dec!(2.2697), dec!(2.2698), dec!(2.2698), dec!(2.2706), dec!(2.2706), dec!(2.2707), dec!(2.2706), dec!(2.2712), dec!(2.2709),
         dec!(2.2702), dec!(2.2703), dec!(2.2703), dec!(2.2703), dec!(2.2703), dec!(2.2702), dec!(2.2711), dec!(2.2714), dec!(2.2721), dec!(2.2718),
@@ -864,188 +875,13 @@ async fn test_calculate_convolve() {
         dec!(2.2782), dec!(2.2783), dec!(2.2784), dec!(2.2785), dec!(2.2786), dec!(2.2785), dec!(2.2786), dec!(2.2786), dec!(2.2787), dec!(2.2786),
     ]);
 
-    let data1 = vec![
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(0), dec!(0), dec!(0), dec!(0), dec!(0), dec!(0),
-        dec!(-1.51366003), dec!(0.82317862), dec!(-0.34639457), dec!(1.40436689),
-        dec!(0.52576059), dec!(3.10408618), dec!(5.40679788), dec!(-0.63094596),
-        dec!(-1.44785491), dec!(-2.24874184), dec!(1.01774124), dec!(-0.88708034),
-        dec!(0.20288234), dec!(-0.34251705), dec!(0.20392966), dec!(-0.06977106),
-        dec!(2.105398), dec!(0.7399713), dec!(-0.3506485), dec!(0.74023035),
-        dec!(-1.97815476), dec!(-0.6163126), dec!(0.20069595), dec!(-0.34442031),
-        dec!(-0.07107959), dec!(0.20224903), dec!(-0.34527475), dec!(-0.89175069),
-        dec!(0.48005961), dec!(0.20484779), dec!(-0.89375803), dec!(-0.89144111),
-        dec!(-0.61475331), dec!(-1.97913078), dec!(-0.05690703), dec!(-0.60578388),
-        dec!(-0.32993925), dec!(-0.05415535), dec!(-0.60519327), dec!(-0.32828368),
-        dec!(-0.05143276), dec!(0.22540326), dec!(-0.88261323), dec!(-0.0495238),
-        dec!(-0.0494518), dec!(-0.3274343), dec!(-0.60514445), dec!(-1.71222061),
-        dec!(-0.04171431), dec!(1.07026528), dec!(-0.60110854), dec!(0.51398304),
-        dec!(-1.43491434), dec!(-0.04040009), dec!(-0.04034306), dec!(1.07513537),
-        dec!(0.2358752), dec!(-0.04403156), dec!(-0.04397007), dec!(-0.04390885),
-        dec!(1.07730628), dec!(-0.88782913), dec!(1.63385062), dec!(0.23120541),
-        dec!(-0.049504), dec!(-0.04943616), dec!(-0.61139964), dec!(-0.6103062),
-        dec!(0.23555605), dec!(1.35982308), dec!(-0.33206437), dec!(0.23237418),
-        dec!(-1.17763221), dec!(0.79893428), dec!(0.23306382), dec!(-1.17870026),
-        dec!(1.36271823), dec!(0.79558198), dec!(-0.89856942), dec!(-0.33252826),
-        dec!(-0.33205557), dec!(-0.04849889), dec!(-0.04843539), dec!(0.23547843),
-        dec!(-0.04904784), dec!(1.37041714), dec!(0.51569686), dec!(0.51480464),
-        dec!(-0.3399096), dec!(-0.05444969), dec!(0.2309956), dec!(-0.05503933),
-        dec!(-0.34102558), dec!(-0.05416038), dec!(-1.76805137), dec!(-1.19178737),
-        dec!(0.23956802), dec!(-0.33335025), dec!(0.24035981), dec!(-0.04693717),
-        dec!(0.81443955), dec!(-0.048937), dec!(-0.0488761), dec!(0.23931597),
-        dec!(-0.33790762), dec!(0.24010446), dec!(-0.04933526), dec!(-0.04927462),
-        dec!(-0.33902589), dec!(-0.04843598), dec!(0.24213795), dec!(-0.04902409),
-        dec!(-0.04896456), dec!(-0.34043585), dec!(0.24374229), dec!(-0.34095575),
-        dec!(-0.04800687), dec!(-0.04794928), dec!(0.24533574), dec!(-0.04853372),
-        dec!(-0.04847591), dec!(-0.0484183), dec!(0.24623975), dec!(-1.81178073),
-        dec!(-0.04457772), dec!(-0.04452526), dec!(-2.387976), dec!(-0.03861294),
-        dec!(-0.62574247), dec!(2.87357069), dec!(0.53889428), dec!(0.24669282),
-        dec!(-0.0454332), dec!(-0.04538072), dec!(-0.04532842), dec!(-0.0452763),
-        dec!(-0.04522436), dec!(6.12654727), dec!(1.06377094), dec!(0.50121867),
-        dec!(-2.29341244), dec!(-0.89305045), dec!(-0.05335191), dec!(-0.61285328),
-        dec!(-0.89156361), dec!(-0.61016279), dec!(0.23181839), dec!(0.23153325),
-        dec!(-0.04975217), dec!(0.7936963), dec!(0.51117064), dec!(-0.05266672),
-        dec!(-1.45898415), dec!(-0.33092097), dec!(1.07762525), dec!(0.23081927),
-        dec!(1.07544167), dec!(-0.05390913), dec!(0.51063643), dec!(0.22750393),
-        dec!(-0.33834199), dec!(-0.05488091), dec!(-0.33819448), dec!(-0.05414148),
-        dec!(0.22989909), dec!(-0.0546346), dec!(0.79858056), dec!(-0.05631276),
-        dec!(1.36568396), dec!(-0.05912139), dec!(-0.91313034), dec!(0.22788848),
-        dec!(-0.62804286), dec!(-0.34185217), dec!(-0.3414625), dec!(-0.0550319),
-        dec!(-0.34131832), dec!(-0.91353986), dec!(0.52092128), dec!(0.23339143),
-        dec!(-0.62826636), dec!(-0.34018298), dec!(-2.34066832), dec!(1.09730216),
-        dec!(-0.90759951), dec!(-0.04742728), dec!(0.52590153), dec!(0.81164602),
-        dec!(-0.05018255), dec!(0.2371242), dec!(-0.05066525), dec!(-0.62605992),
-        dec!(-0.62522569), dec!(-0.04812742), dec!(0.24043921), dec!(-0.04861199),
-        dec!(0.52945153), dec!(-0.04966689), dec!(-0.04961698), dec!(-0.33939856),
-        dec!(1.39883066), dec!(-0.92033624), dec!(-0.04985301), dec!(-0.33993529),
-        dec!(0.24124244), dec!(-0.04969627), dec!(-0.34059704), dec!(0.24221346),
-        dec!(1.11502442), dec!(0.23964249), dec!(-0.05224548), dec!(1.11407752),
-        dec!(-0.05436422), dec!(-0.05431115), dec!(0.53033885), dec!(0.82176406),
-        dec!(-0.05694392), dec!(-0.05688875), dec!(-0.93565631), dec!(-0.34825878),
-        dec!(-0.05440776), dec!(-0.05435547), dec!(-0.05430332), dec!(0.24009955),
-        dec!(-0.3493502), dec!(0.24072679), dec!(-0.34975089), dec!(-0.34939186),
-        dec!(0.24223074), dec!(-0.05391553), dec!(-0.05386459), dec!(0.24263774),
-        dec!(-0.0543191), dec!(-0.05426807), dec!(-0.05421718), dec!(-0.05416643),
-        dec!(-2.42380369), dec!(-0.3458876), dec!(-1.23442538), dec!(-0.04641704),
-        dec!(0.54748386), dec!(0.84352229), dec!(-0.34618693), dec!(0.24906799),
-        dec!(1.4368338), dec!(1.43247689), dec!(2.60218826), dec!(-1.23817405),
-        dec!(0.23894527), dec!(0.23870256), dec!(-1.23842334), dec!(0.24064941),
-        dec!(-0.05543029), dec!(-0.35147151), dec!(-1.53353866), dec!(-0.3479929),
-        dec!(2.59902348), dec!(-0.35040309), dec!(-0.05518917), dec!(0.24001266),
-        dec!(-0.94115226), dec!(-0.05393976), dec!(0.24183059), dec!(-1.53120792),
-        dec!(-0.93796416), dec!(0.24581631), dec!(-0.05039846), dec!(-1.82272699),
-        dec!(-1.8162756), dec!(-0.04373642), dec!(-0.04369803), dec!(-0.04365974),
-        dec!(-0.33956995), dec!(0.25313713), dec!(0.25288976), dec!(-0.04401541),
-        dec!(0.54972758), dec!(0.54905569), dec!(-0.64023139), dec!(-0.6395047),
-        dec!(-0.9359334), dec!(-0.33980931), dec!(0.55405184), dec!(-2.12112421),
-        dec!(0.85237088), dec!(0.25698343), dec!(-0.04075743), dec!(-0.0407227),
-        dec!(-0.33868592), dec!(0.55621064), dec!(1.15113445), dec!(0.25520421),
-        dec!(0.25496179), dec!(0.25471999), dec!(0.25447881), dec!(-0.34405725),
-        dec!(0.25501926), dec!(-0.04483101), dec!(0.25506798), dec!(-0.34533212),
-    ];
-    let a: VecDeque<Decimal> = data1.into();
-
-    let data2 = vec![
-        dec!(0.00016578), dec!(0.00017082), dec!(0.00017602), dec!(0.00018138),
-        dec!(0.0001869), dec!(0.00019258), dec!(0.00019843), dec!(0.00020446),
-        dec!(0.00021067), dec!(0.00021706), dec!(0.00022365), dec!(0.00023043),
-        dec!(0.00023742), dec!(0.00024461), dec!(0.00025202), dec!(0.00025965),
-        dec!(0.00026751), dec!(0.00027561), dec!(0.00028394), dec!(0.00029252),
-        dec!(0.00030136), dec!(0.00031047), dec!(0.00031984), dec!(0.00032949),
-        dec!(0.00033943), dec!(0.00034966), dec!(0.0003602), dec!(0.00037105),
-        dec!(0.00038222), dec!(0.00039372), dec!(0.00040557), dec!(0.00041776),
-        dec!(0.00043031), dec!(0.00044324), dec!(0.00045655), dec!(0.00047025),
-        dec!(0.00048435), dec!(0.00049887), dec!(0.00051382), dec!(0.00052921),
-        dec!(0.00054505), dec!(0.00056136), dec!(0.00057814), dec!(0.00059542),
-        dec!(0.00061321), dec!(0.00063152), dec!(0.00065036), dec!(0.00066976),
-        dec!(0.00068972), dec!(0.00071027), dec!(0.00073142), dec!(0.00075319),
-        dec!(0.00077559), dec!(0.00079865), dec!(0.00082237), dec!(0.00084679),
-        dec!(0.00087192), dec!(0.00089778), dec!(0.00092439), dec!(0.00095177),
-        dec!(0.00097995), dec!(0.00100894), dec!(0.00103878), dec!(0.00106947),
-        dec!(0.00110106), dec!(0.00113356), dec!(0.00116699), dec!(0.00120139),
-        dec!(0.00123678), dec!(0.00127319), dec!(0.00131064), dec!(0.00134918),
-        dec!(0.00138882), dec!(0.00142959), dec!(0.00147154), dec!(0.00151468),
-        dec!(0.00155906), dec!(0.00160471), dec!(0.00165167), dec!(0.00169996),
-        dec!(0.00174962), dec!(0.00180071), dec!(0.00185324), dec!(0.00190727),
-        dec!(0.00196283), dec!(0.00201996), dec!(0.00207871), dec!(0.00213913),
-        dec!(0.00220125), dec!(0.00226513), dec!(0.00233081), dec!(0.00239833),
-        dec!(0.00246776), dec!(0.00253914), dec!(0.00261252), dec!(0.00268796),
-        dec!(0.00276551), dec!(0.00284524), dec!(0.00292718), dec!(0.00301142),
-        dec!(0.003098), dec!(0.00318699), dec!(0.00327846), dec!(0.00337246),
-        dec!(0.00346907), dec!(0.00356836), dec!(0.00367039), dec!(0.00377524),
-        dec!(0.00388298), dec!(0.00399368), dec!(0.00410743), dec!(0.0042243),
-        dec!(0.00434438), dec!(0.00446774), dec!(0.00459447), dec!(0.00472466),
-        dec!(0.0048584), dec!(0.00499578), dec!(0.00513688), dec!(0.00528182),
-        dec!(0.00543068), dec!(0.00558356), dec!(0.00574056), dec!(0.00590179),
-        dec!(0.00606736), dec!(0.00623737), dec!(0.00641194), dec!(0.00659117),
-        dec!(0.00677519), dec!(0.00696411), dec!(0.00715806), dec!(0.00735715),
-        dec!(0.00756151), dec!(0.00777127), dec!(0.00798657), dec!(0.00820753),
-        dec!(0.0084343), dec!(0.00866701), dec!(0.0089058), dec!(0.00915083),
-        dec!(0.00940223), dec!(0.00966017), dec!(0.00992478), dec!(0.01019624),
-        dec!(0.0104747), dec!(0.01076032), dec!(0.01105327), dec!(0.01135371),
-        dec!(0.01166182), dec!(0.01197778), dec!(0.01230176), dec!(0.01263393),
-        dec!(0.0129745), dec!(0.01332363), dec!(0.01368153), dec!(0.01404838),
-        dec!(0.01442438), dec!(0.01480973), dec!(0.01520464), dec!(0.01560929),
-        dec!(0.01602392), dec!(0.01644871), dec!(0.0168839), dec!(0.01732968),
-        dec!(0.01778629), dec!(0.01825395), dec!(0.01873287), dec!(0.01922329),
-        dec!(0.01972543), dec!(0.02023952), dec!(0.02076581), dec!(0.02130452),
-        dec!(0.02185589), dec!(0.02242016), dec!(0.02299757), dec!(0.02358837),
-        dec!(0.0241928), dec!(0.0248111), dec!(0.02544352), dec!(0.02609031),
-        dec!(0.02675171), dec!(0.02742797), dec!(0.02811935), dec!(0.02882608),
-        dec!(0.02954842), dec!(0.0302866), dec!(0.03104088), dec!(0.0318115),
-        dec!(0.03259869), dec!(0.0334027), dec!(0.03422377), dec!(0.03506211),
-        dec!(0.03591798), dec!(0.03679157), dec!(0.03768313), dec!(0.03859285),
-        dec!(0.03952095), dec!(0.04046763), dec!(0.04143307), dec!(0.04241748),
-        dec!(0.04342101), dec!(0.04444385), dec!(0.04548613), dec!(0.04654801),
-        dec!(0.04762962), dec!(0.04873107), dec!(0.04985247), dec!(0.05099391),
-        dec!(0.05215544), dec!(0.05333714), dec!(0.05453902), dec!(0.05576109),
-        dec!(0.05700336), dec!(0.05826577), dec!(0.05954827), dec!(0.06085078),
-        dec!(0.06217316), dec!(0.06351529), dec!(0.06487696), dec!(0.06625797),
-        dec!(0.06765807), dec!(0.06907695), dec!(0.0705143), dec!(0.07196971),
-        dec!(0.07344278), dec!(0.07493303), dec!(0.07643992), dec!(0.07796288),
-        dec!(0.07950125), dec!(0.08105435), dec!(0.08262139), dec!(0.08420154),
-        dec!(0.08579388), dec!(0.08739744), dec!(0.08901113), dec!(0.0906338),
-        dec!(0.09226422), dec!(0.09390103), dec!(0.09554281), dec!(0.09718799),
-        dec!(0.09883494), dec!(0.10048188), dec!(0.10212692), dec!(0.10376803),
-        dec!(0.10540306), dec!(0.10702971), dec!(0.10864554), dec!(0.11024795),
-        dec!(0.11183416), dec!(0.11340123), dec!(0.11494606), dec!(0.11646533),
-        dec!(0.11795553), dec!(0.11941294), dec!(0.12083364), dec!(0.12221345),
-        dec!(0.12354798), dec!(0.12483257), dec!(0.1260623), dec!(0.12723198),
-        dec!(0.12833612), dec!(0.12936894), dec!(0.13032432), dec!(0.13119585),
-        dec!(0.13197673), dec!(0.13265981), dec!(0.13323758), dec!(0.1337021),
-        dec!(0.13404504), dec!(0.13425762), dec!(0.13433061), dec!(0.13425431),
-        dec!(0.1340185), dec!(0.13361246), dec!(0.13302493), dec!(0.13224406),
-        dec!(0.13125743), dec!(0.13005198), dec!(0.12861401), dec!(0.12692915),
-        dec!(0.12498232), dec!(0.12275768), dec!(0.12023864), dec!(0.1174078),
-        dec!(0.11424692), dec!(0.11073687), dec!(0.10685762), dec!(0.10258818),
-        dec!(0.09790653), dec!(0.09278966), dec!(0.08721344), dec!(0.08115259),
-        dec!(0.07458068), dec!(0.06747003), dec!(0.05979166), dec!(0.05151525),
-        dec!(0.04260909), dec!(0.03304), dec!(0.02277326), dec!(0.01177258),
-    ];
-    let b: VecDeque<Decimal> = data2.into();
-
+    let weights: VecDeque<Decimal> = Predictor::calculate_weights(12);
 
     let mut close_price_vec: VecDeque<Decimal> = Default::default();
     let mut log_return_vec: VecDeque<Decimal> = Default::default();
     let mut r_vec: VecDeque<Decimal> = Default::default();
 
-    for p in &data {
+    for p in &prices {
         close_price_vec.push_back(p.clone());
         let len = close_price_vec.len();
 
@@ -1067,16 +903,13 @@ async fn test_calculate_convolve() {
             r.rescale(8);
             r_vec.push_back(r);
 
-            let phi = Predictor::calculate_convolve(&r_vec, &b);
+            let phi = Predictor::calculate_phi(&r_vec, &weights);
+            println!("{}", phi[phi.len() - 1]);
         } else {
             r_vec.push_back(Decimal::ZERO);
         }
     }
 
-    // println!("{:?} {:?} {:?}", r_vec.len(), a.len(), data.len());
-    // for r in r_vec {
-    //     println!("{:?}", r)
-    // }
-    // println!("{:?}", Predictor::calculate_convolve(&a, &b));
+    println!("{:?} {:?}", r_vec.len(), prices.len());
 }