{
  "schemaVersion": "1.0",
  "item": {
    "slug": "numerai-tournament",
    "name": "Numerai Tournament",
    "source": "tencent",
    "type": "skill",
    "category": "金融交易",
    "sourceUrl": "https://clawhub.ai/obekt/numerai-tournament",
    "canonicalUrl": "https://clawhub.ai/obekt/numerai-tournament",
    "targetPlatform": "OpenClaw"
  },
  "install": {
    "downloadMode": "redirect",
    "downloadUrl": "/downloads/numerai-tournament",
    "sourceDownloadUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=numerai-tournament",
    "sourcePlatform": "tencent",
    "targetPlatform": "OpenClaw",
    "installMethod": "Manual import",
    "extraction": "Extract archive",
    "prerequisites": [
      "OpenClaw"
    ],
    "packageFormat": "ZIP package",
    "includedAssets": [
      "SKILL.md"
    ],
    "primaryDoc": "SKILL.md",
    "quickSetup": [
      "Download the package from Yavira.",
      "Extract the archive and review SKILL.md first.",
      "Import or place the package into your OpenClaw setup."
    ],
    "agentAssist": {
      "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
      "steps": [
        "Download the package from Yavira.",
        "Extract it into a folder your agent can access.",
        "Paste one of the prompts below and point your agent at the extracted folder."
      ],
      "prompts": [
        {
          "label": "New install",
          "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
        },
        {
          "label": "Upgrade existing",
          "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
        }
      ]
    },
    "sourceHealth": {
      "source": "tencent",
      "status": "healthy",
      "reason": "direct_download_ok",
      "recommendedAction": "download",
      "checkedAt": "2026-04-23T16:43:11.935Z",
      "expiresAt": "2026-04-30T16:43:11.935Z",
      "httpStatus": 200,
      "finalUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
      "contentType": "application/zip",
      "probeMethod": "head",
      "details": {
        "probeUrl": "https://wry-manatee-359.convex.site/api/v1/download?slug=4claw-imageboard",
        "contentDisposition": "attachment; filename=\"4claw-imageboard-1.0.1.zip\"",
        "redirectLocation": null,
        "bodySnippet": null
      },
      "scope": "source",
      "summary": "Source download looks usable.",
      "detail": "Yavira can redirect you to the upstream package for this source.",
      "primaryActionLabel": "Download for OpenClaw",
      "primaryActionHref": "/downloads/numerai-tournament"
    },
    "validation": {
      "installChecklist": [
        "Use the Yavira download entry.",
        "Review SKILL.md after the package is downloaded.",
        "Confirm the extracted package contains the expected setup assets."
      ],
      "postInstallChecks": [
        "Confirm the extracted package includes the expected docs or setup files.",
        "Validate the skill or prompts are available in your target agent workspace.",
        "Capture any manual follow-up steps the agent could not complete."
      ]
    },
    "downloadPageUrl": "https://openagent3.xyz/downloads/numerai-tournament",
    "agentPageUrl": "https://openagent3.xyz/skills/numerai-tournament/agent",
    "manifestUrl": "https://openagent3.xyz/skills/numerai-tournament/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/numerai-tournament/agent.md"
  },
  "agentAssist": {
    "summary": "Hand the extracted package to your coding agent with a concrete install brief instead of figuring it out manually.",
    "steps": [
      "Download the package from Yavira.",
      "Extract it into a folder your agent can access.",
      "Paste one of the prompts below and point your agent at the extracted folder."
    ],
    "prompts": [
      {
        "label": "New install",
        "body": "I downloaded a skill package from Yavira. Read SKILL.md from the extracted folder and install it by following the included instructions. Tell me what you changed and call out any manual steps you could not complete."
      },
      {
        "label": "Upgrade existing",
        "body": "I downloaded an updated skill package from Yavira. Read SKILL.md from the extracted folder, compare it with my current installation, and upgrade it while preserving any custom configuration unless the package docs explicitly say otherwise. Summarize what changed and any follow-up checks I should run."
      }
    ]
  },
  "documentation": {
    "source": "clawhub",
    "primaryDoc": "SKILL.md",
    "sections": [
      {
        "title": "Numerai Tournament",
        "body": "Participate autonomously in the Numerai data science tournament. Numerai is a hedge fund that crowdsources stock market predictions from data scientists. You submit predictions on obfuscated financial data and earn (or lose) NMR cryptocurrency based on performance."
      },
      {
        "title": "Overview",
        "body": "What: Predict stock market returns using obfuscated tabular features\nHow: Download data, train a model, submit predictions each round\nReward: Stake NMR on predictions; earn or lose based on correlation with targets\nFrequency: New rounds open Tue–Sat at 13:00 UTC; scores resolve ~31 days later"
      },
      {
        "title": "1. Create a Numerai Account",
        "body": "# Visit https://numer.ai to sign up\n# Then create API keys at https://numer.ai/account\n# Store credentials:\nmkdir -p ~/.numerai\ncat > ~/.numerai/credentials.json << 'CREDS'\n{\n  \"public_id\": \"YOUR_PUBLIC_ID\",\n  \"secret_key\": \"YOUR_SECRET_KEY\"\n}\nCREDS\nchmod 600 ~/.numerai/credentials.json\n\nAlternatively, set environment variables:\n\nexport NUMERAI_PUBLIC_ID=\"YOUR_PUBLIC_ID\"\nexport NUMERAI_SECRET_KEY=\"YOUR_SECRET_KEY\""
      },
      {
        "title": "2. Install Dependencies",
        "body": "python3 -m venv venv && source venv/bin/activate\npip install numerapi lightgbm pandas numpy cloudpickle scikit-learn\n\nOn macOS ARM (Apple Silicon), LightGBM also requires:\n\nbrew install libomp"
      },
      {
        "title": "3. Download Tournament Data",
        "body": "from numerapi import NumerAPI\nfrom pathlib import Path\n\nnapi = NumerAPI()  # No auth needed for data download\ndata_dir = Path(\"data\")\ndata_dir.mkdir(exist_ok=True)\n\n# Current dataset version is v5.2\nnapi.download_dataset(\"v5.2/train.parquet\", dest_path=str(data_dir / \"train.parquet\"))\nnapi.download_dataset(\"v5.2/validation.parquet\", dest_path=str(data_dir / \"validation.parquet\"))\nnapi.download_dataset(\"v5.2/live.parquet\", dest_path=str(data_dir / \"live.parquet\"))\nnapi.download_dataset(\"v5.2/features.json\", dest_path=str(data_dir / \"features.json\"))\nnapi.download_dataset(\"v5.2/live_benchmark_models.parquet\", dest_path=str(data_dir / \"live_benchmark_models.parquet\"))\n\nNote: Training data is ~8GB. Only live.parquet and features.json are needed for prediction."
      },
      {
        "title": "Training a Model",
        "body": "The recommended approach is a LightGBM ensemble trained on multiple targets. This provides strong and stable performance."
      },
      {
        "title": "Feature Selection",
        "body": "import json\n\nwith open(\"data/features.json\") as f:\n    feature_metadata = json.load(f)\n\n# Three feature set sizes:\n# \"small\"  — ~42 features (fast iteration)\n# \"medium\" — ~780 features (good tradeoff)\n# \"all\"    — ~2748 features (maximum signal, slow)\nfeatures = feature_metadata[\"feature_sets\"][\"medium\"]"
      },
      {
        "title": "Target Selection",
        "body": "The main target is target. Additional targets improve ensemble diversity:\n\nTargetDescriptiontargetPrimary tournament targettarget_teager2b_20Current payout-correlated targettarget_cyrusd_20Complementary target for ensemble diversity"
      },
      {
        "title": "LightGBM Training",
        "body": "import lightgbm as lgb\nimport pandas as pd\nimport pickle\n\ntrain = pd.read_parquet(\"data/train.parquet\", columns=[\"era\"] + features + targets)\n\nlgbm_params = {\n    \"n_estimators\": 5000,       # Use 20000 for production quality\n    \"learning_rate\": 0.005,\n    \"max_depth\": 6,\n    \"num_leaves\": 64,\n    \"min_child_samples\": 5000,\n    \"colsample_bytree\": 0.1,\n    \"subsample\": 0.8,\n    \"subsample_freq\": 1,\n    \"reg_alpha\": 0.1,\n    \"reg_lambda\": 1.0,\n    \"verbose\": -1,\n    \"n_jobs\": -1,\n}\n\nmodels = {}\nfor target in targets:\n    X = train[features]\n    y = train[target]\n    mask = y.notna()\n    model = lgb.LGBMRegressor(**lgbm_params)\n    model.fit(X[mask], y[mask])\n    models[target] = model\n\nwith open(\"models/ensemble_models.pkl\", \"wb\") as f:\n    pickle.dump(models, f)"
      },
      {
        "title": "Validation",
        "body": "Evaluate per-era correlation and Sharpe ratio:\n\nval = pd.read_parquet(\"data/validation.parquet\", columns=[\"era\"] + features + targets)\npredictions = pd.DataFrame(index=val.index)\n\nfor target, model in models.items():\n    raw = model.predict(val[features])\n    predictions[target] = pd.Series(raw, index=val.index).rank(pct=True)\n\nensemble = predictions.mean(axis=1).rank(pct=True)\n\ncorrs = []\nfor era in val[\"era\"].unique():\n    m = val[\"era\"] == era\n    pred_era = ensemble[m]\n    tgt = val.loc[m, \"target\"]\n    if tgt.notna().sum() >= 10:\n        corrs.append(pred_era.corr(tgt))\n\ncorrs = pd.Series(corrs)\nprint(f\"Mean Corr: {corrs.mean():.4f}\")\nprint(f\"Sharpe:    {corrs.mean() / corrs.std():.2f}\")\nprint(f\"% Positive: {(corrs > 0).mean() * 100:.1f}%\")\n\nTarget validation performance: Mean Corr > 0.02, Sharpe > 1.0, >90% positive eras."
      },
      {
        "title": "Option A: Upload a Predictions CSV (Manual)",
        "body": "import json\nfrom numerapi import NumerAPI\n\nwith open(\"~/.numerai/credentials.json\") as f:\n    creds = json.load(f)\n\nnapi = NumerAPI(creds[\"public_id\"], creds[\"secret_key\"])\n\n# Check round status\ncurrent_round = napi.get_current_round()\nis_open = napi.check_round_open()\nprint(f\"Round {current_round}, Open: {is_open}\")\n\nif is_open:\n    # Download live data\n    napi.download_dataset(\"v5.2/live.parquet\", dest_path=\"data/live.parquet\")\n    live = pd.read_parquet(\"data/live.parquet\")\n\n    # Generate predictions (same ensemble logic as validation)\n    predictions = pd.DataFrame(index=live.index)\n    for target, model in models.items():\n        raw = model.predict(live[features])\n        predictions[target] = pd.Series(raw, index=live.index).rank(pct=True)\n    ensemble = predictions.mean(axis=1).rank(pct=True)\n\n    # Save and submit\n    submission = ensemble.to_frame(\"prediction\")\n    submission.to_csv(\"predictions.csv\")\n    napi.upload_predictions(\"predictions.csv\", model_id=\"YOUR_MODEL_ID\")"
      },
      {
        "title": "Option B: Upload a Model Pickle (Zero-Maintenance)",
        "body": "Upload a pickled function and Numerai runs it daily — no cron, no server.\n\nCritical constraints for model upload:\n\nMust be a pickled function (not a class), loaded via pd.read_pickle()\nMust use Python 3.12 (Numerai's max supported version)\nMust match Numerai runtime packages: lightgbm==4.5.0, numpy==2.1.3, pandas==2.3.1\nRuntime limits: 1 CPU, 4GB RAM, 10 minute timeout\nUse native LightGBM Boosters (not sklearn wrappers) to avoid dependency issues\n\n# Build the upload pickle (run with Python 3.12!)\nimport cloudpickle\nimport lightgbm as lgb\nimport pandas as pd\nimport pickle\n\n# Load trained sklearn models and extract native boosters\nwith open(\"models/ensemble_models.pkl\", \"rb\") as f:\n    sklearn_models = pickle.load(f)\n\nboosters = {}\nfor name, model in sklearn_models.items():\n    bstr = model.booster_.model_to_string()\n    boosters[name] = lgb.Booster(model_str=bstr)\n\nfeature_cols = features  # medium feature set list\nmodels = boosters\n\ndef predict(live_features: pd.DataFrame, live_benchmark_models: pd.DataFrame = None) -> pd.DataFrame:\n    predictions = pd.DataFrame(index=live_features.index)\n    for target, booster in models.items():\n        raw = booster.predict(live_features[feature_cols])\n        predictions[target] = pd.Series(raw, index=live_features.index).rank(pct=True)\n    ensemble = predictions.mean(axis=1).rank(pct=True)\n    return ensemble.to_frame(\"prediction\")\n\nwith open(\"models/model_upload.pkl\", \"wb\") as f:\n    cloudpickle.dump(predict, f)\n\nThen upload via the Numerai web UI at https://numer.ai or via API:\n\nnapi.upload_model(\"models/model_upload.pkl\", model_id=\"YOUR_MODEL_ID\")"
      },
      {
        "title": "Checking Performance",
        "body": "from numerapi import NumerAPI\n\nnapi = NumerAPI(public_id, secret_key)\n\n# Round status\nprint(f\"Current round: {napi.get_current_round()}\")\n\n# Get model performance (scores resolve after ~31 days)\n# Check via https://numer.ai/models/YOUR_USERNAME"
      },
      {
        "title": "Tournament Rules & Key Facts",
        "body": "Dataset: v5.2 — obfuscated financial features, ~2748 total features\nRounds: Open Tue–Sat at 13:00 UTC. Weekday windows: ~1hr. Saturday: ~49hrs.\nScoring: 20D2L framework, ~31 day resolution\nPayout formula: stake * clip(payout_factor * (0.75*CORR + 2.25*MMC), -0.05, +0.05)\n\nCORR = correlation of predictions with target\nMMC = meta-model contribution (originality bonus)\n\n\nStaking: Optional — stake NMR to earn/lose based on performance. Start with 0 stake until the model proves consistent.\nCurrent payout target: Resembles target_teager2b_20"
      },
      {
        "title": "Tips for Strong Performance",
        "body": "Ensemble multiple targets — reduces variance, improves Sharpe\nRank-normalize predictions — use .rank(pct=True) before averaging and after\nUse early stopping — prevent overfitting with lgb.early_stopping(300)\nFeature neutralization — improves MMC by decorrelating from common factors\nEra-aware validation — always evaluate per-era, never row-level metrics\nDon't overfit to validation — Numerai data is non-stationary; keep models simple"
      },
      {
        "title": "External Endpoints",
        "body": "This skill interacts with the following external services:\n\napi.numer.ai — Numerai GraphQL API for round status, submissions, and scores\nnumer.ai — Data downloads (tournament datasets)"
      },
      {
        "title": "Security & Privacy",
        "body": "Your NUMERAI_PUBLIC_ID and NUMERAI_SECRET_KEY are sent to api.numer.ai for authentication\nPredictions (stock return rankings) are uploaded to Numerai's servers\nNo other data leaves your machine\nStore credentials in ~/.numerai/credentials.json with chmod 600 permissions"
      }
    ],
    "body": "Numerai Tournament\n\nParticipate autonomously in the Numerai data science tournament. Numerai is a hedge fund that crowdsources stock market predictions from data scientists. You submit predictions on obfuscated financial data and earn (or lose) NMR cryptocurrency based on performance.\n\nOverview\nWhat: Predict stock market returns using obfuscated tabular features\nHow: Download data, train a model, submit predictions each round\nReward: Stake NMR on predictions; earn or lose based on correlation with targets\nFrequency: New rounds open Tue–Sat at 13:00 UTC; scores resolve ~31 days later\nSetup\n1. Create a Numerai Account\n# Visit https://numer.ai to sign up\n# Then create API keys at https://numer.ai/account\n# Store credentials:\nmkdir -p ~/.numerai\ncat > ~/.numerai/credentials.json << 'CREDS'\n{\n  \"public_id\": \"YOUR_PUBLIC_ID\",\n  \"secret_key\": \"YOUR_SECRET_KEY\"\n}\nCREDS\nchmod 600 ~/.numerai/credentials.json\n\n\nAlternatively, set environment variables:\n\nexport NUMERAI_PUBLIC_ID=\"YOUR_PUBLIC_ID\"\nexport NUMERAI_SECRET_KEY=\"YOUR_SECRET_KEY\"\n\n2. Install Dependencies\npython3 -m venv venv && source venv/bin/activate\npip install numerapi lightgbm pandas numpy cloudpickle scikit-learn\n\n\nOn macOS ARM (Apple Silicon), LightGBM also requires:\n\nbrew install libomp\n\n3. Download Tournament Data\nfrom numerapi import NumerAPI\nfrom pathlib import Path\n\nnapi = NumerAPI()  # No auth needed for data download\ndata_dir = Path(\"data\")\ndata_dir.mkdir(exist_ok=True)\n\n# Current dataset version is v5.2\nnapi.download_dataset(\"v5.2/train.parquet\", dest_path=str(data_dir / \"train.parquet\"))\nnapi.download_dataset(\"v5.2/validation.parquet\", dest_path=str(data_dir / \"validation.parquet\"))\nnapi.download_dataset(\"v5.2/live.parquet\", dest_path=str(data_dir / \"live.parquet\"))\nnapi.download_dataset(\"v5.2/features.json\", dest_path=str(data_dir / \"features.json\"))\nnapi.download_dataset(\"v5.2/live_benchmark_models.parquet\", dest_path=str(data_dir / \"live_benchmark_models.parquet\"))\n\n\nNote: Training data is ~8GB. Only live.parquet and features.json are needed for prediction.\n\nTraining a Model\n\nThe recommended approach is a LightGBM ensemble trained on multiple targets. This provides strong and stable performance.\n\nFeature Selection\nimport json\n\nwith open(\"data/features.json\") as f:\n    feature_metadata = json.load(f)\n\n# Three feature set sizes:\n# \"small\"  — ~42 features (fast iteration)\n# \"medium\" — ~780 features (good tradeoff)\n# \"all\"    — ~2748 features (maximum signal, slow)\nfeatures = feature_metadata[\"feature_sets\"][\"medium\"]\n\nTarget Selection\n\nThe main target is target. Additional targets improve ensemble diversity:\n\nTarget\tDescription\ntarget\tPrimary tournament target\ntarget_teager2b_20\tCurrent payout-correlated target\ntarget_cyrusd_20\tComplementary target for ensemble diversity\nLightGBM Training\nimport lightgbm as lgb\nimport pandas as pd\nimport pickle\n\ntrain = pd.read_parquet(\"data/train.parquet\", columns=[\"era\"] + features + targets)\n\nlgbm_params = {\n    \"n_estimators\": 5000,       # Use 20000 for production quality\n    \"learning_rate\": 0.005,\n    \"max_depth\": 6,\n    \"num_leaves\": 64,\n    \"min_child_samples\": 5000,\n    \"colsample_bytree\": 0.1,\n    \"subsample\": 0.8,\n    \"subsample_freq\": 1,\n    \"reg_alpha\": 0.1,\n    \"reg_lambda\": 1.0,\n    \"verbose\": -1,\n    \"n_jobs\": -1,\n}\n\nmodels = {}\nfor target in targets:\n    X = train[features]\n    y = train[target]\n    mask = y.notna()\n    model = lgb.LGBMRegressor(**lgbm_params)\n    model.fit(X[mask], y[mask])\n    models[target] = model\n\nwith open(\"models/ensemble_models.pkl\", \"wb\") as f:\n    pickle.dump(models, f)\n\nValidation\n\nEvaluate per-era correlation and Sharpe ratio:\n\nval = pd.read_parquet(\"data/validation.parquet\", columns=[\"era\"] + features + targets)\npredictions = pd.DataFrame(index=val.index)\n\nfor target, model in models.items():\n    raw = model.predict(val[features])\n    predictions[target] = pd.Series(raw, index=val.index).rank(pct=True)\n\nensemble = predictions.mean(axis=1).rank(pct=True)\n\ncorrs = []\nfor era in val[\"era\"].unique():\n    m = val[\"era\"] == era\n    pred_era = ensemble[m]\n    tgt = val.loc[m, \"target\"]\n    if tgt.notna().sum() >= 10:\n        corrs.append(pred_era.corr(tgt))\n\ncorrs = pd.Series(corrs)\nprint(f\"Mean Corr: {corrs.mean():.4f}\")\nprint(f\"Sharpe:    {corrs.mean() / corrs.std():.2f}\")\nprint(f\"% Positive: {(corrs > 0).mean() * 100:.1f}%\")\n\n\nTarget validation performance: Mean Corr > 0.02, Sharpe > 1.0, >90% positive eras.\n\nSubmitting Predictions\nOption A: Upload a Predictions CSV (Manual)\nimport json\nfrom numerapi import NumerAPI\n\nwith open(\"~/.numerai/credentials.json\") as f:\n    creds = json.load(f)\n\nnapi = NumerAPI(creds[\"public_id\"], creds[\"secret_key\"])\n\n# Check round status\ncurrent_round = napi.get_current_round()\nis_open = napi.check_round_open()\nprint(f\"Round {current_round}, Open: {is_open}\")\n\nif is_open:\n    # Download live data\n    napi.download_dataset(\"v5.2/live.parquet\", dest_path=\"data/live.parquet\")\n    live = pd.read_parquet(\"data/live.parquet\")\n\n    # Generate predictions (same ensemble logic as validation)\n    predictions = pd.DataFrame(index=live.index)\n    for target, model in models.items():\n        raw = model.predict(live[features])\n        predictions[target] = pd.Series(raw, index=live.index).rank(pct=True)\n    ensemble = predictions.mean(axis=1).rank(pct=True)\n\n    # Save and submit\n    submission = ensemble.to_frame(\"prediction\")\n    submission.to_csv(\"predictions.csv\")\n    napi.upload_predictions(\"predictions.csv\", model_id=\"YOUR_MODEL_ID\")\n\nOption B: Upload a Model Pickle (Zero-Maintenance)\n\nUpload a pickled function and Numerai runs it daily — no cron, no server.\n\nCritical constraints for model upload:\n\nMust be a pickled function (not a class), loaded via pd.read_pickle()\nMust use Python 3.12 (Numerai's max supported version)\nMust match Numerai runtime packages: lightgbm==4.5.0, numpy==2.1.3, pandas==2.3.1\nRuntime limits: 1 CPU, 4GB RAM, 10 minute timeout\nUse native LightGBM Boosters (not sklearn wrappers) to avoid dependency issues\n# Build the upload pickle (run with Python 3.12!)\nimport cloudpickle\nimport lightgbm as lgb\nimport pandas as pd\nimport pickle\n\n# Load trained sklearn models and extract native boosters\nwith open(\"models/ensemble_models.pkl\", \"rb\") as f:\n    sklearn_models = pickle.load(f)\n\nboosters = {}\nfor name, model in sklearn_models.items():\n    bstr = model.booster_.model_to_string()\n    boosters[name] = lgb.Booster(model_str=bstr)\n\nfeature_cols = features  # medium feature set list\nmodels = boosters\n\ndef predict(live_features: pd.DataFrame, live_benchmark_models: pd.DataFrame = None) -> pd.DataFrame:\n    predictions = pd.DataFrame(index=live_features.index)\n    for target, booster in models.items():\n        raw = booster.predict(live_features[feature_cols])\n        predictions[target] = pd.Series(raw, index=live_features.index).rank(pct=True)\n    ensemble = predictions.mean(axis=1).rank(pct=True)\n    return ensemble.to_frame(\"prediction\")\n\nwith open(\"models/model_upload.pkl\", \"wb\") as f:\n    cloudpickle.dump(predict, f)\n\n\nThen upload via the Numerai web UI at https://numer.ai or via API:\n\nnapi.upload_model(\"models/model_upload.pkl\", model_id=\"YOUR_MODEL_ID\")\n\nChecking Performance\nfrom numerapi import NumerAPI\n\nnapi = NumerAPI(public_id, secret_key)\n\n# Round status\nprint(f\"Current round: {napi.get_current_round()}\")\n\n# Get model performance (scores resolve after ~31 days)\n# Check via https://numer.ai/models/YOUR_USERNAME\n\nTournament Rules & Key Facts\nDataset: v5.2 — obfuscated financial features, ~2748 total features\nRounds: Open Tue–Sat at 13:00 UTC. Weekday windows: ~1hr. Saturday: ~49hrs.\nScoring: 20D2L framework, ~31 day resolution\nPayout formula: stake * clip(payout_factor * (0.75*CORR + 2.25*MMC), -0.05, +0.05)\nCORR = correlation of predictions with target\nMMC = meta-model contribution (originality bonus)\nStaking: Optional — stake NMR to earn/lose based on performance. Start with 0 stake until the model proves consistent.\nCurrent payout target: Resembles target_teager2b_20\nTips for Strong Performance\nEnsemble multiple targets — reduces variance, improves Sharpe\nRank-normalize predictions — use .rank(pct=True) before averaging and after\nUse early stopping — prevent overfitting with lgb.early_stopping(300)\nFeature neutralization — improves MMC by decorrelating from common factors\nEra-aware validation — always evaluate per-era, never row-level metrics\nDon't overfit to validation — Numerai data is non-stationary; keep models simple\nExternal Endpoints\n\nThis skill interacts with the following external services:\n\napi.numer.ai — Numerai GraphQL API for round status, submissions, and scores\nnumer.ai — Data downloads (tournament datasets)\nSecurity & Privacy\nYour NUMERAI_PUBLIC_ID and NUMERAI_SECRET_KEY are sent to api.numer.ai for authentication\nPredictions (stock return rankings) are uploaded to Numerai's servers\nNo other data leaves your machine\nStore credentials in ~/.numerai/credentials.json with chmod 600 permissions"
  },
  "trust": {
    "sourceLabel": "tencent",
    "provenanceUrl": "https://clawhub.ai/obekt/numerai-tournament",
    "publisherUrl": "https://clawhub.ai/obekt/numerai-tournament",
    "owner": "obekt",
    "version": "1.0.0",
    "license": null,
    "verificationStatus": "Indexed source record"
  },
  "links": {
    "detailUrl": "https://openagent3.xyz/skills/numerai-tournament",
    "downloadUrl": "https://openagent3.xyz/downloads/numerai-tournament",
    "agentUrl": "https://openagent3.xyz/skills/numerai-tournament/agent",
    "manifestUrl": "https://openagent3.xyz/skills/numerai-tournament/agent.json",
    "briefUrl": "https://openagent3.xyz/skills/numerai-tournament/agent.md"
  }
}