gmocoin-backtest
gmocoin-backtest is a python library for backtest with gmocoin fx btc trade technical analysis on Python 3.7 and above.
backtest data from here
Installation
$ pip install gmocoin-backtest
Usage
basic run
from gmocoin_backtest import Backtest
class MyBacktest(Backtest):
def strategy(self):
fast_ma = self.sma(period=5)
slow_ma = self.sma(period=25)
# golden cross
self.sell_exit = self.buy_entry = (fast_ma > slow_ma) & (
fast_ma.shift() <= slow_ma.shift()
)
# dead cross
self.buy_exit = self.sell_entry = (fast_ma < slow_ma) & (
fast_ma.shift() >= slow_ma.shift()
)
MyBacktest(from_date="2021-07-15", to_date="2021-08-15").run()
advanced run
from gmocoin_backtest import Backtest
from pprint import pprint
class MyBacktest(Backtest):
def strategy(self):
rsi = self.rsi(period=10)
ema = self.ema(period=20)
atr = self.atr(period=20)
lower = ema - atr
upper = ema + atr
self.buy_entry = (rsi < 30) & (self.df.C < lower)
self.sell_entry = (rsi > 70) & (self.df.C > upper)
self.sell_exit = ema > self.df.C
self.buy_exit = ema < self.df.C
bt = MyBacktest(
symbol="BTC", # (default=BTC_JPY)
sqlite_file_name="backtest.sqlite3", # (default=backtest.sqlite3)
from_date="2021-07-15", # (default="")
to_date="2021-08-15", # (default="")
size=0.1, # (default=0.001)
interval="1H", # 5-60S(second), 1-60T(minute), 1-24H(hour) (default=1T)
data_dir="data", # data directory (default=data)
)
pprint(bt.run(), sort_dicts=False)
{'total profit': -76320.2,
'total trades': 25,
'win rate': 56.0,
'profit factor': 0.549,
'maximum drawdown': 105907.1,
'recovery factor': -0.721,
'riskreward ratio': 0.431,
'sharpe ratio': -0.226,
'average return': -0.075,
'stop loss': 0,
'take profit': 0}
Supported indicators
- Simple Moving Average 'sma'
- Exponential Moving Average 'ema'
- Moving Average Convergence Divergence 'macd'
- Relative Strenght Index 'rsi'
- Bollinger Bands 'bbands'
- Stochastic Oscillator 'stoch'
- Average True Range 'atr'
Strategy examples
MACD
class MyBacktest(Backtest):
def strategy(self):
macd, signal = self.macd(fast_period=12, slow_period=26, signal_period=9)
self.sell_exit = self.buy_entry = (macd > signal) & (
macd.shift() <= signal.shift()
)
self.buy_exit = self.sell_entry = (macd < signal) & (
macd.shift() >= signal.shift()
)
Bollinger Bands
class MyBacktest(Backtest):
def strategy(self):
upper, mid, lower = self.bbands(period=20, band=2)
self.sell_exit = self.buy_entry = (upper > self.df.C) & (
upper.shift() <= self.df.C.shift()
)
self.buy_exit = self.sell_entry = (lower < self.df.C) & (
lower.shift() >= self.df.C.shift()
)
Stochastic
class MyBacktest(Backtest):
def strategy(self):
k, d = self.stoch(k_period=5, d_period=3)
self.sell_exit = self.buy_entry = (
(k > 20) & (d > 20) & (k.shift() <= 20) & (d.shift() <= 20)
)
self.buy_exit = self.sell_entry = (
(k < 80) & (d < 80) & (k.shift() >= 80) & (d.shift() >= 80)
)
Moving average divergence rate
class MyBacktest(Backtest):
def strategy(self):
sma = self.sma(period=20)
ratio = (self.df.C - sma) / sma * 100
self.sell_exit = self.buy_entry = ratio > -5 & (ratio.shift() <= -5)
self.buy_exit = self.sell_entry = ratio < 5 & (ratio.shift() >= 5)
Momentum
class MyBacktest(Backtest):
def strategy(self):
mom = self.df.C - self.df.C.shift(10)
self.sell_exit = self.buy_entry = mom > 0 & (mom.shift() <= 0)
self.buy_exit = self.sell_entry = mom < 0 & (mom.shift() >= 0)
Donchian Channels
class MyBacktest(Backtest):
def strategy(self):
high = self.df.H.rolling(20).max()
low = self.df.L.rolling(20).min()
self.sell_exit = self.buy_entry = (high > self.df.C) & (
high.shift() <= self.df.C
)
self.buy_exit = self.sell_entry = (low < self.df.C) & (
low.shift() >= self.df.C
)
Relative Vigor Index
class MyBacktest(Backtest):
def rvi(
self, *, period: int = 10, price: str = "C"
) -> Tuple[pd.DataFrame, pd.DataFrame]:
co = self.df.C - self.df.O
n = (co + 2 * co.shift(1) + 2 * co.shift(2) + co.shift(3)) / 6
hl = self.df.H - self.df.L
d = (hl + 2 * hl.shift(1) + 2 * hl.shift(2) + hl.shift(3)) / 6
rvi = n.rolling(period).mean() / d.rolling(period).mean()
signal = (rvi + 2 * rvi.shift(1) + 2 * rvi.shift(2) + rvi.shift(3)) / 6
return rvi, signal
def strategy(self):
rvi, signal = self.rvi(period=5)
self.sell_exit = self.buy_entry = (rvi > signal) & (
rvi.shift() <= signal.shift()
)
self.buy_exit = self.sell_entry = (rvi < signal) & (
rvi.shift() >= signal.shift()
)
Metadata
Release files for gmocoin-backtest 0.1.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| gmocoin-backtest-0.1.2.tar.gz | 9.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| gmocoin_backtest-0.1.2-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 17.4 kB
Release files / gmocoin-backtest-0.1.2.tar.gz
| Download URL | gmocoin-backtest-0.1.2.tar.gz |
|---|---|
| Size | 9.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
a5329d0fd305033621f51f43e8849b81880c7c2ebc5a022715dd4e2e6a58d999
|
|
BLAKE2b-256 checksum How to use checksums |
e22c904835417f4cbdea745be13a160893f6a336b815e533ef633b5d4fcd2d57
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6
|
Release files / gmocoin_backtest-0.1.2-py3-none-any.whl
| Download URL | gmocoin_backtest-0.1.2-py3-none-any.whl |
|---|---|
| Size | 8.2 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
8fe35fab424a00376d95f33ce6f62358d32675aaaf667aff5e237cd2241d09ab
|
|
BLAKE2b-256 checksum How to use checksums |
cb62ef41f528c3070a2a64076b5219f15ed6d02fdf655ab6a2f75268167ed8d5
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/3.4.2 importlib_metadata/4.6.4 pkginfo/1.7.1 requests/2.26.0 requests-toolbelt/0.9.1 tqdm/4.62.0 CPython/3.9.6
|