feat: grade gate-ablation variants under the hold-to-horizon exit too
The ablation judged floors under the target/stop model, but the exit sweeps point at replacing that exit with a fixed hold — under which the R:R floor's rationale (bigger payoff at the target) may not apply. Each ablation row now also carries hold_avg_r / hold_net_avg_r / hold_total_r (30d hold, initial stop only), so the Phase 3 gate decision can be read under the exit policy that would actually be used. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
@@ -285,6 +285,8 @@ export function BacktestPanel() {
|
||||
<th className="px-4 py-2.5 text-right">Avg R</th>
|
||||
<th className="px-4 py-2.5 text-right">Net Avg R</th>
|
||||
<th className="px-4 py-2.5 text-right">Total R</th>
|
||||
<th className="px-4 py-2.5 text-right">Hold Net Avg R</th>
|
||||
<th className="px-4 py-2.5 text-right">Hold Total R</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -303,6 +305,12 @@ export function BacktestPanel() {
|
||||
{fmtR(row.net_avg_r ?? null)}
|
||||
</td>
|
||||
<td className={`num px-4 py-2.5 text-right ${rColor(row.total_r)}`}>{fmtR(row.total_r)}</td>
|
||||
<td className={`num px-4 py-2.5 text-right font-semibold ${rColor(row.hold_net_avg_r ?? null)}`}>
|
||||
{fmtR(row.hold_net_avg_r ?? null)}
|
||||
</td>
|
||||
<td className={`num px-4 py-2.5 text-right ${rColor(row.hold_total_r ?? null)}`}>
|
||||
{fmtR(row.hold_total_r ?? null)}
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
</tbody>
|
||||
|
||||
@@ -280,6 +280,11 @@ export interface BacktestTimeExitRow {
|
||||
|
||||
export interface BacktestGateAblationRow extends BacktestBucket {
|
||||
variant: string;
|
||||
// The same variant graded under the hold-to-horizon time exit.
|
||||
hold_days?: number;
|
||||
hold_avg_r?: number | null;
|
||||
hold_net_avg_r?: number | null;
|
||||
hold_total_r?: number | null;
|
||||
}
|
||||
|
||||
export interface BacktestSignalEvalRow {
|
||||
|
||||
Reference in New Issue
Block a user