research: prepare effective risk floor ab
This commit is contained in:
@@ -10,6 +10,7 @@ import pytest
|
||||
from app.services import backtest_service as bt
|
||||
from scripts.portfolio_capacity_research import (
|
||||
ANCHOR_YEARS,
|
||||
RISK_FLOOR_ARMS,
|
||||
aggregate_results,
|
||||
bootstrap_median_interval,
|
||||
build_cells,
|
||||
@@ -20,6 +21,7 @@ from scripts.portfolio_capacity_research import (
|
||||
)
|
||||
from scripts.run_portfolio_construction_matrix import (
|
||||
CACHE_VERSION,
|
||||
STUDIES,
|
||||
_assert_clean_worktree,
|
||||
_build_candidate_cache,
|
||||
_checkpoint_state,
|
||||
@@ -29,6 +31,7 @@ from scripts.run_portfolio_construction_matrix import (
|
||||
_load_snapshot,
|
||||
_markdown,
|
||||
_operational_summary,
|
||||
_risk_floor_markdown,
|
||||
_worker_init,
|
||||
_worker_run_cell,
|
||||
_write_cell_checkpoint,
|
||||
@@ -538,6 +541,29 @@ def test_cohort_manifest_realizes_seven_frozen_clusters():
|
||||
assert len(cells) == (
|
||||
len(manifest['empty_book']) + len(manifest['warm_book'])
|
||||
) * 4 * 2
|
||||
floor_cells = build_cells(manifest, arms=RISK_FLOOR_ARMS)
|
||||
assert len(floor_cells) == (
|
||||
len(manifest['empty_book']) + len(manifest['warm_book'])
|
||||
) * 2 * 2
|
||||
assert {row['arm_id'] for row in floor_cells} == {
|
||||
'cap10_incumbent',
|
||||
'cap10_min_risk_005',
|
||||
}
|
||||
|
||||
|
||||
def test_risk_floor_study_changes_only_the_effective_risk_floor():
|
||||
control, treatment = RISK_FLOOR_ARMS
|
||||
|
||||
assert control['max_positions'] == treatment['max_positions'] == 10
|
||||
assert (
|
||||
control['weekly_top_n_rebalance']
|
||||
== treatment['weekly_top_n_rebalance']
|
||||
is False
|
||||
)
|
||||
assert control['min_initial_risk_fraction'] is None
|
||||
assert treatment['min_initial_risk_fraction'] == 0.005
|
||||
assert STUDIES['risk-floor-ab']['arms'] == RISK_FLOOR_ARMS
|
||||
assert STUDIES['capacity-bracket']['arms'] != RISK_FLOOR_ARMS
|
||||
|
||||
|
||||
def test_zero_outcome_horizon_extends_rank_replay_to_last_session(monkeypatch):
|
||||
@@ -700,6 +726,18 @@ def test_aggregate_reports_paired_years_and_separate_warm_iqrs():
|
||||
assert cash_empty['headline']['ev_net_r']['paired_delta_median'] == pytest.approx(
|
||||
0.2
|
||||
)
|
||||
cash_paths = next(
|
||||
row
|
||||
for row in report['paired_path_distributions']
|
||||
if row['arm_id'] == 'cash_unbounded'
|
||||
and row['protocol'] == 'empty_book'
|
||||
and row['cost_per_side_pct'] == 0.1
|
||||
)
|
||||
assert cash_paths['metrics']['ev_net_r']['paired_delta_mean'] == pytest.approx(
|
||||
0.2
|
||||
)
|
||||
assert cash_paths['metrics']['ev_net_r']['positive_fraction'] == 1.0
|
||||
assert cash_paths['metrics']['ev_net_r']['identical_fraction'] == 0.0
|
||||
cash_warm = next(
|
||||
row
|
||||
for row in report['warm_seed_dispersion']
|
||||
@@ -738,6 +776,43 @@ def test_aggregate_reports_paired_years_and_separate_warm_iqrs():
|
||||
assert 'Rank-only qualified rows removed: 137000.' in markdown
|
||||
assert 'formal promotion gate' in markdown
|
||||
|
||||
focused_cells = [
|
||||
row
|
||||
for row in cells
|
||||
if row['arm_id'] == 'cap10_incumbent'
|
||||
] + [
|
||||
{
|
||||
**row,
|
||||
'arm_id': 'cap10_min_risk_005',
|
||||
}
|
||||
for row in cells
|
||||
if row['arm_id'] == 'cash_unbounded'
|
||||
]
|
||||
focused_analysis = aggregate_results(
|
||||
focused_cells,
|
||||
arms=RISK_FLOOR_ARMS,
|
||||
include_warm_dispersion=False,
|
||||
)
|
||||
assert focused_analysis['warm_seed_dispersion'] == []
|
||||
focused_markdown = _risk_floor_markdown({
|
||||
'generated_at': '2026-08-05T00:00:00Z',
|
||||
'arms': list(RISK_FLOOR_ARMS),
|
||||
'protocols': ['empty_book', 'warm_book'],
|
||||
'costs_per_side_pct': [0.1, 0.2],
|
||||
'analysis': focused_analysis,
|
||||
'operational_summary': _operational_summary(
|
||||
focused_cells,
|
||||
arms=RISK_FLOOR_ARMS,
|
||||
),
|
||||
})
|
||||
assert '# Effective initial-risk floor A/B' in focused_markdown
|
||||
assert 'Mean dEV' in focused_markdown
|
||||
assert 'Identical' in focused_markdown
|
||||
assert 'Mean dGtP' in focused_markdown
|
||||
assert 'Mean dCalmar/MAR' in focused_markdown
|
||||
assert 'Floor rejects' in focused_markdown
|
||||
assert 'not independent evidence' in focused_markdown
|
||||
|
||||
|
||||
def test_synthetic_worker_matrix_covers_four_arms_protocols_and_costs(monkeypatch):
|
||||
monkeypatch.setenv('BACKTEST_SNAPSHOT_OFFLINE', '0')
|
||||
|
||||
Reference in New Issue
Block a user