File size: 1,680 Bytes
ee37d63
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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