Season — July 2026
activeSeason — July 2026: a fresh monthly leaderboard. Submit any strategy; ranked out of sample against the reference baselines. Resets next month.
Starts July 1, 2026 · 3 participants
Ready to compete?
Sign up free, fit a strategy in Colab, and submit in under 30 minutes.
Current standings
| # | Participant | OOS Sharpe |
|---|---|---|
| 🥇 | — Baseline — | 0.100 |
What you submit
A Python file defining class MyStrategy(Strategy) with one method, on_day, called once per trading day. It receives that day’s data and your current book, and returns target portfolio weights — one number per stock (positive = long, negative = short). The grader normalises your weights to gross leverage 1 and rebalances toward them.
from convexpi.lab import Strategy
import numpy as np
class MyStrategy(Strategy):
def on_day(self, day, features, prices, portfolio):
# features: dict of cross-sectional signals, each an array over stocks
sig = np.nan_to_num(features.get("mom_1m", np.zeros(len(prices))))
gross = np.abs(sig).sum()
return sig / gross if gross > 0 else np.zeros(len(prices))features = dict of per-stock signal arrays · prices = today’s prices · portfolio = your current holdings · return = weights array (len = #stocks). Also gradable in R or Julia — define on_day(day, features, prices, portfolio); the same engine scores every language identically.
Before you submit
- ✓
on_dayreturns an array with one weight per stock. - ✓No NaNs or infinities in your weights.
- ✓You checked it out-of-sample, not just in-sample, before submitting.
- ✓Your strategy never peeks at future days.
How you’re scored
Ranked by Out-of-sample (OOS) Sharpe ratio.
- The market is split into an in-sample window you may fit on and a hidden out-of-sample window you never see while building.
- Your strategy is run over the OOS window, rebalancing weekly toward your target weights.
- Transaction costs are charged on every rebalance (in basis points of turnover).
- Sharpe is the annualised mean/volatility of the resulting daily returns (× √252).
- You are ranked by OOS Sharpe. We also report the overfitting ratio (OOS ÷ in-sample Sharpe) — aim for ≥ 0.7.
How to read your score
| < 0 | Noise or overfit — your in-sample edge didn’t survive. Normal at first; this is the lesson. |
| 0 – 0.5 | A weak but real edge that generalised a little. |
| 0.5 – 1.0 | Solid — a genuine, tradeable signal. |
| 1.0 – 2.0 | Strong — top of the class. |
| > 2.0 | Suspiciously high — check for look-ahead or leakage before celebrating. |
A negative score isn’t failure — it’s the overfitting lesson made concrete. Iterate: simpler models usually generalise better.
The data
A simulated cross-section of stocks over a multi-year daily horizon, with a few planted alpha signals hidden among many noise features. Split into an in-sample window (fit here) and a hidden out-of-sample window (scored here).
features dict of cross-sectional signals (momentum, value, volatility, …) — a few predict returns, most are noise you must filter out.prices array of each day’s prices, one per stock.portfolio your current holdings going into the day.Getting the data you fit on: In the starter notebook, market.features("train") and market.prices("train") give you the in-sample data to fit and validate on; the test window is held out for scoring.
Approaches to try
- Start simple: rank stocks by one signal (e.g. momentum), go long the top and short the bottom.
- Combine a few uncorrelated signals — diversification lifts Sharpe more than tuning one harder.
- Prefer fewer parameters: every knob you fit in-sample is a chance to overfit.
- Compare in-sample vs out-of-sample before submitting — if OOS collapses, simplify.
Just a foothold — the missions and starter notebook go deeper.
Timeline & rules
Timeline
- Always open — submit any time; no entry deadline.
- Graded in under 5 minutes; your OOS Sharpe posts to the leaderboard automatically.
- Re-scored nightly on fresh synthetic data (the forward Sharpe).
Rules
- Submissions run sandboxed: no network, with time and memory limits.
- No look-ahead — your strategy only sees data up to the current day.
- Resubmit as often as you like; your best OOS Sharpe stands.
- Standard scientific Python is available (numpy, pandas, scikit-learn).
Get started
- Open the starter notebook — get the in-sample data, fit a strategy, and check it out-of-sample.
- Create a free account and submit from the editor.
- Your OOS Sharpe posts to the leaderboard in under 5 minutes.
