Skip to main content

Official Python client for the Backtest360 API

Project description

backtest360

PyPI version CI Python versions License: MIT

Official Python client for the Backtest360 API.

Run backtests, automate, integrate with your research or trading workflows. The SDK handles authentication, serialization, and error mapping so you can call a single method instead of building and parsing the raw HTTP requests yourself.

import matplotlib.pyplot as plt
import yfinance as yf
from backtest360 import Client, Strategy

df = yf.download("BTC-USD", period="1y", interval="1d",
                 auto_adjust=False, multi_level_index=False, progress=False)
df.columns = df.columns.str.lower()

result = Client(api_key="b360_...").backtest(Strategy.rsi_threshold_long(), df)
result.summary()
result.strategy_equity.plot(title="Equity curve")
plt.show()

Save this snippet as quickstart.py, drop in your API key, and run it with python quickstart.py (install matplotlib if needed: pip install matplotlib).


Install

pip install backtest360

Requires Python 3.9+. The only runtime dependencies are httpx and pandas.

Need to install Python first? (Windows / macOS / Linux / WSL)

Windows (native)

  1. Install Python from python.org/downloads (check "Add to PATH"), or via winget:
    winget install Python.Python.3.12
    
  2. Open PowerShell and verify:
    python --version
    
  3. Install the SDK and yfinance for the quickstart:
    pip install backtest360 yfinance
    
  4. Run a script:
    python quickstart.py
    

Windows via WSL (recommended for quant work)

  1. Install WSL:
    wsl --install
    
    Restart, then open the Ubuntu terminal.
  2. Install Python:
    sudo apt update && sudo apt install python3 python3-pip -y
    
  3. Install the SDK:
    pip3 install backtest360 yfinance
    
  4. Run a script:
    python3 quickstart.py
    

macOS

# via Homebrew (recommended)
brew install python

# or download from python.org/downloads

Then:

pip3 install backtest360 yfinance
python3 quickstart.py

Linux

sudo apt install python3 python3-pip -y   # Debian/Ubuntu
pip3 install backtest360 yfinance
python3 quickstart.py

Get an API key

Sign up at backtest360.com/api and copy your key. Store it in the BACKTEST360_API_KEY environment variable or pass it directly:

client = Client(api_key="b360_...")
# or: export BACKTEST360_API_KEY=b360_...
client = Client()

Features

  • Synchronous client — straightforward to use in scripts, notebooks, and pipelines
  • Hand-written wrapper over the public REST API — no generated code, no schema sync
  • Built-in strategy templates (Strategy.rsi_threshold_long(), Strategy.ma_crossover(), …)
  • Grouped-knob classes: Execution, Costs, Risk, Sizing, MarketHours, Settings — set only what you need
  • Pre-computed signals path: client.backtest_signals(series, df) for model-generated signals
  • Pandas-native — pass a DataFrame, get pandas Series back (result.strategy_equity, result.returns)
  • Engine introspection: client.version() and client.health() for uptime checks and version compatibility
  • Raw-API escape hatch for full control (client.backtest_raw({...}))
  • Strict type hints + py.typed — first-class IDE and mypy support
  • MIT licensed

Common patterns

Custom strategy

from backtest360 import Client, Strategy, Execution, Costs, Risk, Sizing, Settings

strat = Strategy(
    name="rsi_mean_reversion",
    long_entry="rsi < 30",
    long_exit="rsi > 70",
    indicators=[Strategy.indicator("rsi", period=14)],
)

result = Client(api_key="b360_...").backtest(
    strat, df,
    benchmark=spy_df,
    execution=Execution(entry="open", exit="close", signal_frequency="daily"),
    costs=Costs(slippage_bps=2.5, fee_pct=0.001),
    risk=Risk(stop="atr", value=2.5, atr_period=14, max_drawdown=0.25),
    sizing=Sizing(weight=1.0, vol_target=0.15, leverage_limit=2.0),
    settings=Settings(risk_free_rate=0.04),
)

result.summary()
print(result.stats["Max Drawdown"])
for t in result.trades[:5]:
    print(t["entry_date"], t["direction"], t["return_net"])

Indicator library (names, params, output columns): https://api.backtest360.com/docs#tag/Reference/operation/list_indicators_api_indicators_get

Strategy templates (full list): https://api.backtest360.com/docs#tag/Reference/operation/list_strategies_api_strategies_get

Pre-computed signals

import pandas as pd
from backtest360 import Client

# Any signal series of {-1, 0, 1} — your ML model, custom indicator, etc.
signals = pd.Series(..., index=df.index)

result = Client(api_key="b360_...").backtest_signals(signals, df)
print(result.stats["Sharpe"])

Raw API escape hatch

For users who want exact control with the API docs open:

resp = Client(api_key="...").backtest_raw({
    "strategy":    {"condition_tree": {...}, "indicators": [...]},
    "data_source": {"ohlcv": {...}},
    "execution":   {"signal_frequency": "daily"},
})

Error handling

from backtest360 import Backtest360Error

try:
    result = client.backtest(strategy, df)
except Backtest360Error as e:
    if e.status == 401:
        print("Invalid or expired API key — renew at backtest360.com/api")
    elif e.status == 429:
        print("Rate limited — retry after a moment")
    elif e.status == 422:
        print("Strategy validation failed:", e.body)
    else:
        raise   # unexpected — let it propagate

Versioning

MAJOR.MINOR.PATCH. Pre-1.0 (0.x.y): the API may move between minor versions. Pre-release suffixes: aN (alpha), bN (beta), rcN (release candidate). See CHANGELOG.md for the release history.


Full documentation

Full documentation → https://backtest360.github.io/backtest360/

Engine API reference → https://api.backtest360.com/docs

Questions / feedback

Questions or feedback? hello@backtest360.com — we read everything. The SDK is in active development, so help shape it.

Bug reports and feature requests: open an issue on GitHub.

License

MIT — see LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

backtest360-0.1.0.tar.gz (45.4 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

backtest360-0.1.0-py3-none-any.whl (18.3 kB view details)

Uploaded Python 3

File details

Details for the file backtest360-0.1.0.tar.gz.

File metadata

  • Download URL: backtest360-0.1.0.tar.gz
  • Upload date:
  • Size: 45.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for backtest360-0.1.0.tar.gz
Algorithm Hash digest
SHA256 67eed2888c96e7f198f7382688ac783bc5e02bbb60e390e725bae7e6744f9df4
MD5 c5804fcbe6b1cb83970033f2da8a120a
BLAKE2b-256 e53b62ca75f5dc091242e0edba6f59d3373f69475adad66c0309869c8d1cad7e

See more details on using hashes here.

Provenance

The following attestation bundles were made for backtest360-0.1.0.tar.gz:

Publisher: release.yml on Backtest360/backtest360

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file backtest360-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: backtest360-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 18.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for backtest360-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 213e2deca415882eb443be86b46432e7cf4b7d7c88fdf65ca9006d2ad2d661f7
MD5 2005b6e10190b12821aacb98d65aadbd
BLAKE2b-256 6ef276864a3b53ac53b72894f70d74f2a2d1c3e6ba1c7d1dc459a83cfa68d16d

See more details on using hashes here.

Provenance

The following attestation bundles were made for backtest360-0.1.0-py3-none-any.whl:

Publisher: release.yml on Backtest360/backtest360

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page