jesse-ai/jesse

An advanced crypto trading bot written in Python

8,194
Stars
over 7 years
Age
0
Published reviews
0
Questions

Reliability breakdown

What drives the reliability score

Component scores measured daily from GitHub activity (2026-07-15).

Continuity30% of headline49

Activity on 27 of 90 tracked days in the last 90 and 4 of 30 in the last 30.

Closure30% of headline83

Merged 16 of 23 PRs opened and closed 12 of 8 issues opened over the last 90 tracked days — PR flow carries 55% of this component, issue flow 45%.

Shipping20% of headline0

0 releases in the last 180 days, 0 in the last 90 and 0 in the last 30 — a steady cadence scores highest.

Liveness10% of headline100

Last push 4 days ago — freshness decays as pushes age (roughly halves every 83 days without a push).

Support burden10% of headline100

Open-issue load isn't tracked for this repo yet.

Adoption confidence86

Modeled — how confidently teams are adopting this repo. Stargazers

Maintenance quality61

Modeled from PR/issue responsiveness and upkeep signals. Activity pulse

Risk score16

Modeled — lower is better; adoption and continuity risk. Repository

Stays active (30d)39%

Modeled chance the repo stays active over 30 days. Activity pulse

Stays active (90d)62%

Modeled chance the repo stays active over 90 days. Activity pulse

Release rhythm (180d)0

Regularity of releases over the last 180 days. Releases

Maintainer bus risk (90d)46%

Modeled — lower is better; concentration of commits in few maintainers. Contributors graph

Topics

Explore related topics

Jump into the topic listings this repository belongs to.

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-candles is case-sensitive and must match Jesse's internal driver names exactly. A misspelling silently does nothing — no error, no data imported. Check jesse/modes/import_candles/drivers/ for the exact string to use.
  • Jesse reads .env from the current working directory at command invocation. Running commands from a parent directory breaks this lookup and produces a confusing KeyError rather 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 Strategy class, 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

Measured 90-day trends for this project and its alternatives.

GitHub stars

Weekly star gains

4502250
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue

Issues opened

Weekly total

36180
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue

Issues closed

Weekly total

2011010
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue

Pull requests opened

Weekly total

29150
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue

Pull requests closed

Weekly total

35180
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue

Pull requests merged

Weekly total

22110
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue

Open/closed pull request ratio

Weekly average

100500
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue

Open/closed issues ratio

Weekly average

100500
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue
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.

DateValue

Releases

Weekly total

630
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.

DateValue
freqtrade

GitHub release published_at events bucketed by UTC day; drafts are excluded.

138 observed daily rows. Missing days are not fabricated.

DateValue
Hummingbot

GitHub release published_at events bucketed by UTC day; drafts are excluded.

180 observed daily rows. Missing days are not fabricated.

DateValue
Nautilus Trader

GitHub release published_at events bucketed by UTC day; drafts are excluded.

180 observed daily rows. Missing days are not fabricated.

DateValue
Superalgos

GitHub release published_at events bucketed by UTC day; drafts are excluded.

180 observed daily rows. Missing days are not fabricated.

DateValue

Hotness score

Weekly average

100500
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))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored 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))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored 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))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored 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))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored 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))
DateStarsStars 1dStars 7dStars 14dStars 30dStars 90dSame-day multiplierWeekly multiplierFortnight multiplierHot todayHot weekBreakoutStored score

Reliability score

Weekly average

100500
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.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored 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.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored 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.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored 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.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored 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.

DateIssues openedIssues closedPRs openedPRs mergedReleasesStarsOpen issuesPushed days agoContinuityClosureShippingLivenessSupport burdenLicenseObserved daysMissing daysNeeds healingStored 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.

Join the conversation

Reviews · Questions · Posts

Share what you know about jesse — write a review from your real experience, ask an implementation question, or publish a post about how you use it.

Share your experience

Write or update your review

Explain what worked, what broke down, and what another team should know before adopting jesse.

Write your review now — it saves locally and publishes automatically after you sign in.

Rating
Positive attributes
Negative attributes

Project Q&A

Questions and answers

Browse implementation threads tied directly to jesse-ai/jesse. Each question links through to the full answer page.

Q&A No threads yet

Be the first to ask how teams run jesse in production. Every question you post becomes a durable, searchable answer page other developers can find.

Ask the first question

Related posts

Posts tagged with the same topics

These posts come from the same topic surface as this repo, so readers can move from project evaluation into practical writeups and migration notes without leaving context.

Posts No topic-linked posts yet

Share how your team uses jesse — a migration note, an architecture writeup, or a comparison. Your post reaches everyone browsing these same topics.

Write the first post
Get a weekly email with the hottest new projects in the Web Development and Python world.
No Spam. Unsubscribe easily at any time.

Copyright 2018-2026 Awesome Open Source.  All rights reserved.