import numpy as np import pandas as pd from scripts.run_factor_side_split_strategy_report import ( SidePolicy, apply_confidence_override, apply_side_policy, prediction_rate_table, ) def test_apply_side_policy_zeroes_selected_sides_without_mutating_source(): events = pd.DataFrame( { "factor__risk": [1.0, -2.0, 0.0], "factor__macro": [3.0, -4.0, 0.0], "factor__kept": [5.0, -6.0, 0.0], } ) policy = SidePolicy( "test", zero_positive=("risk",), zero_negative=("macro",), ) transformed = apply_side_policy(events, policy) assert events["factor__risk"].tolist() == [1.0, -2.0, 0.0] assert transformed["factor__risk"].tolist() == [0.0, -2.0, 0.0] assert transformed["factor__macro"].tolist() == [3.0, 0.0, 0.0] assert transformed["factor__kept"].tolist() == [5.0, -6.0, 0.0] def test_confidence_override_converts_only_hold_predictions(): events = pd.DataFrame( { "p_buy": [0.6, 0.2, 0.4, 0.7], "p_sell": [0.3, 0.5, 0.6, 0.1], } ) pred = np.array([0, 0, 0, -1]) adjusted = apply_confidence_override(events, pred, 0.4) assert adjusted.tolist() == [1, -1, -1, -1] def test_prediction_rate_table_reports_class_precision_and_recall(): events = pd.DataFrame({"y_true": [1, 1, -1, 0]}) pred = np.array([1, 0, -1, -1]) rows = {row["class"]: row for row in prediction_rate_table(events, pred)} assert rows["BUY"]["precision_pct"] == 100.0 assert rows["BUY"]["recall_pct"] == 50.0 assert rows["SELL"]["pred_count"] == 2 assert rows["HOLD"]["pred_rate_pct"] == 25.0