{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os\n", "import sys\n", "\n", "backtester_dir = os.path.realpath(os.path.join(os.getcwd(), '..', '..'))\n", "sys.path.append(backtester_dir) # Add backtester base dir to $PYTHONPATH" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "from asset_backtester import Backtest, Portfolio, Asset\n", "from asset_backtester.datahandler import HistoricalAssetData\n", "from asset_backtester.charts import *" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import pandas_datareader as pdr\n", "import datetime" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As a first example, we run a backtest of a portfolio with the following tickers during the year 2019. Data is taken from [Tiingo](https://api.tiingo.com)." ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "env: TIINGO_API_KEY=your_tiingo_api_key\n" ] } ], "source": [ "%env TIINGO_API_KEY=your_tiingo_api_key" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "api_key = os.environ[\"TIINGO_API_KEY\"]\n", "\n", "start = datetime.datetime(2019, 1, 1)\n", "end = datetime.datetime(2019, 12, 31)\n", "tickers = [\"VOO\", \"TUR\", \"RSX\", \"EWY\", \"EWS\", \"VTIP\", \"TLT\", \"BWX\", \"PDBC\", \"IAU\", \"VNQI\"]\n", "\n", "symbols = pdr.get_data_tiingo(tickers, api_key=api_key, start=start, end=end)" ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | \n", " | close | \n", "high | \n", "low | \n", "open | \n", "volume | \n", "adjClose | \n", "adjHigh | \n", "adjLow | \n", "adjOpen | \n", "adjVolume | \n", "divCash | \n", "splitFactor | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| symbol | \n", "date | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
| VOO | \n", "2019-01-02 00:00:00+00:00 | \n", "229.99 | \n", "230.85 | \n", "226.02 | \n", "226.18 | \n", "4891329 | \n", "225.367394 | \n", "226.210108 | \n", "221.477187 | \n", "221.633971 | \n", "4891329 | \n", "0.0 | \n", "1.0 | \n", "
| 2019-01-03 00:00:00+00:00 | \n", "224.50 | \n", "228.42 | \n", "223.97 | \n", "228.10 | \n", "3330026 | \n", "219.987738 | \n", "223.828949 | \n", "219.468391 | \n", "223.515381 | \n", "3330026 | \n", "0.0 | \n", "1.0 | \n", "|
| 2019-01-04 00:00:00+00:00 | \n", "231.91 | \n", "232.62 | \n", "227.15 | \n", "227.54 | \n", "5100088 | \n", "227.248803 | \n", "227.944533 | \n", "222.584475 | \n", "222.966637 | \n", "5100088 | \n", "0.0 | \n", "1.0 | \n", "|
| 2019-01-07 00:00:00+00:00 | \n", "233.65 | \n", "235.23 | \n", "231.32 | \n", "232.29 | \n", "3706014 | \n", "228.953831 | \n", "230.502074 | \n", "226.670662 | \n", "227.621166 | \n", "3706014 | \n", "0.0 | \n", "1.0 | \n", "|
| 2019-01-08 00:00:00+00:00 | \n", "235.92 | \n", "236.46 | \n", "233.43 | \n", "236.05 | \n", "3546649 | \n", "231.178206 | \n", "231.707352 | \n", "228.738253 | \n", "231.305593 | \n", "3546649 | \n", "0.0 | \n", "1.0 | \n", "|
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| VNQI | \n", "2019-12-24 00:00:00+00:00 | \n", "58.22 | \n", "58.23 | \n", "58.08 | \n", "58.12 | \n", "637517 | \n", "58.220000 | \n", "58.230000 | \n", "58.080000 | \n", "58.120000 | \n", "637517 | \n", "0.0 | \n", "1.0 | \n", "
| 2019-12-26 00:00:00+00:00 | \n", "58.54 | \n", "58.54 | \n", "58.25 | \n", "58.28 | \n", "355091 | \n", "58.540000 | \n", "58.540000 | \n", "58.250000 | \n", "58.280000 | \n", "355091 | \n", "0.0 | \n", "1.0 | \n", "|
| 2019-12-27 00:00:00+00:00 | \n", "58.96 | \n", "58.96 | \n", "58.77 | \n", "58.78 | \n", "322343 | \n", "58.960000 | \n", "58.960000 | \n", "58.770000 | \n", "58.780000 | \n", "322343 | \n", "0.0 | \n", "1.0 | \n", "|
| 2019-12-30 00:00:00+00:00 | \n", "58.71 | \n", "59.02 | \n", "58.71 | \n", "59.00 | \n", "294134 | \n", "58.710000 | \n", "59.020000 | \n", "58.710000 | \n", "59.000000 | \n", "294134 | \n", "0.0 | \n", "1.0 | \n", "|
| 2019-12-31 00:00:00+00:00 | \n", "59.09 | \n", "59.09 | \n", "58.85 | \n", "58.95 | \n", "219935 | \n", "59.090000 | \n", "59.090000 | \n", "58.850000 | \n", "58.950000 | \n", "219935 | \n", "0.0 | \n", "1.0 | \n", "
2772 rows × 12 columns
\n", "| \n", " | symbol | \n", "date | \n", "close | \n", "high | \n", "low | \n", "open | \n", "volume | \n", "adjClose | \n", "adjHigh | \n", "adjLow | \n", "adjOpen | \n", "adjVolume | \n", "divCash | \n", "splitFactor | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "VOO | \n", "2019-01-02 00:00:00+00:00 | \n", "229.99 | \n", "230.85 | \n", "226.02 | \n", "226.18 | \n", "4891329 | \n", "225.367394 | \n", "226.210108 | \n", "221.477187 | \n", "221.633971 | \n", "4891329 | \n", "0.0 | \n", "1.0 | \n", "
| 1 | \n", "VOO | \n", "2019-01-03 00:00:00+00:00 | \n", "224.50 | \n", "228.42 | \n", "223.97 | \n", "228.10 | \n", "3330026 | \n", "219.987738 | \n", "223.828949 | \n", "219.468391 | \n", "223.515381 | \n", "3330026 | \n", "0.0 | \n", "1.0 | \n", "
| 2 | \n", "VOO | \n", "2019-01-04 00:00:00+00:00 | \n", "231.91 | \n", "232.62 | \n", "227.15 | \n", "227.54 | \n", "5100088 | \n", "227.248803 | \n", "227.944533 | \n", "222.584475 | \n", "222.966637 | \n", "5100088 | \n", "0.0 | \n", "1.0 | \n", "
| 3 | \n", "VOO | \n", "2019-01-07 00:00:00+00:00 | \n", "233.65 | \n", "235.23 | \n", "231.32 | \n", "232.29 | \n", "3706014 | \n", "228.953831 | \n", "230.502074 | \n", "226.670662 | \n", "227.621166 | \n", "3706014 | \n", "0.0 | \n", "1.0 | \n", "
| 4 | \n", "VOO | \n", "2019-01-08 00:00:00+00:00 | \n", "235.92 | \n", "236.46 | \n", "233.43 | \n", "236.05 | \n", "3546649 | \n", "231.178206 | \n", "231.707352 | \n", "228.738253 | \n", "231.305593 | \n", "3546649 | \n", "0.0 | \n", "1.0 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 2767 | \n", "VNQI | \n", "2019-12-24 00:00:00+00:00 | \n", "58.22 | \n", "58.23 | \n", "58.08 | \n", "58.12 | \n", "637517 | \n", "58.220000 | \n", "58.230000 | \n", "58.080000 | \n", "58.120000 | \n", "637517 | \n", "0.0 | \n", "1.0 | \n", "
| 2768 | \n", "VNQI | \n", "2019-12-26 00:00:00+00:00 | \n", "58.54 | \n", "58.54 | \n", "58.25 | \n", "58.28 | \n", "355091 | \n", "58.540000 | \n", "58.540000 | \n", "58.250000 | \n", "58.280000 | \n", "355091 | \n", "0.0 | \n", "1.0 | \n", "
| 2769 | \n", "VNQI | \n", "2019-12-27 00:00:00+00:00 | \n", "58.96 | \n", "58.96 | \n", "58.77 | \n", "58.78 | \n", "322343 | \n", "58.960000 | \n", "58.960000 | \n", "58.770000 | \n", "58.780000 | \n", "322343 | \n", "0.0 | \n", "1.0 | \n", "
| 2770 | \n", "VNQI | \n", "2019-12-30 00:00:00+00:00 | \n", "58.71 | \n", "59.02 | \n", "58.71 | \n", "59.00 | \n", "294134 | \n", "58.710000 | \n", "59.020000 | \n", "58.710000 | \n", "59.000000 | \n", "294134 | \n", "0.0 | \n", "1.0 | \n", "
| 2771 | \n", "VNQI | \n", "2019-12-31 00:00:00+00:00 | \n", "59.09 | \n", "59.09 | \n", "58.85 | \n", "58.95 | \n", "219935 | \n", "59.090000 | \n", "59.090000 | \n", "58.850000 | \n", "58.950000 | \n", "219935 | \n", "0.0 | \n", "1.0 | \n", "
2772 rows × 14 columns
\n", "| \n", " | capital | \n", "cash | \n", "total_value | \n", "% change | \n", "accumulated return | \n", "
|---|---|---|---|---|---|
| 2019-01-01 00:00:00+00:00 | \n", "1.000000e+06 | \n", "1000000.000000 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "
| 2019-01-02 00:00:00+00:00 | \n", "1.000000e+06 | \n", "365.102886 | \n", "9.996349e+05 | \n", "0.000000 | \n", "1.000000 | \n", "
| 2019-01-03 00:00:00+00:00 | \n", "9.987002e+05 | \n", "365.102886 | \n", "9.983351e+05 | \n", "-0.001300 | \n", "0.998700 | \n", "
| 2019-01-04 00:00:00+00:00 | \n", "1.008706e+06 | \n", "365.102886 | \n", "1.008341e+06 | \n", "0.010019 | \n", "1.008706 | \n", "
| 2019-01-07 00:00:00+00:00 | \n", "1.010930e+06 | \n", "365.102886 | \n", "1.010565e+06 | \n", "0.002205 | \n", "1.010930 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 2019-12-24 00:00:00+00:00 | \n", "1.157945e+06 | \n", "365.102886 | \n", "1.157580e+06 | \n", "0.002707 | \n", "1.157945 | \n", "
| 2019-12-26 00:00:00+00:00 | \n", "1.163165e+06 | \n", "365.102886 | \n", "1.162800e+06 | \n", "0.004508 | \n", "1.163165 | \n", "
| 2019-12-27 00:00:00+00:00 | \n", "1.165863e+06 | \n", "365.102886 | \n", "1.165498e+06 | \n", "0.002319 | \n", "1.165863 | \n", "
| 2019-12-30 00:00:00+00:00 | \n", "1.163344e+06 | \n", "365.102886 | \n", "1.162979e+06 | \n", "-0.002161 | \n", "1.163344 | \n", "
| 2019-12-31 00:00:00+00:00 | \n", "1.163594e+06 | \n", "365.102886 | \n", "1.163229e+06 | \n", "0.000215 | \n", "1.163594 | \n", "
253 rows × 5 columns
\n", "| \n", " | symbol | \n", "date | \n", "close | \n", "high | \n", "low | \n", "open | \n", "volume | \n", "adjClose | \n", "adjHigh | \n", "adjLow | \n", "adjOpen | \n", "adjVolume | \n", "divCash | \n", "splitFactor | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 0 | \n", "VTI | \n", "2010-01-04 00:00:00+00:00 | \n", "57.31 | \n", "57.3799 | \n", "56.84 | \n", "56.86 | \n", "2251461 | \n", "47.189147 | \n", "47.246703 | \n", "46.802149 | \n", "46.818617 | \n", "2251461 | \n", "0.0 | \n", "1.0 | \n", "
| 1 | \n", "VTI | \n", "2010-01-05 00:00:00+00:00 | \n", "57.53 | \n", "57.5400 | \n", "57.11 | \n", "57.34 | \n", "1597643 | \n", "47.370296 | \n", "47.378530 | \n", "47.024467 | \n", "47.213849 | \n", "1597643 | \n", "0.0 | \n", "1.0 | \n", "
| 2 | \n", "VTI | \n", "2010-01-06 00:00:00+00:00 | \n", "57.61 | \n", "57.7150 | \n", "57.41 | \n", "57.50 | \n", "2120206 | \n", "47.436168 | \n", "47.522625 | \n", "47.271488 | \n", "47.345594 | \n", "2120206 | \n", "0.0 | \n", "1.0 | \n", "
| 3 | \n", "VTI | \n", "2010-01-07 00:00:00+00:00 | \n", "57.85 | \n", "57.8890 | \n", "57.29 | \n", "57.55 | \n", "1656639 | \n", "47.633784 | \n", "47.665897 | \n", "47.172679 | \n", "47.386764 | \n", "1656639 | \n", "0.0 | \n", "1.0 | \n", "
| 4 | \n", "VTI | \n", "2010-01-08 00:00:00+00:00 | \n", "58.04 | \n", "58.0461 | \n", "57.56 | \n", "57.70 | \n", "1649919 | \n", "47.790231 | \n", "47.795253 | \n", "47.394998 | \n", "47.510274 | \n", "1649919 | \n", "0.0 | \n", "1.0 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 12575 | \n", "DBC | \n", "2019-12-24 00:00:00+00:00 | \n", "15.93 | \n", "15.9500 | \n", "15.86 | \n", "15.86 | \n", "466153 | \n", "15.930000 | \n", "15.950000 | \n", "15.860000 | \n", "15.860000 | \n", "466153 | \n", "0.0 | \n", "1.0 | \n", "
| 12576 | \n", "DBC | \n", "2019-12-26 00:00:00+00:00 | \n", "16.05 | \n", "16.0500 | \n", "15.97 | \n", "15.97 | \n", "679206 | \n", "16.050000 | \n", "16.050000 | \n", "15.970000 | \n", "15.970000 | \n", "679206 | \n", "0.0 | \n", "1.0 | \n", "
| 12577 | \n", "DBC | \n", "2019-12-27 00:00:00+00:00 | \n", "16.08 | \n", "16.0900 | \n", "16.02 | \n", "16.06 | \n", "1250014 | \n", "16.080000 | \n", "16.090000 | \n", "16.020000 | \n", "16.060000 | \n", "1250014 | \n", "0.0 | \n", "1.0 | \n", "
| 12578 | \n", "DBC | \n", "2019-12-30 00:00:00+00:00 | \n", "16.05 | \n", "16.1800 | \n", "15.98 | \n", "16.16 | \n", "976284 | \n", "16.050000 | \n", "16.180000 | \n", "15.980000 | \n", "16.160000 | \n", "976284 | \n", "0.0 | \n", "1.0 | \n", "
| 12579 | \n", "DBC | \n", "2019-12-31 00:00:00+00:00 | \n", "15.95 | \n", "16.0453 | \n", "15.91 | \n", "15.95 | \n", "806115 | \n", "15.950000 | \n", "16.045300 | \n", "15.910000 | \n", "15.950000 | \n", "806115 | \n", "0.0 | \n", "1.0 | \n", "
12580 rows × 14 columns
\n", "| \n", " | capital | \n", "cash | \n", "total_value | \n", "% change | \n", "accumulated return | \n", "
|---|---|---|---|---|---|
| 2010-01-03 00:00:00+00:00 | \n", "1.000000e+06 | \n", "1000000.000000 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "
| 2010-01-04 00:00:00+00:00 | \n", "1.000000e+06 | \n", "96.545508 | \n", "9.999035e+05 | \n", "0.000000 | \n", "1.000000 | \n", "
| 2010-01-05 00:00:00+00:00 | \n", "1.001321e+06 | \n", "96.545508 | \n", "1.001225e+06 | \n", "0.001321 | \n", "1.001321 | \n", "
| 2010-01-06 00:00:00+00:00 | \n", "1.005603e+06 | \n", "96.545508 | \n", "1.005507e+06 | \n", "0.004276 | \n", "1.005603 | \n", "
| 2010-01-07 00:00:00+00:00 | \n", "1.004723e+06 | \n", "96.545508 | \n", "1.004627e+06 | \n", "-0.000875 | \n", "1.004723 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 2019-12-24 00:00:00+00:00 | \n", "2.039175e+06 | \n", "96.545508 | \n", "2.039079e+06 | \n", "0.001159 | \n", "2.039175 | \n", "
| 2019-12-26 00:00:00+00:00 | \n", "2.048066e+06 | \n", "96.545508 | \n", "2.047969e+06 | \n", "0.004360 | \n", "2.048066 | \n", "
| 2019-12-27 00:00:00+00:00 | \n", "2.050801e+06 | \n", "96.545508 | \n", "2.050705e+06 | \n", "0.001336 | \n", "2.050801 | \n", "
| 2019-12-30 00:00:00+00:00 | \n", "2.045131e+06 | \n", "96.545508 | \n", "2.045035e+06 | \n", "-0.002765 | \n", "2.045131 | \n", "
| 2019-12-31 00:00:00+00:00 | \n", "2.051265e+06 | \n", "96.545508 | \n", "2.051168e+06 | \n", "0.002999 | \n", "2.051265 | \n", "
2517 rows × 5 columns
\n", "| \n", " | capital | \n", "cash | \n", "total_value | \n", "% change | \n", "accumulated return | \n", "
|---|---|---|---|---|---|
| 2010-01-03 00:00:00+00:00 | \n", "1.000000e+06 | \n", "1000000.000000 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "
| 2010-01-04 00:00:00+00:00 | \n", "1.000000e+06 | \n", "96.545508 | \n", "9.999035e+05 | \n", "0.000000 | \n", "1.000000 | \n", "
| 2010-01-05 00:00:00+00:00 | \n", "1.001321e+06 | \n", "96.545508 | \n", "1.001225e+06 | \n", "0.001321 | \n", "1.001321 | \n", "
| 2010-01-06 00:00:00+00:00 | \n", "1.005603e+06 | \n", "96.545508 | \n", "1.005507e+06 | \n", "0.004276 | \n", "1.005603 | \n", "
| 2010-01-07 00:00:00+00:00 | \n", "1.004723e+06 | \n", "96.545508 | \n", "1.004627e+06 | \n", "-0.000875 | \n", "1.004723 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 2019-12-24 00:00:00+00:00 | \n", "1.697197e+06 | \n", "189.028410 | \n", "1.697008e+06 | \n", "0.001499 | \n", "1.697197 | \n", "
| 2019-12-26 00:00:00+00:00 | \n", "1.704983e+06 | \n", "189.028410 | \n", "1.704794e+06 | \n", "0.004587 | \n", "1.704983 | \n", "
| 2019-12-27 00:00:00+00:00 | \n", "1.707689e+06 | \n", "189.028410 | \n", "1.707500e+06 | \n", "0.001587 | \n", "1.707689 | \n", "
| 2019-12-30 00:00:00+00:00 | \n", "1.703069e+06 | \n", "189.028410 | \n", "1.702880e+06 | \n", "-0.002706 | \n", "1.703069 | \n", "
| 2019-12-31 00:00:00+00:00 | \n", "1.704913e+06 | \n", "189.028410 | \n", "1.704724e+06 | \n", "0.001083 | \n", "1.704913 | \n", "
2517 rows × 5 columns
\n", "| \n", " | capital | \n", "cash | \n", "total_value | \n", "% change | \n", "accumulated return | \n", "
|---|---|---|---|---|---|
| 2010-01-03 00:00:00+00:00 | \n", "1.000000e+06 | \n", "1000000.000000 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "
| 2010-01-04 00:00:00+00:00 | \n", "1.000000e+06 | \n", "96.545508 | \n", "9.999035e+05 | \n", "0.000000 | \n", "1.000000 | \n", "
| 2010-01-05 00:00:00+00:00 | \n", "1.001321e+06 | \n", "96.545508 | \n", "1.001225e+06 | \n", "0.001321 | \n", "1.001321 | \n", "
| 2010-01-06 00:00:00+00:00 | \n", "1.005603e+06 | \n", "96.545508 | \n", "1.005507e+06 | \n", "0.004276 | \n", "1.005603 | \n", "
| 2010-01-07 00:00:00+00:00 | \n", "1.004723e+06 | \n", "96.545508 | \n", "1.004627e+06 | \n", "-0.000875 | \n", "1.004723 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 2019-12-24 00:00:00+00:00 | \n", "1.766451e+06 | \n", "168.362295 | \n", "1.766283e+06 | \n", "0.001476 | \n", "1.766451 | \n", "
| 2019-12-26 00:00:00+00:00 | \n", "1.774559e+06 | \n", "168.362295 | \n", "1.774390e+06 | \n", "0.004590 | \n", "1.774559 | \n", "
| 2019-12-27 00:00:00+00:00 | \n", "1.777363e+06 | \n", "168.362295 | \n", "1.777194e+06 | \n", "0.001580 | \n", "1.777363 | \n", "
| 2019-12-30 00:00:00+00:00 | \n", "1.772492e+06 | \n", "168.362295 | \n", "1.772324e+06 | \n", "-0.002740 | \n", "1.772492 | \n", "
| 2019-12-31 00:00:00+00:00 | \n", "1.774520e+06 | \n", "168.362295 | \n", "1.774352e+06 | \n", "0.001144 | \n", "1.774520 | \n", "
2517 rows × 5 columns
\n", "