Add an n-normalized SQN (SQN100) as an optional sweep objective #130
Reference in New Issue
Block a user
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Motivation
summarize_r'ssqn(crates/aura-engine/src/report.rs, cycle 0065 iter-2, spec0065) is the raw Van-Tharp form
√n · mean(R) / stdev(R). Because it scales withthe raw trade count, a strategy that simply trades more earns a higher SQN partly
for the turnover alone — not ideal when SQN is the single-number objective used to
rank a sweep family whose members differ in trade count.
Idea
Offer an n-normalized variant alongside the raw
sqn— Van Tharp's "SQN score"caps the trade count, conventionally at 100:
This makes the objective comparable across sweep members with different trade
counts: it still rewards edge quality (mean/stdev) and consistency, but stops
rewarding sheer turnover past the cap.
Notes / open choices
sqnfield; add asqn_normalizedfield (or make the capa
summarize_rparameter), so existing reporting stays byte-unchanged.correction.
default to raw or normalized SQN.
Context: Stage-1 "R-based signal quality" cycle 0065 / decision log #117.
Design reconciliation (specify) — cycle 0067
Spec:
0067-r-sweep-followups. This issue's open choices are resolved below(derived autonomously under
/boss; reply to veto).summarize_rparameter → fixed named constantSQN_CAP = 100, not a parameter.Basis: derived — the cap is Van Tharp's convention, not a per-experiment
tuning knob; a parameter forces every call site to answer "what cap?" with
no principled value but 100 (YAGNI). A future variable-cap need is a
separate change.
sqnkeeps themeaning of
"sqn", andsqn_normalizedis a NEW opt-in metric selectedexplicitly (
aura runs family <id> rank sqn_normalized).Basis: derived — non-breaking, preserves the 0066 byte-compat / golden,
consistent with how 0066 added the R metrics as opt-in ranking vocabulary.
RMetrics.sqn_normalizedfieldcarries
#[serde(default)], so a pre-0067r:block (without the field)still deserializes (→ 0.0).
Basis: derived — C18 back-compat (the registry reads
runs.jsonl); mirrorsthe
metrics.rfield's ownserde(default).Note: additive — the 0066 single-run golden is re-baselined (the
r:blockgains one field). That is the correct response to an intended output change,
not drift.