Open-source project
beatzxbt/smm avatar
beatzxbt/smm

beatzxbt/smm: a learning market maker for Bybit futures

simple crypto market maker

608 stars190 forksPythonMIT

At a glance

What is it?
This Python bot quotes both sides of a single Bybit futures symbol, skewing quotes with inventory and volatility features, and its own disclaimer says it is built for learning rather than profit.
Who is it for?
Use this bot on Bybit testnet if you want to read and modify a working market making loop in Python, and treat the parameters.yaml spread and inventory values as the parts to study. Do not run it on real capital expecting returns, since the README says profits are highly unlikely, and check the account_size, bybit_symbol and TESTNET settings before the first start.
Can I use it commercially?
Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
Is it still maintained?
Yes. The repository last received commits 1 day ago.
What is it written in?
Mainly Python, according to GitHub's language statistics.

Answers come from the project's GitHub data, last synced on October 23, 2026, and from our analysis. They are not legal advice.

Editorial analysis

One symbol, two quotes, and an inventory brake

The repository is a market making bot for Bybit, written in Python, and it does one job in one place: it posts a bid and an ask around the mid price of a single futures symbol and keeps them updated as the market moves. The entry point is main.py, with the strategy logic under src, and the configuration is deliberately split from the code so that separate trading environments can run with separate settings. The README is unusually honest about what this is for. Its disclaimer states that nothing in the repository constitutes financial advice, that it is tailored primarily for learning purposes, and that it is highly unlikely you will make profits trading this strategy. It also points readers who are not ready to risk their own capital at Bybit's testnet. That framing should shape your expectations before you read a single parameter. The interesting engineering here is the quote logic, not a claim of returns.

Market data arrives over websockets into a shared class

The strategy overview describes a three step data flow. Prices from Bybit, and optionally from Binance, are streamed using websockets into a common shared class. Features are then calculated from the updated market data, and a market maker class generates the quotes. Two design details are worth pulling out. The primary data feed is configurable between Binance and Bybit, and selecting Binance starts additional websocket streams that enable additional pricing features, which only works if the symbol is also trading on Binance USD-M, so a symbol that exists on one venue and not the other cannot use that path. Second, the features do not simply read one mid price. Multiple features work by comparing different mid prices to each other, which the README frames as an attempt to predict where price is likely to go, and the bid and ask skew is then calculated from those feature values but corrected for the current inventory, meaning your filled position.

Volatility widens the spread, inventory skews it

Quote generation comes down to two corrections applied to a base spread. Skew comes from the feature values and from inventory, and the inventory control is the part that keeps the bot from accumulating a position it cannot unwind. The inventory_extreme parameter is a value between 0 and 1 defining the maximum limit at which the system quotes normally, and once the inventory delta exceeds that value the bot stops quoting the opposite side and switches to a reduce-only mode. The volatility side uses Bollinger Band Width as the indicator, configured by bollinger_band_length, the lookback of one minute candlestick close data used to calculate band width, and bollinger_band_std, the multiplier of standard deviations generated over the lookback. The base spread is scaled by that measure and may go up to ten times its base_spread value when short-term movement increases. On top of that sit three offsets for price, size and volatility, each of which can push the exchange to reject the quote if the result falls outside the venue's minimum or maximum ranges.

Running against testnet before real money

The setup sequence is documented closely enough to follow end to end. You clone the repository, create and activate a virtual environment if you are comfortable with that step, install the requirements and create your own parameters file:

bash
$ pip install -r requirements.txt
$ cp parameters.yaml.example parameters.yaml

Then copy .env.example to .env with your API key and secret. The testnet switch is a single flag in that environment file:

bash
TESTNET=True

The credentials block is the same shape as the .env.example file shipped in the repository:

bash
API_KEY=YOUR_API_KEY_HERE
API_SECRET=YOUR_API_SECRET_HERE

One account requirement is not optional: the account must be a Unified Trading Account (UTA), and a testnet account can be created with no KYC required. The final command starts the bot from the project directory:

bash
(venv) $ python3 -m main

The dependency set is pinned to exact versions in requirements.txt, including pybit 5.6.2 and python-binance 1.0.19 for the two venues, numpy 1.26.4, pandas 1.5.0, numba 0.59.0, websockets 10.3 and uvloop 0.19.0. Those pins mean a Python version mismatch shows up as an install failure rather than a subtle runtime problem.

The order management system is described, then switched off

Step three of the strategy description covers the part of the pipeline that is not live. The README says orders are sent via an Order Management System, which is currently disabled, and describes what it would do: transition between current and new states and try to do so in the most ratelimit-efficient way possible. Elsewhere the overview says quotes are generated using all of the above, formatted for the local client and returned, which describes a local client that receives prepared quotes. The honest reading is that the strategy generates quotes, while the machinery that manages live order state and respects exchange rate limits is present in outline but not switched on. That matters for expectations about what the bot does when it runs. It is a quote generator and strategy sandbox, not a finished execution system, and the README gives no account size, symbol or exchange limits you can borrow to size it yourself.

Small friction points: a clone URL, a typo and an SSL error

A few details will cost you time on a first run. The clone command shown in the README points at [email protected]:beatzxbt/bybit-smm.git while the repository itself is published as beatzxbt/smm, so the command as written does not match the project it documents. The environment step is also inconsistent: the prose says to copy .env.exmaple to .env, with the letters transposed, while the shell command that follows copies .env.example. On macOS the README warns about a specific failure, an ssl.SSLCertVerificationError with the message certificate verify failed: unable to get local issuer certificate, and links to a general fix. Separately, the parameters file is gitignored on purpose, so a checkout gives you parameters.yaml.example and a working configuration is something you create yourself, which is the right call for a file holding account size and credentials.

MIT licensed, no releases, and a rewrite waiting on a branch

The licence is MIT, so the code can be read, copied and modified with the notice preserved, and redistribution of a derived bot carries no commercial restriction from this repository. The maintenance picture is more cautious. There are no GitHub releases, so there is nothing to pin and no changelog to read, and the last push was on 2026-08-15. The contribution note says no contributions are planned for the repository in its current state, and that the author is working on a major upgrade in a separate branch, the v.2.0-alpha branch, which the README describes as a faster, exchange-agnostic framework intended to support multi-symbol execution, still very much work in progress. If you want multi-symbol execution or a vendor-neutral framework, that branch is the place to look. If you want to understand the current single-symbol Bybit loop, the master branch is complete and readable, with the main.py entry point and the src package sitting side by side.

Editorial conclusion

Use this bot on Bybit testnet if you want to read and modify a working market making loop in Python, and treat the parameters.yaml spread and inventory values as the parts to study. Do not run it on real capital expecting returns, since the README says profits are highly unlikely, and check the account_size, bybit_symbol and TESTNET settings before the first start.

Frequently asked questions

How do I run the beatzxbt/smm market making bot on Bybit testnet?

Create a Bybit testnet account, generate an API key and secret, copy .env.example to .env with your credentials, set the TESTNET flag to True, copy parameters.yaml.example to parameters.yaml, then run python3 -m main from the project directory. The account must be a Unified Trading Account (UTA).

What does the inventory_extreme parameter do in beatzxbt/smm?

It is a value between 0 and 1 defining the maximum limit at which the system quotes normally. When the inventory delta exceeds it, the bot stops quoting the opposite side and moves into a reduce-only mode.

Can beatzxbt/smm use Binance data for a Bybit symbol?

Yes, by setting primary_data_feed to Binance, which starts additional websocket streams for extra pricing features. It only works if the symbol is also trading on Binance USD-M, and the Binance derivatives symbol is set through binance_symbol.

Does the beatzxbt/smm bot send live orders to the exchange?

The strategy overview says orders are sent via an Order Management System which is currently disabled. The quotes are generated and returned to a local client, so the live order management path is not switched on in the current state of the repository.

Which volatility indicator does beatzxbt/smm use?

Bollinger Band Width, with bollinger_band_length as the lookback for one minute candlestick close data and bollinger_band_std as the multiplier of standard deviations over that period. The base spread is scaled by that measure and can reach up to ten times base_spread.

Official sources

  1. beatzxbt/smm on GitHub
  2. Issues
  3. License: MIT
  4. README
Add this badge to your README

If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.

Add this badge to your README

markdown
[![Hysen Labs](https://hysenlabs.com/badge/beatzxbt-smm.svg)](https://hysenlabs.com/projects/beatzxbt-smm)

Was this useful?