avellaneda_stoikov.rs 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541
  1. use std::cmp::{max, min};
  2. use std::collections::{BTreeMap, VecDeque};
  3. use std::sync::Arc;
  4. use chrono::Utc;
  5. use rust_decimal::prelude::*;
  6. use rust_decimal_macros::dec;
  7. use tokio::sync::Mutex;
  8. use tracing::info;
  9. use global::cci::CentralControlInfo;
  10. use global::fixed_time_range_deque::FixedTimeRangeDeque;
  11. use global::predictor_state::PredictorState;
  12. use standard::{Depth, Record, Ticker, Trade};
  13. #[derive(Debug)]
  14. pub struct AvellanedaStoikov {
  15. pub depth_vec: FixedTimeRangeDeque<Depth>, // 深度队列
  16. pub trade_long_vec: FixedTimeRangeDeque<Trade>, // 交易队列
  17. pub trade_short_vec: FixedTimeRangeDeque<Trade>, // 交易队列
  18. pub spread_vec: FixedTimeRangeDeque<Decimal>,
  19. pub record_vec: VecDeque<Record>, // 蜡烛队列
  20. pub mid_price: Decimal, // 中间价
  21. pub ask_price: Decimal, // 卖一价
  22. pub bid_price: Decimal, // 买一价
  23. pub last_price: Decimal, // 最后成交价
  24. pub spread: Decimal, // 市场冲击
  25. pub spread_max: Decimal, // 最大市场冲击
  26. pub spread_min: Decimal, // 最小市场冲击
  27. pub optimal_ask_price: Decimal, // 卖出挂单价
  28. pub optimal_bid_price: Decimal, // 买入挂单价
  29. pub inventory: Decimal, // 库存,也就是q
  30. pub level: Decimal, // martin
  31. pub sigma_square: Decimal, // σ^2,波动性的平方
  32. pub gamma: Decimal, // γ,库存风险厌恶参数
  33. pub kappa: Decimal, // κ 订单簿 流动性 参数
  34. pub flow_ratio_mfi: Decimal, // 资金流比例(专供MFI)
  35. pub flow_ratio_trades: Decimal, // 资金流比例(trades生成)
  36. pub money_flow_index: Decimal, // MFI
  37. pub ask_delta: Decimal, // δa
  38. pub bid_delta: Decimal, // δb
  39. pub base_delta: Decimal, // 基础挂单距离
  40. pub ratio_edge: Decimal, // 资金流修正的挂单距离
  41. pub ref_price: Decimal, // 预定价格
  42. pub cci_arc: Arc<Mutex<CentralControlInfo>>, // 中控信息
  43. pub is_ready: bool,
  44. pub prev_trade_time: i64, // 上次交易时间,也就是t
  45. pub t_diff: Decimal, // (T-t)
  46. }
  47. impl AvellanedaStoikov {
  48. // 时间窗口大小(微秒)
  49. const MAX_TIME_RANGE_MICROS: i64 = 3 * 60_000_000;
  50. const TRADE_LONG_RANGE_MICROS: i64 = 3 * 60_000_000;
  51. const TRADE_SHORT_RANGE_MICROS: i64 = 60_000_000;
  52. // const ONE_MILLION: Decimal = dec!(1_000_000);
  53. // const TWENTY_THOUSAND: Decimal = dec!(20_000);
  54. const IRA: Decimal = dec!(1);
  55. pub fn new(cci_arc: Arc<Mutex<CentralControlInfo>>) -> Self {
  56. let avellaneda_stoikov = Self {
  57. // 分别给与的长度
  58. depth_vec: FixedTimeRangeDeque::new(Self::MAX_TIME_RANGE_MICROS),
  59. spread_vec: FixedTimeRangeDeque::new(Self::MAX_TIME_RANGE_MICROS),
  60. trade_long_vec: FixedTimeRangeDeque::new(Self::TRADE_LONG_RANGE_MICROS),
  61. trade_short_vec: FixedTimeRangeDeque::new(Self::TRADE_SHORT_RANGE_MICROS),
  62. record_vec: VecDeque::new(),
  63. mid_price: Default::default(),
  64. ask_price: Default::default(),
  65. bid_price: Default::default(),
  66. last_price: Default::default(),
  67. spread: Default::default(),
  68. spread_max: Default::default(),
  69. spread_min: Default::default(),
  70. optimal_ask_price: Default::default(),
  71. optimal_bid_price: Default::default(),
  72. inventory: Default::default(),
  73. gamma: Default::default(),
  74. sigma_square: Default::default(),
  75. ask_delta: Default::default(),
  76. bid_delta: Default::default(),
  77. base_delta: Default::default(),
  78. ratio_edge: Default::default(),
  79. kappa: Default::default(),
  80. ref_price: Default::default(),
  81. cci_arc,
  82. is_ready: false,
  83. prev_trade_time: Utc::now().timestamp_micros(),
  84. t_diff: Default::default(),
  85. level: Default::default(),
  86. flow_ratio_mfi: Default::default(),
  87. flow_ratio_trades: Default::default(),
  88. money_flow_index: Default::default(),
  89. };
  90. avellaneda_stoikov
  91. }
  92. // 更新最大市场冲击
  93. pub fn update_spread_max(&mut self) {
  94. self.spread_max = if let Some(&max_value) = self.spread_vec.deque.iter().max() {
  95. max_value
  96. } else {
  97. Decimal::NEGATIVE_ONE
  98. };
  99. }
  100. // 更新最小市场冲击
  101. pub fn update_spread_min(&mut self) {
  102. self.spread_min = if let Some(&min_value) = self.spread_vec.deque.iter().min() {
  103. min_value
  104. } else {
  105. Decimal::NEGATIVE_ONE
  106. };
  107. }
  108. pub fn update_spread(&mut self) {
  109. if self.trade_long_vec.len() > 0 {
  110. //
  111. let last_trade = self.trade_long_vec.get(self.trade_long_vec.len() - 1).unwrap();
  112. let last_trade_price = last_trade.price;
  113. let last_trade_time = last_trade.time;
  114. let mut first_trade_price = last_trade.price;
  115. for trade in self.trade_long_vec.deque.iter().rev() {
  116. if last_trade_time - trade.time > Decimal::TEN {
  117. break;
  118. }
  119. first_trade_price = trade.price;
  120. }
  121. self.spread = (last_trade_price - first_trade_price).abs();
  122. if self.spread > Decimal::ZERO {
  123. self.spread_vec.push_back(self.spread);
  124. }
  125. self.update_spread_max();
  126. self.update_spread_min();
  127. }
  128. }
  129. pub async fn on_depth(&mut self, depth: &Depth) {
  130. self.depth_vec.push_back(depth.clone());
  131. self.ask_price = depth.asks[0].price;
  132. self.bid_price = depth.bids[0].price;
  133. self.mid_price = (self.ask_price + self.bid_price) / Decimal::TWO;
  134. self.processor().await;
  135. }
  136. pub async fn on_trade(&mut self, trade: &Trade) {
  137. self.trade_long_vec.push_back(trade.clone());
  138. self.trade_short_vec.push_back(trade.clone());
  139. self.last_price = trade.price;
  140. self.update_spread();
  141. self.processor().await;
  142. }
  143. pub async fn update_level(&mut self) {
  144. self.level = (Decimal::NEGATIVE_ONE + (Decimal::ONE + dec!(8) * self.inventory.abs()).sqrt().unwrap()) / Decimal::TWO;
  145. self.level = min(self.level, dec!(6));
  146. }
  147. pub async fn on_ticker(&mut self, _ticker: &Ticker) {}
  148. pub async fn on_record(&mut self, record: &Record) {
  149. // 添加新蜡烛
  150. if self.record_vec.len() == 0 {
  151. self.record_vec.push_back(record.clone());
  152. } else {
  153. let last_record = self.record_vec.back_mut().unwrap();
  154. if last_record.time == record.time {
  155. *last_record = record.clone();
  156. } else if last_record.time < record.time {
  157. self.record_vec.push_back(record.clone());
  158. }
  159. }
  160. if self.record_vec.len() > 4 {
  161. self.record_vec.pop_front();
  162. }
  163. // 如果蜡烛数量足够,则更新mfi
  164. if self.record_vec.len() >= 4 {
  165. self.update_mfi();
  166. }
  167. }
  168. pub fn update_mfi(&mut self) {
  169. let mut money_flow_in = Decimal::ZERO;
  170. let mut money_flow_out = Decimal::ZERO;
  171. let _3 = dec!(3);
  172. for record in self.record_vec.iter() {
  173. let typical_price = (record.high + record.low + record.close) / _3;
  174. let money_flow = typical_price * record.volume;
  175. if record.close > record.open {
  176. money_flow_in += money_flow;
  177. } else if record.close < record.open {
  178. money_flow_out += money_flow;
  179. }
  180. }
  181. self.money_flow_index = if money_flow_out.is_zero() {
  182. Decimal::ONE_HUNDRED
  183. } else {
  184. let money_flow_ratio = money_flow_in / money_flow_out;
  185. Decimal::ONE_HUNDRED - Decimal::ONE_HUNDRED / (Decimal::ONE + money_flow_ratio)
  186. };
  187. }
  188. pub async fn update_inventory(&mut self, inventory: &Decimal, min_amount_value: &Decimal) {
  189. let prev_inventory = self.inventory;
  190. self.inventory = (inventory / (min_amount_value / self.mid_price)).round();
  191. if prev_inventory != self.inventory {
  192. self.prev_trade_time = Utc::now().timestamp_micros();
  193. }
  194. self.update_level().await;
  195. self.processor().await;
  196. }
  197. pub fn update_sigma_square(&mut self) {
  198. self.sigma_square = self.spread_max * dec!(0.5);
  199. self.sigma_square.rescale(10);
  200. }
  201. pub fn update_gamma(&mut self) {
  202. // self.gamma = if self.sigma_square == Decimal::ZERO || self.inventory == Decimal::ZERO {
  203. // Decimal::ONE
  204. // } else {
  205. // Self::IRA * (self.spread_max - self.spread_min) / (Decimal::TWO * self.inventory.abs() * self.sigma_square)
  206. // };
  207. // self.gamma.rescale(8);
  208. self.gamma = dec!(0.236) * Self::IRA;
  209. }
  210. pub fn update_kappa(&mut self) {
  211. // self.kappa = if self.spread_max.is_zero() || self.init_delta_plus.is_zero() {
  212. // Decimal::ONE
  213. // } else {
  214. // let mut temp = self.init_delta_plus * self.gamma - self.sigma_square * self.gamma.powd(Decimal::TWO);
  215. // temp.rescale(6);
  216. //
  217. // self.gamma / (temp.exp() - Decimal::ONE)
  218. // };
  219. //
  220. // self.kappa.rescale(8);
  221. if self.mid_price > Decimal::ZERO {
  222. self.kappa = dec!(888) / self.mid_price;
  223. } else {
  224. self.kappa = dec!(1);
  225. }
  226. }
  227. pub fn update_ref_price(&mut self) {
  228. self.ref_price = self.mid_price;
  229. }
  230. pub fn update_delta(&mut self) {
  231. if self.gamma != Decimal::ZERO {
  232. let pos_edge = self.gamma * self.sigma_square * self.inventory.abs().powd(dec!(2)) * self.t_diff;
  233. self.base_delta = self.gamma * self.sigma_square * self.t_diff / Decimal::TWO + (Decimal::ONE / self.gamma) * (Decimal::ONE + self.gamma / self.kappa).ln();
  234. self.ratio_edge = self.flow_ratio_mfi * self.sigma_square;
  235. self.bid_delta = self.base_delta;
  236. self.ask_delta = self.base_delta;
  237. if self.inventory > Decimal::ZERO {
  238. self.bid_delta += pos_edge;
  239. } else if self.inventory < Decimal::ZERO {
  240. self.ask_delta += pos_edge;
  241. }
  242. if self.ratio_edge > Decimal::ZERO {
  243. self.ask_delta -= self.sigma_square.abs() * (Decimal::TWO - self.t_diff);
  244. self.bid_delta += self.sigma_square.abs() * dec!(10);
  245. } else if self.ratio_edge < Decimal::ZERO {
  246. self.ask_delta += self.sigma_square.abs() * dec!(10);
  247. self.bid_delta -= self.sigma_square.abs() * (Decimal::TWO - self.t_diff);
  248. } else if self.ratio_edge == Decimal::ZERO {
  249. self.ask_delta += self.sigma_square.abs() * dec!(10);
  250. self.bid_delta += self.sigma_square.abs() * dec!(10);
  251. }
  252. }
  253. }
  254. pub fn update_optimal_ask_and_bid(&mut self) {
  255. self.optimal_ask_price = max(self.ref_price + self.ask_delta / Decimal::TWO, self.ask_price);
  256. self.optimal_bid_price = min(self.ref_price - self.bid_delta / Decimal::TWO, self.bid_price);
  257. }
  258. pub fn update_t_diff(&mut self) {
  259. if self.prev_trade_time > 0 {
  260. let time_diff_decimal = Decimal::from_i64(Utc::now().timestamp_micros() - self.prev_trade_time).unwrap();
  261. self.t_diff = max(Decimal::ONE - time_diff_decimal / Decimal::from_i64(Self::MAX_TIME_RANGE_MICROS).unwrap(), Decimal::ZERO);
  262. } else {
  263. self.t_diff = Decimal::ONE;
  264. }
  265. }
  266. fn calc_flow_ratio(_prev_flow_ratio: &Decimal, min_volume: &Decimal, trades: &mut FixedTimeRangeDeque<Trade>) -> Decimal {
  267. // let mut flow_in_value = Decimal::ZERO;
  268. // let mut flow_out_value = Decimal::ZERO;
  269. // for (index, trade_iter) in trades.deque.iter().enumerate() {
  270. // if index == 0 {
  271. // continue
  272. // }
  273. //
  274. // let prev_trade_iter = trades.deque.get(index - 1).unwrap();
  275. // let trade = trade_iter;
  276. // if trade.price > prev_trade_iter.price {
  277. // flow_in_value += trade.value * (prev_trade_iter.price - trade.price).abs();
  278. // // flow_in_value += Decimal::ONE;
  279. // } else if trade.price < prev_trade_iter.price {
  280. // flow_out_value += trade.value * (prev_trade_iter.price - trade.price).abs();
  281. // // flow_out_value += Decimal::ONE;
  282. // } else {
  283. // // if trade.size > Decimal::ZERO {
  284. // // flow_in_value += trade.value;
  285. // // } else {
  286. // // flow_out_value += trade.value;
  287. // // }
  288. // }
  289. //
  290. // // if trade_iter.size > Decimal::ZERO {
  291. // // flow_in_value += trade_iter.value;
  292. // // } else {
  293. // // flow_out_value += trade_iter.value;
  294. // // }
  295. // }
  296. // if self.trade_vec.deque.len() > 1 {
  297. // let prev_trade_iter = self.trade_vec.deque.get(self.trade_vec.deque.len() - 2).unwrap();
  298. // if trade.price > prev_trade_iter.price {
  299. // self.flow_in_value += trade.value;
  300. // } else if trade.price < prev_trade_iter.price {
  301. // self.flow_out_value += trade.value;
  302. // } else {
  303. // // if trade.size > Decimal::ZERO {
  304. // // self.flow_in_value += trade.value;
  305. // // } else {
  306. // // self.flow_out_value += trade.value;
  307. // // }
  308. // }
  309. //
  310. // // if trade.size > Decimal::ZERO {
  311. // // self.flow_in_value += trade.value;
  312. // // } else {
  313. // // self.flow_out_value += trade.value;
  314. // // }
  315. //
  316. // if self.flow_out_value + self.flow_in_value > dec!(2_000_000) {
  317. // self.flow_out_value = self.flow_out_value * dec!(0.618);
  318. // self.flow_in_value = self.flow_in_value * dec!(0.618);
  319. // }
  320. // }
  321. // else {
  322. // if trade.size > Decimal::ZERO {
  323. // self.flow_in_value += trade.value;
  324. // } else {
  325. // self.flow_out_value += trade.value;
  326. // }
  327. // }
  328. let mut flow_in_value = Decimal::ZERO;
  329. let mut flow_out_value = Decimal::ZERO;
  330. for trade_iter in trades.deque.iter() {
  331. if trade_iter.size > Decimal::ZERO {
  332. flow_in_value += trade_iter.value;
  333. } else {
  334. flow_out_value += trade_iter.value;
  335. }
  336. }
  337. // 使用EMA來更新資金流,確保平滑性
  338. // let a = Decimal::TWO / dec!(50);
  339. if flow_out_value + flow_in_value > *min_volume {
  340. let now = (flow_in_value - flow_out_value) / (flow_out_value + flow_in_value);
  341. // a * now + (Decimal::ONE - a) * prev_flow_ratio
  342. // Decimal::ONE_HUNDRED * flow_in_value / (flow_out_value + flow_in_value)
  343. now
  344. } else {
  345. Decimal::ZERO
  346. }
  347. }
  348. // fn calc_flow_ratio_2(_prev_flow_ratio: &Decimal, min_volume: &Decimal, trades: &mut FixedTimeRangeDeque<Trade>) -> Decimal {
  349. // let mut flow_in_value = Decimal::ZERO;
  350. // let mut flow_out_value = Decimal::ZERO;
  351. // for (index, trade_iter) in trades.deque.iter().enumerate() {
  352. // if index == 0 {
  353. // continue
  354. // }
  355. //
  356. // let prev_trade_iter = trades.deque.get(index - 1).unwrap();
  357. // let trade = trade_iter;
  358. // if trade.price > prev_trade_iter.price {
  359. // flow_in_value += trade.value;
  360. // // flow_in_value += Decimal::ONE;
  361. // } else if trade.price < prev_trade_iter.price {
  362. // flow_out_value += trade.value;
  363. // // flow_out_value += Decimal::ONE;
  364. // } else {
  365. // if trade.size > Decimal::ZERO {
  366. // flow_in_value += trade.value;
  367. // } else {
  368. // flow_out_value += trade.value;
  369. // }
  370. // }
  371. // }
  372. //
  373. // // 使用EMA來更新資金流,確保平滑性
  374. // // let a = Decimal::TWO / dec!(50);
  375. // if flow_out_value + flow_in_value > *min_volume {
  376. // // let now = (flow_in_value - flow_out_value) / (flow_out_value + flow_in_value);
  377. // // a * now + (Decimal::ONE - a) * prev_flow_ratio
  378. // (flow_in_value - flow_out_value) / (flow_out_value + flow_in_value)
  379. // } else {
  380. // Decimal::ZERO
  381. // }
  382. // }
  383. pub fn update_flow_ratio(&mut self) {
  384. self.flow_ratio_mfi = if self.money_flow_index > dec!(80) {
  385. (self.money_flow_index - dec!(80)) / dec!(20)
  386. } else if self.money_flow_index < dec!(20) {
  387. Decimal::NEGATIVE_ONE * (dec!(20) - self.money_flow_index) / dec!(20)
  388. } else {
  389. Decimal::ZERO
  390. };
  391. self.flow_ratio_trades = Self::calc_flow_ratio(&self.flow_ratio_trades, &dec!(0), &mut self.trade_short_vec);
  392. }
  393. pub fn check_ready(&mut self) {
  394. if self.is_ready {
  395. return;
  396. }
  397. if self.mid_price == Decimal::ZERO {
  398. return;
  399. }
  400. if self.ask_price == Decimal::ZERO {
  401. return;
  402. }
  403. if self.bid_price == Decimal::ZERO {
  404. return;
  405. }
  406. if self.optimal_ask_price < self.ask_price {
  407. return;
  408. }
  409. if self.optimal_bid_price > self.bid_price {
  410. return;
  411. }
  412. if self.depth_vec.len() < 100 {
  413. return;
  414. }
  415. if self.trade_long_vec.len() < 100 {
  416. return;
  417. }
  418. self.is_ready = true;
  419. info!("========================================行情数据预热完毕==================================")
  420. }
  421. // #[instrument(skip(self), level="TRACE")]
  422. async fn processor(&mut self) {
  423. self.update_t_diff();
  424. // info!(?self.t_diff);
  425. self.update_flow_ratio();
  426. // info!(?self.flow_ratio_long);
  427. self.update_sigma_square();
  428. // info!(?self.sigma_square);
  429. self.update_gamma();
  430. // info!(?self.gamma);
  431. self.update_kappa();
  432. // info!(?self.kappa);
  433. self.update_ref_price();
  434. // info!(?self.ref_price);
  435. self.update_delta();
  436. // info!(?self.ask_delta, ?self.bid_delta);
  437. self.update_optimal_ask_and_bid();
  438. // info!("=============================================");
  439. self.check_ready();
  440. if !self.is_ready {
  441. return;
  442. }
  443. let mut cci = self.cci_arc.lock().await;
  444. cci.predictor_state_vec.push_back(PredictorState {
  445. update_time: Decimal::from_i64(Utc::now().timestamp_millis()).unwrap(),
  446. mid_price: self.last_price,
  447. ask_price: self.ask_price,
  448. bid_price: self.bid_price,
  449. last_price: self.last_price,
  450. spread: self.spread,
  451. spread_max: self.ask_delta,
  452. spread_min: self.bid_delta,
  453. optimal_ask_price: self.optimal_ask_price,
  454. optimal_bid_price: self.optimal_bid_price,
  455. inventory: self.inventory,
  456. sigma_square: self.money_flow_index,
  457. gamma: self.flow_ratio_trades,
  458. kappa: self.t_diff,
  459. flow_ratio: self.flow_ratio_mfi,
  460. ref_price: self.ref_price,
  461. });
  462. }
  463. // #[instrument(skip(self, ref_ticker_map), level="TRACE")]
  464. pub fn get_ref_price(&mut self, _ref_ticker_map: &BTreeMap<String, Ticker>) -> Vec<Vec<Decimal>> {
  465. return vec![];
  466. }
  467. }