ConvexPi
← Competitions

Season — July 2026

active

Season — July 2026: a fresh monthly leaderboard. Submit any strategy; ranked out of sample against the reference baselines. Resets next month.

Metric
Out-of-sample Sharpe
Data
Synthetic equity panel
Cadence
Always open · graded < 5 min
Level
Beginner

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

#ParticipantOOS Sharpe
🥇— Baseline —0.100
Full leaderboard →

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_day returns 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.

In-sample Sharpe (the “public” score)

Your score on the window you fit on. You can push it arbitrarily high by curve-fitting, so it does NOT determine your rank — exactly like a Kaggle public leaderboard.

Out-of-sample Sharpe (the “private” score)

Your score on the hidden holdout. This is your rank — like a Kaggle private leaderboard — plus a nightly forward Sharpe on fresh synthetic data that tracks whether your edge keeps generalising.

How to read your score

< 0Noise or overfit — your in-sample edge didn’t survive. Normal at first; this is the lesson.
0 – 0.5A weak but real edge that generalised a little.
0.5 – 1.0Solid — a genuine, tradeable signal.
1.0 – 2.0Strong — top of the class.
> 2.0Suspiciously 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

  1. Open the starter notebook — get the in-sample data, fit a strategy, and check it out-of-sample.
  2. Create a free account and submit from the editor.
  3. Your OOS Sharpe posts to the leaderboard in under 5 minutes.