Ver código fonte

使用方差标定基准值。

skyffire 1 ano atrás
pai
commit
7f07ce4fea
1 arquivos alterados com 16 adições e 1 exclusões
  1. 16 1
      src/rank.rs

+ 16 - 1
src/rank.rs

@@ -41,6 +41,7 @@ pub fn generate_rank_by_indicator_map(indicator_map: &MutexGuard<HashMap<String,
         let mut msv_abs_total = Decimal::ZERO;
         let mut msv_abs_max = Decimal::ZERO;
         let mut effective_count = Decimal::ZERO;
+        let mut effective_msv_vec: Vec<Decimal> = vec![];
         for value in indicators.msv.iter() {
             let msv_abs_value = value[1].abs();
 
@@ -50,18 +51,32 @@ pub fn generate_rank_by_indicator_map(indicator_map: &MutexGuard<HashMap<String,
 
             effective_count += Decimal::ONE;
             msv_abs_total += msv_abs_value;
+            effective_msv_vec.push(msv_abs_value);
 
             if msv_abs_value > msv_abs_max {
                 msv_abs_max = msv_abs_value
             }
         }
+        // 计算波动率平均值
         let mut msv_abs_avg = if effective_count == Decimal::ZERO {
             Decimal::ZERO
         } else {
             msv_abs_total / effective_count
         };
         msv_abs_avg.rescale(6);
-        let mut coverted_open_base = (msv_abs_max + msv_abs_avg) / TWO_HUNDRED;
+        // 计算方差
+        let msv_variance = if effective_count == Decimal::ZERO {
+            Decimal::ZERO
+        } else {
+            let mut total = Decimal::ZERO;
+
+            for effective_msv in effective_msv_vec {
+                total += (effective_msv - msv_abs_avg).powd(Decimal::TWO)
+            }
+
+            total / effective_count
+        };
+        let mut coverted_open_base = msv_abs_max - msv_variance;
         coverted_open_base.rescale(8);
 
         // ============== epr相关数据的计算 =================