独立保留市场统计并标明行业缺失日期
This commit is contained in:
@@ -67,6 +67,7 @@ pub struct OutputDay {
|
|||||||
pub no_limit: usize,
|
pub no_limit: usize,
|
||||||
pub profit_effect_members: Vec<String>,
|
pub profit_effect_members: Vec<String>,
|
||||||
pub profit_effect_missing: Vec<String>,
|
pub profit_effect_missing: Vec<String>,
|
||||||
|
pub industry_missing: Vec<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize)]
|
#[derive(Serialize)]
|
||||||
@@ -193,8 +194,14 @@ pub fn aggregate(request: Request) -> Result<Output, String> {
|
|||||||
fields.insert("industry_rank".into(), ranks.get(name).copied());
|
fields.insert("industry_rank".into(), ranks.get(name).copied());
|
||||||
fields.insert("industry_size".into(), Some(universe.len() as f64));
|
fields.insert("industry_size".into(), Some(universe.len() as f64));
|
||||||
}
|
}
|
||||||
|
let industry_missing=members.iter().filter(|(_,group)|group.is_none()).map(|(s,_)|s.clone()).collect::<Vec<_>>();
|
||||||
|
if !industry_missing.is_empty() {
|
||||||
|
// An unclassified member may belong to any group; never silently shrink a group.
|
||||||
|
state.industry_history.clear();
|
||||||
|
for fields in industries.values_mut() { for value in fields.values_mut() { *value=None; } }
|
||||||
|
}
|
||||||
output.push(OutputDay { date:day.date, common, industries, members, securities:day.rows.len(), active, paused,
|
output.push(OutputDay { date:day.date, common, industries, members, securities:day.rows.len(), active, paused,
|
||||||
no_limit:unlimited, profit_effect_members:previous_ups, profit_effect_missing:profit_missing });
|
no_limit:unlimited, profit_effect_members:previous_ups, profit_effect_missing:profit_missing, industry_missing });
|
||||||
state.last_date = Some(day.date); state.streaks = streaks; state.limit_ups = ups;
|
state.last_date = Some(day.date); state.streaks = streaks; state.limit_ups = ups;
|
||||||
}
|
}
|
||||||
Ok(Output {contract:CONTRACT, days:output, state})
|
Ok(Output {contract:CONTRACT, days:output, state})
|
||||||
@@ -236,4 +243,13 @@ mod tests {
|
|||||||
let unknown=aggregate(Request{days:vec![day(1,true)],previous:State::default()}).unwrap();
|
let unknown=aggregate(Request{days:vec![day(1,true)],previous:State::default()}).unwrap();
|
||||||
assert_eq!(unknown.days[0].common["market_high_board"],None);
|
assert_eq!(unknown.days[0].common["market_high_board"],None);
|
||||||
}
|
}
|
||||||
|
#[test]
|
||||||
|
fn missing_industry_does_not_invent_groups_or_disable_independent_market_facts() {
|
||||||
|
let mut missing=day(2,true);missing.rows[0].industry=None;
|
||||||
|
let r=aggregate(Request{days:vec![day(1,false),missing,day(3,true)],previous:State::default()}).unwrap();
|
||||||
|
assert_eq!(r.days[1].common["market_breadth"],Some(0.5));
|
||||||
|
assert_eq!(r.days[1].industry_missing,vec!["A"]);
|
||||||
|
assert!(r.days[1].industries.values().flat_map(|g|g.values()).all(Option::is_none));
|
||||||
|
assert_eq!(r.days[2].industries["I"]["industry_return_20"],None);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user