Skip to main content

End of All Trades — ruthless backtesting lab for long-only spot strategies.

Project description

Terminus

Terminus

End of All Trades

Where strategies go to prove themselves — or die.


Terminus is a pure Python backtesting engine built for one thing: honest results.

8 years of market data. Year-by-year walk-forward with frozen parameters. Realistic fees and slippage. A content-hashed simulation store so you never burn compute twice.

Most backtesting tools let you cheat. Terminus doesn't.


Why Terminus

  • Near-perfect walk-forward required — frozen parameters tested year by year. At most 2 losing years tolerated, each no worse than −10%.
  • Bear years count — 2022 was −64% on BTC. Your strategy survives that or it doesn't ship.
  • Multi-pair generalization required — works on one pair? That's a curve fit. Terminus requires success across multiple pairs.
  • Realistic execution — fees, entry slippage, stop slippage, TP slippage, timeout slippage, cooldowns, max-hold. Tiered by market cap.
  • Halal-first — spot-only, no leverage, no shorts, no interest. Cash (stablecoin) is a valid position in bear regimes.
  • Content-hashed cache — every sim keyed by hash(pair + tf + config + date_range + slippage + fee). Same inputs = instant cache hit.

Quickstart

pip install terminus-lab

# Fetch 8 years of data
terminus fetch --pairs BTCUSDT,ETHUSDT,SOLUSDT --tfs 1h,4h,1d --days 2920

# Run the full sweep
terminus sweep

# Walk-forward the top candidates year-by-year
terminus walk-forward --top 15

# Generate the report
terminus report --min-calmar 1.5 --min-bear-return -5

Example Output

=== TOP 15 SURVIVORS by ANNUALIZED return ===
 Rank  Pair       TF    Family                   Yrs   TotalRet   AnnRet   Calmar   Bear22
 ----- ---------- ----  -----------------------  ----  --------   ------   ------   ------
   1   TIAUSDT    2h    Ichi-bull+BTCreg          3/3    +90.7%    +24.0%    2.77     -
   2   XRPUSDT    2h    Ichi-bull+BTCreg          6/6   +213.5%    +21.0%    5.68    +0.0%
   3   LTCUSDT    12h   Ichi-bull+BTCreg          3/3    +70.1%    +19.4%    4.28    +0.0%
   4   BNBUSDT    1h    ROC10+BTCreg              5/5   +133.2%    +18.4%    4.93    +0.0%
   5   SOLUSDT    4h    ATR-brk                   5/5   +130.6%    +18.2%    7.86   +13.2%

What's Inside

Module What it does
Sweep engine Runs thousands of configs in parallel, skips cache hits
Walk-forward Frozen / anchored / rolling — calendar-year folds
Portfolio builder Correlation-capped leg selection, blended Sharpe/Calmar
ML module XGBoost regime classifier (BULL/BEAR/CHOP) + WF-aware optimizer
Community hub Contribute sim results, query the global leaderboard
SQLite store Local 6-table schema, travels with your research

30+ strategy families — RSI, EMA/MACD crosses, Bollinger, Donchian, ATR breakouts, Ichimoku, Supertrend, Keltner, VWAP reclaim, Heikin Ashi, ROC momentum, and more.


Philosophy

Terminus is pessimistic by default. It will tell you your strategy doesn't work before it tells you it does. That's the point.

Terminus is reproducible by design. The content-hash cache means any claim in a report traces back to the exact inputs that produced it. sims.db travels with your conclusions.

Terminus is spot-only, halal-first. Built by someone who can't use futures or margin. If you have those tools, you have more alpha. If you don't — Terminus fits your constraints natively.


Community Hub

Leaderboard: https://terminus-hub.shatla-tech.workers.dev

After every terminus sweep and terminus walk-forward, Terminus automatically contributes your survivors to the community hub — no manual step needed. Sims are always stored locally first; remote send is retried on the next run if the network was down.

To opt out:

export TERMINUS_TELEMETRY=0

To force-upload everything you've ever run:

terminus contribute --all

Status

Alpha. Used in production on a paper-trading bot running 7 pairs. API may shift. Results format and research data model are stable.


Contributing

PRs welcome for:

  • New strategy families (numpy-vectorized signals)
  • Alternative data fetchers (Kraken, Coinbase, OKX, Bybit spot)
  • Portfolio construction methods
  • New walk-forward modes

See CONTRIBUTING.md.


License

MIT. Use it, fork it, ship it. If you find something useful, open a PR — the community sim database grows stronger with every contributor.

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

terminus_lab-0.1.1.tar.gz (62.8 kB view details)

Uploaded Source

Built Distribution

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

terminus_lab-0.1.1-py3-none-any.whl (63.2 kB view details)

Uploaded Python 3

File details

Details for the file terminus_lab-0.1.1.tar.gz.

File metadata

  • Download URL: terminus_lab-0.1.1.tar.gz
  • Upload date:
  • Size: 62.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for terminus_lab-0.1.1.tar.gz
Algorithm Hash digest
SHA256 431ad0b96b8ae35d11b98b91ceb8e482736e0d6aabd7b0461b25b6317de072b3
MD5 916f0b5bbcf8b0221d0d48ef407de38f
BLAKE2b-256 c6b906451eb4251baa155d8abee1a6555e2544cfed664f9c8a56d0ba1fef0c2b

See more details on using hashes here.

File details

Details for the file terminus_lab-0.1.1-py3-none-any.whl.

File metadata

  • Download URL: terminus_lab-0.1.1-py3-none-any.whl
  • Upload date:
  • Size: 63.2 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.2

File hashes

Hashes for terminus_lab-0.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1e24583a7a63d8852ebd01857672de0ccf073b2b5bacb9894184b1a4b9fac1bd
MD5 33e0d8e1ed8a24a6e5a9fa24c017aada
BLAKE2b-256 37c30dbce27da2d7daafcbc94f173a2824f743ad3ec444869696aabacab8a383

See more details on using hashes here.

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