Add honest Torch validation gate

This commit is contained in:
Codex
2026-06-25 06:19:14 +03:00
parent bb3b4070f6
commit 4a24419a30
11 changed files with 839 additions and 147 deletions
+29 -1
View File
@@ -806,12 +806,14 @@ HTML = r"""
const rec = backtest.recommended || {};
const replay = backtest.full_replay || {};
const walk = backtest.walk_forward?.summary || {};
const validation = backtest.validation || {};
const benchmark = backtest.benchmark?.summary || {};
return `
<div class="grid cols-4">
${metric('Recommended edge', `${num(rec.edge, 4)}%`, `P(up) ${num((rec.probability || 0) * 100, 1)}%`)}
${metric('Entry replay', `${replay.trades || 0} trades`, `${signed(replay.avg_net_percent, 4)}% avg · PF ${num(replay.profit_factor, 3)}`)}
${metric('Walk-forward', `${walk.trades || 0} trades`, `${signed(walk.avg_net_percent, 4)}% avg · ${walk.status || ''}`)}
${metric('Retrain guard', retrain.available ? (retrain.accepted ? 'accepted' : 'rejected') : 'no report', retrain.reason || '')}
${metric('Quality gate', validation.status || 'missing', validation.passed ? 'Torch allowed' : 'Torch blocked')}
</div>
<div class="grid cols-2" style="margin-top:14px">
${panel('Threshold calibration', kvTable([
@@ -832,6 +834,32 @@ HTML = r"""
['Profit factor', num(replay.profit_factor, 4)]
]))}
</div>
<div class="grid cols-2" style="margin-top:14px">
${panel('Honest validation', kvTable([
['Status', validation.status || 'missing'],
['OOS trades', String(validation.oos_summary?.trades || 0)],
['OOS avg net', signed(validation.oos_summary?.avg_net_percent, 4) + '%'],
['OOS PF', num(validation.oos_summary?.profit_factor, 4)],
['Folds with trades', String(backtest.walk_forward?.folds_with_trades || 0)],
['Benchmark total', signed(benchmark.total_net_percent, 4) + '%'],
['Benchmark trades', String(benchmark.trades || 0)],
['Retrain guard', retrain.available ? (retrain.accepted ? 'accepted' : 'rejected') : 'no report']
]))}
${panel('Gate checks', simpleTable((validation.checks || []).map(row => ({
check: row.name,
value: row.value,
required: row.required,
passed: row.passed ? 'yes' : 'no'
})), ['check', 'value', 'required', 'passed']))}
</div>
${panel('OOS by symbol', simpleTable((backtest.walk_forward?.symbol_breakdown || []).map(row => ({
symbol: row.symbol,
trades: row.trades,
share: num((row.trade_share || 0) * 100, 1) + '%',
avg: signed(row.avg_net_percent, 4) + '%',
total: signed(row.total_net_percent, 4) + '%',
pf: num(row.profit_factor, 3)
})), ['symbol', 'trades', 'share', 'avg', 'total', 'pf']))}
${panel('Walk-forward folds', simpleTable((backtest.walk_forward?.folds || []).map(row => ({
fold: row.fold,
train: row.train_records,