Methodology

How Steady Otter searches and compares ETF portfolios

Objective: find ETF mixes with stronger historical compound growth after modeled trading costs, within allocation, risk, turnover and liquidity limits. Historical comparisons do not establish future returns.

IdentityCurrent value
Revision Date2026-10-19
Methodalpha-p0-v1.4
Algorithmalpha-p0-v1.4-robust-selection-v9
Resultscenario-ranking-v2.12
EngineJAX/XLA in compute-core-gpu; same numerical source for GPU and CPU checks

Exact rules: numerical reference. Display scores: evidence-score paper.

The data and portfolio rules

ElementRule
SnapshotImmutable adjusted returns, unadjusted closes and volume; cutoff is the last XNYS session before acquisition date in New York
HistoryFull requested actual-history calendar1. Every requested ETF/reference is required; legacy frozen inputs retain the 2,520-actual-return cap
TrainingStandard minimum 1,262 returns; explicitly accepted limited history minimum 756
Later testReserve the longest admissible period before search: standard 252 or 126 sessions; limited 126; otherwise historical-only
AllocationsLong-only, total 100%, integer 1% ticks; optional holdings may be zero or meet the configured floor; ticker-specific positive minima override that floor; grouped constraints unsupported
ComparatorsStarting portfolio (seed), VTI, VT and starting 60% VTI / 40% BND
RebalancingMonthly by default; otherwise holdings drift. Explicit chronological refits still execute
CostsBase, stress, modeled and funded rates default to zero; equal base/stress rates provide no distinct fee stress

All comparisons share dates and execution assumptions. History floors and window choices are product policies, not evidence of adequate sample size.

Missing ETF history blocks a run. Compute identifies affected ETFs and available dates so the user can remove or replace them or choose a later start year. The product does not reconstruct history from proxies or holdings.

Measures and qualification

Returns and weights are fractions. Daily annualization uses 252 sessions; volatility uses sample standard deviation. Drawdown includes initial wealth 1.

G=exp⁡(252n∑tlog⁡(1+rt))−1D=max⁡t(1−Wtmax⁡(1,W1,…,Wt))σ=s(r)252,HHI=∑iwi2Tt=12∑j∣wj,ttarget−wj,tcurrent∣\begin{aligned} G &= \exp\left(\frac{252}{n}\sum_t\log(1+r_t)\right)-1 \\ D &= \max_t\left(1-\frac{W_t}{\max(1,W_1,\ldots,W_t)}\right) \\ \sigma &= s(r)\sqrt{252},\qquad HHI=\sum_i w_i^2 \\ T_t &= \tfrac12\sum_j|w^{target}_{j,t}-w^{current}_{j,t}| \end{aligned}

Historical and modeled trading cost = pretrade wealth × rate × turnover, including cash. Establishment turnover is 1; recurring turnover excludes it. Funded paths charge the rate on executed purchases plus sales; these conventions differ at positive rates. Ranking excludes contributions, taxes and inflation; expense drag embedded in adjusted returns remains.

Development is the last 60% of training, split into three consecutive blocks with one continuous holdings path. Full-training risk also includes the first 40%.

GateRequirement
GrowthLinked development CAGR exceeds every fixed reference by at least 0.5 percentage points/year, at both costs
DrawdownAt most min(40%, same-scope seed drawdown + 5 percentage points)
VolatilityAt most min(25%, 1.10 × same-scope seed volatility)
TurnoverMaximum rolling-252-session recurring one-way turnover at most 100%
LiquidityEvery active ETF: trailing-60-session median close × volume at least $5 million/day

Risk gates cover each development block, linked development and full training, at both costs. Individual-block growth persistence is diagnostic.

There is no general requirement to beat seed CAGR.

The paired circular stationary bootstrap resamples computed daily net-return paths within each development block, using common candidate/reference indices.2 Each replicate links the three blocks and takes minimum CAGR excess across three references and two costs. At every expected block length—10, 21 and 63 sessions—the one-based ceil(replicates/10) order statistic must exceed zero. These lengths and the lower-decile gate are engine policies. Candidate-level bounds neither correct for searching many mixes nor estimate future-win probabilities.3

Search

RouteMechanism
PoolDirichlet proposals, legal tick projection, capped point screening and bounded full evaluation
EvolutionaryParent crossover, one-tick mutation and immigrants
CMAActive full-covariance adaptation of continuous proposals, followed by tick projection4
IslandsSequential CMA routes with distinct streams and refreshed parents
BlendsDirichlet combinations of up to three distinct best route winners

Routes share validity checks, fitness, allocation identities and a per-search cache. Seed allocations cannot be parents; admitted benchmark controls may participate. Optional illiquid ETFs are masked in proposals; financial liquidity validation still applies.

Search fitness maximizes the same growth/risk/diversity preference f as final selection for qualified candidates, then prefers allocations passing observed gates but failing bootstrap by their bound, then remaining failures by normalized gate shortfalls. Qualified exact ties use the same financial keys as final ranking. Duplicates consume proposal budgets and reuse evidence. Keyed Threefry streams identify proposals and paths; repeatability requires pinned inputs, settings and execution environment.

Final order and retained alternatives

Feasible qualified mixes precede feasible unqualified mixes. Within each group:

R=100max⁡scope,cost(D/Dcap,σ/σcap)xs=∑jwjhj,s,E=∑jwj2H=∑sxs2,Q=∑smax⁡(0,xs−t)2P=aE+bH+kQf=100G−λR−P\begin{aligned} R &= 100\max_{scope,cost}(D/D_{cap},\sigma/\sigma_{cap}) \\ x_s &= \sum_j w_j h_{j,s},\qquad E=\sum_j w_j^2 \\ H &= \sum_s x_s^2,\qquad Q=\sum_s\max(0,x_s-t)^2 \\ P &= aE+bH+kQ \\ f &= 100G-\lambda R-P \end{aligned}

Here G is linked-development base-cost net CAGR; w_j is ETF weight and h_{j,s} its original NAV fraction in stock s. E is ETF HHI; H is observed stock HHI; Q is squared exposure above soft threshold t. Weights and thresholds are fractions. P is in annual CAGR percentage points, applied once. Only frozen SEC common/preferred-stock rows eligible at each fit cutoff enter; partial rows keep original weights and missing rows add no estimate or penalty. No usable stock rows means the stock component is unavailable and contributes no cost.

Independent controlMin / Balanced / Max defaultsAlgorithm effect
Candidate varietyDistance floor 10 / 15 / 20 points; default MaxFinal and exploratory retention only
ETF diversitya = 0.5 / 1 / 2; default BalancedQualified search fitness and feasible final order
Stock diversityb = 5 / 10 / 20; t = 6% / 4% / 2%; default BalancedQualified search fitness and feasible final order; k defaults to 100 at all levels

These configurable preferences leave point screening, qualification, hard limits and failure ordering unchanged. Stronger settings need not change every ordering or monotonically reduce selected exposures. Policy formulas and units. CAGR/risk preference points: higher f ranks first; exact ties prefer lower risk usage, then the remaining comparison keys. The configured risk coefficient defaults to 0.5 annual CAGR percentage points per raw risk-usage point. Post-run comparison holds development CAGR and P fixed, expands risk to include the matched later test, and leaves historical ranks unchanged. Missing later evidence leaves the after score unavailable; later CAGR remains separate. Using later results for choice consumes their untouched-validation role. The evidence-score paper gives the in-run and post-run equations and a worked example. This is a chosen preference, not an expected return or calibrated optimum. The current engine requires this mode; legacy band ranking is unsupported.

Retain at most eleven mixes. Preserve the seed reference and one highest raw-CAGR alternative in the best feasible tier. Other nonseed rows, including score and defensive winners, must meet the selected allocation-distance floor and eligible SEC holdings-distance checks. Fewer alternatives are valid. Unknown holdings cannot establish separation; missing eligible SEC data uses allocation distance. Roles name only surviving exact IDs. Select the first retained feasible mix. Exploratory output also spaces alternatives and retains its diagnostic labels. The selected mix is a comparison focus, not a trade instruction.

Checks and output boundaries

CheckPurpose and effect
RepeatabilityCompare qualified top sets and leading allocations across enabled seeds
Expanded searchCompare primary results with larger budgets
Training stabilityFailed or omitted required checks with alternatives → exploratory, unranked output; unanimous no-qualification permits feasible diagnostic comparison (“No qualified winner”)
Five chronological refitsRepeat the complete enabled policy on strict prefixes; freeze each target, then evaluate its next segment; defaults total twenty constituent searches
Continuous outer pathCarry holdings and transitions across five segments; cash-reset diagnostics remain separate
Reserved later testEvaluate frozen retained allocations after a separate execution row; historical qualification and rank stay fixed
ProjectionsAfter rank freeze, resample complete common months, including later-test rows; ten-year conditional simulations, not independent validation
Holdings reportsPartial disclosed-position HHI and sectors describe frozen facts without changing qualification or rank; concentration needs holdings context5
AIExplain deterministic results without changing metrics or ranking; optional text may be absent

What the results cannot establish

Implementation: numerical reference. Historical SEC evidence enters stock scoring and diversity retention only with eligible identity and public timing at each fit cutoff. Outer results, later-test results, projections and report-only exposures cannot change final historical selection.

References

1

New inputs select a start year from 2000 through the current New York year, defaulting to ten years back. Every required symbol must have actual history for the selected period. No silent truncation, exclusions or renormalization are permitted. Legacy frozen inputs retain their original actual-only window; its 2,520-return cap is a runtime/recency policy, not an empirically optimal history.

2

D. N. Politis and J. P. Romano (1994), The Stationary Bootstrap, JASA 89(428), 1303–1313, §2. Geometric circular blocks for stationary, weakly dependent series; no validation of this engine's fixed lengths, lower-decile threshold or ETF sample adequacy.

3

H. White (2000), A Reality Check for Data Snooping, Econometrica 68(5), 1097–1126, abstract and §1. Tests the best model in a searched family; the engine does not implement that search-wide correction.

4

N. Hansen (2016; revised 10 March 2023), The CMA Evolution Strategy: A Tutorial, §§1–4 and Appendix A. Continuous CMA-ES lineage; tick projection, portfolio fitness and route coordination are local adaptations, without a global-optimality or investment-performance guarantee.

5

J. M. Hill, E. Kashner and D. Nadig (2026), A Comprehensive Guide to ETFs (2nd Edition), Module 2: Evaluating ETFs, CFA Institute Research Foundation, printed p. 21, Exhibit 13. Compares holdings counts and Herfindahl concentration. It does not validate this tool's partial-coverage estimates, identity matching or SEC distance thresholds.

6

D. H. Bailey, J. M. Borwein, M. López de Prado and Q. J. Zhu (27 February 2015 manuscript), The Probability of Backtest Overfitting, abstract and §§1–2. Discusses backtest selection and holdout limitations; the engine does not implement its combinatorially symmetric cross-validation diagnostic.

Back to documents