Skip to content

Late-entry replay: every later listing of a signal scored against its first report (#115) - #116

Merged
yanivil merged 2 commits into
mainfrom
feat/late-entry-replay
Sep 9, 2026
Merged

yanivil merged 2 commits into
mainfrom
feat/late-entry-replay

Conversation

@yanivil

@yanivil yanivil commented Sep 9, 2026

Copy link
Copy Markdown
Owner

Summary

The question behind #115: the report shows a confirmed row again on every following session (HAL for a week), but every replay fills a signal once, at its first report. This PR makes the backtester score the later listings too, and carries the eleven-year finding.

Code

  • walk_forward(..., repeats=[]) records every later CONFIRMED listing of an already-seen signal (first_day, listed_day = sessions since the first report), filled at the next open under the same rules through the shared _fill_outcome; the first-seen rows are unchanged (asserted by a test).
  • late_entry_table summarises each day on the list and pairs every traded listing with its own first report (mean difference and its month-block interval); rendered per window as Late entry, in the JSON as late and repeats.
  • The backtest workflow keeps backtest.json as an artifact (backtest-<run id>, actions/upload-artifact SHA-pinned) so several runs pool exactly.
  • Tests (140 pass), wiki 03 ("Late entry, tested") and 04, changelog.

Finding (runs 34323013559 to 34323039560, tuned, point-in-time membership, bars=500, horizon=60; 1692 first-seen signals, 4915 later listings; full tables on #115)

Day on the list Listed Traded Hit rate Mean R 95 % CI Pairs Same signals on day 1 On day N Difference 95 % CI
1 1692 1632 35 % +0.22 [+0.09, +0.36]
2 1140 1111 35 % +0.28 [+0.13, +0.45] 1090 +0.28 +0.27 −0.01 [−0.07, +0.07]
3 995 952 35 % +0.22 [+0.08, +0.36] 928 +0.31 +0.22 −0.09 [−0.15, −0.02]
4-5 1541 1479 36 % +0.19 [+0.05, +0.32] 1440 +0.31 +0.18 −0.12 [−0.18, −0.06]
6-9 1230 1169 36 % +0.14 [−0.04, +0.32] 1135 +0.26 +0.14 −0.12 [−0.22, −0.01]
  • A row on its second day is as good as new; from the third day the same signal pays about 0.1 R less than on day 1, days 4-9 worse in 10 of 11 years; from day 7 no edge remains (+0.12, +0.05, −0.00 on days 7 to 9); a Wolfe on days 6-9 lost money (−0.45 R on 44 traded).
  • The quoted entry drifts only +0.3 % to +1.2 %: the cost is the missed first sessions, not the price paid.
  • No rule changes. What follows for the report and the site (the day on the list next to the age, the entry line for days 1-2 only) is on Late entry: buying a signal on its Nth day on the list versus at its first report #115 for the owner's decision.

Test plan

  • ruff --select E,F,W --line-length 120 clean, 140 tests pass locally
  • the workflow's smoke run on push (34323013378) and the eleven yearly runs succeeded, artifact step included
  • tests workflow on this PR

🤖 Generated with Claude Code

yanivil and others added 2 commits September 9, 2026 10:16
…st its first report

walk_forward records the later CONFIRMED listings of an already-seen signal
(first_day, listed_day = sessions since the first report) and fills them at
the next open under the same rules (shared _fill_outcome). late_entry_table
summarises each day on the list and pairs every traded listing with its own
first report (mean difference, month-block interval); rendered per window,
in the JSON as `late` and `repeats`. The backtest workflow keeps its JSON as
an artifact so the yearly point-in-time runs pool exactly. Tests, wiki 04,
changelog. #115

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@yanivil
yanivil merged commit 1208994 into main Sep 9, 2026
4 of 5 checks passed
@yanivil
yanivil deleted the feat/late-entry-replay branch September 9, 2026 07:53
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant