41 lines
1.8 KiB
Python
41 lines
1.8 KiB
Python
from control_plane.trading_studio.management.commands.export_cohort_failure_context_v1 import Command
|
|
|
|
|
|
def test_failure_labels_are_explicit_and_precedence_is_deterministic():
|
|
cases = [
|
|
({"net_pnl": -1}, {"return_1_bars_bps": 5}, "GOOD_SIGNAL_BAD_MONETIZATION"),
|
|
({"net_pnl": 1}, {"winner_negative_first": True}, "RECOVERY_DEPENDENT"),
|
|
({}, {"mae_bps": -25}, "HIGH_MAE_ENTRY"),
|
|
({}, {"return_1_bars_bps": -5}, "WRONG_DIRECTION"),
|
|
({}, {"return_1_bars_bps": 0, "return_5_bars_bps": 5}, "LATE_SIGNAL"),
|
|
({"net_pnl": 1}, {"return_1_bars_bps": 5}, "GOOD_ENTRY"),
|
|
({}, {}, "NO_EDGE"),
|
|
]
|
|
|
|
for ledger, deq, expected in cases:
|
|
assert Command._label(ledger, deq)[0] == expected
|
|
|
|
|
|
def test_rows_preserve_raw_ledger_deq_genome_context_and_rescue():
|
|
payload = {
|
|
"cohort_id": "cohort", "dataset_version_id": "dataset", "dataset_sha256": "hash",
|
|
"strategies": [{
|
|
"ordinal": 1, "membership_id": "member", "strategy_version_id": "strategy",
|
|
"runner_name": "runner", "genome": {"combo": "g"}, "feature_triples": [],
|
|
"folds": [{"fold": "F1", "scenarios": [{
|
|
"qualification_run_id": "run", "scenario": "BASE",
|
|
"summary": {"rescue": {"recovered": True}},
|
|
"deq_samples": [{"identity": "trade", "entry_bar": 2, "entry_execution_price": 10,
|
|
"take_profit_price": 11, "context": {"regime": "x"},
|
|
"deq": {"return_1_bars_bps": 5}}],
|
|
}]}],
|
|
}],
|
|
}
|
|
|
|
row = Command._rows(payload)[0]
|
|
|
|
assert row["direction"] == "LONG"
|
|
assert '"return_1_bars_bps":5' in row["raw_deq_json"]
|
|
assert '"combo":"g"' in row["genome_json"]
|
|
assert '"regime":"x"' in row["context_json"]
|
|
assert '"recovered":true' in row["rescue_json"]
|