msv.rs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368
  1. use std::cmp::{max, min};
  2. use std::str::FromStr;
  3. use rust_decimal::{Decimal, MathematicalOps};
  4. use rust_decimal::prelude::{FromPrimitive, ToPrimitive};
  5. use rust_decimal_macros::dec;
  6. use serde::{Deserialize, Serialize};
  7. use serde_json::{Value};
  8. use standard::{SimpleDepth, Trade};
  9. /// 技术指标结构体
  10. /// - `msv(Vec<Vec<Decimal>>)`: msv
  11. /// - `liqs(Vec<Vec<Decimal>>)`: liqs
  12. /// - `eprs(Vec<Vec<Decimal>>)`: eprs
  13. /// - `sigmas(Vec<Vec<Decimal>>)`: sigmas
  14. /// - `sigma_mas(Vec<Vec<Decimal>>)`: sigma_mas
  15. /// - `total_size(i64)`: total_size
  16. /// - `result_size(i64)`: result_size
  17. #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
  18. pub struct Indicators {
  19. pub msv: Vec<Vec<Decimal>>,
  20. pub liqs: Vec<Vec<Decimal>>,
  21. pub eprs: Vec<Vec<Decimal>>,
  22. pub sigmas: Vec<Vec<Decimal>>,
  23. pub sigma_mas: Vec<Vec<Decimal>>,
  24. pub total_size: i64,
  25. pub result_size: i64,
  26. }
  27. // 将trades转换为具体指标 trades 50 [] stime etime
  28. pub fn generate_msv_by_trades(mut trades: Vec<Trade>, mills_back: Decimal, simple_depths: Vec<SimpleDepth>, start_time: i64, end_time: i64) -> Indicators {
  29. // 具体波动
  30. let mut msv_data: Vec<Vec<Decimal>> = vec![];
  31. // 预期利润幅度(except_profit_rate)
  32. let mut epr_data: Vec<Vec<Decimal>> = vec![];
  33. // 波动率sigma
  34. let mut sigma_data: Vec<Vec<Decimal>> = vec![];
  35. const GAMMA: Decimal = dec!(0.5);
  36. // ================== 计算每个点的具体波动率以及回溯幅度 ===================
  37. trades.sort_by(|a, b| Decimal::from_str(a.id.as_str()).unwrap().cmp(&Decimal::from_str(b.id.as_str()).unwrap()));
  38. for (index, trade) in trades.iter().enumerate() {
  39. if index == 0 {
  40. continue;
  41. }
  42. // 该元素向前遍历range毫秒
  43. let mut range_index = index;
  44. // 该区间的预定价格
  45. let mut ref_price = trade.price;
  46. let mut dissociation = Decimal::ZERO;
  47. loop {
  48. // 下标合法性判断
  49. if range_index == 0 {
  50. break;
  51. }
  52. let flag_trade = trades.get(range_index).unwrap();
  53. let range_time = trade.time - flag_trade.time;
  54. // 判断该ticker是否是range ms以外
  55. if range_time > mills_back {
  56. break;
  57. }
  58. ref_price = ref_price * GAMMA + flag_trade.price * (Decimal::ONE - GAMMA);
  59. dissociation = dissociation + flag_trade.size.abs();
  60. range_index -= 1;
  61. }
  62. // 获取到range毫秒以后的预定价格,计算回去的幅度
  63. let mut future_ref_price = ref_price;
  64. let mut future_range_index = index;
  65. loop {
  66. // 下标合法性判断
  67. if future_range_index >= trades.len() {
  68. break;
  69. }
  70. let flag_trade = trades.get(future_range_index).unwrap();
  71. let range_time = flag_trade.time - trade.time;
  72. // 判断该ticker是否是range ms以外
  73. if range_time > mills_back {
  74. break;
  75. }
  76. future_ref_price = future_ref_price * GAMMA + flag_trade.price * (Decimal::ONE - GAMMA);
  77. future_range_index += 1;
  78. }
  79. // 计算过去至多100条数据的sigma值 sigma^2 = (1 / (tn-t0))*sum((S(tk) - S(tk-1)) ^ 2)
  80. let mut sigma_index = index - 1;
  81. let t_last = trade.time;
  82. let mut _t_first = trade.time;
  83. // 右值
  84. let mut total_right = Decimal::ZERO;
  85. loop {
  86. let flag_trade = trades.get(sigma_index).unwrap();
  87. let next_trade = trades.get(sigma_index + 1).unwrap();
  88. // 下标合法性判断
  89. if sigma_index == 0 || sigma_index + 100 <= index {
  90. _t_first = flag_trade.time;
  91. break;
  92. }
  93. // 计算差值
  94. let diff = Decimal::ONE - flag_trade.price / next_trade.price;
  95. total_right += diff * diff;
  96. sigma_index = sigma_index - 1;
  97. }
  98. let sigma_square = if _t_first == t_last {
  99. let time_diff = Decimal::ONE;
  100. (Decimal::ONE / time_diff) * total_right
  101. } else {
  102. let time_diff = (t_last - _t_first) / Decimal::ONE_THOUSAND;
  103. (Decimal::ONE / time_diff) * total_right
  104. };
  105. let mut sigma = sigma_square.sqrt().unwrap();
  106. sigma.rescale(6);
  107. // 计算过去至多100个sigma值的平均值
  108. let sigma_ma = if sigma_data.len() > 0 {
  109. let mut sigma_ma_index = sigma_data.len();
  110. let mut sigma_total = Decimal::ZERO;
  111. let mut sigma_count = Decimal::ZERO;
  112. loop {
  113. if sigma_ma_index == 0 || sigma_ma_index + 99 < sigma_data.len() {
  114. break;
  115. }
  116. // 步进
  117. sigma_ma_index -= 1;
  118. // 计算
  119. sigma_total += sigma_data[sigma_ma_index][1];
  120. sigma_count += Decimal::ONE;
  121. }
  122. let mut sigma_ma = sigma_total / sigma_count;
  123. sigma_ma.rescale(6);
  124. sigma_ma
  125. } else {
  126. sigma
  127. };
  128. // ==================== 波动逻辑计算 ====================
  129. let last_price = trade.price;
  130. let mut rate = Decimal::ONE_HUNDRED * (last_price - ref_price) / ref_price;
  131. rate.rescale(2);
  132. // 去除小数位之后,可以忽略一些太小的波动,减少图表生成压力
  133. if rate.eq(&Decimal::ZERO) {
  134. continue;
  135. }
  136. // ==================== 预期利润逻辑计算 ====================
  137. // 首先计算未来一段时间的价格与现在的距离
  138. let mut future_rate = Decimal::ONE_HUNDRED * (future_ref_price - last_price) / last_price;
  139. future_rate.rescale(2);
  140. // 根据具体向上波动还是向下波动来计算预期最大利润
  141. let epr = if rate > Decimal::ZERO {
  142. -future_rate
  143. } else {
  144. future_rate
  145. };
  146. // 去重,以及保留最大的波动率
  147. if msv_data.len() > 0 {
  148. let last = msv_data[msv_data.len() - 1].clone();
  149. let last_time = last[0];
  150. let last_rate = last[1];
  151. // 如果时间相同,则可能会进行remove等操作
  152. if last_time == trade.time {
  153. // 如果最新的波动率大于最后波动率
  154. if rate.abs() > last_rate.abs() {
  155. msv_data.remove(msv_data.len() - 1);
  156. msv_data.push(vec![trade.time, rate, dissociation]);
  157. epr_data.remove(epr_data.len() - 1);
  158. epr_data.push(vec![trade.time, epr]);
  159. sigma_data.remove(sigma_data.len() - 1);
  160. sigma_data.push(vec![trade.time, sigma, sigma_ma]);
  161. }
  162. } else {
  163. msv_data.push(vec![trade.time, rate, dissociation]);
  164. epr_data.push(vec![trade.time, epr]);
  165. sigma_data.push(vec![trade.time, sigma, sigma_ma]);
  166. }
  167. } else {
  168. msv_data.push(vec![trade.time, rate, dissociation]);
  169. epr_data.push(vec![trade.time, epr]);
  170. sigma_data.push(vec![trade.time, sigma, sigma_ma]);
  171. }
  172. }
  173. // 按时间序列填充数据
  174. let mut msv_index = 0;
  175. let mut final_msv_data: Vec<Vec<Decimal>> = vec![];
  176. let mut final_epr_data: Vec<Vec<Decimal>> = vec![];
  177. let mut final_sigma_data: Vec<Vec<Decimal>> = vec![];
  178. let mut final_sigma_ma_data: Vec<Vec<Decimal>> = vec![];
  179. let mut depth_index = 0;
  180. let mut final_volume_data: Vec<Vec<Decimal>> = vec![];
  181. let mut index_timestamp = Decimal::from_i64(start_time).unwrap();
  182. let last_timestamp = Decimal::from_i64(end_time).unwrap();
  183. let step_timestamp = dec!(1000);
  184. loop {
  185. let mut max_msv_data = Decimal::ZERO;
  186. let mut max_msv_qty_data = Decimal::ZERO;
  187. let mut max_epr_data = Decimal::ZERO;
  188. let mut max_sigma_data = Decimal::ZERO;
  189. let mut max_sigma_ma_data = Decimal::ZERO;
  190. // ====================================== 数据生产 ===============================================
  191. // 获取时间范围内的波动率数据
  192. loop {
  193. // 下标合法性判断
  194. if msv_index >= msv_data.len() {
  195. break;
  196. }
  197. // msv_data的指定下标数据不在时间范围内(时间范围:指的是[index_timestamp-mills_back, index_timestamp]这个范围)
  198. if index_timestamp < msv_data[msv_index][0] {
  199. break;
  200. }
  201. // -------------- 大小判断,取值
  202. let msv_d = msv_data[msv_index][1];
  203. let msv_qty_data = msv_data[msv_index][2];
  204. let epr_d = epr_data[msv_index][1];
  205. let sigma_d = sigma_data[msv_index][1];
  206. let sigma_ma_d = sigma_data[msv_index][2];
  207. // msv波动数据
  208. if max_msv_data.abs() < msv_d.abs() {
  209. max_msv_data = msv_d;
  210. max_msv_qty_data = msv_qty_data;
  211. max_epr_data = epr_d;
  212. max_sigma_data = sigma_d;
  213. max_sigma_ma_data = sigma_ma_d;
  214. }
  215. // // 波动率sigma
  216. // if max_sigma_data.abs() < sigma_d {
  217. // max_sigma_data = sigma_d;
  218. // }
  219. // 下标步近
  220. msv_index = msv_index + 1;
  221. }
  222. // 获取时间范围内的深度数据、买一及卖一价数据
  223. let mut max_size = Decimal::ZERO;
  224. let mut min_size = Decimal::ONE_THOUSAND * Decimal::ONE_THOUSAND;
  225. loop {
  226. // 下标合法性判断
  227. if depth_index >= simple_depths.len() {
  228. break;
  229. }
  230. let depth = &simple_depths[depth_index];
  231. // 时间范围合法性判断,只统计那一秒以内的深度总交易量
  232. if index_timestamp < depth.time {
  233. break;
  234. }
  235. // 这一秒的深度最大值、最小值
  236. max_size = max(max_size, depth.size);
  237. min_size = min(min_size, depth.size);
  238. // 下标步近
  239. depth_index += 1;
  240. }
  241. // ====================================== 智能填充数据 ===============================================
  242. // 流动性数据叠加
  243. // let rst_size = if (max_size == Decimal::ZERO || min_size == Decimal::ONE_THOUSAND * Decimal::ONE_THOUSAND) && final_depth_data.len() > 0 {
  244. // final_depth_data.last().unwrap()[1]
  245. // } else {
  246. // if (max_size == Decimal::ZERO || min_size == Decimal::ONE_THOUSAND * Decimal::ONE_THOUSAND) && simple_depths.len() > 0 {
  247. // simple_depths[0].size
  248. // } else {
  249. // if simple_depths.len() > 0 {
  250. // (max_size + min_size) / Decimal::TWO
  251. // } else {
  252. // Decimal::ZERO
  253. // }
  254. // }
  255. // };
  256. // final_depth_data.push(vec![index_timestamp, rst_size]);
  257. //
  258. // // 建议开仓距离
  259. // let mut rst_spread = if rst_size == Decimal::ZERO {
  260. // Decimal::ZERO
  261. // } else {
  262. // dec!(10000) / rst_size
  263. // };
  264. // rst_spread.rescale(6);
  265. // final_spread_data.push(vec![index_timestamp, rst_spread]);
  266. // 波动率数据处理
  267. // 如果这两个值为0,则代表这mills_back毫秒以内是没有数据的,填充0数据,使得x轴是完整的
  268. if max_msv_data == Decimal::ZERO {
  269. final_msv_data.push(vec![index_timestamp, Decimal::ZERO, Decimal::ZERO]);
  270. final_epr_data.push(vec![index_timestamp, Decimal::ZERO]);
  271. final_volume_data.push(vec![index_timestamp, Decimal::ZERO]);
  272. if final_sigma_data.len() > 0 {
  273. final_sigma_data.push(vec![index_timestamp, final_sigma_data.last().unwrap()[1]]);
  274. final_sigma_ma_data.push(vec![index_timestamp, final_sigma_ma_data.last().unwrap()[1]]);
  275. } else {
  276. final_sigma_data.push(vec![index_timestamp, Decimal::ZERO]);
  277. final_sigma_ma_data.push(vec![index_timestamp, Decimal::ZERO]);
  278. }
  279. // 说明在这个时间范围内是有数据存在的,将各类副图放置完全
  280. } else {
  281. final_msv_data.push(vec![index_timestamp, max_msv_data, max_msv_qty_data]);
  282. final_epr_data.push(vec![index_timestamp, max_epr_data]);
  283. let mut final_qty = max_msv_qty_data / Decimal::ONE_THOUSAND;
  284. final_qty.rescale(2);
  285. final_volume_data.push(vec![index_timestamp, final_qty]);
  286. final_sigma_data.push(vec![index_timestamp, max_sigma_data]);
  287. final_sigma_ma_data.push(vec![index_timestamp, max_sigma_ma_data]);
  288. }
  289. // ====================================== 时间步进处理 ======================================
  290. // 对时间进行步近
  291. index_timestamp = index_timestamp + step_timestamp;
  292. // 时间越界
  293. if index_timestamp > last_timestamp {
  294. break;
  295. }
  296. }
  297. // 结果统计
  298. let total_size = trades.len().to_i64().unwrap();
  299. let result_size = final_msv_data.len().to_i64().unwrap();
  300. Indicators {
  301. msv: final_msv_data,
  302. liqs: final_volume_data,
  303. eprs: final_epr_data,
  304. sigmas: final_sigma_data,
  305. sigma_mas: final_sigma_ma_data,
  306. total_size,
  307. result_size,
  308. }
  309. }
  310. // 将json转换为trades
  311. pub fn parse_json_to_trades(trades_json: Value) -> Vec<Trade> {
  312. let mut rst = vec![];
  313. for trade_json in trades_json.as_array().unwrap() {
  314. let arr = trade_json.as_array().unwrap();
  315. rst.push(Trade {
  316. id: arr[0].as_str().unwrap().to_string(),
  317. time: Decimal::from_str(arr[1].as_str().unwrap()).unwrap(),
  318. size: Decimal::from_str(arr[2].as_str().unwrap()).unwrap(),
  319. price: Decimal::from_str(arr[3].as_str().unwrap()).unwrap(),
  320. symbol: "".to_string(),
  321. });
  322. }
  323. rst
  324. }