Jesse is a framework by Saleh Mirnezami that implements an algo trader on some large crypto markets. You can run it with past data in a backtest - live trading is not yet implemented. Mirnezami wrote a blog post detailing how to get backtesting working in Jesse, which I followed.
A Running Algo in a Shareable Container
I got backtesting in Jesse running reliably in this Gitpod - have a try yourself. If you like, you can take this Gitpod and develop further with it: add exchange data (it currently has candle data from Bifinex and Binance for their Bitcoin contracts), add coins, change parameters, extend or change Mirnezami’s code - it’s a full development environment in a functioning Ubuntu 20.04.
This blog works you through how do create such a Gitpod. What a Gitpod is an why I used it I explain here.
Why Do It?
I wanted to create a algo that I could share with others for Webinars and similar, so participants could follow along if they wished, but without wasting time laboriously working them through the setup.
The Initial Gitpod
Following Mirnezami’s blog post How to write a profitable strategy for algotrading Bitcoin, he first directs you to install Jesse. Doing this in Gitpod leads to a problem later when you realize it requires Postgresql - not something that can be installed by a non-root user easily. Luckily Gitpod provides some base Docker containers, including one for PostgreSQL. See the Gitpod Prebuilds documentation.
Here’s one way to set up a Gitpod for Jesse. First you must sign up to GitHub (free). Start Chrome and install the Gitpod Chrome Extension then go to Gitpod’s basic image. Click the “Gitpod” button the Chrome app just created (top right, next to “Clone or download”). This will bring up a new Gitpod.
In the bottom right after initialization completes, a popup will appear:
Click “Setup Project”. This will produce a right side-panel with a list of 5 steps, the first being “Create .gitpod.yml” - click the button for this, then click “Update Docker Configuration”:
Choose “Default + PostgreSQL” and “Yes, generate a .gitpod.Dockerfile”. At this point the image will contain a functioning PostgreSQL installation when it is re-started. Note that you can get back to the Project Setup by doing F1 and searching for Toggle Project Setup View.
Continuing the sequence of steps, if you wish, click “Update Readme”. Click “Test Drive Configuration” and then “Push to Branch & Start Workspace”. A popup will appear in the top bar: choose “Fork to my account”
This will create a new repo in your GitHub which will be your-github-name/gitpod
. You can close the current Gitpod now - even delete it.
Go to github.com, find that repo and click on it to open it. Under Branch:
change from master
to your-github-name/gitpod-setup
. Click the “Gitpod” button - creating another Gitpod instance - this time Postgresql will be installed (test it by opening a Terminal and entering psql
- it should go to a PSQL prompt - then \q
to quit).
Install Jesse
The actuall Jesse install can now - with some adjustments for the lack of root user - be followed. Python 3 (>3.6) is required, which is available in the image as python3
- mine is 3.8.2
. If necessary upgrade pip
with
python3 -m pip install --upgrade pip
Jesse relies on talib
, a Technical Analysis library. This is a C++ library, exposed via a CPython wrapper. Getting it in the Gitpod is slightly tricky: SourceForge’s downloads don’t directly expose the filename. Prior investigation shows that it is something like https://phoenixnap.dl.sourceforge.net/project/ta-lib/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz
. Using a version number in this address the same as the one on the download page, download and unpack it:
wget https://phoenixnap.dl.sourceforge.net/project/ta-lib/ta-lib/0.4.0/ta-lib-0.4.0-src.tar.gz
tar xf ta-lib-0.4.0-src.tar.gz
That will create a directory called ta-lib
.
So that that the installation persists between Gitpod restarts, this C++ library needs to be installed locally to the workspace, so I suggest first do
mkdir .local
cd .local
mkdir bin lib include man share
export PREFIX=/workspace/gitpod/.local
Now it is time to build the library:
cd /workspace/gitpod/ta-lib
./configure --prefix=$PREFIX
make
make install
This will put all requrired files within the .local
hierarchy.
Now for the Python layer. First you must direct it to the ta-lib
installation:
export TA_LIBRARY_PATH=$PREFIX/lib
export TA_INCLUDE_PATH=$PREFIX/include
export LD_LIBRARY_PATH=$PREFIX/lib
numpy
is required for the Python talib
layer - it should be installed with the Scipy packages - useful for other work with Jesse:
python3 -m pip install --user numpy scipy matplotlib ipython jupyter pandas sympy nose
The Python library ZIP file is available from https://github.com/mrjbq7/ta-lib
.
cd /workspace/gitpod
wget https://github.com/mrjbq7/ta-lib/archive/master.zip
unzip master.zip
cd ta-lib-master
python3 setup.py install
Because this install must be written to the Python installation which is in the gitpod
home directory, it is lost during a Gitpod Stop/Start cycle. Therefore it needs to be repeated by addition to the .gitpod.yml
file:
tasks:
- init: echo "Not doing anything with 'init' right now!"
command: |
cd /workspace/gitpod/ta-lib-master && python3 setup.py install && cd /workspace/gitpod
export LD_LIBRARY_PATH=/workspace/gitpod/.local/lib
image:
file: .gitpod.Dockerfile
Finally install Jesse’s Requirements (pip install
from the documentation doesn’t work between Gitpod restarts):
python3 -m pip install -r https://raw.githubusercontent.com/jesse-ai/jesse/master/requirements.txt
Now install Jesse:
python3 -m pip install --user jesse
Create The Algo
With Jesse installed, first you create a project:
jesse make-project your-project
which will create the directory your-project
(choose an appropriate name for your project).
Now you can follow the process described in Mirnezami’s blog post following from the jesse
install.
Share it Around
You should have a functioning Algo in a Gitpod. One of the beauties of the technology is the ease by which you can share workspaces: just right-click on the top-right-hand corner user icon and click “Share Workspace Snapshot”.
The link produced can be passed to anyone: they will then see the functioning IDE in their browser and can re-run the backtests of Mirnezami’s blog.
For example, my image contains candle data for both Bitfinex and Binance for Bitcoin/USD contracts and is set up to backtest on Binance - easily changed via the Jesse config.py
and routes.py
.
To see this working, click the “my image” link above, give it a few minutes to start, and in the then run
jesse backtest 2019-01-01 2020-01-01