backtest: full-GPU research twin (cudaBasedBacktesting.py + cuda_signal_kernels.py); books byte-identical to gpu_backtest.py (2026-09-18)
Owner decisions: research only (live scans stay on the CPU code), gpu_backtest.py stays the base reference, every research flag supported, the one exemption from instructions item 6 recorded in backtest/instructions_for_backtest.txt. - backtest/cuda_signal_kernels.py: the CUDA decision stage. K1 = engine.py + the GPUTechnicalEngine overrides (one thread per bar), K2 = analyze_from_dataframes end to end incl. gates 6b-6i, the four setup generators and the regime filter (one thread per primary bar), K3 = position_sizing.build_features, K4 cooldown, K5 prefix median, K6 recorder bar rows. Config packer with generated #defines; leaf module; --fmad=false; Python evaluation order kept (ternary min/max, pairwise sums, Neumaier sum(), exact round(x, 2)). - backtest/cudaBasedBacktesting.py: same CLI, cache files and writers as the reference; the host turns kernel codes into the exact strings; no CPU path. - test_all.py Module 37 (16 tests): every stage pinned against the live code; suite 552 / 552 on the GPU, without CUDA and with FB2_BACKEND=cpu. - Proof: five reference MD5s, four 6-month acceptance books (M5/M15, $0.65/$0.30), M15 OOS --export-features and --record --record-bars tables, ten research-flag variants, and the owner's five-year M5 and M15 books, all byte-identical to gpu_backtest.py. Wall time 0.8-6.6 s per book against 13-353 s. - CLAUDE.md sections 1, 3, 6, 7, 9, 10, 11 and the instructions addendum: any signal change is now a parity event for the twin. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
@@ -46,3 +46,22 @@ re-implementation.
|
||||
- Any change to a kernel or to its CPU twin is a parity event: re-run Module 36, regenerate the
|
||||
five reference books on BOTH backends and show the ten MD5s unchanged. Never replace a kernel
|
||||
with a differently ordered algorithm (parallel scan, two-pass variance) even if it is faster.
|
||||
|
||||
--- 2026-09-18: CUDA research twin (backtest/cudaBasedBacktesting.py) ---
|
||||
- Exemption from "replays go through the real signal code" above, granted by the owner for this
|
||||
ONE research script: its per-bar decision is a CUDA re-implementation of engine.py,
|
||||
signal_aggregator.py and chart_patterns.py (backtest/cuda_signal_kernels.py). gpu_backtest.py
|
||||
stays the base reference and live scans never use the twin.
|
||||
- Its numbers count as evidence only while parity holds. After ANY change to engine.py,
|
||||
signal_aggregator.py, chart_patterns.py, position_sizing.py, the recorder's row layout or the
|
||||
GPUTechnicalEngine overrides: mirror the change in cuda_signal_kernels.py in the same commit,
|
||||
keep test_all.py Module 37 green, and regenerate at least the M15 OOS book (2024-06-01 ->
|
||||
2025-03-30, $0.65) with BOTH scripts and show equal MD5s before quoting a CUDA-script result.
|
||||
- A report built from the twin quotes both scripts' "Backend:" lines (the twin's necessarily
|
||||
starts with "CuPy GPU (") and the paired MD5 of at least one book from the reference script on
|
||||
the same code and cache. Whole-window and half-window figures, costs and breakdowns are then
|
||||
read from the twin's book exactly as from the reference's; the CSVs are identical.
|
||||
- The twin has no CPU path (--backend cpu / FB2_BACKEND=cpu are refused), --workers is ignored,
|
||||
and it refuses configurations beyond its compile-time limits (more than 4 confirmation
|
||||
timeframes, divergence lookback >= 64, swing lookback >= 256, cp_lookback >= 128) with a
|
||||
message that points back to gpu_backtest.py.
|
||||
|
||||
Reference in New Issue
Block a user