{ "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", "DATA_DIR = os.path.join(BACKTESTER_DIR, 'data')\n", "OPTIONS_DATA = os.path.join(DATA_DIR, 'options_data_clean_v2.h5')\n", "STOCKS_DATA = os.path.join(DATA_DIR, 'ivy_5assets.csv')\n", "\n", "sys.path.append(BACKTESTER_DIR) # Add backtester base dir to $PYTHONPATH" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/jamoroso/.local/share/virtualenvs/backtester_options-33KCFJeg/lib/python3.7/site-packages/pandas_datareader/compat/__init__.py:7: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.\n", " from pandas.util.testing import assert_frame_equal\n", "/Users/jamoroso/.local/share/virtualenvs/backtester_options-33KCFJeg/lib/python3.7/site-packages/pyfolio/pos.py:27: UserWarning: Module \"zipline.assets\" not found; mutltipliers will not be applied to position notionals.\n", " 'Module \"zipline.assets\" not found; mutltipliers will not be applied' +\n" ] } ], "source": [ "import pyfolio as pf\n", "\n", "from backtester import Backtest, Type, Direction, Stock\n", "from backtester.strategy import Strategy, StrategyLeg\n", "from backtester.datahandler import HistoricalOptionsData, TiingoData\n", "\n", "# Cleaned up data\n", "options_data = HistoricalOptionsData(\n", " OPTIONS_DATA,\n", " key=\"/SPX\",\n", " where='quotedate >= \"2012-01-01\" & quotedate <= \"2014-01-01\"')\n", "options_schema = options_data.schema" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Strategy(legs=[StrategyLeg(name=leg_1, type=Type.PUT, direction=Direction.BUY, entry_filter=Filter(query='((type == 'put') & (ask > 0)) & ((underlying == 'SPX') & (dte >= 60))'), exit_filter=Filter(query='(type == 'put') & (dte <= 30)')), StrategyLeg(name=leg_2, type=Type.CALL, direction=Direction.BUY, entry_filter=Filter(query='((type == 'call') & (ask > 0)) & ((underlying == 'SPX') & (dte >= 60))'), exit_filter=Filter(query='(type == 'call') & (dte <= 30)'))], exit_thresholds=(inf, inf))" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "put_otm = Strategy(options_schema)\n", "\n", "leg_1 = StrategyLeg(\"leg_1\", options_schema, option_type=Type.PUT, direction=Direction.BUY)\n", "leg_1.entry_filter = (options_schema.underlying == \"SPX\") & (options_schema.dte >= 60)\n", "leg_1.exit_filter = (options_schema.dte <= 30)\n", "\n", "leg_2 = StrategyLeg(\"leg_2\", options_schema, option_type=Type.CALL, direction=Direction.BUY)\n", "leg_2.entry_filter = (options_schema.underlying == \"SPX\") & (options_schema.dte >= 60)\n", "leg_2.exit_filter = (options_schema.dte <= 30)\n", "put_otm.add_legs([leg_1, leg_2])" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "asset_data = TiingoData(STOCKS_DATA)\n", "asset_data._data = asset_data.query('date >= \"2012-01-01\" & date <= \"2014-01-01\"')\n", "\n", "VTI = Stock(\"VTI\", 0.2)\n", "VEU = Stock(\"VEU\", 0.2)\n", "BND = Stock(\"BND\", 0.2)\n", "VNQ = Stock(\"VNQ\", 0.2)\n", "DBC = Stock(\"DBC\", 0.2)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "0% [██████████████████████████████] 100% | ETA: 00:00:00\n", "Total time elapsed: 00:00:07\n" ] }, { "data": { "text/html": [ "
| \n", " | total capital | \n", "cash | \n", "VTI | \n", "VEU | \n", "BND | \n", "VNQ | \n", "DBC | \n", "options qty | \n", "calls capital | \n", "puts capital | \n", "stocks qty | \n", "options capital | \n", "stocks capital | \n", "% change | \n", "accumulated return | \n", "
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 2010-01-03 | \n", "1.000000e+06 | \n", "1000000.000000 | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "NaN | \n", "0.0 | \n", "0.000000e+00 | \n", "NaN | \n", "NaN | \n", "
| 2012-01-03 | \n", "9.978700e+05 | \n", "2233.455073 | \n", "193990.075633 | \n", "193976.304225 | \n", "193986.878802 | \n", "193966.992283 | \n", "193976.293985 | \n", "6.0 | \n", "25740.0 | \n", "0.0 | \n", "24257.0 | \n", "25740.0 | \n", "9.698965e+05 | \n", "-0.002130 | \n", "0.997870 | \n", "
| 2012-01-04 | \n", "9.949656e+05 | \n", "2233.455073 | \n", "194079.321182 | \n", "193451.915101 | \n", "194080.052134 | \n", "190650.750322 | \n", "195450.064670 | \n", "6.0 | \n", "25020.0 | \n", "0.0 | \n", "24257.0 | \n", "25020.0 | \n", "9.677121e+05 | \n", "-0.002911 | \n", "0.994966 | \n", "
| 2012-01-05 | \n", "9.927494e+05 | \n", "2233.455073 | \n", "194942.028158 | \n", "191259.015126 | \n", "194010.172135 | \n", "192441.520981 | \n", "192783.241526 | \n", "6.0 | \n", "25080.0 | \n", "0.0 | \n", "24257.0 | \n", "25080.0 | \n", "9.654360e+05 | \n", "-0.002227 | \n", "0.992749 | \n", "
| 2012-01-06 | \n", "9.887005e+05 | \n", "2233.455073 | \n", "194495.800412 | \n", "188827.756460 | \n", "194126.638801 | \n", "191811.435009 | \n", "193625.396202 | \n", "6.0 | \n", "23580.0 | \n", "0.0 | \n", "24257.0 | \n", "23580.0 | \n", "9.628870e+05 | \n", "-0.004079 | \n", "0.988700 | \n", "
| ... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "... | \n", "
| 2013-12-24 | \n", "1.276243e+06 | \n", "273.097958 | \n", "248730.685735 | \n", "246256.243708 | \n", "242926.387533 | \n", "245754.530575 | \n", "246032.446280 | \n", "7.0 | \n", "46270.0 | \n", "0.0 | \n", "27125.0 | \n", "46270.0 | \n", "1.229700e+06 | \n", "0.003401 | \n", "1.276243 | \n", "
| 2013-12-26 | \n", "1.282165e+06 | \n", "273.097958 | \n", "249907.026341 | \n", "247293.424036 | \n", "242562.316514 | \n", "245944.449069 | \n", "246414.781084 | \n", "7.0 | \n", "49770.0 | \n", "0.0 | \n", "27125.0 | \n", "49770.0 | \n", "1.232122e+06 | \n", "0.004640 | \n", "1.282165 | \n", "
| 2013-12-27 | \n", "1.284267e+06 | \n", "273.097958 | \n", "249750.180927 | \n", "248281.214826 | \n", "242562.316514 | \n", "246476.220851 | \n", "247083.866990 | \n", "7.0 | \n", "49840.0 | \n", "0.0 | \n", "27125.0 | \n", "49840.0 | \n", "1.234154e+06 | \n", "0.001639 | \n", "1.284267 | \n", "
| 2013-12-30 | \n", "1.284806e+06 | \n", "273.097958 | \n", "249828.603634 | \n", "249565.342851 | \n", "242956.726785 | \n", "246552.188248 | \n", "245650.111476 | \n", "7.0 | \n", "49980.0 | \n", "0.0 | \n", "27125.0 | \n", "49980.0 | \n", "1.234553e+06 | \n", "0.000420 | \n", "1.284806 | \n", "
| 2013-12-31 | \n", "1.288826e+06 | \n", "273.097958 | \n", "250743.535215 | \n", "250553.133640 | \n", "242865.709030 | \n", "245222.758794 | \n", "245267.776672 | \n", "7.0 | \n", "53900.0 | \n", "0.0 | \n", "27125.0 | \n", "53900.0 | \n", "1.234653e+06 | \n", "0.003129 | \n", "1.288826 | \n", "
503 rows × 15 columns
\n", "| Start date | 2012-01-03 | |
|---|---|---|
| End date | 2013-12-31 | |
| Total months | 23 | |
| \n", " | Backtest | \n", "|
| Annual return | \n", "13.6% | \n", "|
| Cumulative returns | \n", "28.9% | \n", "|
| Annual volatility | \n", "14.3% | \n", "|
| Sharpe ratio | \n", "0.96 | \n", "|
| Calmar ratio | \n", "1.14 | \n", "|
| Stability | \n", "0.83 | \n", "|
| Max drawdown | \n", "-11.9% | \n", "|
| Omega ratio | \n", "1.18 | \n", "|
| Sortino ratio | \n", "1.37 | \n", "|
| Skew | \n", "-0.52 | \n", "|
| Kurtosis | \n", "3.88 | \n", "|
| Tail ratio | \n", "0.97 | \n", "|
| Daily value at risk | \n", "-1.7% | \n", "|