{"id":24496854,"url":"https://github.com/10mohi6/gmocoin-backtest-python","last_synced_at":"2025-04-14T04:14:21.277Z","repository":{"id":57435082,"uuid":"396019373","full_name":"10mohi6/gmocoin-backtest-python","owner":"10mohi6","description":"gmocoin-backtest is a python library for backtest with gmocoin fx btc trade technical analysis on Python 3.7 and above.","archived":false,"fork":false,"pushed_at":"2021-08-14T15:41:20.000Z","size":80,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-14T04:14:15.581Z","etag":null,"topics":["backtest","btc","fx","gmocoin","python","strategy","technical-analysis"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/10mohi6.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-08-14T13:36:09.000Z","updated_at":"2023-04-22T08:24:42.000Z","dependencies_parsed_at":"2022-09-04T15:32:55.200Z","dependency_job_id":null,"html_url":"https://github.com/10mohi6/gmocoin-backtest-python","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/10mohi6%2Fgmocoin-backtest-python","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/10mohi6%2Fgmocoin-backtest-python/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/10mohi6%2Fgmocoin-backtest-python/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/10mohi6%2Fgmocoin-backtest-python/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/10mohi6","download_url":"https://codeload.github.com/10mohi6/gmocoin-backtest-python/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248819408,"owners_count":21166477,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backtest","btc","fx","gmocoin","python","strategy","technical-analysis"],"created_at":"2025-01-21T21:19:07.211Z","updated_at":"2025-04-14T04:14:21.249Z","avatar_url":"https://github.com/10mohi6.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# gmocoin-backtest\n\n[![PyPI](https://img.shields.io/pypi/v/gmocoin-backtest)](https://pypi.org/project/gmocoin-backtest/)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n[![codecov](https://codecov.io/gh/10mohi6/gmocoin-backtest-python/branch/main/graph/badge.svg?token=5U127JNHX9)](https://codecov.io/gh/10mohi6/gmocoin-backtest-python)\n[![Build Status](https://travis-ci.com/10mohi6/gmocoin-backtest-python.svg?branch=main)](https://travis-ci.com/10mohi6/gmocoin-backtest-python)\n[![PyPI - Python Version](https://img.shields.io/pypi/pyversions/gmocoin-backtest)](https://pypi.org/project/gmocoin-backtest/)\n[![Downloads](https://pepy.tech/badge/gmocoin-backtest)](https://pepy.tech/project/gmocoin-backtest)\n\ngmocoin-backtest is a python library for backtest with gmocoin fx btc trade technical analysis on Python 3.7 and above.\n\nbacktest data from [here](https://api.coin.z.com/data/trades/)\n\n## Installation\n\n    $ pip install gmocoin-backtest\n\n## Usage\n\n### basic run\n```python\nfrom gmocoin_backtest import Backtest\n\nclass MyBacktest(Backtest):\n    def strategy(self):\n        fast_ma = self.sma(period=5)\n        slow_ma = self.sma(period=25)\n        # golden cross\n        self.sell_exit = self.buy_entry = (fast_ma \u003e slow_ma) \u0026 (\n            fast_ma.shift() \u003c= slow_ma.shift()\n        )\n        # dead cross\n        self.buy_exit = self.sell_entry = (fast_ma \u003c slow_ma) \u0026 (\n            fast_ma.shift() \u003e= slow_ma.shift()\n        )\n\nMyBacktest(from_date=\"2021-07-15\", to_date=\"2021-08-15\").run()\n```\n![basic.png](https://raw.githubusercontent.com/10mohi6/gmocoin-backtest-python/main/tests/basic.png)\n\n### advanced run\n```python\nfrom gmocoin_backtest import Backtest\nfrom pprint import pprint\n\nclass MyBacktest(Backtest):\n    def strategy(self):\n        rsi = self.rsi(period=10)\n        ema = self.ema(period=20)\n        atr = self.atr(period=20)\n        lower = ema - atr\n        upper = ema + atr\n        self.buy_entry = (rsi \u003c 30) \u0026 (self.df.C \u003c lower)\n        self.sell_entry = (rsi \u003e 70) \u0026 (self.df.C \u003e upper)\n        self.sell_exit = ema \u003e self.df.C\n        self.buy_exit = ema \u003c self.df.C\n\nbt = MyBacktest(\n    symbol=\"BTC\", # (default=BTC_JPY)\n    sqlite_file_name=\"backtest.sqlite3\", # (default=backtest.sqlite3)\n    from_date=\"2021-07-15\", # (default=\"\")\n    to_date=\"2021-08-15\", # (default=\"\")\n    size=0.1, # (default=0.001)\n    interval=\"1H\", # 5-60S(second), 1-60T(minute), 1-24H(hour) (default=1T)\n    data_dir=\"data\", # data directory (default=data)\n)\npprint(bt.run(), sort_dicts=False)\n```\n```python\n{'total profit': -76320.2,\n 'total trades': 25,\n 'win rate': 56.0,\n 'profit factor': 0.549,\n 'maximum drawdown': 105907.1,\n 'recovery factor': -0.721,\n 'riskreward ratio': 0.431,\n 'sharpe ratio': -0.226,\n 'average return': -0.075,\n 'stop loss': 0,\n 'take profit': 0}\n```\n![advanced.png](https://raw.githubusercontent.com/10mohi6/gmocoin-backtest-python/main/tests/advanced.png)\n\n\n## Supported indicators\n- Simple Moving Average 'sma'\n- Exponential Moving Average 'ema'\n- Moving Average Convergence Divergence 'macd'\n- Relative Strenght Index 'rsi'\n- Bollinger Bands 'bbands'\n- Stochastic Oscillator 'stoch'\n- Average True Range 'atr'\n\n## Strategy examples\n### MACD\n```python\nclass MyBacktest(Backtest):\n    def strategy(self):\n        macd, signal = self.macd(fast_period=12, slow_period=26, signal_period=9)\n        self.sell_exit = self.buy_entry = (macd \u003e signal) \u0026 (\n            macd.shift() \u003c= signal.shift()\n        )\n        self.buy_exit = self.sell_entry = (macd \u003c signal) \u0026 (\n            macd.shift() \u003e= signal.shift()\n        )\n```\n### Bollinger Bands\n```python\nclass MyBacktest(Backtest):\n    def strategy(self):\n        upper, mid, lower = self.bbands(period=20, band=2)\n        self.sell_exit = self.buy_entry = (upper \u003e self.df.C) \u0026 (\n            upper.shift() \u003c= self.df.C.shift()\n        )\n        self.buy_exit = self.sell_entry = (lower \u003c self.df.C) \u0026 (\n            lower.shift() \u003e= self.df.C.shift()\n        )\n```\n### Stochastic\n```python\nclass MyBacktest(Backtest):\n    def strategy(self):\n        k, d = self.stoch(k_period=5, d_period=3)\n        self.sell_exit = self.buy_entry = (\n            (k \u003e 20) \u0026 (d \u003e 20) \u0026 (k.shift() \u003c= 20) \u0026 (d.shift() \u003c= 20)\n        )\n        self.buy_exit = self.sell_entry = (\n            (k \u003c 80) \u0026 (d \u003c 80) \u0026 (k.shift() \u003e= 80) \u0026 (d.shift() \u003e= 80)\n        )\n```\n### Moving average divergence rate\n```python\nclass MyBacktest(Backtest):\n    def strategy(self):\n        sma = self.sma(period=20)\n        ratio = (self.df.C - sma) / sma * 100\n        self.sell_exit = self.buy_entry = ratio \u003e -5 \u0026 (ratio.shift() \u003c= -5)\n        self.buy_exit = self.sell_entry = ratio \u003c 5 \u0026 (ratio.shift() \u003e= 5)\n```\n### Momentum\n```python\nclass MyBacktest(Backtest):\n    def strategy(self):\n        mom = self.df.C - self.df.C.shift(10)\n        self.sell_exit = self.buy_entry = mom \u003e 0 \u0026 (mom.shift() \u003c= 0)\n        self.buy_exit = self.sell_entry = mom \u003c 0 \u0026 (mom.shift() \u003e= 0)\n```\n### Donchian Channels\n```python\nclass MyBacktest(Backtest):\n    def strategy(self):\n        high = self.df.H.rolling(20).max()\n        low = self.df.L.rolling(20).min()\n        self.sell_exit = self.buy_entry = (high \u003e self.df.C) \u0026 (\n            high.shift() \u003c= self.df.C\n        )\n        self.buy_exit = self.sell_entry = (low \u003c self.df.C) \u0026 (\n            low.shift() \u003e= self.df.C\n        )\n```\n### Relative Vigor Index\n```python\nclass MyBacktest(Backtest):\n    def rvi(\n        self, *, period: int = 10, price: str = \"C\"\n    ) -\u003e Tuple[pd.DataFrame, pd.DataFrame]:\n        co = self.df.C - self.df.O\n        n = (co + 2 * co.shift(1) + 2 * co.shift(2) + co.shift(3)) / 6\n        hl = self.df.H - self.df.L\n        d = (hl + 2 * hl.shift(1) + 2 * hl.shift(2) + hl.shift(3)) / 6\n        rvi = n.rolling(period).mean() / d.rolling(period).mean()\n        signal = (rvi + 2 * rvi.shift(1) + 2 * rvi.shift(2) + rvi.shift(3)) / 6\n        return rvi, signal\n\n    def strategy(self):\n        rvi, signal = self.rvi(period=5)\n        self.sell_exit = self.buy_entry = (rvi \u003e signal) \u0026 (\n            rvi.shift() \u003c= signal.shift()\n        )\n        self.buy_exit = self.sell_entry = (rvi \u003c signal) \u0026 (\n            rvi.shift() \u003e= signal.shift()\n        )\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F10mohi6%2Fgmocoin-backtest-python","html_url":"https://awesome.ecosyste.ms/projects/github.com%2F10mohi6%2Fgmocoin-backtest-python","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2F10mohi6%2Fgmocoin-backtest-python/lists"}