Created
November 7, 2021 23:06
-
-
Save gaugau3000/c3d9a50f79d6f6fca995c7fdb602e4fd to your computer and use it in GitHub Desktop.
Trix Complete backtest.ipynb
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{ | |
"nbformat": 4, | |
"nbformat_minor": 0, | |
"metadata": { | |
"colab": { | |
"name": "Trix Complete backtest.ipynb", | |
"provenance": [], | |
"collapsed_sections": [], | |
"include_colab_link": true | |
}, | |
"kernelspec": { | |
"name": "python3", | |
"display_name": "Python 3" | |
}, | |
"language_info": { | |
"name": "python" | |
} | |
}, | |
"cells": [ | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "view-in-github", | |
"colab_type": "text" | |
}, | |
"source": [ | |
"<a href=\"https://colab.research.google.com/gist/gaugau3000/c3d9a50f79d6f6fca995c7fdb602e4fd/trix-complete-backtest.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "Yfi2qr-OmHJb", | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"outputId": "dd6d7018-61ca-4212-a334-dfae7a7f4cf9" | |
}, | |
"source": [ | |
"pip install python-binance" | |
], | |
"execution_count": 2, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Collecting python-binance\n", | |
" Downloading python_binance-1.0.15-py2.py3-none-any.whl (63 kB)\n", | |
"\u001b[?25l\r\u001b[K |█████▏ | 10 kB 23.7 MB/s eta 0:00:01\r\u001b[K |██████████▎ | 20 kB 29.2 MB/s eta 0:00:01\r\u001b[K |███████████████▍ | 30 kB 12.1 MB/s eta 0:00:01\r\u001b[K |████████████████████▌ | 40 kB 9.3 MB/s eta 0:00:01\r\u001b[K |█████████████████████████▋ | 51 kB 5.2 MB/s eta 0:00:01\r\u001b[K |██████████████████████████████▊ | 61 kB 5.7 MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 63 kB 1.6 MB/s \n", | |
"\u001b[?25hRequirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from python-binance) (2.23.0)\n", | |
"Collecting websockets==9.1\n", | |
" Downloading websockets-9.1-cp37-cp37m-manylinux2010_x86_64.whl (103 kB)\n", | |
"\u001b[K |████████████████████████████████| 103 kB 37.7 MB/s \n", | |
"\u001b[?25hCollecting ujson\n", | |
" Downloading ujson-4.2.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (214 kB)\n", | |
"\u001b[K |████████████████████████████████| 214 kB 50.5 MB/s \n", | |
"\u001b[?25hCollecting aiohttp\n", | |
" Downloading aiohttp-3.8.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (1.1 MB)\n", | |
"\u001b[K |████████████████████████████████| 1.1 MB 48.8 MB/s \n", | |
"\u001b[?25hRequirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from python-binance) (1.15.0)\n", | |
"Collecting dateparser\n", | |
" Downloading dateparser-1.1.0-py2.py3-none-any.whl (288 kB)\n", | |
"\u001b[K |████████████████████████████████| 288 kB 31.4 MB/s \n", | |
"\u001b[?25hRequirement already satisfied: typing-extensions>=3.7.4 in /usr/local/lib/python3.7/dist-packages (from aiohttp->python-binance) (3.7.4.3)\n", | |
"Requirement already satisfied: charset-normalizer<3.0,>=2.0 in /usr/local/lib/python3.7/dist-packages (from aiohttp->python-binance) (2.0.7)\n", | |
"Requirement already satisfied: attrs>=17.3.0 in /usr/local/lib/python3.7/dist-packages (from aiohttp->python-binance) (21.2.0)\n", | |
"Collecting async-timeout<5.0,>=4.0.0a3\n", | |
" Downloading async_timeout-4.0.0-py3-none-any.whl (6.1 kB)\n", | |
"Collecting yarl<2.0,>=1.0\n", | |
" Downloading yarl-1.7.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (271 kB)\n", | |
"\u001b[K |████████████████████████████████| 271 kB 57.2 MB/s \n", | |
"\u001b[?25hCollecting aiosignal>=1.1.2\n", | |
" Downloading aiosignal-1.2.0-py3-none-any.whl (8.2 kB)\n", | |
"Collecting asynctest==0.13.0\n", | |
" Downloading asynctest-0.13.0-py3-none-any.whl (26 kB)\n", | |
"Collecting multidict<7.0,>=4.5\n", | |
" Downloading multidict-5.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (160 kB)\n", | |
"\u001b[K |████████████████████████████████| 160 kB 56.1 MB/s \n", | |
"\u001b[?25hCollecting frozenlist>=1.1.1\n", | |
" Downloading frozenlist-1.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (192 kB)\n", | |
"\u001b[K |████████████████████████████████| 192 kB 57.9 MB/s \n", | |
"\u001b[?25hRequirement already satisfied: idna>=2.0 in /usr/local/lib/python3.7/dist-packages (from yarl<2.0,>=1.0->aiohttp->python-binance) (2.10)\n", | |
"Requirement already satisfied: tzlocal in /usr/local/lib/python3.7/dist-packages (from dateparser->python-binance) (1.5.1)\n", | |
"Requirement already satisfied: pytz in /usr/local/lib/python3.7/dist-packages (from dateparser->python-binance) (2018.9)\n", | |
"Requirement already satisfied: python-dateutil in /usr/local/lib/python3.7/dist-packages (from dateparser->python-binance) (2.8.2)\n", | |
"Requirement already satisfied: regex!=2019.02.19,!=2021.8.27 in /usr/local/lib/python3.7/dist-packages (from dateparser->python-binance) (2019.12.20)\n", | |
"Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->python-binance) (3.0.4)\n", | |
"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->python-binance) (2021.5.30)\n", | |
"Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->python-binance) (1.24.3)\n", | |
"Installing collected packages: multidict, frozenlist, yarl, asynctest, async-timeout, aiosignal, websockets, ujson, dateparser, aiohttp, python-binance\n", | |
"Successfully installed aiohttp-3.8.0 aiosignal-1.2.0 async-timeout-4.0.0 asynctest-0.13.0 dateparser-1.1.0 frozenlist-1.2.0 multidict-5.2.0 python-binance-1.0.15 ujson-4.2.0 websockets-9.1 yarl-1.7.2\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "GSVP99iMmTt4", | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"outputId": "e62554e8-3e1f-4d28-c7f1-ceb73bf3d076" | |
}, | |
"source": [ | |
"pip install ta" | |
], | |
"execution_count": 3, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Collecting ta\n", | |
" Downloading ta-0.7.0.tar.gz (25 kB)\n", | |
"Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (from ta) (1.19.5)\n", | |
"Requirement already satisfied: pandas in /usr/local/lib/python3.7/dist-packages (from ta) (1.1.5)\n", | |
"Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.7/dist-packages (from pandas->ta) (2018.9)\n", | |
"Requirement already satisfied: python-dateutil>=2.7.3 in /usr/local/lib/python3.7/dist-packages (from pandas->ta) (2.8.2)\n", | |
"Requirement already satisfied: six>=1.5 in /usr/local/lib/python3.7/dist-packages (from python-dateutil>=2.7.3->pandas->ta) (1.15.0)\n", | |
"Building wheels for collected packages: ta\n", | |
" Building wheel for ta (setup.py) ... \u001b[?25l\u001b[?25hdone\n", | |
" Created wheel for ta: filename=ta-0.7.0-py3-none-any.whl size=28718 sha256=dcee52f7762efae4c870f6cf7df9514bd2ab782296c6ed30cc31060e7532162a\n", | |
" Stored in directory: /root/.cache/pip/wheels/5e/74/e0/72395003bd1d3c8f3f5860c2d180ff15699e47a2733d8ebd38\n", | |
"Successfully built ta\n", | |
"Installing collected packages: ta\n", | |
"Successfully installed ta-0.7.0\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "XwM1VV4d2V-R" | |
}, | |
"source": [ | |
"<h1>Load yours data</h1>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "1F0pok5BmY3X", | |
"outputId": "ec14270b-1384-48ca-c319-ebb3587a6729" | |
}, | |
"source": [ | |
"# -- Import --\n", | |
"import pandas as pd\n", | |
"from binance.client import Client\n", | |
"import ta\n", | |
"import matplotlib.pyplot as plt\n", | |
"import numpy as np\n", | |
"\n", | |
"# -- Define Binance Client --\n", | |
"client = Client()\n", | |
"\n", | |
"# -- You can change the crypto pair ,the start date and the time interval below --\n", | |
"pairName = \"ETHUSDT\"\n", | |
"startDate = \"1 Dec, 2017\"\n", | |
"timeInterval = Client.KLINE_INTERVAL_1HOUR\n", | |
"\n", | |
"# -- Load all price data from binance API --\n", | |
"klinesT = client.get_historical_klines(pairName, timeInterval, startDate)\n", | |
"\n", | |
"# -- Define your dataset --\n", | |
"df = pd.DataFrame(klinesT, columns = ['timestamp', 'open', 'high', 'low', 'close', 'volume', 'close_time', 'quote_av', 'trades', 'tb_base_av', 'tb_quote_av', 'ignore' ])\n", | |
"df['close'] = pd.to_numeric(df['close'])\n", | |
"df['high'] = pd.to_numeric(df['high'])\n", | |
"df['low'] = pd.to_numeric(df['low'])\n", | |
"df['open'] = pd.to_numeric(df['open'])\n", | |
"\n", | |
"# -- Set the date to index --\n", | |
"df = df.set_index(df['timestamp'])\n", | |
"df.index = pd.to_datetime(df.index, unit='ms')\n", | |
"del df['timestamp']\n", | |
"\n", | |
"print(\"Data loaded 100%\")\n", | |
"\n", | |
"# -- Uncomment the line below if you want to check your price dataset --\n", | |
"# df" | |
], | |
"execution_count": 4, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Data loaded 100%\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 237 | |
}, | |
"id": "3lGLpoxEpBI8", | |
"outputId": "66cb719c-8938-4f7b-e20d-576719579a68" | |
}, | |
"source": [ | |
"df.head()" | |
], | |
"execution_count": 5, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>open</th>\n", | |
" <th>high</th>\n", | |
" <th>low</th>\n", | |
" <th>close</th>\n", | |
" <th>volume</th>\n", | |
" <th>close_time</th>\n", | |
" <th>quote_av</th>\n", | |
" <th>trades</th>\n", | |
" <th>tb_base_av</th>\n", | |
" <th>tb_quote_av</th>\n", | |
" <th>ignore</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>timestamp</th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>2017-12-01 00:00:00</th>\n", | |
" <td>428.05</td>\n", | |
" <td>432.11</td>\n", | |
" <td>418.33</td>\n", | |
" <td>421.42</td>\n", | |
" <td>1325.87305000</td>\n", | |
" <td>1512089999999</td>\n", | |
" <td>566021.60286040</td>\n", | |
" <td>956</td>\n", | |
" <td>733.33227000</td>\n", | |
" <td>313694.29790640</td>\n", | |
" <td>271300.32546398</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2017-12-01 01:00:00</th>\n", | |
" <td>421.38</td>\n", | |
" <td>423.99</td>\n", | |
" <td>416.39</td>\n", | |
" <td>421.72</td>\n", | |
" <td>1532.11545000</td>\n", | |
" <td>1512093599999</td>\n", | |
" <td>644084.83411590</td>\n", | |
" <td>1037</td>\n", | |
" <td>920.31892000</td>\n", | |
" <td>387238.82227090</td>\n", | |
" <td>271394.84389969</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2017-12-01 02:00:00</th>\n", | |
" <td>422.56</td>\n", | |
" <td>427.81</td>\n", | |
" <td>417.12</td>\n", | |
" <td>426.12</td>\n", | |
" <td>1971.42264000</td>\n", | |
" <td>1512097199999</td>\n", | |
" <td>830464.91755110</td>\n", | |
" <td>925</td>\n", | |
" <td>1392.22932000</td>\n", | |
" <td>586507.32976610</td>\n", | |
" <td>271368.11447690</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2017-12-01 03:00:00</th>\n", | |
" <td>426.55</td>\n", | |
" <td>427.67</td>\n", | |
" <td>420.75</td>\n", | |
" <td>426.01</td>\n", | |
" <td>1125.83309000</td>\n", | |
" <td>1512100799999</td>\n", | |
" <td>478267.85257870</td>\n", | |
" <td>625</td>\n", | |
" <td>756.63943000</td>\n", | |
" <td>321653.32695550</td>\n", | |
" <td>271075.24993718</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2017-12-01 04:00:00</th>\n", | |
" <td>427.27</td>\n", | |
" <td>432.93</td>\n", | |
" <td>423.75</td>\n", | |
" <td>430.90</td>\n", | |
" <td>966.11991000</td>\n", | |
" <td>1512104399999</td>\n", | |
" <td>414951.04946780</td>\n", | |
" <td>697</td>\n", | |
" <td>511.99989000</td>\n", | |
" <td>219957.97339610</td>\n", | |
" <td>271065.95719873</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" open high ... tb_quote_av ignore\n", | |
"timestamp ... \n", | |
"2017-12-01 00:00:00 428.05 432.11 ... 313694.29790640 271300.32546398\n", | |
"2017-12-01 01:00:00 421.38 423.99 ... 387238.82227090 271394.84389969\n", | |
"2017-12-01 02:00:00 422.56 427.81 ... 586507.32976610 271368.11447690\n", | |
"2017-12-01 03:00:00 426.55 427.67 ... 321653.32695550 271075.24993718\n", | |
"2017-12-01 04:00:00 427.27 432.93 ... 219957.97339610 271065.95719873\n", | |
"\n", | |
"[5 rows x 11 columns]" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 5 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "-1iFHBre2Suk" | |
}, | |
"source": [ | |
"<h1>Define your indicators</h1>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 464 | |
}, | |
"id": "VznGtRXG_g_s", | |
"outputId": "95e1fae3-97b9-4b48-f40f-198811bb66ac" | |
}, | |
"source": [ | |
"# -- Drop all columns we do not need --\n", | |
"df.drop(df.columns.difference(['open','high','low','close','volume']), 1, inplace=True)\n", | |
"\n", | |
"# -- Indicators, you can edit every value --\n", | |
"df['EMA200'] = ta.trend.ema_indicator(close=df['close'], window=200)\n", | |
"# -- Trix Indicator --\n", | |
"trixLength = 9\n", | |
"trixSignal = 21\n", | |
"df['TRIX'] = ta.trend.ema_indicator(ta.trend.ema_indicator(ta.trend.ema_indicator(close=df['close'], window=trixLength), window=trixLength), window=trixLength)\n", | |
"df['TRIX_PCT'] = df[\"TRIX\"].pct_change()*100\n", | |
"df['TRIX_SIGNAL'] = ta.trend.sma_indicator(df['TRIX_PCT'],trixSignal)\n", | |
"df['TRIX_HISTO'] = df['TRIX_PCT'] - df['TRIX_SIGNAL']\n", | |
"\n", | |
"# -- Stochasitc RSI --\n", | |
"df['STOCH_RSI'] = ta.momentum.stochrsi(close=df['close'], window=14, smooth1=3, smooth2=3)\n", | |
"\n", | |
"print(\"Indicators loaded 100%\")\n", | |
"\n", | |
"# -- Uncomment the line below if you want to check your dataset with indicators --\n", | |
"df" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Indicators loaded 100%\n" | |
] | |
}, | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>open</th>\n", | |
" <th>high</th>\n", | |
" <th>low</th>\n", | |
" <th>close</th>\n", | |
" <th>volume</th>\n", | |
" <th>EMA200</th>\n", | |
" <th>TRIX</th>\n", | |
" <th>TRIX_PCT</th>\n", | |
" <th>TRIX_SIGNAL</th>\n", | |
" <th>TRIX_HISTO</th>\n", | |
" <th>STOCH_RSI</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>timestamp</th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>2017-08-17 04:00:00</th>\n", | |
" <td>301.13</td>\n", | |
" <td>302.57</td>\n", | |
" <td>298.00</td>\n", | |
" <td>301.61</td>\n", | |
" <td>125.66877000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2017-08-17 05:00:00</th>\n", | |
" <td>301.61</td>\n", | |
" <td>303.28</td>\n", | |
" <td>300.00</td>\n", | |
" <td>303.10</td>\n", | |
" <td>377.67246000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2017-08-17 06:00:00</th>\n", | |
" <td>302.40</td>\n", | |
" <td>304.44</td>\n", | |
" <td>301.90</td>\n", | |
" <td>302.68</td>\n", | |
" <td>303.86672000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2017-08-17 07:00:00</th>\n", | |
" <td>302.68</td>\n", | |
" <td>307.96</td>\n", | |
" <td>302.60</td>\n", | |
" <td>307.96</td>\n", | |
" <td>754.74510000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2017-08-17 08:00:00</th>\n", | |
" <td>307.95</td>\n", | |
" <td>309.97</td>\n", | |
" <td>307.00</td>\n", | |
" <td>308.62</td>\n", | |
" <td>150.75029000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>...</th>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-09-19 08:00:00</th>\n", | |
" <td>3440.82</td>\n", | |
" <td>3452.98</td>\n", | |
" <td>3436.80</td>\n", | |
" <td>3441.96</td>\n", | |
" <td>7142.61040000</td>\n", | |
" <td>3457.334621</td>\n", | |
" <td>3436.482398</td>\n", | |
" <td>-0.054200</td>\n", | |
" <td>-0.023382</td>\n", | |
" <td>-0.030818</td>\n", | |
" <td>1.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-09-19 09:00:00</th>\n", | |
" <td>3441.96</td>\n", | |
" <td>3449.99</td>\n", | |
" <td>3417.10</td>\n", | |
" <td>3423.64</td>\n", | |
" <td>7920.09050000</td>\n", | |
" <td>3456.999351</td>\n", | |
" <td>3434.982719</td>\n", | |
" <td>-0.043640</td>\n", | |
" <td>-0.031177</td>\n", | |
" <td>-0.012463</td>\n", | |
" <td>0.711894</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-09-19 10:00:00</th>\n", | |
" <td>3423.63</td>\n", | |
" <td>3429.72</td>\n", | |
" <td>3406.84</td>\n", | |
" <td>3408.16</td>\n", | |
" <td>8890.18960000</td>\n", | |
" <td>3456.513388</td>\n", | |
" <td>3433.610742</td>\n", | |
" <td>-0.039941</td>\n", | |
" <td>-0.038523</td>\n", | |
" <td>-0.001418</td>\n", | |
" <td>0.493946</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-09-19 11:00:00</th>\n", | |
" <td>3408.17</td>\n", | |
" <td>3408.33</td>\n", | |
" <td>3302.00</td>\n", | |
" <td>3326.19</td>\n", | |
" <td>49662.61380000</td>\n", | |
" <td>3455.216637</td>\n", | |
" <td>3431.587468</td>\n", | |
" <td>-0.058926</td>\n", | |
" <td>-0.046281</td>\n", | |
" <td>-0.012644</td>\n", | |
" <td>0.000000</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-09-19 12:00:00</th>\n", | |
" <td>3326.19</td>\n", | |
" <td>3347.73</td>\n", | |
" <td>3310.00</td>\n", | |
" <td>3328.16</td>\n", | |
" <td>20539.52240000</td>\n", | |
" <td>3453.952392</td>\n", | |
" <td>3428.613731</td>\n", | |
" <td>-0.086658</td>\n", | |
" <td>-0.054697</td>\n", | |
" <td>-0.031961</td>\n", | |
" <td>0.026601</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>35741 rows × 11 columns</p>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" open high ... TRIX_HISTO STOCH_RSI\n", | |
"timestamp ... \n", | |
"2017-08-17 04:00:00 301.13 302.57 ... NaN NaN\n", | |
"2017-08-17 05:00:00 301.61 303.28 ... NaN NaN\n", | |
"2017-08-17 06:00:00 302.40 304.44 ... NaN NaN\n", | |
"2017-08-17 07:00:00 302.68 307.96 ... NaN NaN\n", | |
"2017-08-17 08:00:00 307.95 309.97 ... NaN NaN\n", | |
"... ... ... ... ... ...\n", | |
"2021-09-19 08:00:00 3440.82 3452.98 ... -0.030818 1.000000\n", | |
"2021-09-19 09:00:00 3441.96 3449.99 ... -0.012463 0.711894\n", | |
"2021-09-19 10:00:00 3423.63 3429.72 ... -0.001418 0.493946\n", | |
"2021-09-19 11:00:00 3408.17 3408.33 ... -0.012644 0.000000\n", | |
"2021-09-19 12:00:00 3326.19 3347.73 ... -0.031961 0.026601\n", | |
"\n", | |
"[35741 rows x 11 columns]" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 13 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "zsmuqT5Vgu0R" | |
}, | |
"source": [ | |
"<h1>RUN the Spot Backtest</h1>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"id": "vGY9ySpQf4C0", | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 447 | |
}, | |
"outputId": "541253d2-e0fc-4ed2-d93e-10d729d415c5" | |
}, | |
"source": [ | |
"dfTest = df.copy()\n", | |
"\n", | |
"# -- If you want to run your BackTest on a specific period, uncomment the line below --\n", | |
"# dfTest = df['2021-09-01':]\n", | |
"\n", | |
"# -- Definition of dt, that will be the dataset to do your trades analyses --\n", | |
"dt = None\n", | |
"dt = pd.DataFrame(columns = ['date','position', 'reason', 'price', 'frais' ,'fiat', 'coins', 'wallet', 'drawBack'])\n", | |
"\n", | |
"# -- You can change variables below --\n", | |
"usdt = 1000\n", | |
"makerFee = 0.0002\n", | |
"takerFee = 0.0007\n", | |
"\n", | |
"# -- Do not touch these values --\n", | |
"initalWallet = usdt\n", | |
"wallet = usdt\n", | |
"coin = 0\n", | |
"lastAth = 0\n", | |
"previousRow = dfTest.iloc[0]\n", | |
"stopLoss = 0\n", | |
"takeProfit = 500000\n", | |
"buyReady = True\n", | |
"sellReady = True\n", | |
"\n", | |
"# -- Condition to BUY market --\n", | |
"def buyCondition(row, previousRow):\n", | |
" if row['TRIX_HISTO'] > 0 and row['STOCH_RSI'] < 0.8:\n", | |
" return True\n", | |
" else:\n", | |
" return False\n", | |
"\n", | |
"# -- Condition to SELL market -- \n", | |
"def sellCondition(row, previousRow):\n", | |
" if row['TRIX_HISTO'] < 0 and row['STOCH_RSI'] > 0.2:\n", | |
" return True\n", | |
" else:\n", | |
" return False\n", | |
"\n", | |
"# -- Iteration on all your price dataset (df) --\n", | |
"for index, row in dfTest.iterrows():\n", | |
" # -- Buy market order --\n", | |
" if buyCondition(row, previousRow) and usdt > 0 and buyReady == True:\n", | |
" # -- You can define here at what price you buy --\n", | |
" buyPrice = row['close']\n", | |
"\n", | |
" # -- Define the price of you SL and TP or comment it if you don't want a SL or TP --\n", | |
" # stopLoss = buyPrice - 0.02 * buyPrice\n", | |
" # takeProfit = buyPrice + 0.04 * buyPrice\n", | |
"\n", | |
" coin = usdt / buyPrice\n", | |
" fee = takerFee * coin\n", | |
" coin = coin - fee\n", | |
" usdt = 0\n", | |
" wallet = coin * row['close']\n", | |
"\n", | |
" # -- Check if your wallet hit a new ATH to know the drawBack --\n", | |
" if wallet > lastAth:\n", | |
" lastAth = wallet\n", | |
"\n", | |
" # -- You can uncomment the line below if you want to see logs --\n", | |
" # print(\"Buy COIN at\",buyPrice,'$ the', index)\n", | |
"\n", | |
" # -- Add the trade to DT to analyse it later --\n", | |
" myrow = {'date': index, 'position': \"Buy\", 'reason':'Buy Market Order','price': buyPrice,'frais': fee,'fiat': usdt,'coins': coin,'wallet': wallet,'drawBack':(wallet-lastAth)/lastAth}\n", | |
" dt = dt.append(myrow,ignore_index=True)\n", | |
" \n", | |
" # -- Stop Loss --\n", | |
" elif row['low'] < stopLoss and coin > 0:\n", | |
" sellPrice = stopLoss\n", | |
" usdt = coin * sellPrice\n", | |
" fee = makerFee * usdt\n", | |
" usdt = usdt - fee\n", | |
" coin = 0\n", | |
" buyReady = False\n", | |
" wallet = usdt\n", | |
"\n", | |
" # -- Check if your wallet hit a new ATH to know the drawBack --\n", | |
" if wallet > lastAth:\n", | |
" lastAth = wallet\n", | |
" \n", | |
" # -- You can uncomment the line below if you want to see logs --\n", | |
" # print(\"Sell COIN at Stop Loss\",sellPrice,'$ the', index)\n", | |
"\n", | |
" # -- Add the trade to DT to analyse it later --\n", | |
" myrow = {'date': index,'position': \"Sell\", 'reason':'Sell Stop Loss','price': sellPrice,'frais': fee,'fiat': usdt,'coins': coin,'wallet': wallet,'drawBack':(wallet-lastAth)/lastAth}\n", | |
" dt = dt.append(myrow,ignore_index=True) \n", | |
"\n", | |
" # -- Sell Market Order --\n", | |
" elif sellCondition(row, previousRow) and coin > 0 and sellReady == True:\n", | |
"\n", | |
" # -- You can define here at what price you buy --\n", | |
" sellPrice = row['close']\n", | |
" usdt = coin * sellPrice\n", | |
" fee = takerFee * usdt\n", | |
" usdt = usdt - fee\n", | |
" coin = 0\n", | |
" buyReady = True\n", | |
" wallet = usdt\n", | |
"\n", | |
" # -- Check if your wallet hit a new ATH to know the drawBack --\n", | |
" if wallet > lastAth:\n", | |
" lastAth = wallet\n", | |
"\n", | |
" # -- You can uncomment the line below if you want to see logs -- \n", | |
" # print(\"Sell COIN at\",sellPrice,'$ the', index)\n", | |
"\n", | |
" # -- Add the trade to DT to analyse it later --\n", | |
" myrow = {'date': index,'position': \"Sell\", 'reason':'Sell Market Order','price': sellPrice,'frais': fee,'fiat': usdt,'coins': coin,'wallet': wallet,'drawBack':(wallet-lastAth)/lastAth}\n", | |
" dt = dt.append(myrow,ignore_index=True)\n", | |
" \n", | |
" previousRow = row\n", | |
"\n", | |
"# -- BackTest Analyses --\n", | |
"dt = dt.set_index(dt['date'])\n", | |
"dt.index = pd.to_datetime(dt.index)\n", | |
"dt['resultat'] = dt['wallet'].diff()\n", | |
"dt['resultat%'] = dt['wallet'].pct_change()*100\n", | |
"dt.loc[dt['position']=='Buy','resultat'] = None\n", | |
"dt.loc[dt['position']=='Buy','resultat%'] = None\n", | |
"\n", | |
"dt['tradeIs'] = ''\n", | |
"dt.loc[dt['resultat']>0,'tradeIs'] = 'Good'\n", | |
"dt.loc[dt['resultat']<=0,'tradeIs'] = 'Bad'\n", | |
"\n", | |
"iniClose = dfTest.iloc[0]['close']\n", | |
"lastClose = dfTest.iloc[len(dfTest)-1]['close']\n", | |
"holdPercentage = ((lastClose - iniClose)/iniClose) * 100\n", | |
"algoPercentage = ((wallet - initalWallet)/initalWallet) * 100\n", | |
"vsHoldPercentage = ((algoPercentage - holdPercentage)/holdPercentage) * 100\n", | |
"\n", | |
"try:\n", | |
" tradesPerformance = round(dt.loc[(dt['tradeIs'] == 'Good') | (dt['tradeIs'] == 'Bad'), 'resultat%'].sum()\n", | |
" / dt.loc[(dt['tradeIs'] == 'Good') | (dt['tradeIs'] == 'Bad'), 'resultat%'].count(), 2)\n", | |
"except:\n", | |
" tradesPerformance = 0\n", | |
" print(\"/!\\ There is no Good or Bad Trades in your BackTest, maybe a problem...\")\n", | |
"\n", | |
"try:\n", | |
" totalGoodTrades = dt.groupby('tradeIs')['date'].nunique()['Good']\n", | |
" AveragePercentagePositivTrades = round(dt.loc[dt['tradeIs'] == 'Good', 'resultat%'].sum()\n", | |
" / dt.loc[dt['tradeIs'] == 'Good', 'resultat%'].count(), 2)\n", | |
" idbest = dt.loc[dt['tradeIs'] == 'Good', 'resultat%'].idxmax()\n", | |
" bestTrade = str(\n", | |
" round(dt.loc[dt['tradeIs'] == 'Good', 'resultat%'].max(), 2))\n", | |
"except:\n", | |
" totalGoodTrades = 0\n", | |
" AveragePercentagePositivTrades = 0\n", | |
" idbest = ''\n", | |
" bestTrade = 0\n", | |
" print(\"/!\\ There is no Good Trades in your BackTest, maybe a problem...\")\n", | |
"\n", | |
"try:\n", | |
" totalBadTrades = dt.groupby('tradeIs')['date'].nunique()['Bad']\n", | |
" AveragePercentageNegativTrades = round(dt.loc[dt['tradeIs'] == 'Bad', 'resultat%'].sum()\n", | |
" / dt.loc[dt['tradeIs'] == 'Bad', 'resultat%'].count(), 2)\n", | |
" idworst = dt.loc[dt['tradeIs'] == 'Bad', 'resultat%'].idxmin()\n", | |
" worstTrade = round(dt.loc[dt['tradeIs'] == 'Bad', 'resultat%'].min(), 2)\n", | |
"except:\n", | |
" totalBadTrades = 0\n", | |
" AveragePercentageNegativTrades = 0\n", | |
" idworst = ''\n", | |
" worstTrade = 0\n", | |
" print(\"/!\\ There is no Bad Trades in your BackTest, maybe a problem...\")\n", | |
"\n", | |
"totalTrades = totalBadTrades + totalGoodTrades\n", | |
"winRateRatio = (totalGoodTrades/totalTrades) * 100\n", | |
"\n", | |
"reasons = dt['reason'].unique()\n", | |
"\n", | |
"dt" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "execute_result", | |
"data": { | |
"text/html": [ | |
"<div>\n", | |
"<style scoped>\n", | |
" .dataframe tbody tr th:only-of-type {\n", | |
" vertical-align: middle;\n", | |
" }\n", | |
"\n", | |
" .dataframe tbody tr th {\n", | |
" vertical-align: top;\n", | |
" }\n", | |
"\n", | |
" .dataframe thead th {\n", | |
" text-align: right;\n", | |
" }\n", | |
"</style>\n", | |
"<table border=\"1\" class=\"dataframe\">\n", | |
" <thead>\n", | |
" <tr style=\"text-align: right;\">\n", | |
" <th></th>\n", | |
" <th>date</th>\n", | |
" <th>position</th>\n", | |
" <th>reason</th>\n", | |
" <th>price</th>\n", | |
" <th>frais</th>\n", | |
" <th>fiat</th>\n", | |
" <th>coins</th>\n", | |
" <th>wallet</th>\n", | |
" <th>drawBack</th>\n", | |
" <th>resultat</th>\n", | |
" <th>resultat%</th>\n", | |
" <th>tradeIs</th>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>date</th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" <th></th>\n", | |
" </tr>\n", | |
" </thead>\n", | |
" <tbody>\n", | |
" <tr>\n", | |
" <th>2017-08-19 16:00:00</th>\n", | |
" <td>2017-08-19 16:00:00</td>\n", | |
" <td>Buy</td>\n", | |
" <td>Buy Market Order</td>\n", | |
" <td>286.14</td>\n", | |
" <td>0.002446</td>\n", | |
" <td>0</td>\n", | |
" <td>3.492346</td>\n", | |
" <td>999.300000</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2017-08-22 06:00:00</th>\n", | |
" <td>2017-08-22 06:00:00</td>\n", | |
" <td>Sell</td>\n", | |
" <td>Sell Market Order</td>\n", | |
" <td>305.37</td>\n", | |
" <td>0.746520</td>\n", | |
" <td>1065.71</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>1065.711301</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>66.411301</td>\n", | |
" <td>6.645782</td>\n", | |
" <td>Good</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2017-08-22 18:00:00</th>\n", | |
" <td>2017-08-22 18:00:00</td>\n", | |
" <td>Buy</td>\n", | |
" <td>Buy Market Order</td>\n", | |
" <td>310.77</td>\n", | |
" <td>0.002400</td>\n", | |
" <td>0</td>\n", | |
" <td>3.426860</td>\n", | |
" <td>1064.965303</td>\n", | |
" <td>-0.000700</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2017-08-23 16:00:00</th>\n", | |
" <td>2017-08-23 16:00:00</td>\n", | |
" <td>Sell</td>\n", | |
" <td>Sell Market Order</td>\n", | |
" <td>318.85</td>\n", | |
" <td>0.764858</td>\n", | |
" <td>1091.89</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>1091.889474</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>26.924171</td>\n", | |
" <td>2.528174</td>\n", | |
" <td>Good</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2017-08-24 12:00:00</th>\n", | |
" <td>2017-08-24 12:00:00</td>\n", | |
" <td>Buy</td>\n", | |
" <td>Buy Market Order</td>\n", | |
" <td>322.00</td>\n", | |
" <td>0.002374</td>\n", | |
" <td>0</td>\n", | |
" <td>3.388587</td>\n", | |
" <td>1091.125152</td>\n", | |
" <td>-0.000700</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>...</th>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" <td>...</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-09-15 05:00:00</th>\n", | |
" <td>2021-09-15 05:00:00</td>\n", | |
" <td>Sell</td>\n", | |
" <td>Sell Market Order</td>\n", | |
" <td>3392.90</td>\n", | |
" <td>570.304717</td>\n", | |
" <td>814151</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>814150.718948</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>25620.158324</td>\n", | |
" <td>3.249102</td>\n", | |
" <td>Good</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-09-16 00:00:00</th>\n", | |
" <td>2021-09-16 00:00:00</td>\n", | |
" <td>Buy</td>\n", | |
" <td>Buy Market Order</td>\n", | |
" <td>3580.59</td>\n", | |
" <td>0.159165</td>\n", | |
" <td>0</td>\n", | |
" <td>227.219764</td>\n", | |
" <td>813580.813445</td>\n", | |
" <td>-0.000700</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-09-16 12:00:00</th>\n", | |
" <td>2021-09-16 12:00:00</td>\n", | |
" <td>Sell</td>\n", | |
" <td>Sell Market Order</td>\n", | |
" <td>3628.94</td>\n", | |
" <td>577.196822</td>\n", | |
" <td>823990</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>823989.692194</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>10408.878749</td>\n", | |
" <td>1.279391</td>\n", | |
" <td>Good</td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-09-18 11:00:00</th>\n", | |
" <td>2021-09-18 11:00:00</td>\n", | |
" <td>Buy</td>\n", | |
" <td>Buy Market Order</td>\n", | |
" <td>3496.50</td>\n", | |
" <td>0.164963</td>\n", | |
" <td>0</td>\n", | |
" <td>235.496325</td>\n", | |
" <td>823412.899409</td>\n", | |
" <td>-0.000700</td>\n", | |
" <td>NaN</td>\n", | |
" <td>NaN</td>\n", | |
" <td></td>\n", | |
" </tr>\n", | |
" <tr>\n", | |
" <th>2021-09-18 22:00:00</th>\n", | |
" <td>2021-09-18 22:00:00</td>\n", | |
" <td>Sell</td>\n", | |
" <td>Sell Market Order</td>\n", | |
" <td>3418.33</td>\n", | |
" <td>563.502906</td>\n", | |
" <td>804441</td>\n", | |
" <td>0.000000</td>\n", | |
" <td>804440.648799</td>\n", | |
" <td>-0.023725</td>\n", | |
" <td>-18972.250610</td>\n", | |
" <td>-2.304099</td>\n", | |
" <td>Bad</td>\n", | |
" </tr>\n", | |
" </tbody>\n", | |
"</table>\n", | |
"<p>1820 rows × 12 columns</p>\n", | |
"</div>" | |
], | |
"text/plain": [ | |
" date position ... resultat% tradeIs\n", | |
"date ... \n", | |
"2017-08-19 16:00:00 2017-08-19 16:00:00 Buy ... NaN \n", | |
"2017-08-22 06:00:00 2017-08-22 06:00:00 Sell ... 6.645782 Good\n", | |
"2017-08-22 18:00:00 2017-08-22 18:00:00 Buy ... NaN \n", | |
"2017-08-23 16:00:00 2017-08-23 16:00:00 Sell ... 2.528174 Good\n", | |
"2017-08-24 12:00:00 2017-08-24 12:00:00 Buy ... NaN \n", | |
"... ... ... ... ... ...\n", | |
"2021-09-15 05:00:00 2021-09-15 05:00:00 Sell ... 3.249102 Good\n", | |
"2021-09-16 00:00:00 2021-09-16 00:00:00 Buy ... NaN \n", | |
"2021-09-16 12:00:00 2021-09-16 12:00:00 Sell ... 1.279391 Good\n", | |
"2021-09-18 11:00:00 2021-09-18 11:00:00 Buy ... NaN \n", | |
"2021-09-18 22:00:00 2021-09-18 22:00:00 Sell ... -2.304099 Bad\n", | |
"\n", | |
"[1820 rows x 12 columns]" | |
] | |
}, | |
"metadata": {}, | |
"execution_count": 17 | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "XtiQhB25wvuh" | |
}, | |
"source": [ | |
"<h1>Print Complete BackTest Analyses</h1>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/" | |
}, | |
"id": "BXPkbIklr4qI", | |
"outputId": "9d689aac-115a-4350-8ab8-6a95f28e43c2" | |
}, | |
"source": [ | |
"print(\"Pair Symbol :\",pairName)\n", | |
"print(\"Period : [\" + str(dfTest.index[0]) + \"] -> [\" +\n", | |
" str(dfTest.index[len(dfTest)-1]) + \"]\")\n", | |
"print(\"Starting balance :\", initalWallet, \"$\")\n", | |
"\n", | |
"print(\"\\n----- General Informations -----\")\n", | |
"print(\"Final balance :\", round(wallet, 2), \"$\")\n", | |
"print(\"Performance vs US Dollar :\", round(algoPercentage, 2), \"%\")\n", | |
"print(\"Buy and Hold Performence :\", round(holdPercentage, 2), \"%\")\n", | |
"print(\"Performance vs Buy and Hold :\", round(vsHoldPercentage, 2), \"%\")\n", | |
"print(\"Best trade : +\"+bestTrade, \"%, the\", idbest)\n", | |
"print(\"Worst trade :\", worstTrade, \"%, the\", idworst)\n", | |
"print(\"Worst drawBack :\", str(100*round(dt['drawBack'].min(), 2)), \"%\")\n", | |
"print(\"Total fees : \", round(dt['frais'].sum(), 2), \"$\")\n", | |
"\n", | |
"print(\"\\n----- Trades Informations -----\")\n", | |
"print(\"Total trades on period :\",totalTrades)\n", | |
"print(\"Number of positive trades :\", totalGoodTrades)\n", | |
"print(\"Number of negative trades : \", totalBadTrades)\n", | |
"print(\"Trades win rate ratio :\", round(winRateRatio, 2), '%')\n", | |
"print(\"Average trades performance :\",tradesPerformance,\"%\")\n", | |
"print(\"Average positive trades :\", AveragePercentagePositivTrades, \"%\")\n", | |
"print(\"Average negative trades :\", AveragePercentageNegativTrades, \"%\")\n", | |
"\n", | |
"print(\"\\n----- Trades Reasons -----\")\n", | |
"reasons = dt['reason'].unique()\n", | |
"for r in reasons:\n", | |
" print(r+\" number :\", dt.groupby('reason')['date'].nunique()[r])" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"Pair Symbol : ETHUSDT\n", | |
"Period : [2017-08-17 04:00:00] -> [2021-09-19 12:00:00]\n", | |
"Starting balance : 1000 $\n", | |
"\n", | |
"----- General Informations -----\n", | |
"Final balance : 804440.65 $\n", | |
"Performance vs US Dollar : 80344.06 %\n", | |
"Buy and Hold Performence : 1003.46 %\n", | |
"Performance vs Buy and Hold : 7906.67 %\n", | |
"Best trade : +40.44 %, the 2021-01-04 12:00:00\n", | |
"Worst trade : -17.52 %, the 2018-08-14 02:00:00\n", | |
"Worst drawBack : -32.0 %\n", | |
"Total fees : 92730.49 $\n", | |
"\n", | |
"----- Trades Informations -----\n", | |
"Total trades on period : 910\n", | |
"Number of positive trades : 458\n", | |
"Number of negative trades : 452\n", | |
"Trades win rate ratio : 50.33 %\n", | |
"Average trades performance : 0.92 %\n", | |
"Average positive trades : 3.84 %\n", | |
"Average negative trades : -2.05 %\n", | |
"\n", | |
"----- Trades Reasons -----\n", | |
"Buy Market Order number : 910\n", | |
"Sell Market Order number : 910\n" | |
] | |
} | |
] | |
}, | |
{ | |
"cell_type": "markdown", | |
"metadata": { | |
"id": "Y2qTRL5KwqyA" | |
}, | |
"source": [ | |
"<h1>Plot to improve ...</h1>" | |
] | |
}, | |
{ | |
"cell_type": "code", | |
"metadata": { | |
"colab": { | |
"base_uri": "https://localhost:8080/", | |
"height": 605 | |
}, | |
"id": "zLBLXPolwnsg", | |
"outputId": "4e0dd666-f3b4-45f7-98d2-67079e018034" | |
}, | |
"source": [ | |
"dt[['wallet', 'price']].plot(subplots=True, figsize=(20, 10))\n", | |
"print(\"\\n----- Plot -----\")" | |
], | |
"execution_count": null, | |
"outputs": [ | |
{ | |
"output_type": "stream", | |
"name": "stdout", | |
"text": [ | |
"\n", | |
"----- Plot -----\n" | |
] | |
}, | |
{ | |
"output_type": "display_data", | |
"data": { | |
"image/png": "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\n", | |
"text/plain": [ | |
"<Figure size 1440x720 with 2 Axes>" | |
] | |
}, | |
"metadata": { | |
"needs_background": "light" | |
} | |
} | |
] | |
} | |
] | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment