Pārlūkot izejas kodu

v4.2.2: 显示实时波动率(sigma)。

skyffire 7 mēneši atpakaļ
vecāks
revīzija
6f49a37cf9
1 mainītis faili ar 27 papildinājumiem un 1 dzēšanām
  1. 27 1
      strategy/src/predictor.rs

+ 27 - 1
strategy/src/predictor.rs

@@ -16,6 +16,7 @@ use crate::utils;
 #[derive(Debug, Clone)]
 pub struct Predictor {
     // MeanReversion相关
+    pub close_price_std: Decimal,
     pub close_price_vec: VecDeque<Record>,
 
     pub deviation: Decimal,                                                     // 偏离程度(与均线)
@@ -155,6 +156,7 @@ impl Predictor {
         });
 
         let predictor = Self {
+            close_price_std: Default::default(),
             depth_vec: vec![Depth::new(); params.ref_exchange.len()],
             record_vec: Default::default(),
             fair_price_std_vec: vec![Decimal::ZERO; params.ref_exchange.len()],
@@ -292,6 +294,11 @@ impl Predictor {
 
                 let len = self.close_price_vec.len();
 
+                // 求收盘价的标准差,用于衡量波动率
+                if len > 10 {
+                    self.close_price_std = Self::calculate_std_dev(&self.close_price_vec)
+                };
+
                 // 求短期涨跌幅的相关数据
                 if len >= 10 {
                     let mut i = len - 1;
@@ -781,7 +788,7 @@ impl Predictor {
 
         let inventory = self.inventory;
 
-        let sigma_square = self.trend;
+        let sigma_square = self.close_price_std;
         let gamma = self.balance;
         let kappa = self.float_balance;
 
@@ -821,4 +828,23 @@ impl Predictor {
     pub fn get_ref_price(&mut self, _ref_ticker_map: &BTreeMap<String, Ticker>) -> Vec<Vec<Decimal>> {
         vec![]
     }
+
+    pub fn calculate_std_dev(close_price_vec: &VecDeque<Record>) -> Decimal {
+        let close_prices: Vec<f64> = close_price_vec
+            .iter()
+            .map(|record| record.close.to_f64().unwrap())
+            .collect();
+
+        let n = close_prices.len() as f64;
+        let mean = close_prices.iter().sum::<f64>() / n;
+
+        let variance = close_prices
+            .iter()
+            .map(|&x| (x - mean).powi(2))
+            .sum::<f64>() / n;
+
+        let vs_f64 = variance.sqrt();
+
+        Decimal::from_f64(vs_f64).unwrap()
+    }
 }