|
|
@@ -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()
|
|
|
+ }
|
|
|
}
|