浏览代码

马尔科夫链动态规划(实验)

skyffire 9 月之前
父节点
当前提交
c964226da5
共有 1 个文件被更改,包括 44 次插入6 次删除
  1. 44 6
      strategy/src/predictor.rs

+ 44 - 6
strategy/src/predictor.rs

@@ -81,6 +81,10 @@ pub struct Predictor {
     pub trade_side_map: HashMap<Decimal, String>,                               // 交易时间,对应的是kk,kd两个方向
     pub trade_amount_map: HashMap<Decimal, Decimal>,                            // 交易数量
     pub trade_amount: Decimal,
+
+    pub prev_flush_state_time: Decimal,
+    pub state: usize,
+    pub state_matrix: Vec<Vec<Decimal>>,
 }
 
 impl Predictor {
@@ -205,6 +209,14 @@ impl Predictor {
             trade_side_map: HashMap::new(),
             trade_amount_map: HashMap::new(),
             trade_amount: Default::default(),
+
+            prev_flush_state_time: Default::default(),
+            state: 1,
+            state_matrix: vec![
+                vec![dec!(0.33), dec!(0.33), dec!(0.33)],
+                vec![dec!(0.33), dec!(0.33), dec!(0.33)],
+                vec![dec!(0.33), dec!(0.33), dec!(0.33)],
+            ],
         };
 
         predictor
@@ -423,10 +435,36 @@ impl Predictor {
             return;
         }
 
-        self.bid_delta = dec!(-2);
-        self.ask_delta = dec!(-2);
 
+        // 根据马尔科夫链调整挂单策略
         let now = Decimal::from(Utc::now().timestamp_millis());
+        if now - self.prev_flush_state_time > dec!(60_000) {
+            self.state_matrix = vec![
+                vec![dec!(0.33), dec!(0.33), dec!(0.33)],
+                vec![dec!(0.33), dec!(0.33), dec!(0.33)],
+                vec![dec!(0.33), dec!(0.33), dec!(0.33)],
+            ];
+
+            self.state = 0usize;
+            let profit_list = vec![dec!(0.33), dec!(0.33), dec!(0.33)];
+
+            let mut profit_min = dec!(1);
+            let mut profit_min_index = 0usize;
+
+            for (i, p) in profit_list.iter().enumerate() {
+                if *p < profit_min {
+                    profit_min = *p;
+                    profit_min_index = i;
+                }
+            }
+
+            // 这个是后面加了动态平仓时间再使用的
+            // self.params.holding_time = Decimal::from(profit_min_index);
+            let _ = Decimal::from(profit_min_index);
+        }
+
+        self.bid_delta = dec!(-2);
+        self.ask_delta = dec!(-2);
 
         // 平仓优先级高一些
         if self.trade_time_vec.len() > 0 {
@@ -548,9 +586,9 @@ impl Predictor {
         let last_price = self.last_price;
         let fair_price = Self::DONT_VIEW;
 
-        let spread = self.balance;
-        let spread_max = Self::DONT_VIEW;
-        let spread_min = Self::DONT_VIEW;
+        let spread = self.state_matrix[0][0];
+        let spread_max = self.state_matrix[1][1];
+        let spread_min = self.state_matrix[2][2];
 
         let optimal_ask_price = self.optimal_ask_price;
         let optimal_bid_price = self.optimal_bid_price;
@@ -561,7 +599,7 @@ impl Predictor {
         // let sigma_square = self.error_rate;
 
         let gamma = self.pos_amount;
-        let kappa = self.inventory;
+        let kappa = self.balance;
 
         let flow_ratio = Decimal::ZERO;