Project Overview
Jesse is an open-source Python framework for developing, backtesting, and live-executing algorithmic crypto trading strategies. Its core promise: write your strategy logic once in Python, validate it against historical OHLCV data, and deploy the same code against real exchange APIs without rewriting it.
The project targets developers and quantitatively-minded traders who want full control over strategy logic without building exchange connectivity, order management, or reporting infrastructure from scratch. You own the strategy; Jesse handles data ingestion, position tracking, order routing, and session monitoring.
Jesse is MIT-licensed and actively maintained, with regular releases and a browser-based dashboard for monitoring live trading sessions.
Key Challenges Addressed
Without a framework, a Python-based crypto backtesting setup means writing CSV loaders, handling per-exchange OHLCV quirks, simulating fills, and building your own reporting pipeline. Jesse removes all of that.
Specific problems it targets:
Strategy-to-live parity. Most backtesting setups diverge from live execution: different codepaths, different state management, different order models. Jesse uses the same Strategy class for both modes. Your backtest results are directly comparable to live behavior, assuming your fee and slippage assumptions hold.
Clean historical data. Getting gap-free OHLCV candles from exchange APIs is error-prone — rate limits, pagination, missing bars. Jesse's exchange-aware data fetcher handles this and stores candles locally in a PostgreSQL database so you're not re-fetching on every run.
Stateful position and order management. In live trading, tracking open positions, partial fills, pending stops, and take-profits requires careful shared state. Jesse's internal store manages this so your strategy code stays declarative.
Getting Started
Jesse requires Python 3.10+ and PostgreSQL. Install via pip:
pip install jesse
Create a new project:
jesse make-project my-bot
cd my-bot
Copy and configure your environment file:
cp .env.example .env
Import historical candles before running any backtest:
jesse import-candles 'Binance Futures' 'BTC-USDT' '2022-01-01'
Sharp edges you'll hit immediately:
- The exchange name string in
import-candlesis case-sensitive and must match Jesse's internal driver names exactly. A misspelling silently does nothing — no error, no data imported. Checkjesse/modes/import_candles/drivers/for the exact string to use. - Jesse reads
.envfrom the current working directory at command invocation. Running commands from a parent directory breaks this lookup and produces a confusingKeyErrorrather than a useful missing-config message. - Live trading API keys need trading permissions enabled on the exchange. If you reuse a read-only data key, Jesse fails only at the first order submission attempt — not at startup — which is a difficult moment to catch the mistake.
Features and Use Cases
Backtesting with realistic simulation. Jesse simulates market and limit order execution per candle, including stop-loss and take-profit levels. You configure fee rates per exchange and set slippage assumptions. The resulting report covers net PnL, Sharpe ratio, Calmar ratio, max drawdown, win rate, and a complete trade log.
Strategy authoring via lifecycle methods. You subclass Strategy and implement hooks: should_long(), should_short(), go_long(), go_short(), and update_position(). The framework calls these in order on each candle — no event bus or callback registration required.
from jesse.strategies import Strategy
import jesse.indicators as ta
class MACrossover(Strategy):
@property
def fast_ma(self):
return ta.sma(self.candles, 9)
@property
def slow_ma(self):
return ta.sma(self.candles, 21)
def should_long(self):
return self.fast_ma > self.slow_ma
def should_short(self):
return self.fast_ma < self.slow_ma
def go_long(self):
self.buy = 1, self.price
def go_short(self):
self.sell = 1, self.price
def update_position(self):
pass
Live trading. Jesse connects to exchange WebSocket feeds for real-time candle updates and uses REST APIs for order placement. Supported exchanges include Binance Spot, Binance Futures, Bybit, and others via a driver system.
Genetic algorithm optimizer. Jesse can sweep your strategy's numeric parameters using a genetic algorithm to maximize a target metric like Sharpe ratio. I'd recommend against running this on your full historical date range — the optimizer will find overfitted parameters unless you hold out a validation period.
Web dashboard. Active live sessions expose a browser-based dashboard showing current positions, open orders, and real-time P&L — useful for status checks without staying attached to a terminal.
Ecosystem and Dependencies
Jesse depends on NumPy and pandas for numerical operations and uses TA-Lib (via tulipy or the ta-lib Python wrapper) for a large built-in technical indicator library. Installing TA-Lib on Apple Silicon requires building from source or using a conda environment — the pip path often fails silently on arm64 hardware.
The official jesse-ai/jesse-ai-add-on is a paid commercial plugin maintained by the same team. It adds additional exchange drivers and strategy utilities. This creates a two-tier ecosystem: some connectors are open and community-maintained, others require a subscription.
For live session alerting, Jesse integrates with Telegram — practical for trade notifications when you're not watching the web dashboard.
Architectural Overview
Jesse's runtime is a single-threaded candle loop. In backtest mode, the loop iterates over stored candle records in chronological order. In live mode, the loop is driven by WebSocket candle-close events from the exchange.
Key components:
- Store: a singleton holding current position state, open orders, and in-flight candle data. Your strategy code reads position and price state from here rather than managing state directly.
- Exchange drivers: adapter classes that translate Jesse's internal order model to exchange-specific REST and WebSocket calls. Each supported exchange has its own driver class. Adding a new exchange means implementing this adapter interface.
- Indicators library: a set of stateless functions that take a candle NumPy array and return a scalar or array. Because they're pure functions, they're straightforward to test in isolation and compose freely.
- Routes config: a list mapping
(exchange, symbol, timeframe)tuples to strategy classes. A single Jesse process can run multiple routes simultaneously — one process can trade BTC-USDT and ETH-USDT using separate strategy instances.
The single-threaded design keeps state management simple and makes backtests fully deterministic. The trade-off is that expensive indicator computation in update_position() runs synchronously in the live loop and can delay order submission if your strategy logic is slow.
Pros and Cons
Pros
- Backtest and live trading share the same
Strategyclass, which eliminates a common source of divergence between paper and live results. - The built-in indicator library covers most common technical analysis functions, so you don't need to implement SMA, RSI, MACD, or Bollinger Bands yourself.
- Backtest reports include risk-adjusted metrics beyond raw returns, which makes it harder to fool yourself with a lucky equity curve.
- The project structure is opinionated enough that you spend time on strategy logic, not infrastructure plumbing.
- MIT license with no commercial use restrictions.
Cons
- Exchange coverage is narrower than general-purpose libraries. If you need an unsupported exchange, you're writing an adapter class.
- The single-threaded candle loop doesn't parallelize across symbols. Running many concurrent symbols through one process means later routes wait for earlier ones to finish each candle.
- Some exchange drivers and features are locked behind the paid add-on, which splits community documentation and support.
- Long backtests on minute-level candles are memory-intensive: several years of BTC-USDT at 1m resolution can push multi-GB pandas DataFrames. Plan your RAM budget accordingly.
- The genetic optimizer has no built-in out-of-sample enforcement — it will overfit readily if you run it on your full date range without a held-out validation window.
Comparison and Alternatives
GitHub stars
Weekly star gains
Full metrics details
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
Jesse
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
freqtrade
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
138 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Hummingbot
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Nautilus Trader
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Superalgos
GitHub GraphQL current stargazer cohort, reconstructed from starredAt events and totalCount retrieved in one stable pagination walk. GitHub does not expose historical unstar events, so this is not an exact ledger of past star counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Issues opened
Weekly total
Full metrics details
GitHub API observation. Historical values render only when the source provides a real observation for that day.
Jesse
GitHub API observation. Historical values render only when the source provides a real observation for that day.
160 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
freqtrade
GitHub API observation. Historical values render only when the source provides a real observation for that day.
131 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Hummingbot
GitHub API observation. Historical values render only when the source provides a real observation for that day.
173 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Nautilus Trader
GitHub API observation. Historical values render only when the source provides a real observation for that day.
173 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Superalgos
GitHub API observation. Historical values render only when the source provides a real observation for that day.
173 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Issues closed
Weekly total
Full metrics details
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
Jesse
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
160 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
freqtrade
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
131 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Hummingbot
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
173 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Nautilus Trader
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
173 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Superalgos
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
173 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Pull requests opened
Weekly total
Full metrics details
GitHub API observation. Historical values render only when the source provides a real observation for that day.
Jesse
GitHub API observation. Historical values render only when the source provides a real observation for that day.
160 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
freqtrade
GitHub API observation. Historical values render only when the source provides a real observation for that day.
131 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Hummingbot
GitHub API observation. Historical values render only when the source provides a real observation for that day.
173 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Nautilus Trader
GitHub API observation. Historical values render only when the source provides a real observation for that day.
173 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Superalgos
GitHub API observation. Historical values render only when the source provides a real observation for that day.
173 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Pull requests closed
Weekly total
Full metrics details
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
Jesse
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
160 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
freqtrade
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
131 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Hummingbot
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
173 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Nautilus Trader
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
173 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Superalgos
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
173 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Pull requests merged
Weekly total
Full metrics details
GitHub API observation. Historical values render only when the source provides a real observation for that day.
Jesse
GitHub API observation. Historical values render only when the source provides a real observation for that day.
160 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
freqtrade
GitHub API observation. Historical values render only when the source provides a real observation for that day.
131 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Hummingbot
GitHub API observation. Historical values render only when the source provides a real observation for that day.
173 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Nautilus Trader
GitHub API observation. Historical values render only when the source provides a real observation for that day.
173 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Superalgos
GitHub API observation. Historical values render only when the source provides a real observation for that day.
173 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Open/closed pull request ratio
Weekly average
Full metrics details
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
Jesse
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
freqtrade
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
138 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Hummingbot
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Nautilus Trader
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Superalgos
GitHub Search pull-request totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Open/closed issues ratio
Weekly average
Full metrics details
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
Jesse
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
freqtrade
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
138 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Hummingbot
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Nautilus Trader
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Superalgos
GitHub Search issue totals queried for exact UTC days; rolling values are sums of proven daily counts.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Releases
Weekly total
Full metrics details
GitHub release published_at events bucketed by UTC day; drafts are excluded.
Jesse
GitHub release published_at events bucketed by UTC day; drafts are excluded.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
freqtrade
GitHub release published_at events bucketed by UTC day; drafts are excluded.
138 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Hummingbot
GitHub release published_at events bucketed by UTC day; drafts are excluded.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Nautilus Trader
GitHub release published_at events bucketed by UTC day; drafts are excluded.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Superalgos
GitHub release published_at events bucketed by UTC day; drafts are excluded.
180 observed daily rows. Missing days are not fabricated.
| Date | Value |
|---|
Hotness score
Weekly average
Full metrics details
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
Jesse
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.
- Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
- Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
- Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
- Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
- Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
- Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
| Date | Stars | Stars 1d | Stars 7d | Stars 14d | Stars 30d | Stars 90d | Same-day multiplier | Weekly multiplier | Fortnight multiplier | Hot today | Hot week | Breakout | Stored score |
|---|
freqtrade
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
138 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.
- Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
- Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
- Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
- Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
- Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
- Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
| Date | Stars | Stars 1d | Stars 7d | Stars 14d | Stars 30d | Stars 90d | Same-day multiplier | Weekly multiplier | Fortnight multiplier | Hot today | Hot week | Breakout | Stored score |
|---|
Hummingbot
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.
- Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
- Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
- Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
- Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
- Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
- Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
| Date | Stars | Stars 1d | Stars 7d | Stars 14d | Stars 30d | Stars 90d | Same-day multiplier | Weekly multiplier | Fortnight multiplier | Hot today | Hot week | Breakout | Stored score |
|---|
Nautilus Trader
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.
- Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
- Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
- Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
- Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
- Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
- Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
| Date | Stars | Stars 1d | Stars 7d | Stars 14d | Stars 30d | Stars 90d | Same-day multiplier | Weekly multiplier | Fortnight multiplier | Hot today | Hot week | Breakout | Stored score |
|---|
Superalgos
Derived only from GitHub GraphQL starredAt events after daily star totals are reconciled.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.40 × Hot today + 0.40 × Hot week + 0.20 × Breakout.
- Same-day multiplier = stars 1d ÷ max(1, stars 7d ÷ 7)
- Weekly multiplier = stars 7d ÷ max(1, stars 30d ÷ 30 × 7)
- Fortnight multiplier = stars 14d ÷ max(1, stars 90d ÷ 90 × 14)
- Hot today = clamp(70 × log-scale(stars 1d, 1000) + 30 × breakout-scale(same-day, 4))
- Hot week = clamp(75 × log-scale(stars 7d, 5000) + 25 × breakout-scale(weekly, 3))
- Breakout = clamp(35 × breakout-scale(same-day, 4) + 40 × breakout-scale(weekly, 3) + 25 × breakout-scale(fortnight, 2.5))
| Date | Stars | Stars 1d | Stars 7d | Stars 14d | Stars 30d | Stars 90d | Same-day multiplier | Weekly multiplier | Fortnight multiplier | Hot today | Hot week | Breakout | Stored score |
|---|
Reliability score
Weekly average
Full metrics details
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
Jesse
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.
- Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
- Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
- Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
- Support burden = 100 − 2 × open issues per 1,000 stars
- Liveness = 100 × exp(−pushed days ago ÷ 120)
Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.
| Date | Issues opened | Issues closed | PRs opened | PRs merged | Releases | Stars | Open issues | Pushed days ago | Continuity | Closure | Shipping | Liveness | Support burden | License | Observed days | Missing days | Needs healing | Stored score |
|---|
freqtrade
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
138 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.
- Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
- Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
- Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
- Support burden = 100 − 2 × open issues per 1,000 stars
- Liveness = 100 × exp(−pushed days ago ÷ 120)
Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.
| Date | Issues opened | Issues closed | PRs opened | PRs merged | Releases | Stars | Open issues | Pushed days ago | Continuity | Closure | Shipping | Liveness | Support burden | License | Observed days | Missing days | Needs healing | Stored score |
|---|
Hummingbot
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.
- Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
- Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
- Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
- Support burden = 100 − 2 × open issues per 1,000 stars
- Liveness = 100 × exp(−pushed days ago ÷ 120)
Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.
| Date | Issues opened | Issues closed | PRs opened | PRs merged | Releases | Stars | Open issues | Pushed days ago | Continuity | Closure | Shipping | Liveness | Support burden | License | Observed days | Missing days | Needs healing | Stored score |
|---|
Nautilus Trader
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.
- Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
- Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
- Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
- Support burden = 100 − 2 × open issues per 1,000 stars
- Liveness = 100 × exp(−pushed days ago ÷ 120)
Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.
| Date | Issues opened | Issues closed | PRs opened | PRs merged | Releases | Stars | Open issues | Pushed days ago | Continuity | Closure | Shipping | Liveness | Support burden | License | Observed days | Missing days | Needs healing | Stored score |
|---|
Superalgos
Derived from the displayed continuity, closure, shipping, liveness, and support-burden components.
180 observed daily rows. Missing days are not fabricated.
Per-day formula: 0.30 × Continuity + 0.30 × Closure + 0.20 × Shipping + 0.10 × Liveness + 0.10 × Support burden.
- Continuity = 35% active ratio 90d + 20% active ratio 30d + 15% PR efficiency 90d + 10% PR efficiency 30d + 10% liveness + 10% observed-history coverage
- Closure = 55% PR merge efficiency 90d + 45% issue close efficiency 90d
- Shipping = 100 × (20% × release ratio 30d + 30% × release ratio 90d + 50% × release ratio 180d); ratios are releases ÷ 2, 6, and 12, capped at 1
- Support burden = 100 − 2 × open issues per 1,000 stars
- Liveness = 100 × exp(−pushed days ago ÷ 120)
Stars, issues, pull requests, and releases are daily observations. Pushed-days and license are repository snapshot-derived inputs and are not independent historical GitHub events.
| Date | Issues opened | Issues closed | PRs opened | PRs merged | Releases | Stars | Open issues | Pushed days ago | Continuity | Closure | Shipping | Liveness | Support burden | License | Observed days | Missing days | Needs healing | Stored score |
|---|
Jesse competes with a small set of actively maintained Python algorithmic trading frameworks. The meaningful differences come down to exchange breadth, target strategy type (directional vs. market making vs. high-frequency), and community scale.
| Project | Repo | Hotness (~6mo) | PRs merged (~6mo) | Star growth (~6mo) |
|---|---|---|---|---|
| Jesse | https://github.com/jesse-ai/jesse | 33.70 | 5 | 1638 |
| freqtrade | https://github.com/freqtrade/freqtrade | 41.91 | 0 | 3219 |
| Hummingbot | https://github.com/hummingbot/hummingbot | metrics pending | 0 | 592 |
| Nautilus Trader | https://github.com/nautechsystems/nautilus_trader | metrics pending | 0 | 773 |
| Superalgos | https://github.com/Superalgos/Superalgos | metrics pending | 0 | 95 |
freqtrade is the most established Python crypto trading framework. It connects to over 100 exchanges via a CCXT backend, has a larger contributor community, and documents edge cases more thoroughly. Strategy authoring differs — freqtrade uses signals returned from a DataFrame rather than lifecycle methods — but both are workable approaches for directional strategies.
Hummingbot targets market making and cross-exchange arbitrage rather than directional trend or mean-reversion strategies. If you want to run a market maker simultaneously across multiple exchanges, Hummingbot has connectivity and tooling that Jesse doesn't cover.
Nautilus Trader is a high-performance trading platform with a Rust and Cython core. It handles much higher throughput than Jesse's Python loop and suits strategies that need sub-second execution or concurrent processing of many instruments. The setup complexity and learning curve are significantly steeper.
Superalgos takes a visual node-based approach to strategy building, targeting non-programmers as much as developers. The architecture, storage model, and operating model are fundamentally different from Jesse's code-first design.
The best overall alternative is freqtrade. Broader exchange coverage through CCXT, higher community PR throughput, and comprehensive open documentation without a paid-add-on tier make it the lower-risk long-term choice for most directional crypto strategy use cases.
Conclusion
Jesse is the right pick for Python developers building directional crypto trading strategies who want a clean, code-first framework where backtest and live execution share the same codebase. The official Jesse documentation covers strategy authoring, data management, and live deployment clearly enough to get a working strategy running in a day.
Do not run the built-in genetic optimizer against your full historical candle range — it will produce parameters that backtest well and underperform live. Split your data first: set start_date and finish_date in the backtest config to cover only your training window, leaving the most recent period as an untouched holdout before running any optimization.
