Add honest Torch validation gate
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user