feat: extend take-profit sweep into the tail + clarify it ignores the target
Avg R was still rising at the previous top level (+15%), so the optimum was off the table. Extend TP_LEVELS to 20/25/30% to reveal where letting winners run stops paying (it plateaus toward "just hold to the horizon close"). Also clarify in the panel that the take-profit model deliberately does NOT use the setup's S/R target — it's a standalone fixed-% exit; exiting at the target is the target-vs-stop model above. The two are complementary ends, not in conflict. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -322,7 +322,10 @@ def _bucket_stats(cands: list[dict]) -> dict:
|
||||
|
||||
|
||||
# Fixed take-profit levels (fractions) swept for the take-profit exit model.
|
||||
TP_LEVELS = (0.04, 0.06, 0.08, 0.10, 0.12, 0.15)
|
||||
# Extended into the tail so the avg-R peak/plateau is visible (it's where letting
|
||||
# winners run stops paying). Note: this model ignores the setup's S/R target —
|
||||
# it's a standalone fixed-% exit; exiting at the target is the target model.
|
||||
TP_LEVELS = (0.04, 0.06, 0.08, 0.10, 0.12, 0.15, 0.20, 0.25, 0.30)
|
||||
|
||||
|
||||
def _take_profit_bucket(cands: list[dict], tp: float) -> dict:
|
||||
|
||||
@@ -248,7 +248,8 @@ export function BacktestPanel() {
|
||||
the stop, else exit at the {report.params.horizon_days}-day close. In R, so it compares to the
|
||||
target model above. <span className="text-gray-300">Hit Rate = how often you'd have banked
|
||||
+X%</span> (how far winners actually run) — no top-ticking, it's the level you'd really set.
|
||||
★ = best avg R.
|
||||
The setup's own S/R target is <em>not</em> used here (exiting at that target is the model
|
||||
above); this is a pure fixed-% exit. ★ = best avg R.
|
||||
</p>
|
||||
<div className="glass overflow-x-auto">
|
||||
<table className="w-full text-sm">
|
||||
|
||||
Reference in New Issue
Block a user