QuantProp. Analyze a trade file ↗
stockback / Weekly log

Weekly report — work week 5 (2026-W37)

Weekly research log for W37: EXP-011 rejected on 30 symbols, per-period capital isolation, a shared harness and an external audit.

Original record: 2026-09-10 · Migrated: 2026-10-27 · Translated from Korean: 2026-10-27
A historical record, not rerun in this migration.

The figures, hypotheses and verdicts of the time are preserved. A past positive result or candidate mention does not mean validated profitability today or a live-trading recommendation. Validation periods that were already used are not treated as new independent validation.

This is an English translation of a preserved Korean original. It describes conditions at the time of writing, not current provider specifications, costs or regulations.

Weekly report — work week 5 (2026-W37)

  • Period: 2026-09-07 ~ 2026-09-13
  • Stage: generalization verdict on the squeeze candidate across symbols, and overhaul of the measurement system
  • Status: complete — EXP-011 rejected. Strategies admitted to live trading: still 0
  • Execution model: claude-opus-5 / high

| generated_at | 2026-09-10T00:00:00+09:00 |

This week's single goal

Expand Turtle + Bollinger squeeze to 30 symbols to build, for the first time, a sample that allows a statistical verdict, and decide advance / hold / rejected.

Done this week means not adding a candidate but settling one candidate for certain. Rejection is a normal completion too. Week 4 set several goals and ended as a "partial completion", so the one-goal-per-week rule was kept.

The capital contract is an initial 3,000,000 KRW per symbol, variant and period, 95% of cash just before entry, integer quantities and no leverage. From this week, the period became the unit of capital isolation.

Evidence carried from last week

  • EXP-008 7 symbols: the squeeze filter moved locked OOS median CAGR 2.05% → 9.33% and mean MDD -30.54% → -16.30%. But only about 4 OOS trades per symbol
  • EXP-010 7-symbol RSI(2) daily: 6/7 positive, 4~10 trades per symbol, so hold
  • EXP-009 5-minute: all 14 OOS cells negative at provisional actual costs
  • Daily bars for all 3,552 symbols secured — no extra collection needed to add symbols

Completion gates

  1. Basket preregistration — 30 symbols fixed by objective rules before seeing results — done
  2. Per-period capital isolation — each period starts from initial capital; the default keeps the old behaviour — done
  3. Making capital starvation visible — signals discarded for being unable to buy even 1 share exposed in results — done
  4. Buy-and-hold benchmark — excess CAGR incorporated into the verdict gate — done
  5. Verdict — control and new symbols aggregated separately under 8 preregistered gates — done

Non-goals

  • Recording the official retirement of the 5-minute line (carried to week 6)
  • Expanding daily RSI(2) to 30 symbols, EXP-012 (candidate single goal for week 6)
  • Confirming actual CREON execution commissions
  • Restoring a point-in-time universe

Verifying external feedback — research partner

The research partner who proposed the joint research sent feedback on the week-4 results. Each claim was checked directly against the repository.

ClaimVerification
Engine sound, BNF rejectedTrue
5-minute is negative even at 0 commissionTrue
Turtle + squeeze 2%→9.5%, MDD -30.5%→-16%True. EXP-008 2.05%→9.33%, -30.54%→-16.30%
Daily data secured, no more collection neededTrue
"0 trades but the account lost 99%"Partially corrected — not in the daily ledgers, but real in the 5-minute ones
Buy-and-hold comparison is already in the designOnly half true — implemented but never called

The grounds for the three corrections are in 0.

Engine — per-period capital isolation

The locked OOS of EXP-009 started from ₩184,053 (6.1%) of 3,000,000 KRW. Drawdowns in earlier periods distorted later-period sizing, so comparisons across symbols and runs did not hold.

PortfolioConfig.trading_window runs each period independently and resets capital. Signals are generated from the full time series to preserve warm-up, and the default keeps the old behaviour, so past experiments reproduce unchanged. A regression test pins the defect numerically — same period, same entry date, but carried over 100 shares vs isolated 1,000 shares.

Two side fixes: entry signals that intraday.py silently discarded when cash was short are now exposed as starved_count, and buy_and_hold, implemented but never called, was wired in.

Turtle + Bollinger squeeze 30-symbol generalization — EXP-011

3,552 symbols → coverage and quality gates → 1,042 eligible → top 30 by train-period trading value. The rank calculation reads only train-period bars, so there is no OOS leakage. All 7 EXP-008 symbols are in the top 30, so the real subject of the generalization test is the 23 new symbols.

ContractGroupMedian CAGRMedian MDD
turtle_squeeze_60Control 79.74%-16.56%
turtle_squeeze_60New 23-1.70%-15.14%
turtle_onlyControl 71.86%-35.29%
turtle_onlyNew 23-2.52%-32.27%

The control figures reproduced almost exactly as in EXP-008. The capital isolation fix did not change the conclusion; the effect disappeared when the number of symbols increased. All four contracts were negative even fully frictionless, and the median locked OOS excess CAGR was -17~-19%.

Verdict rejected. Not hold, which defers judgment for lack of samples; judgment was reached by enlarging the sample.

Extracting a shared experiment harness

Instrumentation, costs, periods and policies were copied across 10 runners and 2,918 lines, and definitions had diverged in three places. Among them, the handling of undefined PF led to a real bug: 316 all-win cells were recorded as PF = 0.0 (the worst value) .

The single definitions were moved to src/stockback/experiment/, and the EXP-011 matrix was rerun and compared with the committed ledger — 11,520 rows, 0 key mismatches, 0 value mismatches. New work was added on top only after confirming behaviour was preserved. The existing runners are reproduction records, so they were not modified.

While writing tests, the zero profile was found to be mislabelled. It was labelled "0bp cost" but still charged the 15~30bp sell tax. It was renamed and a frictionless profile was added.

Full-universe sweep — the illusion of market exposure

The two registered designs were applied sequentially to the 1,042 eligible symbols. 0 failures.

DesignMarket exposureOwn CAGRExcess CAGR
Connors RSI(2) baseline6.6%0.00%+4.62%
Turtle squeeze (12 variants)0.3~1.2%-0.74~-1.09%+3.7~4.4%
turtle_only8~14%-4.36~-5.08%-0.6~+0.6%

Both designs have own CAGR near 0% or negative, yet beat the benchmark. They lost less by standing aside in cash during declines; it is not excess return. turtle_only, the only contract that actually trades, is the worst of the 12 variants. Participate and lose; do not participate and do not lose.

This finding led to the withdrawal of EXP-011's component-hold. The squeeze filter's drawdown reduction came not from managing risk but from participating in only about 1/(4~7) of the market.

  • Reports: 0, 1
  • Research log: 0
  • Decision: D-032

Accepting the external execution audit — A-01 ~ A-07

The external audit identified 7 time-ordering defects in the execution engine. All were reproduced in code and all were accepted. In particular, portfolio.py did not check entry-bar stops while turtle.py did, so the two engines were running on different execution contracts, and mark_to_market(bar.close) fed into the same bar's open-entry decision, a case of look-ahead.

Execution models were separated into versions to preserve reproducibility of existing experiments. The same-condition replay showed the EXP-011 verdict does not change — control 9.74% / new 23 symbols -1.70% are identical on both engines, and, as the audit predicted, the RSI base form without stops was also completely identical.

This week's verdict summary

SubjectVerdictGrounds
turtle_bollinger_squeezerejectedEffect vanished on the 23 new symbols; nothing to preserve
connors_rsi2 dailyhold maintainedThe cross-section shows 6.6% exposure with own CAGR of 0.00%
Execution engine v17 defects confirmedFixed as v2 with reproducibility preserved

Handling the partner's proposals

ProposalHandling
① Reset capital per validation periodDone
② Squeeze 7→30 symbolsDone — rejected
③ Tidy up the 5-minute lineCarried to week 6
④ Expand daily RSI(2) to more symbolsCandidate single goal for week 6
⑤ Buy-and-hold comparisonDone — excess CAGR incorporated into the gate

Carried to next week

  1. EXP-012 daily RSI(2) expanded to 30 symbols — currently the only remaining candidate. In addition to the same basket, isolated accounting and benchmark gate, a minimum market exposure gate is mandatory. Without it, holding cash is mistaken for an edge.
  2. Record the official retirement of the 5-minute line — confirm EXP-006/EXP-009 as rejected.
  3. Confirm actual CREON execution commissions — though since results were negative even frictionless, existing verdicts will not change.
  4. Remaining audit P1 items — reproducibility hardening (run.json, overwrite protection), linking adjusted and raw prices, the tax-rate gap before 2005, and the shared-capital portfolio experiment.

Strategies admitted to live trading

Still 0. This week one candidate was removed, and the remaining one looks less like "a strategy that makes money" than "a strategy that hardly trades".

The real gain this week is the measurement system more than the rejection itself. Without the exposure column, we would have mistaken both "drawdown is small" and "it beat the benchmark" for edges and designed week 6 on that basis.

Source and migration evidence

Source: reports/weekly/2026-W37.md

Original SHA-256: 46ddb82ddd891a7622d003ad2e1f9fb843e791180c795190179aa25db04fc655

Raw data and account information are not part of the public package. The original results do not replace statistical or scientific revalidation. The English text is a translation; numbers, tables and charts are carried over unchanged.