Prediction market strategy validation — weather signals and copy trading backtesting
Project description
Nephyr Backtest
Prediction market strategy validation — weather signals and copy trading.
Extracts backtesting capability from Momentai and MoonMirror into a standalone package.
Install
pip install -e ".[dev]"
Quick start
import asyncio
from nephyr_backtest import run_backtest, BacktestConfig, generate_report
config = BacktestConfig(
start_date="2025-10-01",
end_date="2026-03-29",
starting_bankroll=1000.0,
platform="polymarket",
strategy="weather_signals",
)
result = asyncio.run(run_backtest(config))
outputs = generate_report(result, output_format="terminal")
print(outputs["terminal"])
Strategies
weather_signals
Replay the Momentai signal pipeline against historical data. Uses GFS ensemble forecasts vs real Polymarket CLOB prices.
copy_trading
Replay historical on-chain trades from top Polymarket wallets.
Strategies: baseline, top3, consensus, category-filtered.
custom (Python package only)
Plug in any signal function and backtest it against real Polymarket market data.
Your function receives a market_data dict and returns a signal dict (or None to skip).
import asyncio
from nephyr_backtest import run_backtest, BacktestConfig
def mean_reversion_signal(market_data: dict) -> dict | None:
"""Buy when price drops significantly from yesterday."""
if market_data.get("price_24h_ago") is None:
return None
price_change = market_data["market_price"] - market_data["price_24h_ago"]
# If price dropped >10%, bet it rebounds
if price_change < -0.10:
return {"probability": 0.65}
return None
result = asyncio.run(run_backtest(BacktestConfig(
start_date="2026-01-01",
end_date="2026-03-28",
starting_bankroll=1000.0,
platform="polymarket",
strategy="custom",
signal_fn=mean_reversion_signal,
)))
print(f"Trades: {result.total_trades} | Return: {result.total_return:+.1f}%")
Signal function contract
Your function receives a market_data dict with these keys:
| Key | Type | Description |
|---|---|---|
market_id |
str | Unique market identifier |
platform |
str | "polymarket" or "kalshi" |
category |
str | "weather", "crypto", "politics", "sports", "other" |
market_price |
float | Current YES price in [0, 1] |
volume |
float | Total USDC volume traded |
date |
str | ISO date "YYYY-MM-DD" |
city |
str | None | City name for weather markets (e.g. "NYC") |
threshold_f |
float | None | Temperature threshold for weather markets |
direction |
str | None | "above" or "below" for weather markets |
price_1h_ago |
float | None | YES price 1 hour ago |
price_24h_ago |
float | None | YES price 24 hours ago |
Return a dict {"probability": float} to place a trade, or None to skip.
Optional return keys: "direction" ("YES" / "NO", default "YES"), "confidence" (float, for logging).
The probability must be in (0, 1). Kelly sizing, risk management, and settlement are handled automatically by the engine — identical to the built-in strategies.
MCP server and REST API
Custom strategies require passing a Python callable, which cannot be serialized
over MCP or HTTP. The MCP server (nephyr-backtest-mcp) and REST API support
weather_signals and copy_trading only. Use the Python package directly for
custom strategies.
MCP Server
{
"mcpServers": {
"nephyr-backtest": {
"command": "nephyr-backtest-mcp"
}
}
}
Tools: run_weather_backtest, run_copy_backtest, get_available_data
REST API
uvicorn api.app:app --reload
POST /v1/backtest/weatherPOST /v1/backtest/copyGET /v1/data/availableGET /v1/health
Tests
pytest tests/ -v
Pricing
| Tier | Details |
|---|---|
| Free | 1 backtest/month (1 month of data, 1 city) |
| Paid | $49/month — unlimited backtests, all data, all cities, CSV export |
| Per-run | $5/backtest for one-off users |
| Agent-to-agent | $0.05/backtest |
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nephyr_backtest-0.1.0.tar.gz.
File metadata
- Download URL: nephyr_backtest-0.1.0.tar.gz
- Upload date:
- Size: 48.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
96e898882190f7bba5e979deadbbf099c094b386b3832195ad2548418d2ff279
|
|
| MD5 |
74d1552c407687c97c16ac0fcaa0710f
|
|
| BLAKE2b-256 |
f2bf5e8be1b2958caf3d593de0721135ca7c5d708d0a3119fc3ed5aa047b9b47
|
File details
Details for the file nephyr_backtest-0.1.0-py3-none-any.whl.
File metadata
- Download URL: nephyr_backtest-0.1.0-py3-none-any.whl
- Upload date:
- Size: 32.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.14.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
94104154a7089ab788932ff67462fcd97693edeb09585f7dba1915ed3bf74409
|
|
| MD5 |
b69d76b0ae445847fdee9c59791796be
|
|
| BLAKE2b-256 |
03d21b055e62f51ab86ba3ee8ab4095c21ba0a306f6afa224bfbc4bbee4a9587
|