{"id":21526910,"url":"https://github.com/lambdaclass/options_backtester","last_synced_at":"2025-07-19T14:34:43.722Z","repository":{"id":50187686,"uuid":"185625937","full_name":"lambdaclass/options_backtester","owner":"lambdaclass","description":"Simple backtesting software for options","archived":false,"fork":false,"pushed_at":"2024-08-07T18:34:49.000Z","size":31820,"stargazers_count":183,"open_issues_count":5,"forks_count":29,"subscribers_count":28,"default_branch":"master","last_synced_at":"2025-07-14T05:34:27.584Z","etag":null,"topics":["backtester","derivatives","finance","options","volatility"],"latest_commit_sha":null,"homepage":"","language":"Jupyter Notebook","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/lambdaclass.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-05-08T14:48:04.000Z","updated_at":"2025-07-13T01:52:45.000Z","dependencies_parsed_at":"2023-01-31T23:45:26.227Z","dependency_job_id":null,"html_url":"https://github.com/lambdaclass/options_backtester","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/lambdaclass/options_backtester","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lambdaclass%2Foptions_backtester","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lambdaclass%2Foptions_backtester/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lambdaclass%2Foptions_backtester/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lambdaclass%2Foptions_backtester/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lambdaclass","download_url":"https://codeload.github.com/lambdaclass/options_backtester/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lambdaclass%2Foptions_backtester/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":265947510,"owners_count":23853382,"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":["backtester","derivatives","finance","options","volatility"],"created_at":"2024-11-24T01:47:12.658Z","updated_at":"2025-07-19T14:34:43.703Z","avatar_url":"https://github.com/lambdaclass.png","language":"Jupyter Notebook","funding_links":[],"categories":["repos:"],"sub_categories":[],"readme":"[![Build Status](https://travis-ci.com/lambdaclass/options_backtester.svg?branch=master)](https://travis-ci.com/lambdaclass/options_backtester)\n\nOptions Backtester\n==============================\n\nSimple backtester to evaluate and analyse options strategies over historical price data.\n\n\n- [Requirements](#requirements)\n- [Setup](#setup)\n- [Usage](#usage)\n- [Recommended Reading](#recommended-reading)\n- [Data Sources](#data-sources)\n\n\n## Requirements\n\n- Python \u003e= 3.6\n- pipenv\n\n## Setup\n\nInstall [pipenv](https://pipenv.pypa.io/en/latest/)\n\n```shell\n$\u003e pip install pipenv\n```\n\nCreate environment and download dependencies\n\n```shell\n$\u003e make install\n```\n\nActivate environment\n\n```shell\n$\u003e make env\n```\n\nRun [Jupyter](https://jupyter.org) notebook\n\n```shell\n$\u003e make notebook\n```\n\nRun tests\n\n```shell\n$\u003e make test\n```\n\n## Usage\n\n### Sample backtest\n\nYou can run this example by putting the code into a Jupyter Notebook/Lab file in this directory.\n\n\n```python\nimport os\nimport sys\n\nBACKTESTER_DIR = os.getcwd()\nTEST_DATA_DIR = os.path.join(BACKTESTER_DIR, 'backtester', 'test', 'test_data')\nSAMPLE_STOCK_DATA = os.path.join(TEST_DATA_DIR, 'test_data_stocks.csv')\nSAMPLE_OPTIONS_DATA = os.path.join(TEST_DATA_DIR, 'test_data_options.csv')\n```\n\n\n```python\nfrom backtester import Backtest, Stock, Type, Direction\nfrom backtester.datahandler import HistoricalOptionsData, TiingoData\nfrom backtester.strategy import Strategy, StrategyLeg\n```\n\nFirst we construct an options datahandler.\n\n\n```python\noptions_data = HistoricalOptionsData(SAMPLE_OPTIONS_DATA)\noptions_schema = options_data.schema\n```\n\nNext, we'll create a toy options strategy. It will simply buy a call and a put with `dte` between $80$ and $52$ and exit them a month later. \n\n\n```python\nsample_strategy = Strategy(options_schema)\n\nleg1 = StrategyLeg('leg_1', options_schema, option_type=Type.CALL, direction=Direction.BUY)\nleg1.entry_filter = (options_schema.dte \u003c 80) \u0026 (options_schema.dte \u003e 52)\n\nleg1.exit_filter = (options_schema.dte \u003c= 52)\n\nleg2 = StrategyLeg('leg_2', options_schema, option_type=Type.PUT, direction=Direction.BUY) \nleg2.entry_filter = (options_schema.dte \u003c 80) \u0026 (options_schema.dte \u003e 52)\n\nleg2.exit_filter = (options_schema.dte \u003c= 52)\n\nsample_strategy.add_legs([leg1, leg2]);\n```\n\nWe do the same for stocks: create a datahandler together with a list of the stocks we want in our inventory and their corresponding weights. In this case, we will hold `VOO`, `TUR` and `RSX`, with $0.4$, $0.1$ and $0.5$ weights respectively.\n\n\n```python\nstocks_data = TiingoData(SAMPLE_STOCK_DATA)\nstocks = [Stock('VOO', 0.4), Stock('TUR', 0.1), Stock('RSX', 0.5)]\n```\n\nWe set our portfolio allocation, i.e. how much of our capital will be invested in stocks, options and cash. We'll allocate 50% of our capital to stocks and the rest to options.\n\n\n```python\nallocation = {'stocks': 0.5, 'options': 0.5, 'cash': 0.0}\n```\n\nFinally, we create the `Backtest` object.\n\n\n```python\nbt = Backtest(allocation, initial_capital=1_000_000)\n\nbt.stocks = stocks\nbt.stocks_data = stocks_data\n\nbt.options_strategy = sample_strategy\nbt.options_data = options_data\n```\n\nAnd run the backtest with a rebalancing period of one month.\n\n\n```python\nbt.run(rebalance_freq=1)\n```\n\n    0% [██████████████████████████████] 100% | ETA: 00:00:00\n    Total time elapsed: 00:00:00\n\n\n\u003cdiv\u003e\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth colspan=\"7\" halign=\"left\"\u003eleg_1\u003c/th\u003e\n      \u003cth colspan=\"7\" halign=\"left\"\u003eleg_2\u003c/th\u003e\n      \u003cth colspan=\"3\" halign=\"left\"\u003etotals\u003c/th\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003econtract\u003c/th\u003e\n      \u003cth\u003eunderlying\u003c/th\u003e\n      \u003cth\u003eexpiration\u003c/th\u003e\n      \u003cth\u003etype\u003c/th\u003e\n      \u003cth\u003estrike\u003c/th\u003e\n      \u003cth\u003ecost\u003c/th\u003e\n      \u003cth\u003eorder\u003c/th\u003e\n      \u003cth\u003econtract\u003c/th\u003e\n      \u003cth\u003eunderlying\u003c/th\u003e\n      \u003cth\u003eexpiration\u003c/th\u003e\n      \u003cth\u003etype\u003c/th\u003e\n      \u003cth\u003estrike\u003c/th\u003e\n      \u003cth\u003ecost\u003c/th\u003e\n      \u003cth\u003eorder\u003c/th\u003e\n      \u003cth\u003ecost\u003c/th\u003e\n      \u003cth\u003eqty\u003c/th\u003e\n      \u003cth\u003edate\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e0\u003c/th\u003e\n      \u003ctd\u003eSPX170317C00300000\u003c/td\u003e\n      \u003ctd\u003eSPX\u003c/td\u003e\n      \u003ctd\u003e2017-03-17\u003c/td\u003e\n      \u003ctd\u003ecall\u003c/td\u003e\n      \u003ctd\u003e300\u003c/td\u003e\n      \u003ctd\u003e195010.0\u003c/td\u003e\n      \u003ctd\u003eOrder.BTO\u003c/td\u003e\n      \u003ctd\u003eSPX170317P00300000\u003c/td\u003e\n      \u003ctd\u003eSPX\u003c/td\u003e\n      \u003ctd\u003e2017-03-17\u003c/td\u003e\n      \u003ctd\u003eput\u003c/td\u003e\n      \u003ctd\u003e300\u003c/td\u003e\n      \u003ctd\u003e5.0\u003c/td\u003e\n      \u003ctd\u003eOrder.BTO\u003c/td\u003e\n      \u003ctd\u003e195015.0\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e2017-01-03\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e1\u003c/th\u003e\n      \u003ctd\u003eSPX170317C00300000\u003c/td\u003e\n      \u003ctd\u003eSPX\u003c/td\u003e\n      \u003ctd\u003e2017-03-17\u003c/td\u003e\n      \u003ctd\u003ecall\u003c/td\u003e\n      \u003ctd\u003e300\u003c/td\u003e\n      \u003ctd\u003e-197060.0\u003c/td\u003e\n      \u003ctd\u003eOrder.STC\u003c/td\u003e\n      \u003ctd\u003eSPX170317P00300000\u003c/td\u003e\n      \u003ctd\u003eSPX\u003c/td\u003e\n      \u003ctd\u003e2017-03-17\u003c/td\u003e\n      \u003ctd\u003eput\u003c/td\u003e\n      \u003ctd\u003e300\u003c/td\u003e\n      \u003ctd\u003e-0.0\u003c/td\u003e\n      \u003ctd\u003eOrder.STC\u003c/td\u003e\n      \u003ctd\u003e-197060.0\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e2017-02-01\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2\u003c/th\u003e\n      \u003ctd\u003eSPX170421C00500000\u003c/td\u003e\n      \u003ctd\u003eSPX\u003c/td\u003e\n      \u003ctd\u003e2017-04-21\u003c/td\u003e\n      \u003ctd\u003ecall\u003c/td\u003e\n      \u003ctd\u003e500\u003c/td\u003e\n      \u003ctd\u003e177260.0\u003c/td\u003e\n      \u003ctd\u003eOrder.BTO\u003c/td\u003e\n      \u003ctd\u003eSPX170421P01375000\u003c/td\u003e\n      \u003ctd\u003eSPX\u003c/td\u003e\n      \u003ctd\u003e2017-04-21\u003c/td\u003e\n      \u003ctd\u003eput\u003c/td\u003e\n      \u003ctd\u003e1375\u003c/td\u003e\n      \u003ctd\u003e60.0\u003c/td\u003e\n      \u003ctd\u003eOrder.BTO\u003c/td\u003e\n      \u003ctd\u003e177320.0\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e2017-02-01\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e3\u003c/th\u003e\n      \u003ctd\u003eSPX170421C00500000\u003c/td\u003e\n      \u003ctd\u003eSPX\u003c/td\u003e\n      \u003ctd\u003e2017-04-21\u003c/td\u003e\n      \u003ctd\u003ecall\u003c/td\u003e\n      \u003ctd\u003e500\u003c/td\u003e\n      \u003ctd\u003e-188980.0\u003c/td\u003e\n      \u003ctd\u003eOrder.STC\u003c/td\u003e\n      \u003ctd\u003eSPX170421P01375000\u003c/td\u003e\n      \u003ctd\u003eSPX\u003c/td\u003e\n      \u003ctd\u003e2017-04-21\u003c/td\u003e\n      \u003ctd\u003eput\u003c/td\u003e\n      \u003ctd\u003e1375\u003c/td\u003e\n      \u003ctd\u003e-5.0\u003c/td\u003e\n      \u003ctd\u003eOrder.STC\u003c/td\u003e\n      \u003ctd\u003e-188985.0\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e2017-03-01\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e4\u003c/th\u003e\n      \u003ctd\u003eSPX170519C01000000\u003c/td\u003e\n      \u003ctd\u003eSPX\u003c/td\u003e\n      \u003ctd\u003e2017-05-19\u003c/td\u003e\n      \u003ctd\u003ecall\u003c/td\u003e\n      \u003ctd\u003e1000\u003c/td\u003e\n      \u003ctd\u003e138940.0\u003c/td\u003e\n      \u003ctd\u003eOrder.BTO\u003c/td\u003e\n      \u003ctd\u003eSPX170519P01650000\u003c/td\u003e\n      \u003ctd\u003eSPX\u003c/td\u003e\n      \u003ctd\u003e2017-05-19\u003c/td\u003e\n      \u003ctd\u003eput\u003c/td\u003e\n      \u003ctd\u003e1650\u003c/td\u003e\n      \u003ctd\u003e100.0\u003c/td\u003e\n      \u003ctd\u003eOrder.BTO\u003c/td\u003e\n      \u003ctd\u003e139040.0\u003c/td\u003e\n      \u003ctd\u003e3.0\u003c/td\u003e\n      \u003ctd\u003e2017-03-01\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e5\u003c/th\u003e\n      \u003ctd\u003eSPX170519C01000000\u003c/td\u003e\n      \u003ctd\u003eSPX\u003c/td\u003e\n      \u003ctd\u003e2017-05-19\u003c/td\u003e\n      \u003ctd\u003ecall\u003c/td\u003e\n      \u003ctd\u003e1000\u003c/td\u003e\n      \u003ctd\u003e-135290.0\u003c/td\u003e\n      \u003ctd\u003eOrder.STC\u003c/td\u003e\n      \u003ctd\u003eSPX170519P01650000\u003c/td\u003e\n      \u003ctd\u003eSPX\u003c/td\u003e\n      \u003ctd\u003e2017-05-19\u003c/td\u003e\n      \u003ctd\u003eput\u003c/td\u003e\n      \u003ctd\u003e1650\u003c/td\u003e\n      \u003ctd\u003e-20.0\u003c/td\u003e\n      \u003ctd\u003eOrder.STC\u003c/td\u003e\n      \u003ctd\u003e-135310.0\u003c/td\u003e\n      \u003ctd\u003e3.0\u003c/td\u003e\n      \u003ctd\u003e2017-04-03\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/div\u003e\n\n\n\nThe trade log (`bt.trade_log`) shows we executed 6 trades: we bought one call and one put on _2017-01-03_, _2017-02-01_ and _2017-03-01_, and exited those positions on _2017-02-01_, _2017-03-01_ and _2017-04-03_ respectively.\n\nThe balance data structure shows how our positions evolved over time:\n- We started with $1000000 on _2017-01-02_\n- `total capital` is the sum of `cash`, `stocks capital` and `options capital`\n- `% change` shows the inter day change in `total capital`\n- `accumulated return` gives the compounded return in `total capital` since the start of the backtest\n\n\n```python\nbt.balance.head()\n```\n\n\n\n\n\u003cdiv\u003e\n\u003ctable border=\"1\" class=\"dataframe\"\u003e\n  \u003cthead\u003e\n    \u003ctr style=\"text-align: right;\"\u003e\n      \u003cth\u003e\u003c/th\u003e\n      \u003cth\u003etotal capital\u003c/th\u003e\n      \u003cth\u003ecash\u003c/th\u003e\n      \u003cth\u003eVOO\u003c/th\u003e\n      \u003cth\u003eTUR\u003c/th\u003e\n      \u003cth\u003eRSX\u003c/th\u003e\n      \u003cth\u003eoptions qty\u003c/th\u003e\n      \u003cth\u003ecalls capital\u003c/th\u003e\n      \u003cth\u003eputs capital\u003c/th\u003e\n      \u003cth\u003estocks qty\u003c/th\u003e\n      \u003cth\u003eVOO qty\u003c/th\u003e\n      \u003cth\u003eTUR qty\u003c/th\u003e\n      \u003cth\u003eRSX qty\u003c/th\u003e\n      \u003cth\u003eoptions capital\u003c/th\u003e\n      \u003cth\u003estocks capital\u003c/th\u003e\n      \u003cth\u003e% change\u003c/th\u003e\n      \u003cth\u003eaccumulated return\u003c/th\u003e\n    \u003c/tr\u003e\n  \u003c/thead\u003e\n  \u003ctbody\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2017-01-02\u003c/th\u003e\n      \u003ctd\u003e1.000000e+06\u003c/td\u003e\n      \u003ctd\u003e1000000.00000\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003e0.0\u003c/td\u003e\n      \u003ctd\u003e0.000000\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n      \u003ctd\u003eNaN\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2017-01-03\u003c/th\u003e\n      \u003ctd\u003e9.990300e+05\u003c/td\u003e\n      \u003ctd\u003e110117.40592\u003c/td\u003e\n      \u003ctd\u003e199872.763320\u003c/td\u003e\n      \u003ctd\u003e49993.281167\u003c/td\u003e\n      \u003ctd\u003e249986.549593\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e389060.0\u003c/td\u003e\n      \u003ctd\u003e0.0\u003c/td\u003e\n      \u003ctd\u003e16186.0\u003c/td\u003e\n      \u003ctd\u003e1025.0\u003c/td\u003e\n      \u003ctd\u003e1758.0\u003c/td\u003e\n      \u003ctd\u003e13403.0\u003c/td\u003e\n      \u003ctd\u003e389060.0\u003c/td\u003e\n      \u003ctd\u003e499852.594080\u003c/td\u003e\n      \u003ctd\u003e-0.000970\u003c/td\u003e\n      \u003ctd\u003e0.999030\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2017-01-04\u003c/th\u003e\n      \u003ctd\u003e1.004228e+06\u003c/td\u003e\n      \u003ctd\u003e110117.40592\u003c/td\u003e\n      \u003ctd\u003e201052.238851\u003c/td\u003e\n      \u003ctd\u003e50072.862958\u003c/td\u003e\n      \u003ctd\u003e251605.333911\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e391380.0\u003c/td\u003e\n      \u003ctd\u003e0.0\u003c/td\u003e\n      \u003ctd\u003e16186.0\u003c/td\u003e\n      \u003ctd\u003e1025.0\u003c/td\u003e\n      \u003ctd\u003e1758.0\u003c/td\u003e\n      \u003ctd\u003e13403.0\u003c/td\u003e\n      \u003ctd\u003e391380.0\u003c/td\u003e\n      \u003ctd\u003e502730.435720\u003c/td\u003e\n      \u003ctd\u003e0.005203\u003c/td\u003e\n      \u003ctd\u003e1.004228\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2017-01-05\u003c/th\u003e\n      \u003ctd\u003e1.002706e+06\u003c/td\u003e\n      \u003ctd\u003e110117.40592\u003c/td\u003e\n      \u003ctd\u003e200897.553535\u003c/td\u003e\n      \u003ctd\u003e49865.950301\u003c/td\u003e\n      \u003ctd\u003e250564.686850\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e391260.0\u003c/td\u003e\n      \u003ctd\u003e0.0\u003c/td\u003e\n      \u003ctd\u003e16186.0\u003c/td\u003e\n      \u003ctd\u003e1025.0\u003c/td\u003e\n      \u003ctd\u003e1758.0\u003c/td\u003e\n      \u003ctd\u003e13403.0\u003c/td\u003e\n      \u003ctd\u003e391260.0\u003c/td\u003e\n      \u003ctd\u003e501328.190686\u003c/td\u003e\n      \u003ctd\u003e-0.001516\u003c/td\u003e\n      \u003ctd\u003e1.002706\u003c/td\u003e\n    \u003c/tr\u003e\n    \u003ctr\u003e\n      \u003cth\u003e2017-01-06\u003c/th\u003e\n      \u003ctd\u003e1.003201e+06\u003c/td\u003e\n      \u003ctd\u003e110117.40592\u003c/td\u003e\n      \u003ctd\u003e201680.647945\u003c/td\u003e\n      \u003ctd\u003e49372.543196\u003c/td\u003e\n      \u003ctd\u003e248830.275081\u003c/td\u003e\n      \u003ctd\u003e2.0\u003c/td\u003e\n      \u003ctd\u003e393200.0\u003c/td\u003e\n      \u003ctd\u003e0.0\u003c/td\u003e\n      \u003ctd\u003e16186.0\u003c/td\u003e\n      \u003ctd\u003e1025.0\u003c/td\u003e\n      \u003ctd\u003e1758.0\u003c/td\u003e\n      \u003ctd\u003e13403.0\u003c/td\u003e\n      \u003ctd\u003e393200.0\u003c/td\u003e\n      \u003ctd\u003e499883.466222\u003c/td\u003e\n      \u003ctd\u003e0.000494\u003c/td\u003e\n      \u003ctd\u003e1.003201\u003c/td\u003e\n    \u003c/tr\u003e\n  \u003c/tbody\u003e\n\u003c/table\u003e\n\u003c/div\u003e\n\n\nEvolution of our total capital over time:\n\n\n```python\nbt.balance['total capital'].plot();\n```\n\n\n![png](img/total_capital.png)\n\n\nEvolution of our stock positions over time:\n\n\n```python\nbt.balance[[stock.symbol for stock in stocks]].plot();\n```\n\n\n![png](img/stock_positions.png)\n\n\nMore plots and statistics are available in the `backtester.statistics` module.\n\n### Other strategies\n\nThe `Strategy` and `StrategyLeg` classes allow for more complex strategies; for instance, a [long strangle](https://www.investopedia.com/terms/s/strangle.asp) could be implemented like so:\n\n\n```python\n# Long strangle\nleg_1 = StrategyLeg('leg_1', options_schema, option_type=Type.PUT, direction=Direction.BUY)\nleg_1.entry_filter = (options_schema.underlying == 'SPX') \u0026 (options_schema.dte \u003e= 60) \u0026 (options_schema.underlying_last \u003c= 1.1 * options_schema.strike)\nleg_1.exit_filter = (options_schema.dte \u003c= 30)\n\nleg_2 = StrategyLeg('leg_2', options_schema, option_type=Type.CALL, direction=Direction.BUY)\nleg_2.entry_filter = (options_schema.underlying == 'SPX') \u0026 (options_schema.dte \u003e= 60) \u0026 (options_schema.underlying_last \u003e= 0.9 * options_schema.strike)\nleg_2.exit_filter = (options_schema.dte \u003c= 30)\n\nstrategy = Strategy(options_schema)\nstrategy.add_legs([leg_1, leg_2]);\n```\n\nYou can explore more usage examples in the Jupyter [notebooks](backtester/examples/).\n\n\n## Recommended reading\n\nFor complete novices in finance and economics, this [post](https://notamonadtutorial.com/how-to-earn-your-macroeconomics-and-finance-white-belt-as-a-software-developer-136e7454866f) gives a comprehensive introduction.\n\n\n### Books\n\n#### Introductory\n- Option Volatility and Pricing 2nd Ed. - Natemberg, 2014\n- Options, Futures, and Other Derivatives 10th Ed. - Hull 2017\n- Trading Options Greeks: How Time, Volatility, and Other Pricing Factors Drive Profits 2nd Ed. - Passarelli 2012\n\n#### Intermediate\n- Trading Volatility - Bennet 2014\n- Volatility Trading 2nd Ed. - Sinclair 2013\n\n#### Advanced\n- Dynamic Hedging - Taleb 1997\n- The Volatility Surface: A Practitioner's Guide - Gatheral 2006\n- The Volatility Smile - Derman \u0026 Miller 2016\n\n### Papers\n- [Volatility: A New Return Driver?](http://static.squarespace.com/static/53974e3ae4b0039937edb698/t/53da6400e4b0d5d5360f4918/1406821376095/Directional%20Volatility%20Research.pdf)\n- [Easy Volatility Investing](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2255327)\n- [Everybody’s Doing It: Short Volatility Strategies and Shadow Financial Insurers](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=3071457)\n- [Volatility-of-Volatility Risk](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2497759)\n- [The Distribution of Returns](https://papers.ssrn.com/sol3/papers.cfm?abstract_id=2828744)\n- [Safe Haven Investing Part I - Not all risk mitigation is created equal](https://www.universa.net/UniversaResearch_SafeHavenPart1_RiskMitigation.pdf)\n- [Safe Haven Investing Part II - Not all risk is created equal](https://www.universa.net/UniversaResearch_SafeHavenPart2_NotAllRisk.pdf)\n- [Safe Haven Investing Part III - Those wonderful tenbaggers](https://www.universa.net/UniversaResearch_SafeHavenPart3_Tenbaggers.pdf)\n- [Insurance makes wealth grow faster](https://arxiv.org/abs/1507.04655)\n- [Ergodicity economics](https://ergodicityeconomics.files.wordpress.com/2018/06/ergodicity_economics.pdf)\n- [The Rate of Return on Everything, 1870–2015](https://economics.harvard.edu/files/economics/files/ms28533.pdf)\n- [Volatility and the Alchemy of Risk](https://static1.squarespace.com/static/5581f17ee4b01f59c2b1513a/t/59ea16dbbe42d6ff1cae589f/1508513505640/Artemis_Volatility+and+the+Alchemy+of+Risk_2017.pdf)\n\n## Data sources\n\n### Exchanges\n\n- [IEX](https://iextrading.com/developer/)\n- [Tiingo](https://api.tiingo.com/)\n- [CBOE Options Data](http://www.cboe.com/delayedquote/quote-table-download)\n\n### Historical Data\n\n- [Shiller's US Stocks, Dividends, Earnings, Inflation (CPI), and long term interest rates](http://www.econ.yale.edu/~shiller/data.htm)\n- [Fama/French US Stock Index Data](http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html)\n- [FRED CPI, Interest Rates, Trade Data](https://fred.stlouisfed.org)\n- [REIT Data](https://www.reit.com/data-research/reit-market-data/reit-industry-financial-snapshot)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flambdaclass%2Foptions_backtester","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flambdaclass%2Foptions_backtester","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flambdaclass%2Foptions_backtester/lists"}