MCPcopy Create free account
hub / github.com/Open-Quant/openquant / build_path_distribution

Function build_path_distribution

crates/openquant/src/backtesting_engine.rs:648–703  ·  view source on GitHub ↗
(
    n_groups: usize,
    group_index_map: &[Vec<usize>],
    assignments: &[CpcvPathAssignment],
    splits: &[SplitDefinition],
    split_returns: &HashMap<usize, Vec<f64>>,
)

Source from the content-addressed store, hash-verified

646}
647
648fn build_path_distribution(
649 n_groups: usize,
650 group_index_map: &[Vec<usize>],
651 assignments: &[CpcvPathAssignment],
652 splits: &[SplitDefinition],
653 split_returns: &HashMap<usize, Vec<f64>>,
654) -> Result<Vec<CpcvPathPerformance>, String> {
655 let mut out = Vec::with_capacity(assignments.len());
656 for assignment in assignments {
657 if assignment.split_for_group.len() != n_groups {
658 return Err("invalid path assignment length".to_string());
659 }
660
661 let mut path_returns = Vec::new();
662 for (group_id, split_id) in assignment.split_for_group.iter().enumerate() {
663 let split = splits
664 .iter()
665 .find(|s| s.split_id == *split_id)
666 .ok_or_else(|| "path references unknown split".to_string())?;
667 if !split.test_groups.contains(&group_id) {
668 return Err("path assignment references split not containing group".to_string());
669 }
670 let split_path_returns = split_returns
671 .get(split_id)
672 .ok_or_else(|| "missing split returns for CPCV path construction".to_string())?;
673 if split_path_returns.len() != split.test_indices.len() {
674 return Err("split return count must match split test indices length".to_string());
675 }
676 let return_by_index: HashMap<usize, f64> = split
677 .test_indices
678 .iter()
679 .copied()
680 .zip(split_path_returns.iter().copied())
681 .collect();
682
683 for idx in &group_index_map[group_id] {
684 if split.test_indices.contains(idx) {
685 let r = return_by_index
686 .get(idx)
687 .ok_or_else(|| "split returns missing group test index".to_string())?;
688 path_returns.push(*r);
689 }
690 }
691 }
692
693 let perf = summarize_returns(assignment.path_id, &path_returns)?;
694 out.push(CpcvPathPerformance {
695 path_id: assignment.path_id,
696 sharpe: perf.sharpe,
697 mean_return: perf.mean_return,
698 std_return: perf.std_return,
699 observations: perf.observations,
700 });
701 }
702 Ok(out)
703}

Callers 1

run_cpcvFunction · 0.85

Calls 2

summarize_returnsFunction · 0.85
lenMethod · 0.80

Tested by

no test coverage detected