rank.rs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. use std::cmp::{min};
  2. use std::collections::HashMap;
  3. use rust_decimal::{Decimal, MathematicalOps};
  4. use rust_decimal_macros::dec;
  5. use serde::{Deserialize, Serialize};
  6. use serde_json::Value;
  7. use tokio::sync::MutexGuard;
  8. use crate::msv::Indicators;
  9. #[derive(Serialize, Deserialize, Clone)]
  10. pub struct Rank {
  11. symbol: String,
  12. score: Decimal,
  13. msv_score: Decimal,
  14. liquidity_score: Decimal,
  15. frequency_score: Decimal,
  16. msv_abs_total: Decimal,
  17. msv_abs_max: Decimal,
  18. msv_abs_avg: Decimal,
  19. coverted_open_base: Decimal,
  20. epr_total: Decimal,
  21. effective_count: Decimal,
  22. liquidity_avg: Decimal,
  23. }
  24. const TWENTY: Decimal = dec!(20);
  25. const SIXTY: Decimal = dec!(60);
  26. const TWO_HUNDRED: Decimal = dec!(200);
  27. // const TEN_THOUSAND: Decimal = dec!(10000);
  28. // 根据最终的msv计算排行榜
  29. pub fn generate_rank_by_indicator_map(indicator_map: &MutexGuard<HashMap<String, Indicators>>) -> Value {
  30. let mut rank_list: Vec<Rank> = vec![];
  31. for (key, indicators) in indicator_map.iter() {
  32. let symbol = key.clone();
  33. // ============== msv相关数据的计算 =================
  34. let mut msv_abs_total = Decimal::ZERO;
  35. let mut msv_abs_max = Decimal::ZERO;
  36. let mut effective_count = Decimal::ZERO;
  37. for value in indicators.msv.iter() {
  38. let msv_abs_value = value[1].abs();
  39. if msv_abs_value <= Decimal::ZERO {
  40. continue
  41. }
  42. effective_count += Decimal::ONE;
  43. msv_abs_total += msv_abs_value;
  44. if msv_abs_value > msv_abs_max {
  45. msv_abs_max = msv_abs_value
  46. }
  47. }
  48. let mut msv_abs_avg = if effective_count == Decimal::ZERO {
  49. Decimal::ZERO
  50. } else {
  51. msv_abs_total / effective_count
  52. };
  53. msv_abs_avg.rescale(6);
  54. let mut coverted_open_base = (msv_abs_max + msv_abs_avg) / TWO_HUNDRED;
  55. coverted_open_base.rescale(8);
  56. // ============== epr相关数据的计算 =================
  57. let mut epr_total = Decimal::ZERO;
  58. for value in indicators.eprs.iter() {
  59. epr_total += value[1];
  60. }
  61. // ============== liq相关数据的计算 =================
  62. let mut liquidity_total = Decimal::ZERO;
  63. for value in indicators.liqs.iter() {
  64. liquidity_total += value[1] * Decimal::ONE_THOUSAND;
  65. }
  66. let mut liquidity_avg = if effective_count == Decimal::ZERO {
  67. Decimal::ZERO
  68. } else {
  69. liquidity_total / effective_count
  70. };
  71. liquidity_avg.rescale(0);
  72. // ======================== 最终计算 =========================
  73. // msv_score计算规则
  74. let mut msv_score = if msv_abs_total > Decimal::ZERO && epr_total > Decimal::ZERO {
  75. ((msv_abs_max * epr_total / msv_abs_total) * SIXTY).powd(Decimal::TWO)
  76. } else {
  77. Decimal::ZERO
  78. };
  79. msv_score.rescale(2);
  80. // liquidity_score
  81. let mut liquidity_score = min(liquidity_avg / Decimal::ONE_THOUSAND, TWENTY);
  82. liquidity_score.rescale(2);
  83. // frequency_score计算规则
  84. let mut frequency_score = (effective_count / Decimal::ONE_THOUSAND) * TWENTY;
  85. frequency_score.rescale(2);
  86. let temp = msv_score * liquidity_score * frequency_score;
  87. let mut score = if temp > Decimal::ONE {
  88. Decimal::TEN * temp.log10()
  89. } else {
  90. Decimal::ZERO
  91. };
  92. score.rescale(2);
  93. let rank = Rank {
  94. symbol,
  95. score,
  96. msv_score,
  97. liquidity_score,
  98. frequency_score,
  99. msv_abs_total,
  100. msv_abs_max,
  101. msv_abs_avg,
  102. coverted_open_base,
  103. epr_total,
  104. effective_count,
  105. liquidity_avg,
  106. };
  107. rank_list.push(rank);
  108. }
  109. // 按 score 倒序排序
  110. rank_list.sort_by(|a, b| b.score.cmp(&a.score));
  111. return serde_json::to_value(&rank_list).unwrap();
  112. }