|
|
@@ -1,5 +1,5 @@
|
|
|
use std::collections::HashMap;
|
|
|
-use rust_decimal::{Decimal, MathematicalOps};
|
|
|
+use rust_decimal::{Decimal};
|
|
|
use rust_decimal_macros::dec;
|
|
|
use serde::{Deserialize, Serialize};
|
|
|
use serde_json::Value;
|
|
|
@@ -79,6 +79,7 @@ pub fn generate_rank_by_indicator_map(indicator_map: &MutexGuard<HashMap<String,
|
|
|
};
|
|
|
liquidity_avg.rescale(0);
|
|
|
|
|
|
+ // ======================== 最终计算 =========================
|
|
|
// msv_score计算规则
|
|
|
let mut msv_score = if msv_abs_total > Decimal::ZERO && epr_total > Decimal::ZERO {
|
|
|
(msv_abs_avg * epr_total / msv_abs_total) * SIXTY
|
|
|
@@ -88,20 +89,11 @@ pub fn generate_rank_by_indicator_map(indicator_map: &MutexGuard<HashMap<String,
|
|
|
msv_score.rescale(2);
|
|
|
|
|
|
// liquidity_score
|
|
|
- let liquidity_k = liquidity_avg / Decimal::ONE_THOUSAND;
|
|
|
- let mut liquidity_score = if liquidity_k > Decimal::TEN {
|
|
|
- TWENTY + Decimal::ONE / (Decimal::ONE + Decimal::TEN - liquidity_k)
|
|
|
- } else {
|
|
|
- Decimal::TEN * liquidity_k.sqrt().unwrap()
|
|
|
- };
|
|
|
+ let mut liquidity_score = (liquidity_avg / Decimal::ONE_THOUSAND) * TWENTY;
|
|
|
liquidity_score.rescale(2);
|
|
|
|
|
|
// frequency_score计算规则
|
|
|
- let mut frequency_score = if effective_count > Decimal::ZERO {
|
|
|
- (Decimal::ONE + effective_count).ln()
|
|
|
- } else {
|
|
|
- Decimal::ZERO
|
|
|
- };
|
|
|
+ let mut frequency_score = (effective_count / Decimal::ONE_HUNDRED) * TWENTY;
|
|
|
frequency_score.rescale(2);
|
|
|
|
|
|
let mut score = msv_score * liquidity_score * frequency_score;
|