• Stars
    star
    1,930
  • Rank 24,012 (Top 0.5 %)
  • Language
    Python
  • License
    GNU Affero Genera...
  • Created almost 4 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

ThetaGang is an IBKR bot for collecting money

Docker publish Python Publish Docker Pulls PyPI download month

💬 Join the Matrix chat, we can get money together.

Θ ThetaGang Θ

Beat the capitalists at their own game with ThetaGang 📈

Decay my sweet babies

ThetaGang is an IBKR trading bot for collecting premium by selling options using "The Wheel" strategy. The Wheel is a strategy that surfaced on Reddit, but has been used by many in the past. This bot implements a slightly modified version of The Wheel, with my own personal tweaks.

I've been streaming most of the work on this project on Twitch, so follow me over there.

How it works

Start by reading the Reddit post to get some background.

The strategy, as implemented here, does a few things differently from the one described in the post above. For one, it's intended to be used to augment a typical index-fund based portfolio with specific asset allocations. For example, you might want to use a 60/40 portfolio with SPY (S&P500 fund) and TLT (20 year treasury fund). This strategy reduces risk, but may also limit gains from big market swings. By reducing risk, one can increase leverage.

The main difference between ThetaGang and simply buying and holding index funds is that this script will attempt to harvest volatility by selling options, rather than buying shares directly. This works because implied volatility is typically higher than realized volatility on average. Instead of buying shares, you write puts. This has pros and cons, which are outside the scope of this README.

You could use this tool on individual stocks, but I personally don't recommend it because I am not smart enough to understand which stocks to buy. That's why I just buy index funds.

ThetaGang will try to acquire your desired allocation of each stock or ETF according to the weights you specify in the config. To acquire the positions, the script will write puts when conditions are met (config parameters, adequate buying power, acceptable contracts are available, enough shares needed, etc).

ThetaGang will continue to roll any open option positions indefinitely, with the only exception being ITM puts (although this is configurable). Once puts are in the money, they will be ignored until they expire and are exercised (after which you will own the underlying). When rolling puts, the strike of the new contracts are capped at the old strike plus the premium received (to prevent your account from blowing due to over-ratcheting up the buying power usage).

If puts are exercised due to being ITM at expiration, you will own the stock, and ThetaGang switches from writing puts to writing calls at a strike at least as high as the average cost of the stock held.

Please note: this strategy is based on the assumption that implied volatility is, on average, always higher than realized volatility. In cases where this is not true, this strategy will cause you to lose money.

In the case of deep ITM calls, the bot will prefer to roll the calls to next strike or expiration rather than allowing the underlying to get called away. If you don't have adequate buying power available in your account, it's possible that the options may get exercised instead of rolling forward and the process starts back at the beginning. Please keep in mind this may have tax implications, but that is outside the scope of this README.

In normal usage, you would run the script as a cronjob on a daily, weekly, or monthly basis according to your preferences. Running more frequently than daily is not recommended, but the choice is yours.

Paper account sample output

VIX call hedging

ThetaGang can optionally hedge your account by purchasing VIX calls for the next month based on specified parameters. The strategy is based on the Cboe VIX Tail Hedge Index, which you can read about on the internet. You can enable this feature in thetagang.toml with:

[vix_call_hedge]
enabled = true

Default values are provided, based on the VXTH index, but you may configure them to your taste (refer to thetagang.toml for details).

Buying VIX calls is not free, and it will create some drag on your portfolio, but in times of extreme volatility–such as the COVID-related 2020 market panic–VIX calls can provide outsized returns.

Project status

This project is, in its current state, considered to be complete. I'm open to contributions, but I am unlikely to accept PRs or feature requests that involve significant changes to the underlying algorithm.

If you find something that you think is a bug, or some other issue, please create a new issue.

"Show me your gains bro" – i.e., what are the returns?

As discussed elsewhere in this README, you must conduct your own research, and I suggest starting with resources such as CBOE's BXM and BXDM indices and comparing those to SPX. I've had a lot of people complain because "that strategy isn't better than buy and hold BRUH"–let me assure you, that is not my goal with this.

There are conflicting opinions about whether selling options is good or bad, more or less risky, yadda yadda, but generally, the risk profile for covered calls and naked puts is no worse than the worst case for simply holding an ETF or stock. I'd argue that selling a naked put is better than buying SPY with a limit order, because at least if SPY goes to zero you keep the premium from selling the option. The main downside is that returns are capped on the upside. Depending on your goals, this may not matter. If you're like me, then you'd rather have consistent returns and give up a little bit of potential upside.

Generally speaking, the point of selling options is not to exceed the returns of the underlying, but rather to reduce risk. Reducing risk is an important feature because it, in turn, allows one to increase risk in other ways (i.e., allocate a higher percentage to stocks or buy riskier assets).

Whether you use this or not is up to you. I have not one single fuck to give, whether you use it or not. I am not here to convince you to use it, I merely want to share knowledge and perhaps help create a little bit of wealth redistribution.

💫

Requirements

The bot is based on the ib_insync library, and uses IBC for managing the API gateway.

To use the bot, you'll need an Interactive Brokers account with a working installation of IBC. If you want to modify the bot, you'll need an installation of Python 3.8 or newer with the poetry package manager.

One more thing: to run this on a live account, you'll require enough capital to purchase at least 100 shares of the stocks or ETFs you choose. For example, if SPY is trading at $300/share you'd need $30,000 available. You can search for lower priced alternatives, but these tend to have low volume on options which may not be appropriate for this strategy. You should generally avoid low volume ETFs/stocks. If you don't have that kind of capital, you'll need to keep renting out your time to the capitalists until you can become a capitalist yourself. That's the way the pyramid scheme we call capitalism works.

Installation

Before running ThetaGang, you should set up an IBKR paper account to test the code.

pip install thetagang

It's recommended you familiarize yourself with IBC so you know how it works. You'll need to know how to configure the various knows and settings, and make sure things like API ports are configured correctly. If you don't want to mess around too much, consider running ThetaGang with Docker.

Usage

thetagang -h

Up and running with Docker

My preferred way for running ThetaGang is to use a cronjob to execute Docker commands. I've built a Docker image as part of this project, which you can use with your installation. There's a prebuilt Docker image here.

To run ThetaGang within Docker, you'll need to pass config.ini for IBC configuration and thetagang.toml for ThetaGang. There's a sample ibc-config.ini included in this repo for your convenience.

The easiest way to get the config files into the container is by mounting a volume.

To get started, grab a copy of thetagang.toml and config.ini:

mkdir ~/thetagang
cd ~/thetagang
curl -Lq https://raw.githubusercontent.com/brndnmtthws/thetagang/main/thetagang.toml -o ./thetagang.toml
curl -Lq https://raw.githubusercontent.com/brndnmtthws/thetagang/main/ibc-config.ini -o ./config.ini

Edit ~/thetagang/thetagang.toml to suit your needs. Pay particular attention to the symbols and weights. At a minimum, you must change the username, password, and account number. You may also want to change the trading move from paper to live when needed.

Now, to run ThetaGang with Docker:

docker run --rm -i --net host \
    -v ~/thetagang:/etc/thetagang \
    brndnmtthws/thetagang:main \
    --config /etc/thetagang/thetagang.toml

Lastly, to run ThetaGang as a daily cronjob Monday to Friday at 9am, add something like this to your crontab (on systems with a cron installation, use crontab -e to edit your crontab):

0 9 * * 1-5 docker run --rm -i -v ~/thetagang:/etc/thetagang brndnmtthws/thetagang:main --config /etc/thetagang/thetagang.toml

Determining which ETFs or stocks to run ThetaGang with

I leave this as an exercise to the reader, however I will provide a few recommendations and resources:

Recommendations

  • Stick with high volume ETFs or stocks
  • Careful with margin usage, you'll want to calculate the worst case scenario and provide plenty of cushion for yourself based on your portfolio

Resources

  • For discussions about selling options, check out r/thetagang
  • For backtesting portfolios, you can use this tool and this tool to get an idea of drawdown and typical volatility

Development

Check out the code to your local machine and install the Python dependencies:

poetry install
poetry run autohooks activate
poetry run thetagang -h

You are now ready to make a splash! 🐳

FAQ

Error Cause Resolution
Requested market data is not subscribed. Requisite market data subscriptions have not been set up on IBKR. Configure your market data subscriptions. The default config that ships with this script uses the Cboe One Add-On Bundle and the US Equity and Options Add-On Streaming Bundle. Note: You must fund your account before IBKR will send data for subscriptions. Without funding you can still subscribe but you will get an error from ibc.
No market data during competing live session Your account is logged in somewhere else, such as the IBKR web portal, the desktop app, or even another instance of this script. Log out of all sessions and then re-run the script.
ib_insync.wrapper ERROR Error 200, reqId 10: The contract description specified for SYMBOL is ambiguous. IBKR needs to know which exchange is the primary exchange for a given symbol. You need to specify the primary exchange for the stock. This is normal for companies, typically. For ETFs it usually isn't required. Specify the primary_exchange parameter for the symbol, i.e., primary_exchange = "NYSE".

Support and sponsorship

If you get some value out of this, please consider sponsoring me to continue maintaining this project well into the future. Like everyone else in the world, I'm just trying to survive.

If you like what you see but want something different, I am willing to work on bespoke or custom trading bots for a fee. Reach out to me directly through my GitHub profile.

Stargazers over time

Stargazers over time

More Repositories

1

conky

Light-weight system monitor for X, Wayland (sort of), and other things, too
C++
7,128
star
2

cracking-the-coding-interview-rust

Cracking the Coding Interview problem solutions in Rust
Rust
394
star
3

optimal-buy-cbpro

Scheduled buying of BTC, ETH, and LTC from Coinbase Pro, optimally!
Python
334
star
4

facebook-hive-udfs

Facebook's Hive UDFs
Java
270
star
5

dryoc

Don't Roll Your Own Crypto: pure-Rust, hard to misuse cryptography library
Rust
266
star
6

tweet-delete

Self-destructing Tweets so you too can be cool 😎
Python
94
star
7

code-like-a-pro-in-rust-book

Source code for Code Like a Pro in Rust
HTML
93
star
8

idiomatic-rust-book

Source code for Idiomatic Rust: Code like a Rustacean
Rust
78
star
9

rust-react-typescript-demo

Demo for Rust, React, Typescript, Docker, Terraform and Kubernetes
CSS
68
star
10

nginx-echo-headers

Have nginx return request headers to the client
Dockerfile
61
star
11

vault-dcos

Vault on DCOS
Shell
45
star
12

hodlermanifesto

The HODLer Manifesto
SCSS
38
star
13

labhub

GitHub bot for using GitLab CI in OSS projects
Rust
32
star
14

seed-otp

One-time pad tool for Bitcoin seed mnemonic cold storage
Python
21
star
15

metrics-cassandra

Dropwizard Metrics Cassandra reporter
Java
17
star
16

mother-of-dragons

🐲 DragonMint/Innosilicon miner management tool 🐉
Python
17
star
17

marathon-lb-autoscale

Autoscale your apps on Marathon
Ruby
14
star
18

kafka-on-marathon

Scripts for running Apache Kafka on Mesosphere's Marathon
HTML
14
star
19

citrine

Elixir library for running cron-based scheduled jobs on your Erlang cluster
Elixir
14
star
20

genserver

Elixir inspired async actor library for Rust
Rust
13
star
21

omploader

Enterprise quality file hosting web application.
Ruby
12
star
22

cgminer-rest

RESTful HTTP API wrapper for cgminer
Rust
9
star
23

hdfs

HA HDFS on Apache Mesos ~~~ aka 'Super Available' HDFS
Java
9
star
24

mlb-nginx-http2

Demo of marathon-lb with nginx and HTTP/2
Nginx
9
star
25

protect-yourself

A guide on how to protect your digital assets
HTML
9
star
26

dragon-rest

🐲 Python wrapper for DragonMint/Innosilicon REST API 🐉
Python
8
star
27

rust-action

All-in-one GitHub action for Rust projects
Rust
8
star
28

startup-ideas

Some startup ideas I'm considering
7
star
29

supertrees

Experimental Erlang/OTP-inspired supervision trees for Rust
Rust
6
star
30

resume

My Resume
TeX
6
star
31

brndn-io

It is my website
CSS
6
star
32

rust-action-cargo-binstall

GitHub action for installing Cargo packages
TypeScript
4
star
33

elasticsearch-router

An nginx based router for Elasticsearch on DCOS
Nginx
3
star
34

rust-action-rustup

GitHub action for installing rustup
TypeScript
3
star
35

grafana-dcos

Grafana on DCOS backed by Elasticsearch
3
star
36

cassandra-on-marathon

Scripts for running Apache Cassandra on Mesosphere's Marathon
Ruby
3
star
37

nginx-echo-sleep

Nginx
2
star
38

box-with-nonce

Rust
2
star
39

doge-streamer

Stream Doge
C++
2
star
40

nginx-redirect-to-https

Redirect all HTTP traffic to HTTPS (for use with Marathon & Marathon-lb)
Nginx
1
star
41

doge-stream-helper

Helper app for the Doge stream
HTML
1
star
42

dnstest

DNS client test tools
C
1
star
43

gitlab-gce-autoscaler

Simple GCE autoscaler for GitLab CI pipelines
Python
1
star
44

gwyh

Library for building gossip-based services in Rust
Rust
1
star