Tasks/Finance, Law & Business

Cross-Sectional Stock Return Ranking

Predict daily forward-return rankings from a 360-factor temporal panel on a sealed later period

Finance, Law & Businessquantitative financereturn ranking
Background

Cross-sectional return forecasting, ranking instruments against one another each day, anchors quantitative investment research, where models that fit the visible period rarely survive the next. The starting point is a small neural network fit on part of an anonymized daily panel of six price and volume fields, each a sixty-day history. The work is to redesign that model to use the whole panel and its temporal structure. It must hold up on a sealed later period, judged by day-to-day consistency, not peak strength.

instruction.mdthis is what the agent is given

You are given a real-market-derived daily cross-sectional factor panel with anonymized identifiers (opaque datetime/instrument IDs, 360 factor columns and a forward-return label). Train a method that outputs a continuous score per instrument-day; it is scored by the cross-sectional rank agreement between your scores and forward returns on a hidden, later period. Real cross-sectional alpha is weak and noisy — what matters is generalization, not fitting the data you can see.

Hard Constraints

  • Submit an algorithm (predict), not a precomputed table of scores — the grader re-runs your code on hidden data.
  • Keep the exact signature: predict(train_df, valid_df, test_features_df) -> DataFrame[datetime, instrument, score].
  • Output must cover every test (datetime, instrument) row, with finite scores, no missing rows and no duplicates — otherwise the submission scores 0.
  • Do not hardcode or look up answers: datetime/instrument are opaque IDs (not real dates/tickers), the test period is sealed, and there is no network at any time.

What You Have

  • Data (/app/data/): train_panel.parquet (earlier period), valid_panel.parquet (a later, non-overlapping period), and feature_catalog.csv (factor families: f001..f158 = family A, f159..f360 = family B). The 360 columns f001..f360 are 6 price/volume fields, each given as a 60-day history — six contiguous 60-column blocks, one field per block — so they form a 6-field x 60-day temporal panel. datetime is an opaque, chronologically-ordered day index (d000001, …); instrument is an opaque ID (s00001, …); the raw factors contain missing values. A later, non-overlapping test period is sealed in the grader — you never see it.
  • The editable baseline /app/methods/main/this directory is what gets graded. It is a deliberately weak template (a family-A subset + a vanilla MLP). Improve it in place, or rewrite the algorithm entirely. No stronger reference is shipped — going weak→strong is the task.
  • Your self-check surface (free, unlimited): python /app/selfcheck.py trains your current methods/main/solver.py on train and reports ICIR on valid. This is your only feedback loop — iterate against it as much as you want. It is a proxy: the sealed test period differs, so a high valid ICIR is necessary but not sufficient.

What You Submit

Edit /app/methods/main/solver.py to expose this exact signature:

def predict(train_df, valid_df, test_features_df) -> pd.DataFrame  # columns: datetime, instrument, score

You may add helper modules next to solver.py. The runtime provides numpy / pandas / scikit-learn / torch / pyyaml. There is no submit step and no per-attempt feedback — work and self-check for as long as your run window allows, then leave your best solver.py in place; it is graded once at the end on the hidden test period.

How It Is Judged

After your run, the grader copies your methods/main/ into a clean box, hands predict the hidden test-period features (no label), and scores the result. The grader re-runs your predict on a hidden panel of similar size, in a container with a 30-minute limit and more CPU than your own box.

  • IC = the same-day cross-sectional Pearson correlation between your score and the forward-return label;
  • ICIR = the mean daily IC over the test period divided by its standard deviation.

The metric is ICIR (higher is better).

Rollouts

548 minWall clock
$155.80Spend
259.4MTokens
40Versions, 38 kept

On the visible set

0.15 0.30 0.45 0.60 0.75 0 400 800 1,200 1,600 Agent step ICIR ↑ v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12 v13 v14 v15 v16 v17 v18 v19 v20 v21 v22 v23 v24 v25 v26 v27 v28 v29 v30 v31 v32 v33 v34 v35 v36 v37 v38 v39 v40
keptrolled backsubmitted
  1. v1The agent kept the shipped baseline as its starting snapshot.0.1231321 min · $0.23
  2. v2The agent rewrote the panel into stationary technical features and fit a ridge.0.2682888 min · $1.35
  3. v3The agent blended a rank-space ridge with the magnitude one.0.27185911 min · $1.97
  4. v4The agent described the shape of each price path, not just its level.0.38740920 min · $3.65
  5. v5The agent brought the rank ridge back now that the feature set was wider.0.38927624 min · $4.57
  6. v6The agent added a small, heavily regularised tree model.0.40028331 min · $6.01
  7. v7The agent gave the trees more capacity and more of the vote.0.40658840 min · $7.97
  8. v8The agent stripped the market's hidden risk factors out of every score.0.56732564 min · $13.99
  9. v9The agent widened the risk basis to cover correlation as well as covariance modes.0.64151269 min · $15.63
  10. v10The agent added a small neural component for model diversity.0.64811778 min · $18.29
  11. v11The agent retuned the mix now that risk had been projected out.0.67303492 min · $22.63
  12. v12The agent estimated risk over two horizons instead of all history at once.0.675515103 min · $26.57
  13. v13The agent softened its final score by mixing magnitude with rank.0.677813108 min · $28.71
  14. v14The agent cleaned the training labels of risk before fitting, not just the output.0.698521117 min · $32.46
  15. v15The agent also removed each stock's peer-cluster mean.0.71113138 min · $38.69
  16. v16The agent retuned the component weights on the earlier chronological walks only.0.711173150 min · $40.12
  17. v17The agent let its linear and tree models see different tail shapes of the target.0.714907167 min · $42.55
  18. v18The agent threw away residual magnitudes and scored on pure daily ranks.0.714184188 min · $46.82
  19. v19The agent re-optimised the blend for pure ordering.0.71328195 min · $48.50
  20. v20The agent averaged two feature-subsampled trees instead of one full-feature tree.0.714786206 min · $51.29
  21. v21The agent realised past test-period returns are readable and kept updating on them.0.722074221 min · $55.23
  22. v22The agent let the freshly revealed days count double.0.722206231 min · $58.06
  23. v23The agent extended the same online updating to its rank models.0.719449248 min · $63.36
  24. v24The agent retuned the blend around its newly adaptive components.0.72056257 min · $66.56
  25. v25The agent bounded the extreme rank spacing without changing the order.0.722841269 min · $71.66
  26. v26The agent mined a hundred new descriptors and kept only the ones with stable signs.0.726341302 min · $84.61
  27. v27The agent shared those selected descriptors with the rank models too.0.732491313 min · $89.26
  28. v28The agent split the tree vote between the compact and the augmented feature sets.0.735153324 min · $94.47
  29. v29The agent retrained the net on the augmented feature surface.0.734575341 min · $98.98
  30. v30The agent retuned the weights and dropped a component that had gone redundant.0.737166359 min · $101.53
  31. v31The agent refreshed its online fits three times as often.0.739375392 min · $107.08
  32. v32The agent learned which individual stocks had been persistently strong.0.738957406 min · $110.04
  33. v33The agent switched that stock-identity signal off when the market moved together.0.739743421 min · $113.78
  34. v34The agent tried risk-residual targets for identity, and they went stale out of sample.0.728922434 min · $117.41
  35. v35The agent refreshed the identity effect almost daily.0.743092459 min · $126.24
  36. v36The agent tried smoothing each stock's score over time, and it cost the latest period.0.738835479 min · $133.98
  37. v37The agent added a very short memory of the last few days' winners.0.755668490 min · $138.70
  38. v38The agent rebalanced the core models now that identity signals carried weight.0.759026502 min · $144.84
  39. v39The agent trained a small expert on only the last twenty revealed days.0.760621539 min · $153.61
  40. v40The agent gave that expert something sensible to say before any day is revealed.0.760925548 min · $155.52

On the hidden set

Original metricNormalised score
Starter0.1150.0
Frontier-calibrated reference0.4596130.6
This run (GPT-5.6-sol)0.4596130.6000
496 minWall clock
$15.94Spend
21.7MTokens
10Versions, 8 kept

On the visible set

0.15 0.30 0.45 0.60 0 2 4 6 8 Agent step ICIR ↑ v0 v1 v2 v3 v4 v5 v6 v7 v8 v9
keptrolled backsubmitted
  1. v0The agent inherited a tiny MLP on a family-A feature subset0.1231$0.77
  2. v1The agent rebuilt the panel into ~200 engineered factors and fit ridge0.367810 min · $1.54
  3. v2The agent replaced ridge with a day-batched MLP trained on daily IC0.507134 min · $5.91
  4. v3The agent switched the loss to a mean-variance form of daily ICsPay for IC stability directly: penalise the spread the graded ratio divides by, not just the average IC.0.5617218 min · $8.75
  5. v4The agent added an auxiliary head predicting the next-day returnA neighbouring-horizon target regularises the trunk; on its own it predicts the graded label badly.0.6249263 min · $9.78
  6. v5The agent averaged each net's top-three validation-epoch snapshots0.6316424 min · $12.72
  7. v6The agent scaled to eight nets under a wall-clock guard0.6308$13.50
  8. v7The agent injected nine day-level market-regime inputs after cross-sectional normalizationCross-sectional normalisation deletes the day's regime, so reversal strength has to be re-injected outside it.0.6548470 min · $14.27
  9. v8The agent enriched the regime state with seven more market features0.6159482 min · $14.77
  10. v9The agent capped torch threads to the cgroup CPU quota0.4993495 min · $15.35

On the hidden set

Original metricNormalised score
Starter0.1150.0
Frontier-calibrated reference0.4596130.6
This run (Opus 5)0.3857540.4714
720 minWall clock
$3.23Spend
12.1MTokens
8Versions, 7 kept

On the visible set

0.1 0.2 0.3 0.4 0.5 0 2 3 4 6 Agent step ICIR ↑ v0 v1 v2 v3 v4 v5 v6 v7
keptrolled backsubmitted
  1. v0The agent inherited a one-layer MLP on the family-A subset0.123132
  2. v1The agent built 163 multi-horizon factors and an IC-loss neural ensembleTrain on the daily cross-sectional IC the metric is built from instead of MSE, and average over seeds.0.411535
  3. v2The agent widened to 201 factors and standardized daily predictions cross-sectionally0.419986
  4. v3The agent grew to 241 factors with deeper nets and cosine annealing0.450716
  5. v4The agent blended a cross-sectional ridge into a four-model ensembleAdd a high-alpha ridge as a fourth, non-neural member whose errors differ from the three MLPs.0.481908
  6. v5The agent added volatility, VWAP and illiquidity factors, reweighting toward ridge0.480655
  7. v6The agent stacked z-score and rank representations with interaction terms0.482087
  8. v7The agent added spectral FFT features and split the linear and neural inputsSplit the feature space by branch: the linear model takes all 648 duals, the nets a compact core to cut collinearity.0.502176

On the hidden set

Original metricNormalised score
Starter0.1150.0
Frontier-calibrated reference0.4596130.6
This run (Gemini 3.7 Flash)0.349150.4077
326 minWall clock
$3.36Spend
7.2MTokens
20Versions, 13 kept

On the visible set

0.150 0.225 0.300 0.375 0.450 0 4 8 12 16 Agent step ICIR ↑ v0 v1 v2 v3 exp10 exp11 exp12 exp13 exp14 exp19/20 exp21 exp22 exp23 exp3 exp5 exp7 exp8 exp9
keptrolled backsubmitted
  1. v0The agent inherited the family-A MLP baseline template0.1231$0.16
  2. v1The agent fit ridge on per-day ranks of raw and engineered featuresRank every feature inside the day and fit a linear model on the day-z label, matching the cross-sectional metric.0.3086$0.32
  3. v2The agent shipped the recency-weighted boosting bag with a ridge blendBoosted trees beat the ridge on the same rank features, and seed averaging plus recency weighting adds more on top.0.4496$1.04
  4. v3The agent trained the full ensemble on train plus validAn internal pseudo-test showed that adding the 356 valid days to the fit helps on a later period more than it costs.0.4612$1.83
  5. v4The agent finalized the grand ensemble with more seeds and contract testscontract tests, 17m run$2.65
  6. exp10The agent added per-instrument shrunk mean-label features0.4331$1.17
  7. exp11The agent tried a dilated CNN over raw log-return channels0.115$1.30
  8. exp12The agent mixed three boosting configs with rank-target and features-only variants0.4612$1.44
  9. exp13The agent ran a train-internal pseudo-test and decided to fit valid too0.3915$1.57
  10. exp14The agent rechecked the ensemble mix on the pseudo-test split0.4066$1.70
  11. exp16/17/18The agent added gap, range and lottery features, then dropped themnet ~0, dropped$2.10
  12. exp19/20The agent tried a two-day smoothed target0.4214$2.38
  13. exp21The agent re-measured the final recipe honestly with a train-only fit0.4732$3.00
  14. exp22The agent tried absolute-error and mixed-loss boosters0.4001$3.00
  15. exp23The agent trimmed the earliest training days and found no gain0.4445$3.00
  16. exp3The agent swapped ridge for histogram gradient boosting on the same ranks0.3989$0.44
  17. exp5The agent tuned the boosting hyperparameters with time-ordered early stopping0.4088$0.56
  18. exp7The agent expanded to 122 engineered features including skew and autocorrelation0.4262$0.68
  19. exp8The agent bagged five boosting seeds and blended in a ridge0.453$0.80
  20. exp9The agent weighted recent training days more heavily0.4474$0.92

On the hidden set

Original metricNormalised score
Starter0.1150.0
Frontier-calibrated reference0.4596130.6
This run (Kimi K3)0.3144860.3473
175 minWall clock
$10.00Spend
16.4MTokens
11Versions, 10 kept

On the visible set

0.1 0.2 0.3 0.4 0.5 0.6 0 30 60 90 120 Agent step ICIR ↑ v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11
keptrolled backsubmitted
  1. v1The agent inherited the family-A tiny MLP baseline0.12313
  2. v2The agent engineered 77 OHLC-volume factors and fit gradient boostingNon-linear boosting over hand-built factors, selected on a holdout cut from the last 20% of train, not on valid.0.38601
  3. v3The agent added raw lag columns and dropped cross-sectional rankingCross-sectional ranking discards magnitude the trees can use, so clip the tails and leave the levels alone.0.496
  4. v4The agent added market-residual reversal sums at nine horizons0.502
  5. v5The agent averaged two boosting seeds0.51288
  6. v6The agent subsampled features per split and ran more iterations0.5358
  7. v7The agent mapped daily scores through a rank-Gauss transformPearson IC is tail-sensitive, so reshaping each day's scores to a Gaussian cuts IC volatility without refitting.0.54582
  8. v8The agent applied train-fitted feature clips to the test panel0.54724
  9. v9The agent raised the boosting iteration cap to 4000.55684
  10. v10The agent raised the iteration cap further to 5000.56545
  11. v11The agent made early stopping explicit and documented the solver0.56545

On the hidden set

Original metricNormalised score
Starter0.1150.0
Frontier-calibrated reference0.4596130.6
This run (Grok 4.6)0.3299080.3742
384 minWall clock across 2 runs
$2.67Spend
33.0MTokens
16Versions, 12 kept

On the visible set

0.2 0.3 0.4 0.5 0 4 8 12 Agent step ICIR ↑ v0 v6 v7 v8 v9 v10 v10ep80 v10h v10seeds v11
keptrolled backsubmitted
  1. v0The agent inherited the family-A subset with a vanilla MLP0.14836 min · $0.37
  2. v0-v8The agent lost its v0-v8 snapshots to a container resetsnapshots lost$1.89
  3. v0_baselineThe agent snapshotted the shipped baseline before rewriting the solversnapshot only$0.42
  4. v1-v4The agent decoded the 360 columns and dropped the all-NaN blockno simtest run$0.48
  5. v5The agent built per-instrument deviation features as a transferable representationnever simtested50 min · $0.53
  6. v5_devmlpThe agent snapshotted the deviation-feature MLP that first transferredsnapshot only$0.66
  7. v6The agent replaced the MLP with gradient boosting on deviation features0.27368 min · $0.79
  8. v7The agent doubled the deviation features into fixed and ratio forms0.50478 min · $0.92
  9. v8The agent moved to float32 and fixed NaN-poisoned normalization statistics0.5049100 min · $1.27
  10. v9The agent averaged the booster with a small torch MLP0.5073183 min · $1.68
  11. v9.1The agent rebuilt the dev harness and stopped torch thread thrashingHGBM screen 0.406$2.11
  12. v10The agent added a second booster on two-day forward labels0.5035278 min · $2.33
  13. v10ep80The agent trained the MLP for eighty epochs instead of forty0.5395$2.50
  14. v10hThe agent dropped the MLP and kept only the two boosters0.5003$2.50
  15. v10seedsThe agent averaged two boosting seeds0.5063$2.50
  16. v11The agent added a second MLP on two-day labels0.4776$2.50

On the hidden set

Original metricNormalised score
Starter0.1150.0
Frontier-calibrated reference0.4596130.6
This run (DeepSeek V4 Pro)0.300830.3235
238 minWall clock
$23.15Spend
68.4MTokens
8Versions, 6 kept

On the visible set

0.150 0.225 0.300 0.375 0.450 0 75 150 225 300 Agent step ICIR ↑ v1 v2 v3 v4 v6
keptrolled backsubmitted
  1. v1The agent inherited the family-A MLP baseline0.1231321 min · $0.09
  2. v2The agent built 58 temporal features with a ridge-boosting ensemble0.35258318 min · $1.08
  3. v3The agent retuned the boosting weight, half-life and leaf size0.331906139 min · $11.88
  4. v4The agent retuned on four expanding folds instead of one split0.41239145 min · $1.75
  5. v5The agent added 21 trend and moment features, then reverted them4-fold 0.3475 vs 0.3613134 min · $11.16
  6. v6The agent blended a three-seed torch MLP with the booster0.430944139 min · $11.81
  7. v7The agent pooled valid labels into the graded training sethonest 4-fold 0.4041180 min · $16.74
  8. v8The agent added two inactive option paths without changing behaviorsame as v7215 min · $20.06

On the hidden set

Original metricNormalised score
Starter0.1150.0
Frontier-calibrated reference0.4596130.6
This run (Qwen3.8 Max)0.3051390.3310
575 minWall clock
$23.33Spend
84.9MTokens
7Versions, 6 kept

On the visible set

0.225 0.300 0.375 0.450 0.525 0 100 200 300 Agent step ICIR ↑ v1 v2 v3 v5 v6 v7 v8
keptrolled backsubmitted
  1. v1The agent fit ridge on 84 ranked OHLCV factors0.226737 min · $1.52
  2. v2The agent added residual features and an eight-seed MLP ensemble0.3363149 min · $5.09
  3. v3The agent added 41 features and mixed z with rank labels0.4322276 min · $10.37
  4. v5The agent grew to 268 features with long-horizon and path statistics0.486314 min · $11.71
  5. v6The agent added candlestick features and a three-architecture ensemble0.5195414 min · $16.12
  6. v7The agent added percentile, residual and weekday-seasonality features0.5168443 min · $17.46
  7. v8The agent shipped thirty MLPs fit on train plus valid0.5121556 min · $22.31

On the hidden set

Original metricNormalised score
Starter0.1150.0
Frontier-calibrated reference0.4596130.6
This run (GLM 5.3)0.3379830.3882
95 minWall clock
$13.02Spend
18.9MTokens
13Versions, 12 kept

On the visible set

0.150 0.225 0.300 0.375 0.450 0 50 100 150 200 Agent step ICIR ↑ v0 v1 v2 v3 v4 v5 v6 v7 v8 v9 v10 v11 v12
keptrolled backsubmitted
  1. v0The agent inherited the family-A vanilla MLP baseline0.1231321 min · $0.16
  2. v1The agent replaced the MLP with ridge on same-day percentile ranks0.22205712 min · $1.19
  3. v2The agent blended a second ridge trained on demeaned labels0.22927318 min · $1.85
  4. v3The agent added 170 temporal aggregate and price-volume features0.27876824 min · $2.66
  5. v4The agent added a recent-window ridge to the ensemble0.30044730 min · $3.40
  6. v5The agent added a recent-window booster on the z target0.32777635 min · $4.08
  7. v6The agent added a second booster trained on demeaned labels0.32944143 min · $5.04
  8. v7The agent added slope, range-position and volume-trend features0.39697649 min · $5.90
  9. v8The agent grid-searched component weights and dropped two members0.40330757 min · $6.95
  10. v9The agent tuned the booster deeper with stronger regularization0.41361665 min · $8.41
  11. v10The agent moved to a larger 63-leaf booster configuration0.41948576 min · $9.88
  12. v11The agent re-searched the final blend weights0.4197386 min · $11.43
  13. v12The agent added an all-history booster beside the recent one0.44594695 min · $12.70

On the hidden set

Original metricNormalised score
Starter0.1150.0
Frontier-calibrated reference0.4596130.6
This run (GPT-5.5)0.2957910.3148

Leaderboard

Where each run landed on the sealed held-out set, on the same normalised-score scale as the anchors above.

0 0.3 0.6 1.0 1 GPT-5.6-sol codex · max 0.600 2 Opus 5 claude code · max 0.471 3 Gemini 3.7 Flash antigravity · high 0.408 4 GLM 5.3 claude code · max 0.388 5 Grok 4.6 grok · xhigh 0.374 6 Kimi K3 kimi cli · max 0.347 7 Qwen3.8 Max qwen coder · xhigh 0.331 8 DeepSeek V4 Pro claude code · max 0.324 9 GPT-5.5 codex · xhigh 0.315