You are an AI agent assisting the quantitative risk officer of a multi-strategy
fund. Every week the monitoring stack flags boundary points in return, spread and
execution-cost series — a suspected regime change after a macro event, an
execution-cost shift after a venue migration, a factor spread that may have
broken after a crowding unwind. For each flagged point you must make the
call: did the generating process actually change there, or is this
within-regime noise? Calling a break that is not there triggers costly
de-risking and model retraining; missing a real one leaves the book sized
off a dead regime. Breaks come in many flavors — level, scale, dependence,
volatility persistence, tail weight — and the flavor of the next one is
unknown, so the desk needs detection that transfers to break mechanisms it
was never tuned on. Your job is to build the detection procedure the desk
will run fleet-wide: it will be retrained and re-scored, unchanged, on
flagged fleets your development never saw.
Hard Constraints
Submit a method: methods/main/solver.py defining exactly
fit(train) -> model and predict(model, test) -> list of floats.
train is a dict {"series": [[...], ...], "boundary": [...],
"label": [...]} (labeled fleet: each series a list of floats, its
annotated boundary index, and 1 iff the process changes there); test
is a dict {"series": ..., "boundary": ...} with no labels. predict
returns one float per test series, larger = more evidence of a break;
only the ranking of the scores matters.
Each evaluation run executes fit then predict in a fresh process
under a 900-second wall-clock budget (measured outside your process).
Anything that takes longer than 915 s (budget + 15 s grace) is scored
as the worst case for that fleet, and the process is hard-killed at
930 s regardless; crashed or wrongly-shaped outputs are scored the
same worst case. The grader records a timeout and the child's exit status
separately from "produced no output", so both show up in the run log.
Your procedure is re-run once per sealed fleet, and there are 6 of
them (two halves x three fleets each), each with its own 2400-series
training fleet and 800-series test fleet — the same shape as the fleet
selfcheck.py uses. So the graded workload is about 6x one
self-check pass, even though each individual run gets the same 900 s.
The whole grading stage is capped at 10800 s wall-clock, inside a
container declared at 4 CPUs / 2048 MiB —
the same shape as your own container. Note the interaction: 6 fleets x
the full 900 s budget is 5400 s, comfortably inside the stage cap, so the
per-fleet budget is the binding constraint. Also note that 4 CPUs is a
share, not a reservation: on a busy host the same work takes noticeably
longer wall-clock than it does on an idle one, so leave headroom rather
than tuning to sit exactly at the budget.
CPU only, no network. Runtime: Python 3 with numpy, scipy and
scikit-learn. BLAS/OpenMP threading is pinned to 4 in both this image
and the grader, so your local timings match the graded ones.
Only files under methods/ are collected and re-run: keep everything
solver.py imports inside methods/main/. Do not modify data/ or
selfcheck.py.
What You Have
data/practice/fleet.json — 2400 labeled training series plus 800
labeled practice series, documented field by field in
data/practice/DATA_CARD.md. This is your only labeled data; study it
in full.
methods/main/solver.py — the inherited starting method: the desk's
legacy screening rule, a single training-free boundary score. It carries
a real signal but is far from what the fleet supports; its level is also
the floor you must clearly beat before the evaluation awards any credit.
python3 selfcheck.py — free and unlimited: retrains your current
methods/main/solver.py on the train fleet, scores the practice fleet
against its labels, and prints the practice ROC-AUC plus wall-clock
timings against the evaluation budget.
What You Submit
Leave your best methods/main/solver.py (plus any helper files it needs
inside methods/main/) in place. There is no submit step and no feedback
from the graded fleets: whatever sits in methods/main/ at the end is what
the evaluation re-runs.
How It Is Judged
The evaluation re-runs your procedure — fit on a labeled training fleet,
predict on an unlabeled test fleet — on sealed fleets generated from
secret seeds. Every sealed training fleet is drawn from the same population
as the practice fleet. The sealed test fleets come in two halves, weighted
equally in the final score: one half draws fresh series from the same
break mechanisms the practice fleet exhibits; the other half contains
only break mechanisms absent from every training fleet — the
flavor-of-the-next-break case the desk actually fears. Each test fleet is
scored by the ROC-AUC of your break scores against the sealed labels;
fleet scores are averaged within each half, then across the two halves.
selfcheck.py computes the identical ROC-AUC on the practice fleet. Your
reward rises monotonically with the sealed score; at or below the shipped
starting method's level it is zero.
Metric
mean sealed ROC-AUC over the two half-fleet layers · higher is better
ROC-AUC of the break scores per sealed fleet; mean over 3 fleets per layer, then mean of indist and newfamily
anchor
visible set
held-out
reward
B
shipped legacy CUSUM rule
0.572347
0.549016
0.00
R
reference method
0.754761
0.694905
0.30
S
hidden expert (sota)
0.814000
0.827957
0.60
U
perfect ranking (AUC 1)
1.000000
1.000000
1.00
normalisation
m <= B
0
B < m <= R
0.3 * (m - B) / (R - B)
R < m <= S
0.3 + 0.3 * (m - R) / (S - R)
S < m <= U
0.6 + 0.4 * (m - S) / (U - S)
m = this run's held-out metric · B = shipped legacy CUSUM rule · R = reference method · S = hidden expert (sota) · U = perfect ranking (AUC 1)
Linear in raw AUC, no transform. The two layer means are averaged first and mapped once; the per-layer rewards below are diagnostic.
Rollouts
188 minwall clock
$23.65spend
32.1Mtokens
12versions, 12 kept
keptrevertedno scoreturning point
v0Inherited legacy rule: standardized CUSUM at the flagged boundary, training-free0.57232 min · $0.39
v162-stat two-sample battery, affine-invariant, combined by boosted trees0.78136 min · $1.28
v2110 stats with delay-embedding MMD; null-conditional calibration, rank blendCalibrate each statistic against label-0 series of the same nuisances, so a generic mean-z score can carry unseen mechanisms.0.775627 min · $3.85
v317 more generic stats: periodogram distance, leverage moments, copula-rank MMD0.778233 min · $4.46
v5Generic score becomes the Mahalanobis norm of the calibrated z-vectorScore the z-vector against its null correlation matrix so correlated statistics stop double-counting each other.0.799345 min · $6.43
v6Schilling-Henze kNN two-sample tests on 1/2/3-d embeddings; z winsorised at 80.794259 min · $8.28
v7Supervised head becomes a regularised linear model; blend weight 0.10 to 0.250.799377 min · $10.13
v8Head gets extra positives: 18 synthetic break flavors grown from the fleet nullsManufacture the missing mechanisms out of the fleet's own single-regime series instead of hoping the labels cover them.0.803398 min · $12.79
v9Augmentation library widened from 18 to 28 flavors, one rep0.7999127 min · $16.44
v10Hardening only: wall-clock guard, pooled-calibration and pinv fallbacks0.7999129 min · $16.84
v11AR(1)-GARCH(1,1)-t likelihood ratio plus 7 parameter deltas, in both channels0.8033182 min · $23.00
v0-v8 took 98 min and $12.79; v11 alone added 53 min. Practice AUC is flat near 0.80 from v4, and later versions were picked on novel-break proxies.
v4Log-magnitude AR/ACF persistence and grid-GARCH likelihood contrasts0.798411 min · $1.08
v5Forest cut back to core features; label-0 tail calibration, blend with omnibusSplit the method in two: a supervised head for the seen mechanisms, a calibrated omnibus of families for the rest.0.81117 min · $1.70
v6Omnibus aggregation: sparse exceedance sum above 1.5 replaces top-two families0.811620 min · $2.00
v7Forest sweep over leaf, feature fraction and depth; leaf 4 / features 0.250.812423 min · $2.38
v8Boundary-alignment scan against 13 nearby splits0.811424 min · $2.56
v9Synthetic marginal-shape expert from label-0 series, gated into the omnibusBuild shape breaks that keep post-boundary mean and variance, and give that expert its own gated channel.0.812430 min · $3.27
v10Spectral peak, entropy and flatness contrasts fed to both channels0.808633 min · $3.85
v11Second gated expert for dynamic breaks; spectral columns used only by it0.809735 min · $4.12
v12Expert gates tuned on mixed shape/dynamic proxy fleets, practice at half weightSelect on a proxy objective that weights unseen mechanisms equally, and accept the loss on practice.0.808242 min · $5.15
v13Calibrated side-slope and curvature-change family for trend mechanisms0.807343 min · $5.42
v14Expert null calibration moves to a deterministic 25% real-null holdout0.811951 min · $6.94
v15Blend retuned on honest calibration: shape gate 4, dynamic 1, omnibus rank 40.80955 min · $7.75
v16Three grid-GARCH features dropped from the supervised and dynamic experts0.808858 min · $8.35
v17Nuisance descriptors (length, tails, dependence) added to the forest only0.809960 min · $9.16
v18Length and boundary-fraction context removed as spurious; sweep re-confirmed0.810162 min · $9.69
19 snapshots in 62 min and $9.69, $10.79 for the run. Practice AUC moved 0.0011 since v7; everything after v11 was picked on synthetic proxy fleets.
v0Inherited legacy rule: cumulative-drift CUSUM at the flagged boundary0.5723
v1Two-sample battery plus AR/Laplace LRs; non-negative logistic on null-zForce non-negative combiner weights so the generic discrepancy terms can never be cancelled by the fitted head.0.7953
v32% winsorized likelihood ratios; combiner cut to ExtraTrees plus 0.12 generic0.8074
v4Long training series cropped to 160/200-point windows, labels carried overManufacture short-series examples by cropping the long ones, since short fleets are where the ranking is worst.0.8074
v5Increment-domain tests: winsorized AR(1) LR, ES, energy, KS and scale on diffs0.8078
v6Same features and model; extraction parallelized over 4 joblib processes0.8078
v73-seed ExtraTrees bag, 500 trees each, plus a third crop length of 140Judge candidates on novel breaks injected into real null series at half weight, not on practice AUC alone.0.81
v8Cleanup: unused NN logit dropped, serial fallback, safer null mean0.81
Nine snapshots in 68 min; this harness reports no cost or tokens. Practice AUC flat at 0.8100 from v7; six other ideas were reverted unsnapshotted.
No trajectory curve: this run left one comparable self-check measurement, so there is nothing to plot against spend. The versions and what each one changed are below.
v1Standardized two-sample features, CUSUM argmax distance, L1/L2 logistic ensembleKeep only monotone distance statistics under a sparse linear head, betting plain features carry to unseen mechanisms.0.79410 min · $0.42
One snapshot in 12 min and $0.61. Later feature variants were tested in scratch scripts, none beat v1, and none was ever snapshotted.
v4Reweighted 35% learned / 35% omnibus / 30% innovation tail for generalizationAccept a visible-score loss to weight label-independent evidence, since the sealed half holds mechanisms the labels never show.0.770551 min · $8.36
v5Negative-only ridge calibration strips length/ACF/kurtosis from the tail score0.770356 min · $9.82
v6Fit-time synthetic tail specialist on AR/GARCH nulls, 30% of the blend0.758462 min · $11.64
v7Tail specialist retrained on two independent simulation seeds; weights frozen0.760265 min · $12.51
v8Broad skew/mixture/bimodality specialist behind a tail-evidence gate0.771776 min · $15.64
v9Learned expert becomes a 75/25 rank ensemble of ExtraTrees and RBF-SVM0.772279 min · $16.75
v10Fleet-level novelty routing picks the known or the unseen path per fleetDecide per fleet, not per series: measure how novel the whole fleet looks and hand it to the specialist path.0.815193 min · $21.49
v11Novelty-route onset raised 0.04 to 0.06 after 10k known-fleet bootstraps0.815196 min · $22.68
v12Second fleet route from the 90th-percentile innovation-tail evidence0.815199 min · $23.98
v13Hierarchical routing: a pure-tail signature selects the dedicated tail expertGive each break mechanism its own expert and let the fleet signature choose one, instead of a single gated unseen score.0.8151105 min · $26.08
v14Pure-shape route sends large shape gaps straight to the broad specialist0.8151111 min · $28.54
v15High-margin mixture route uses the residual-tail statistic directly0.8151114 min · $29.68