Cross-Token Return Prediction

Reconstruct a hidden token's return from its peers, out of sample

Pro

The dataset contains log returns for a basket of anonymous crypto tokens over consecutive time windows. The returns of one additional token are withheld. The task is to reconstruct the withheld token's return in each window from the returns of its peers.

Training and test data are split chronologically: every test window occurs after the end of the training range.

Prediction target

Same-window log return of the hidden target token

y  =  ln ⁣(pendpstart)y \;=\; \ln\!\left(\dfrac{p_{\text{end}}}{p_{\text{start}}}\right)

where p is the hidden token's price and each window runs from window_start to window_end.

Scoring

Submissions are graded against the hidden holdout by root mean squared error (RMSE), lower is better:

RMSE  =  1Ni=1N(y^iyi)2\mathrm{RMSE} \;=\; \sqrt{\dfrac{1}{N}\sum_{i=1}^{N}\left(\hat{y}_i - y_i\right)^2}

ŷᵢ is your prediction and yᵢ the actual return for each of the N scored rows.

Data files

train.csv.gz and test.csv.gz. The test set has 7,453 rows; your submission must cover every test id exactly once.

Data dictionary

ColumnDescription
idOpaque row id. Your submission joins on this; row order does not matter.
window_startInteger minutes since the start of the data. The return window opens here.
window_endInteger minutes since the start of the data. The return window closes here; windows are time-ordered and non-overlapping.
r0 ... rNLog returns of the peer tokens over the same window. Which tokens, and which absolute dates, are not disclosed.
targetLog return of the hidden token over the same window (train only).

Rules

  • 5 scored submissions per day (UTC).
  • Your submission is scored on a public split (shown to you) and a private split (used for ranking). Your leaderboard entry is the private score of your best public submission.
  • The board is always open. No deadlines, all-time rankings.
  • Do not random-shuffle your cross-validation. The data is a time series; use the window columns and validate forward in time.

Getting started

import pandas as pd
from sklearn.linear_model import Ridge

train = pd.read_csv('train.csv.gz')
test = pd.read_csv('test.csv.gz')
features = [c for c in train.columns if c.startswith('r')]
model = Ridge(alpha=1.0).fit(train[features], train['target'])
test['prediction'] = model.predict(test[features])
test[['id', 'prediction']].to_csv('submission.csv', index=False)