quant-engineering tasks · RL environments · evals

Quant-engineering tasks with graders that check the details.

The agent gets raw market data and a strategy spec and has to build a working backtest. The data contains undisclosed traps, like the ones real data has. Grading is deterministic and sandboxed, and runs on hidden synthetic data across 5 seeds. A pass means every trap was handled on every seed.

1 instruction.md 2 solution.py 3 hidden grader
running · seeded data example · illustrative format
01 · instruction.mdtask
02 · solution.pyagent
03 · grader feedback5 hidden seeds
reward…
score…
unadjusted_dividends: holdings diverge from reference FAIL · reward 0 · 1 category missed
datasynthetic · fictional tickers
gradingdeterministic, sandboxed
test datahidden data · 5 seeds
formatHarbor (schema 1.4)
supplyfresh variants from a generator
01 · problem

Finance is where models sound right and are wrong.

Models write backtests that run, return plausible Sharpe ratios and are wrong. In our calibration runs, most failures were near-misses: in 341 of 511 trap-handling failures, the code handled every data issue but one. Unit tests on clean data don't catch that. A grader that re-runs the code on hidden, messy data does.

341/511 trap-handling failures that got every category right but one · private set · 50 tasks · Oct 2026
price return only, no dividend or currency handling
02 · the task

Task families

StatusFamilyDescription
Calibrated, available now Research backtest with undisclosed data traps Build a monthly decile long-short backtest (momentum, mean reversion, residual reversal, price and earnings-yield value, low volatility, 52-week-high proximity) from raw synthetic data. Every trap must be handled.
In development Spec to backtest Turn a written strategy into a correct backtest.
In development Find the bug Fix one planted bug in working trading code without breaking anything else.
Planned P&L reconstruction Rebuild P&L from raw fills, fees and corporate actions.

Calibration figures on this site cover the research-backtest family only.

instruction.mdresearch backtest · excerpt
# 12-1 Momentum Long-Short: Research Task

## Objective
Build a monthly decile long-short strategy from a raw synthetic market
dataset, following standard quantitative research methodology.

## Dataset  (/app/data/)
prices.csv             date, symbol, open, high, low, close, volume, currency
universe.csv           symbol, snapshot_date
corporate_actions.csv  symbol, date, action_type, ratio, amount
All data is synthetic. Hidden grading datasets share the schema but use
different symbols, sizes and dates.

## Signal
Score = close[t-21] / close[t-273] - 1 (trading-day offsets).
Long top decile, short bottom decile. Rebalance first trading day of month.
Equal weight; longs sum to +1, shorts to -1.

## Deliverable
/app/solution.py defining run_strategy(data_dir: str) -> dict
  sharpe_ratio, annual_return, annual_volatility, max_drawdown,
  total_return, num_trades, turnover, holdings_sample

## Grading
run_strategy is executed on hidden datasets. Holdings must follow the spec
and hold up against the realities of raw market data.
graded resultillustrative format
taskresearch-backtest · momentum · 6 categories
seeds5 hidden
reward0
score0.83 · pass requires 1.00
categoryresultseeds
survivorshippass5/5
unadjusted_splitpass5/5
unadjusted_dividendsFAIL0/5
stale_pricespass5/5
trading_haltpass5/5
currency_switchpass5/5
clean-data sanitypass
unadjusted_dividends: holdings diverge from reference
/logs/verifier/reward.json → {"reward": 0, "score": 0.83}
Built for RL post-training Model evaluation Agent benchmarks Finance-agent testing
03 · grading and soundness

How tasks are graded and checked

reward.json {"reward": 0, "score": 0.83} re-graded 36/36 identical

Deterministic, sandboxed grading

The submitted code is re-run on hidden synthetic datasets across 5 seeds. Pass = 100/100. The same code gets the same grade: we re-graded 36 saved responses and every score came out identical.

reference100
ignore one trapfails 5/5
stub · random0
fake holdings0
naive filter0

Shortcuts score zero

Every task passes an acceptance check before it ships: the reference scores 100, a solution that ignores any single trap fails that trap on 5/5 seeds, and stubs, random answers, fake holdings and naive filters score 0.

0% 2–70% (in band) >70%
50 tasks · pooled pass rate per task

Calibrated difficulty

On the current private set, 49 of 50 tasks fall in the 2–70% pass band across three frontier models. One sits just above it at 72% and is labelled easy. No task in the set is at 0%.

generator → new variant strategy · trap mix universe · history length grading seeds: never shipped

Hard to memorize, easy to refresh

All data is synthetic, with fictional tickers and no exchange data, not drawn from real price history. Grading data is generated from seeds that never ship. A procedural generator makes fresh variants (strategy, trap mix, universe, history length) when a task leaks or when you need an exclusive batch.

01

Generate

Synthetic markets with the problems real data has: corporate actions, listings and delistings, stale quotes, halts, symbol and currency changes.

02

Accept

Each task must pass an acceptance check first: reference = 100/100, every single-trap omission fails, every shortcut control scores 0.

03

Calibrate

Frontier models attempt each task on identical instructions. Each task ships with its per-model pass rate, attempt count and difficulty label.

04

Deliver

Harbor-format environments with a pinned Docker image, sample data and a verifier that runs in a separate container.

04 · calibration

Calibration summary: private task set (50 tasks), Oct 2026

Aggregates from the private set we sell, so you can see how hard each task is before you buy. Task names are withheld. The public leaderboard runs on a separate held-out set (see below).

Model Passed Pass rate 95% CI (Wilson) Interval · 0–100% Attempts/task Tasks ≥1 pass
claude-opus-5-5 185/300 61.7% 56–67% 6 49 of 50
gpt-6-astra 53/300 17.7% 14–22% 6 22 of 50
grok-4.7 52/300 17.3% 13–22% 6 26 of 50
50 tasks · identical instructions · same grader · single-response mode (no tools, no code execution) · run Oct 14–19, 2026 49 of 50 tasks in the 2–70% band · 1 task at 72%, labelled easy · no task at 0% · pooled 290/900 (32.2%, 95% CI 29–35%) · mean of model rates 32.2% 6 attempts per task for every model · 3 of 900 attempts were provider errors (all gpt-6-astra), counted as fails · gpt-6-astra and grok-4.7 differ by one pass and their CIs overlap · shaded track = 2–70% band API spend per attempt (single response): claude-opus-5-5 ≈ $0.23 · gpt-6-astra ≈ $0.43 · grok-4.7 ≈ $0.62
trap-category miss rateall models pooled
ticker renames229/372 (62%)
currency switches252/567 (44%)
unadjusted dividends110/587 (19%)
fundamentals look-ahead18/135 (13%)
survivorship50/534 (9%)
trading halts23/616 (4%)
stale prices20/643 (3%)
unadjusted splits2/633 (<1%)

Share of well-formed attempts that missed the category, where the category was present.

gpt-6-astra missed ticker renames on every attempt at a task that contained one: 142 of 142.
claude-opus-5-5's most common misses are ticker renames and unadjusted dividends: they appear in 55 and 49 of its 115 failures.
grok-4.7's main miss is currency switches: they appear in 160 of its 248 failures.
Most failures are near-misses: 341 of 511 trap-handling failures got every category right but one.
free sample pack · 3 tasks, separate from the 50-task set · 6 attempts per model · Oct 2026
easy (3 trap categories): claude-opus-5-5 6/6 · gpt-6-astra 5/6 · grok-4.7 4/6 (15/18, 83%)
in band (5 trap categories): claude-opus-5-5 4/6 · gpt-6-astra 2/6 · grok-4.7 1/6 (7/18, 39%)
hard (6 trap categories): no model passed (0/18)
caveat Per-model totals now rest on 300 attempts each (about ±5 points), but each task still has only 18 (6 per model): about ±20 points on a task's pooled rate, and up to about ±30 for one model on one task. Single-response mode only. Agents that can run code and inspect data will likely score higher. We haven't measured agentic pass rates yet.
05 · leaderboard

Public leaderboard: held-out set

The leaderboard runs on a public held-out set kept separate from the tasks we sell. 6 tasks, 6 attempts per model, scored Oct 15, 2026.

Full leaderboard →
ModelModePass rate95% CIPasses / attemptsDate tested
claude-opus-5-5single-response66.7%50–80%24/36Oct 15, 2026
gpt-6-astrasingle-response16.7%8–32%6/36Oct 15, 2026
grok-4.7single-response16.7%8–32%6/36Oct 15, 2026

6 held-out tasks · 6 attempts per model · provider errors counted as fails (gpt-6-astra 1, grok-4.7 2) · gpt-6-astra and grok-4.7 have identical scores and overlapping CIs.

06 · what you get

Engagements

For post-training and eval teams at AI labs. Also useful to quant funds and finance-agent startups testing their own agents.

Calibrated packs

License tasks from the calibrated set, each with a calibration record (per-model passes, attempts, difficulty label).

Exclusive variants

Fresh variants from the generator (new strategy, trap mix, universe and history length) that no one else has seen. Use them to refresh tasks that have leaked or to buy batches exclusive to your lab.

Graded failure records

Saved attempts with per-category feedback and partial scores, for analysing failures or building reward models. Graded responses with feedback are already saved for every calibration attempt.

harbor/<task>/
  task.toml          # schema 1.4, separate verifier mode, limits, canary
  instruction.md     # spec + methodology
  environment/       # Dockerfile (python 3.11, numpy, pandas, pyarrow)
                     # + sample data

The verifier runs in its own container and receives only /app/solution.py. Submissions run as an unprivileged user.

Delivered in Harbor format (schema 1.4): a pinned Python 3.11 image and a verifier in a separate container. Other formats on request.

07 · pricing

Pricing

license

Standard packs

Licensed per task set.

custom

Custom

Scoped to your target skills and difficulty band.

Verifier-included packages, for rewards inside your own RL loop, are available under NDA on fresh variants.

08 · faq

FAQ

Real price history is in pretraining data, so a model can recall outcomes instead of working them out. We use synthetic markets with fictional tickers, generated from seeds that never ship. No exchange data, so there are no data licences to clear.

Every task passes an acceptance check before it ships: the reference solution scores 100/100 on every hidden seed, a solution that ignores any single trap fails that trap on all 5 seeds, and shortcut controls (stubs, random answers, fake holdings, naive filters) score 0. Grading is deterministic and runs in a separate sandbox.

The current set was calibrated on claude-opus-5-5, gpt-6-astra and grok-4.7, with identical instructions and 6 attempts per task for each model. Each task ships with its per-model passes, attempt counts and difficulty label.

Harbor format (schema 1.4) by default. Other packaging on request.

Yes. The generator produces fresh variants that can be licensed to one buyer. Terms are agreed per engagement.

The free sample is graded by us: send solution.py and we return the reward and per-category feedback. Verifier-included packages for your own RL loop are available under NDA on fresh variants.

Calibration numbers come from the private set we sell and are shown only as aggregates. The leaderboard uses a separate held-out public set.

Probably. Calibration was single-response, with no tools and no code execution. We'll publish agentic results separately.

09 · contact

Request a free sample pack.

Three tasks, Harbor environments, sample data and the calibration report. We reply from hi@lanemint.com.

or email hi@lanemint.com

We use this form only to reply to you.