{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import os\n", "import sys\n", "\n", "import pandas as pd\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": [ "data_dir = os.path.join(backtester_dir, 'data')\n", "store_path = os.path.join(data_dir, 'options_data_full_v2.h5')\n", "store = pd.HDFStore(store_path, complevel=9, complib='blosc', fletcher32=True)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "First we move the data from a h5 store with multiple keys (one per year) to another with a single key." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "old_data = os.path.join(data_dir, 'options_data_compressed_v2.h5')\n", "sizes = {'optionroot': 20, 'optionalias': 20}\n", "underlying_categories = pd.CategoricalDtype(categories=['SPX', 'SPXW', 'SPXPM'], ordered=False)\n", "\n", "keys = ('spx_{}'.format(year) for year in range(1990, 2019))\n", "offset = 0\n", "\n", "for k in keys:\n", " df = pd.read_hdf(old_data, key=k)\n", " df['underlying'] = df['underlying'].astype(underlying_categories)\n", " df.drop(columns='exchange', inplace=True)\n", " \n", " df.index += offset\n", " offset += len(df)\n", " store.append('/SPX', df, index=False, data_columns=['quotedate', 'expiration'], min_itemsize=sizes)\n", " \n", "os.path.getsize(store_path) / 1024**2" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "store.close()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Data cleaning" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We will remove contracts where `bid` _and_ `ask` columns go to 0 unexpectedly, that is, where the bid/ask price of the contract is greater than 0 for the previous and following days. \n", "We will also remove contracts that have a missing `quotedate` before expiration." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
underlyingunderlying_lastoptionroottypeexpirationquotedatestrikelastbidaskvolumeopeninterestimpliedvoldeltagammathetavegaoptionalias
0SPX359.69SPX900120C00225000call1990-01-201990-01-02225.00.0135.5135.508200.00.00.00.00.0SPX900120C00225000
1SPX359.69SPX900120C00320000call1990-01-201990-01-02320.00.040.940.9010880.00.00.00.00.0SPX900120C00320000
2SPX359.69SPX900120C00325000call1990-01-201990-01-02325.00.035.935.9012520.00.00.00.00.0SPX900120C00325000
3SPX359.69SPX900120C00330000call1990-01-201990-01-02330.030.530.930.92587380.00.00.00.00.0SPX900120C00330000
4SPX359.69SPX900120C00335000call1990-01-201990-01-02335.00.026.026.005800.00.00.00.00.0SPX900120C00335000
\n", "
" ], "text/plain": [ " underlying underlying_last optionroot type expiration quotedate \\\n", "0 SPX 359.69 SPX900120C00225000 call 1990-01-20 1990-01-02 \n", "1 SPX 359.69 SPX900120C00320000 call 1990-01-20 1990-01-02 \n", "2 SPX 359.69 SPX900120C00325000 call 1990-01-20 1990-01-02 \n", "3 SPX 359.69 SPX900120C00330000 call 1990-01-20 1990-01-02 \n", "4 SPX 359.69 SPX900120C00335000 call 1990-01-20 1990-01-02 \n", "\n", " strike last bid ask volume openinterest impliedvol delta gamma \\\n", "0 225.0 0.0 135.5 135.5 0 820 0.0 0.0 0.0 \n", "1 320.0 0.0 40.9 40.9 0 1088 0.0 0.0 0.0 \n", "2 325.0 0.0 35.9 35.9 0 1252 0.0 0.0 0.0 \n", "3 330.0 30.5 30.9 30.9 25 8738 0.0 0.0 0.0 \n", "4 335.0 0.0 26.0 26.0 0 580 0.0 0.0 0.0 \n", "\n", " theta vega optionalias \n", "0 0.0 0.0 SPX900120C00225000 \n", "1 0.0 0.0 SPX900120C00320000 \n", "2 0.0 0.0 SPX900120C00325000 \n", "3 0.0 0.0 SPX900120C00330000 \n", "4 0.0 0.0 SPX900120C00335000 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "full_data = os.path.join(data_dir, 'options_data_full_v2.h5')\n", "df = pd.read_hdf(full_data, key='/SPX')\n", "df.head()" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "240554" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['optionroot'].nunique()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "16756680" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(df)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "to_clean = set()\n", "threshold = 0.5\n", "\n", "dates = pd.Series(index=df['quotedate'].unique())\n", "\n", "for contract, group in df.groupby('optionroot'):\n", " both_zero = group.eval('bid == ask == 0.0')\n", " if both_zero.any():\n", " ask_diff_previous = group['ask'].diff().abs()\n", " ask_diff_next = group['ask'].diff(-1).abs()\n", " \n", " if ((ask_diff_previous > threshold) & (ask_diff_next > threshold) & both_zero).any():\n", " to_clean.add(contract)\n", " else:\n", " start_date, end_date = group['quotedate'].min(), group['quotedate'].max()\n", " if len(dates.loc[start_date:end_date]) != len(group):\n", " to_clean.add(contract)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "29394" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(to_clean)" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.1221929379681901" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(to_clean) / df['optionroot'].nunique()" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "to_clean_mask = df[df['optionroot'].isin(to_clean)]\n", "clean_df = df.drop(to_clean_mask.index)\n", "clean_df.reset_index(drop=True, inplace=True)\n", "\n", "min_sizes = {'optionroot': 20, 'optionalias': 20}\n", "clean_file = os.path.join(data_dir, 'options_data_clean_v2.h5')\n", "clean_df.to_hdf(clean_file,\n", " mode='w',\n", " key='/SPX',\n", " format='table',\n", " data_columns=['quotedate', 'expiration'],\n", " complevel=9,\n", " complib='blosc:lz4',\n", " fletcher32=True,\n", " min_itemsize=min_sizes)" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "RangeIndex: 13909922 entries, 0 to 13909921\n", "Data columns (total 18 columns):\n", "underlying category\n", "underlying_last float64\n", "optionroot object\n", "type category\n", "expiration datetime64[ns]\n", "quotedate datetime64[ns]\n", "strike float64\n", "last float64\n", "bid float64\n", "ask float64\n", "volume int64\n", "openinterest int64\n", "impliedvol float64\n", "delta float64\n", "gamma float64\n", "theta float64\n", "vega float64\n", "optionalias object\n", "dtypes: category(2), datetime64[ns](2), float64(10), int64(2), object(2)\n", "memory usage: 3.4 GB\n" ] } ], "source": [ "clean_df.info(memory_usage='deep')" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "568.1449775695801" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "os.path.getsize(clean_file) / 1024**2" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "unique_contracts_per_day = df.groupby('quotedate').apply(lambda x: x['optionroot'].nunique())\n", "unique_contracts_per_day.plot()" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "unique_contracts_per_day_clean = clean_df.groupby('quotedate').apply(lambda x: x['optionroot'].nunique())\n", "unique_contracts_per_day_clean.plot()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Previous data cleaning attempt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Our data has some zero values and missing entries that are inaccurate and could throw off our backtester, giving misleading results. We perform here a cleanup of the data." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "store_path = os.path.join(\"/Users/jrchatruc/Documents/backtester_options/allspx/\", \"options_data_v2_light.h5\")\n", "store = pd.HDFStore(store_path, complevel=9, complib=\"blosc\", fletcher32=True)\n", "underlying_dtype = pd.api.types.CategoricalDtype(\n", " categories=['SPX', 'SPXW', 'SPXPM'])\n", "\n", "offset = 0\n", "sizes = {\"optionroot\": 20, \"optionalias\": 20}\n", "for year in range(1990, 2019):\n", " filename = \"SPX_{}.csv\".format(year)\n", " year_df = pd.read_csv(os.path.join(\"/Users/jrchatruc/Documents/backtester_options/allspx/\", filename),\n", " parse_dates=[\"expiration\", \"quotedate\"])\n", " year_df.rename(columns={\" exchange\": \"exchange\"}, inplace=True)\n", " year_df = year_df.astype({\"strike\": \"float\", \"optionalias\": \"object\", \"type\": \"category\",\n", " 'underlying': underlying_dtype})\n", " year_df = year_df.drop('optionext', axis=1)\n", " year_df = year_df.drop('exchange', axis=1)\n", " year_df = year_df.reset_index(drop=True)\n", " year_df.index += offset\n", " offset += len(year_df)\n", " store.append(\"/SPX\", year_df, index=False, data_columns=True, min_itemsize=sizes)\n", " print(year)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "%cd -q /Users/jrchatruc/Documents/backtester_options/allspx\n", "!ptrepack --complevel=9 --complib=blosc options_data_v2_light.h5 options_data_v2_light_compressed.h5" ] }, { "cell_type": "code", "execution_count": 95, "metadata": {}, "outputs": [], "source": [ "data = HistoricalOptionsData(\"options_data_v2_light_compressed.h5\", key=\"/SPX\")\n", "schema = data.schema\n", "df = data._data" ] }, { "cell_type": "code", "execution_count": 96, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(16756680, 19)" ] }, "execution_count": 96, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.shape" ] }, { "cell_type": "code", "execution_count": 97, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.065681208926828" ] }, "execution_count": 97, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[(df['bid'] == 0) & (df['ask'] == 0)].shape[0] / df.shape[0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As can be seen, around $6.5\\%$ of the rows have both their bid and ask equal to zero. Some of these are because these values are going progressively down until they reach around $0.1$ or $0.05$, at which point they (sometimes) get replaced with zero. This isn't a problematic case, but it is not the only one." ] }, { "cell_type": "code", "execution_count": 98, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
underlyingunderlying_lastoptionroottypeexpirationquotedatestrikelastbidaskvolumeopeninterestimpliedvoldeltagammathetavegaoptionaliasdte
13359109SPX2276.98SPX191220P00100000put2019-12-202017-01-06100.00.150.100.15207730.31850.00000.00.00000.0000SPX191220P001000001078
13388755SPX2275.32SPX191220P00100000put2019-12-202017-01-11100.00.150.100.1507830.5958-0.00020.0-0.24542.4561SPX191220P001000001073
13400173SPX2270.44SPX191220P00100000put2019-12-202017-01-12100.00.150.100.1517830.5940-0.00020.0-0.24662.4588SPX191220P001000001072
13411669SPX2274.64SPX191220P00100000put2019-12-202017-01-13100.00.110.100.1507850.5963-0.00020.0-0.24582.4539SPX191220P001000001071
13423111SPX2267.89SPX191220P00100000put2019-12-202017-01-17100.00.100.100.1508050.5986-0.00020.0-0.24532.4442SPX191220P001000001067
............................................................
16740413SPX2351.10SPX191220P00100000put2019-12-212018-12-24100.00.050.050.10530145410.35000.00000.00.00000.0000NaN362
16744107SPX2467.70SPX191220P00100000put2019-12-212018-12-26100.00.050.000.100150590.32190.00000.00.00000.0000NaN360
16747947SPX2488.83SPX191220P00100000put2019-12-212018-12-27100.00.050.000.050150590.33140.00000.00.00000.0000NaN359
16751791SPX2485.74SPX191220P00100000put2019-12-212018-12-28100.00.050.000.05500150590.32560.00000.00.00000.0000NaN358
16755635SPX2506.85SPX191220P00100000put2019-12-212018-12-31100.00.050.000.051100155590.31880.00000.00.00000.0000NaN355
\n", "

497 rows × 19 columns

\n", "
" ], "text/plain": [ " underlying underlying_last optionroot type expiration \\\n", "13359109 SPX 2276.98 SPX191220P00100000 put 2019-12-20 \n", "13388755 SPX 2275.32 SPX191220P00100000 put 2019-12-20 \n", "13400173 SPX 2270.44 SPX191220P00100000 put 2019-12-20 \n", "13411669 SPX 2274.64 SPX191220P00100000 put 2019-12-20 \n", "13423111 SPX 2267.89 SPX191220P00100000 put 2019-12-20 \n", "... ... ... ... ... ... \n", "16740413 SPX 2351.10 SPX191220P00100000 put 2019-12-21 \n", "16744107 SPX 2467.70 SPX191220P00100000 put 2019-12-21 \n", "16747947 SPX 2488.83 SPX191220P00100000 put 2019-12-21 \n", "16751791 SPX 2485.74 SPX191220P00100000 put 2019-12-21 \n", "16755635 SPX 2506.85 SPX191220P00100000 put 2019-12-21 \n", "\n", " quotedate strike last bid ask volume openinterest \\\n", "13359109 2017-01-06 100.0 0.15 0.10 0.15 20 773 \n", "13388755 2017-01-11 100.0 0.15 0.10 0.15 0 783 \n", "13400173 2017-01-12 100.0 0.15 0.10 0.15 1 783 \n", "13411669 2017-01-13 100.0 0.11 0.10 0.15 0 785 \n", "13423111 2017-01-17 100.0 0.10 0.10 0.15 0 805 \n", "... ... ... ... ... ... ... ... \n", "16740413 2018-12-24 100.0 0.05 0.05 0.10 530 14541 \n", "16744107 2018-12-26 100.0 0.05 0.00 0.10 0 15059 \n", "16747947 2018-12-27 100.0 0.05 0.00 0.05 0 15059 \n", "16751791 2018-12-28 100.0 0.05 0.00 0.05 500 15059 \n", "16755635 2018-12-31 100.0 0.05 0.00 0.05 1100 15559 \n", "\n", " impliedvol delta gamma theta vega optionalias dte \n", "13359109 0.3185 0.0000 0.0 0.0000 0.0000 SPX191220P00100000 1078 \n", "13388755 0.5958 -0.0002 0.0 -0.2454 2.4561 SPX191220P00100000 1073 \n", "13400173 0.5940 -0.0002 0.0 -0.2466 2.4588 SPX191220P00100000 1072 \n", "13411669 0.5963 -0.0002 0.0 -0.2458 2.4539 SPX191220P00100000 1071 \n", "13423111 0.5986 -0.0002 0.0 -0.2453 2.4442 SPX191220P00100000 1067 \n", "... ... ... ... ... ... ... ... \n", "16740413 0.3500 0.0000 0.0 0.0000 0.0000 NaN 362 \n", "16744107 0.3219 0.0000 0.0 0.0000 0.0000 NaN 360 \n", "16747947 0.3314 0.0000 0.0 0.0000 0.0000 NaN 359 \n", "16751791 0.3256 0.0000 0.0 0.0000 0.0000 NaN 358 \n", "16755635 0.3188 0.0000 0.0 0.0000 0.0000 NaN 355 \n", "\n", "[497 rows x 19 columns]" ] }, "execution_count": 98, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# A (mostly) innocuous contract, its bid and ask values are always very close to zero, so them dipping into zero\n", "# is not a problem.\n", "df[df['optionroot'] == 'SPX191220P00100000']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This next contract, however, is a problem. On first inspection it looks fine, but it actually contains a lot of zero values intermingled." ] }, { "cell_type": "code", "execution_count": 99, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
underlyingunderlying_lastoptionroottypeexpirationquotedatestrikelastbidaskvolumeopeninterestimpliedvoldeltagammathetavegaoptionaliasdte
144SPX359.69SPX910622C00300000call1991-06-221990-01-02300.00.094.394.3000.00000.00000.00000.00000.0000SPX910622C00300000536
314SPX358.76SPX910622C00300000call1991-06-221990-01-03300.00.093.393.3000.00000.00000.00000.00000.0000SPX910622C00300000535
484SPX355.66SPX910622C00300000call1991-06-221990-01-04300.00.090.290.2000.00000.00000.00000.00000.0000SPX910622C00300000534
654SPX352.20SPX910622C00300000call1991-06-221990-01-05300.00.086.686.6000.00000.00000.00000.00000.0000SPX910622C00300000533
824SPX353.79SPX910622C00300000call1991-06-221990-01-08300.00.088.188.1000.00000.00000.00000.00000.0000SPX910622C00300000530
............................................................
68132SPX380.13SPX910622C00300000call1991-06-221991-06-17300.081.580.480.9137281.05310.98320.0010-0.24420.0173SPX910622C003000005
68330SPX378.59SPX910622C00300000call1991-06-221991-06-18300.00.078.579.0037271.44220.96080.0016-0.69670.0307SPX910622C003000004
68528SPX375.09SPX910622C00300000call1991-06-221991-06-19300.075.575.076.075637271.66340.95980.0017-0.95830.0260SPX910622C003000003
68726SPX375.42SPX910622C00300000call1991-06-221991-06-20300.00.075.076.0035571.81060.98240.0011-0.70400.0099SPX910622C003000002
68924SPX377.75SPX910622C00300000call1991-06-221991-06-21300.076.077.578.513235573.95470.97660.0012-3.77580.0063SPX910622C003000001
\n", "

373 rows × 19 columns

\n", "
" ], "text/plain": [ " underlying underlying_last optionroot type expiration \\\n", "144 SPX 359.69 SPX910622C00300000 call 1991-06-22 \n", "314 SPX 358.76 SPX910622C00300000 call 1991-06-22 \n", "484 SPX 355.66 SPX910622C00300000 call 1991-06-22 \n", "654 SPX 352.20 SPX910622C00300000 call 1991-06-22 \n", "824 SPX 353.79 SPX910622C00300000 call 1991-06-22 \n", "... ... ... ... ... ... \n", "68132 SPX 380.13 SPX910622C00300000 call 1991-06-22 \n", "68330 SPX 378.59 SPX910622C00300000 call 1991-06-22 \n", "68528 SPX 375.09 SPX910622C00300000 call 1991-06-22 \n", "68726 SPX 375.42 SPX910622C00300000 call 1991-06-22 \n", "68924 SPX 377.75 SPX910622C00300000 call 1991-06-22 \n", "\n", " quotedate strike last bid ask volume openinterest impliedvol \\\n", "144 1990-01-02 300.0 0.0 94.3 94.3 0 0 0.0000 \n", "314 1990-01-03 300.0 0.0 93.3 93.3 0 0 0.0000 \n", "484 1990-01-04 300.0 0.0 90.2 90.2 0 0 0.0000 \n", "654 1990-01-05 300.0 0.0 86.6 86.6 0 0 0.0000 \n", "824 1990-01-08 300.0 0.0 88.1 88.1 0 0 0.0000 \n", "... ... ... ... ... ... ... ... ... \n", "68132 1991-06-17 300.0 81.5 80.4 80.9 1 3728 1.0531 \n", "68330 1991-06-18 300.0 0.0 78.5 79.0 0 3727 1.4422 \n", "68528 1991-06-19 300.0 75.5 75.0 76.0 756 3727 1.6634 \n", "68726 1991-06-20 300.0 0.0 75.0 76.0 0 3557 1.8106 \n", "68924 1991-06-21 300.0 76.0 77.5 78.5 132 3557 3.9547 \n", "\n", " delta gamma theta vega optionalias dte \n", "144 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 536 \n", "314 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 535 \n", "484 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 534 \n", "654 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 533 \n", "824 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 530 \n", "... ... ... ... ... ... ... \n", "68132 0.9832 0.0010 -0.2442 0.0173 SPX910622C00300000 5 \n", "68330 0.9608 0.0016 -0.6967 0.0307 SPX910622C00300000 4 \n", "68528 0.9598 0.0017 -0.9583 0.0260 SPX910622C00300000 3 \n", "68726 0.9824 0.0011 -0.7040 0.0099 SPX910622C00300000 2 \n", "68924 0.9766 0.0012 -3.7758 0.0063 SPX910622C00300000 1 \n", "\n", "[373 rows x 19 columns]" ] }, "execution_count": 99, "metadata": {}, "output_type": "execute_result" } ], "source": [ "problematic = df[df['optionroot'] == 'SPX910622C00300000']\n", "problematic" ] }, { "cell_type": "code", "execution_count": 100, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
underlyingunderlying_lastoptionroottypeexpirationquotedatestrikelastbidaskvolumeopeninterestimpliedvoldeltagammathetavegaoptionaliasdte
824SPX353.79SPX910622C00300000call1991-06-221990-01-08300.00.088.188.1000.00000.00000.00000.00000.0000SPX910622C00300000530
994SPX349.62SPX910622C00300000call1991-06-221990-01-09300.00.083.883.8000.00000.00000.00000.00000.0000SPX910622C00300000529
1164SPX347.31SPX910622C00300000call1991-06-221990-01-10300.00.081.481.4000.00000.00000.00000.00000.0000SPX910622C00300000528
1334SPX348.53SPX910622C00300000call1991-06-221990-01-11300.00.082.682.6000.00000.00000.00000.00000.0000SPX910622C00300000527
1504SPX339.93SPX910622C00300000call1991-06-221990-01-12300.00.00.00.0000.00000.00000.00000.00000.0000SPX910622C00300000526
1674SPX337.00SPX910622C00300000call1991-06-221990-01-15300.00.070.870.8000.00000.00000.00000.00000.0000SPX910622C00300000523
1844SPX340.75SPX910622C00300000call1991-06-221990-01-16300.00.074.574.5000.00000.00000.00000.00000.0000SPX910622C00300000522
2026SPX337.40SPX910622C00300000call1991-06-221990-01-17300.00.071.171.1000.00000.00000.00000.00000.0000SPX910622C00300000521
2208SPX338.19SPX910622C00300000call1991-06-221990-01-18300.00.00.00.0000.00000.00000.00000.00000.0000SPX910622C00300000520
2391SPX339.15SPX910622C00300000call1991-06-221990-01-19300.00.00.00.0000.00000.00000.00000.00000.0000SPX910622C00300000519
2548SPX330.38SPX910622C00300000call1991-06-221990-01-22300.00.063.864.5000.09260.97760.0015-22.362820.9095SPX910622C00300000516
2705SPX331.61SPX910622C00300000call1991-06-221990-01-23300.00.065.065.5000.09040.98160.0013-22.365817.7692SPX910622C00300000515
2862SPX330.26SPX910622C00300000call1991-06-221990-01-24300.00.063.564.2000.08960.98060.0013-22.363618.4703SPX910622C00300000514
3022SPX326.08SPX910622C00300000call1991-06-221990-01-25300.00.00.059.7000.00000.00000.00000.00000.0000SPX910622C00300000513
3182SPX325.80SPX910622C00300000call1991-06-221990-01-26300.00.059.059.7000.08870.97470.0017-22.345722.7432SPX910622C00300000512
3344SPX325.20SPX910622C00300000call1991-06-221990-01-29300.00.058.259.3000.09570.96440.0021-22.376930.0972SPX910622C00300000509
\n", "
" ], "text/plain": [ " underlying underlying_last optionroot type expiration \\\n", "824 SPX 353.79 SPX910622C00300000 call 1991-06-22 \n", "994 SPX 349.62 SPX910622C00300000 call 1991-06-22 \n", "1164 SPX 347.31 SPX910622C00300000 call 1991-06-22 \n", "1334 SPX 348.53 SPX910622C00300000 call 1991-06-22 \n", "1504 SPX 339.93 SPX910622C00300000 call 1991-06-22 \n", "1674 SPX 337.00 SPX910622C00300000 call 1991-06-22 \n", "1844 SPX 340.75 SPX910622C00300000 call 1991-06-22 \n", "2026 SPX 337.40 SPX910622C00300000 call 1991-06-22 \n", "2208 SPX 338.19 SPX910622C00300000 call 1991-06-22 \n", "2391 SPX 339.15 SPX910622C00300000 call 1991-06-22 \n", "2548 SPX 330.38 SPX910622C00300000 call 1991-06-22 \n", "2705 SPX 331.61 SPX910622C00300000 call 1991-06-22 \n", "2862 SPX 330.26 SPX910622C00300000 call 1991-06-22 \n", "3022 SPX 326.08 SPX910622C00300000 call 1991-06-22 \n", "3182 SPX 325.80 SPX910622C00300000 call 1991-06-22 \n", "3344 SPX 325.20 SPX910622C00300000 call 1991-06-22 \n", "\n", " quotedate strike last bid ask volume openinterest impliedvol \\\n", "824 1990-01-08 300.0 0.0 88.1 88.1 0 0 0.0000 \n", "994 1990-01-09 300.0 0.0 83.8 83.8 0 0 0.0000 \n", "1164 1990-01-10 300.0 0.0 81.4 81.4 0 0 0.0000 \n", "1334 1990-01-11 300.0 0.0 82.6 82.6 0 0 0.0000 \n", "1504 1990-01-12 300.0 0.0 0.0 0.0 0 0 0.0000 \n", "1674 1990-01-15 300.0 0.0 70.8 70.8 0 0 0.0000 \n", "1844 1990-01-16 300.0 0.0 74.5 74.5 0 0 0.0000 \n", "2026 1990-01-17 300.0 0.0 71.1 71.1 0 0 0.0000 \n", "2208 1990-01-18 300.0 0.0 0.0 0.0 0 0 0.0000 \n", "2391 1990-01-19 300.0 0.0 0.0 0.0 0 0 0.0000 \n", "2548 1990-01-22 300.0 0.0 63.8 64.5 0 0 0.0926 \n", "2705 1990-01-23 300.0 0.0 65.0 65.5 0 0 0.0904 \n", "2862 1990-01-24 300.0 0.0 63.5 64.2 0 0 0.0896 \n", "3022 1990-01-25 300.0 0.0 0.0 59.7 0 0 0.0000 \n", "3182 1990-01-26 300.0 0.0 59.0 59.7 0 0 0.0887 \n", "3344 1990-01-29 300.0 0.0 58.2 59.3 0 0 0.0957 \n", "\n", " delta gamma theta vega optionalias dte \n", "824 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 530 \n", "994 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 529 \n", "1164 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 528 \n", "1334 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 527 \n", "1504 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 526 \n", "1674 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 523 \n", "1844 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 522 \n", "2026 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 521 \n", "2208 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 520 \n", "2391 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 519 \n", "2548 0.9776 0.0015 -22.3628 20.9095 SPX910622C00300000 516 \n", "2705 0.9816 0.0013 -22.3658 17.7692 SPX910622C00300000 515 \n", "2862 0.9806 0.0013 -22.3636 18.4703 SPX910622C00300000 514 \n", "3022 0.0000 0.0000 0.0000 0.0000 SPX910622C00300000 513 \n", "3182 0.9747 0.0017 -22.3457 22.7432 SPX910622C00300000 512 \n", "3344 0.9644 0.0021 -22.3769 30.0972 SPX910622C00300000 509 " ] }, "execution_count": 100, "metadata": {}, "output_type": "execute_result" } ], "source": [ "problematic[4:20]" ] }, { "cell_type": "code", "execution_count": 101, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(34, 19)" ] }, "execution_count": 101, "metadata": {}, "output_type": "execute_result" } ], "source": [ "problematic[problematic['bid'] == 0].shape" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Of $373$ total rows, $34$ of them have their bid equal to zero even though the non-zero values in between are never even close to zero. These types of contracts happen all throughout the dataset and need to be addressed. We will drop contracts that have an entry with both their ask and bid equal to zero. This means of course that we will also be dropping some contracts with correct values, but we are willing to make that tradeoff." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Here's an example of a contract with all its bid and ask entries set to zero." ] }, { "cell_type": "code", "execution_count": 102, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
underlyingunderlying_lastoptionroottypeexpirationquotedatestrikelastbidaskvolumeopeninterestimpliedvoldeltagammathetavegaoptionaliasdte
117271SPX409.76SPX920718P00250000put1992-07-181992-06-12250.00.0000.00.0000.5202-0.00080.0-0.00250.0035SPX920718P0025000036
117505SPX410.29SPX920718P00250000put1992-07-181992-06-15250.00.0310.00.025000.5463-0.00080.0-0.00280.0034SPX920718P0025000033
117743SPX408.32SPX920718P00250000put1992-07-181992-06-16250.00.0000.00.0000.5485-0.00080.0-0.00290.0033SPX920718P0025000032
117981SPX402.26SPX920718P00250000put1992-07-181992-06-17250.00.0000.00.002500.5408-0.00080.0-0.00290.0033SPX920718P0025000031
118219SPX400.96SPX920718P00250000put1992-07-181992-06-18250.00.0000.00.002500.5452-0.00090.0-0.00310.0033SPX920718P0025000030
118457SPX403.67SPX920718P00250000put1992-07-181992-06-19250.00.0000.00.002500.5618-0.00080.0-0.00320.0032SPX920718P0025000029
118645SPX403.40SPX920718P00250000put1992-07-181992-06-22250.00.0000.00.002500.5933-0.00080.0-0.00350.0030SPX920718P0025000026
118833SPX404.04SPX920718P00250000put1992-07-181992-06-23250.00.0000.00.002500.6072-0.00080.0-0.00370.0030SPX920718P0025000025
119021SPX403.84SPX920718P00250000put1992-07-181992-06-24250.00.0000.00.002500.6194-0.00080.0-0.00390.0029SPX920718P0025000024
119209SPX403.12SPX920718P00250000put1992-07-181992-06-25250.00.0000.00.002500.6311-0.00080.0-0.00400.0029SPX920718P0025000023
119397SPX403.45SPX920718P00250000put1992-07-181992-06-26250.00.0000.00.002500.6466-0.00080.0-0.00420.0028SPX920718P0025000022
119585SPX408.94SPX920718P00250000put1992-07-181992-06-29250.00.0000.00.002500.7150-0.00080.0-0.00490.0025SPX920718P0025000019
119773SPX408.14SPX920718P00250000put1992-07-181992-06-30250.00.0000.00.002500.7327-0.00080.0-0.00520.0025SPX920718P0025000018
119961SPX412.88SPX920718P00250000put1992-07-181992-07-01250.00.0000.00.002500.7704-0.00080.0-0.00560.0024SPX920718P0025000017
120149SPX411.79SPX920718P00250000put1992-07-181992-07-02250.00.0000.00.002500.7914-0.00080.0-0.00590.0023SPX920718P0025000016
120339SPX413.84SPX920718P00250000put1992-07-181992-07-06250.00.0000.00.002500.9286-0.00080.0-0.00800.0020SPX920718P0025000012
120529SPX409.16SPX920718P00250000put1992-07-181992-07-07250.00.0000.00.002500.9527-0.00080.0-0.00870.0019SPX920718P0025000011
120719SPX410.28SPX920718P00250000put1992-07-181992-07-08250.00.0000.00.002501.0074-0.00080.0-0.00970.0018SPX920718P0025000010
120909SPX414.22SPX920718P00250000put1992-07-181992-07-09250.00.0000.00.002501.0846-0.00080.0-0.01090.0017SPX920718P002500009
121099SPX414.62SPX920718P00250000put1992-07-181992-07-10250.00.0000.00.002501.1581-0.00080.0-0.01240.0016SPX920718P002500008
121289SPX414.87SPX920718P00250000put1992-07-181992-07-13250.00.0000.00.002501.5091-0.00080.0-0.02090.0012SPX920718P002500005
121479SPX417.68SPX920718P00250000put1992-07-181992-07-14250.00.0000.00.002501.7409-0.00080.0-0.02730.0010SPX920718P002500004
121669SPX417.10SPX920718P00250000put1992-07-181992-07-15250.00.0000.00.002502.0753-0.00080.0-0.03900.0009SPX920718P002500003
121859SPX417.54SPX920718P00250000put1992-07-181992-07-16250.00.0000.00.002502.7500-0.00080.0-0.06830.0007SPX920718P002500002
122049SPX415.62SPX920718P00250000put1992-07-181992-07-17250.00.0000.00.002505.4547-0.00080.0-0.27270.0003SPX920718P002500001
\n", "
" ], "text/plain": [ " underlying underlying_last optionroot type expiration \\\n", "117271 SPX 409.76 SPX920718P00250000 put 1992-07-18 \n", "117505 SPX 410.29 SPX920718P00250000 put 1992-07-18 \n", "117743 SPX 408.32 SPX920718P00250000 put 1992-07-18 \n", "117981 SPX 402.26 SPX920718P00250000 put 1992-07-18 \n", "118219 SPX 400.96 SPX920718P00250000 put 1992-07-18 \n", "118457 SPX 403.67 SPX920718P00250000 put 1992-07-18 \n", "118645 SPX 403.40 SPX920718P00250000 put 1992-07-18 \n", "118833 SPX 404.04 SPX920718P00250000 put 1992-07-18 \n", "119021 SPX 403.84 SPX920718P00250000 put 1992-07-18 \n", "119209 SPX 403.12 SPX920718P00250000 put 1992-07-18 \n", "119397 SPX 403.45 SPX920718P00250000 put 1992-07-18 \n", "119585 SPX 408.94 SPX920718P00250000 put 1992-07-18 \n", "119773 SPX 408.14 SPX920718P00250000 put 1992-07-18 \n", "119961 SPX 412.88 SPX920718P00250000 put 1992-07-18 \n", "120149 SPX 411.79 SPX920718P00250000 put 1992-07-18 \n", "120339 SPX 413.84 SPX920718P00250000 put 1992-07-18 \n", "120529 SPX 409.16 SPX920718P00250000 put 1992-07-18 \n", "120719 SPX 410.28 SPX920718P00250000 put 1992-07-18 \n", "120909 SPX 414.22 SPX920718P00250000 put 1992-07-18 \n", "121099 SPX 414.62 SPX920718P00250000 put 1992-07-18 \n", "121289 SPX 414.87 SPX920718P00250000 put 1992-07-18 \n", "121479 SPX 417.68 SPX920718P00250000 put 1992-07-18 \n", "121669 SPX 417.10 SPX920718P00250000 put 1992-07-18 \n", "121859 SPX 417.54 SPX920718P00250000 put 1992-07-18 \n", "122049 SPX 415.62 SPX920718P00250000 put 1992-07-18 \n", "\n", " quotedate strike last bid ask volume openinterest impliedvol \\\n", "117271 1992-06-12 250.0 0.000 0.0 0.0 0 0 0.5202 \n", "117505 1992-06-15 250.0 0.031 0.0 0.0 250 0 0.5463 \n", "117743 1992-06-16 250.0 0.000 0.0 0.0 0 0 0.5485 \n", "117981 1992-06-17 250.0 0.000 0.0 0.0 0 250 0.5408 \n", "118219 1992-06-18 250.0 0.000 0.0 0.0 0 250 0.5452 \n", "118457 1992-06-19 250.0 0.000 0.0 0.0 0 250 0.5618 \n", "118645 1992-06-22 250.0 0.000 0.0 0.0 0 250 0.5933 \n", "118833 1992-06-23 250.0 0.000 0.0 0.0 0 250 0.6072 \n", "119021 1992-06-24 250.0 0.000 0.0 0.0 0 250 0.6194 \n", "119209 1992-06-25 250.0 0.000 0.0 0.0 0 250 0.6311 \n", "119397 1992-06-26 250.0 0.000 0.0 0.0 0 250 0.6466 \n", "119585 1992-06-29 250.0 0.000 0.0 0.0 0 250 0.7150 \n", "119773 1992-06-30 250.0 0.000 0.0 0.0 0 250 0.7327 \n", "119961 1992-07-01 250.0 0.000 0.0 0.0 0 250 0.7704 \n", "120149 1992-07-02 250.0 0.000 0.0 0.0 0 250 0.7914 \n", "120339 1992-07-06 250.0 0.000 0.0 0.0 0 250 0.9286 \n", "120529 1992-07-07 250.0 0.000 0.0 0.0 0 250 0.9527 \n", "120719 1992-07-08 250.0 0.000 0.0 0.0 0 250 1.0074 \n", "120909 1992-07-09 250.0 0.000 0.0 0.0 0 250 1.0846 \n", "121099 1992-07-10 250.0 0.000 0.0 0.0 0 250 1.1581 \n", "121289 1992-07-13 250.0 0.000 0.0 0.0 0 250 1.5091 \n", "121479 1992-07-14 250.0 0.000 0.0 0.0 0 250 1.7409 \n", "121669 1992-07-15 250.0 0.000 0.0 0.0 0 250 2.0753 \n", "121859 1992-07-16 250.0 0.000 0.0 0.0 0 250 2.7500 \n", "122049 1992-07-17 250.0 0.000 0.0 0.0 0 250 5.4547 \n", "\n", " delta gamma theta vega optionalias dte \n", "117271 -0.0008 0.0 -0.0025 0.0035 SPX920718P00250000 36 \n", "117505 -0.0008 0.0 -0.0028 0.0034 SPX920718P00250000 33 \n", "117743 -0.0008 0.0 -0.0029 0.0033 SPX920718P00250000 32 \n", "117981 -0.0008 0.0 -0.0029 0.0033 SPX920718P00250000 31 \n", "118219 -0.0009 0.0 -0.0031 0.0033 SPX920718P00250000 30 \n", "118457 -0.0008 0.0 -0.0032 0.0032 SPX920718P00250000 29 \n", "118645 -0.0008 0.0 -0.0035 0.0030 SPX920718P00250000 26 \n", "118833 -0.0008 0.0 -0.0037 0.0030 SPX920718P00250000 25 \n", "119021 -0.0008 0.0 -0.0039 0.0029 SPX920718P00250000 24 \n", "119209 -0.0008 0.0 -0.0040 0.0029 SPX920718P00250000 23 \n", "119397 -0.0008 0.0 -0.0042 0.0028 SPX920718P00250000 22 \n", "119585 -0.0008 0.0 -0.0049 0.0025 SPX920718P00250000 19 \n", "119773 -0.0008 0.0 -0.0052 0.0025 SPX920718P00250000 18 \n", "119961 -0.0008 0.0 -0.0056 0.0024 SPX920718P00250000 17 \n", "120149 -0.0008 0.0 -0.0059 0.0023 SPX920718P00250000 16 \n", "120339 -0.0008 0.0 -0.0080 0.0020 SPX920718P00250000 12 \n", "120529 -0.0008 0.0 -0.0087 0.0019 SPX920718P00250000 11 \n", "120719 -0.0008 0.0 -0.0097 0.0018 SPX920718P00250000 10 \n", "120909 -0.0008 0.0 -0.0109 0.0017 SPX920718P00250000 9 \n", "121099 -0.0008 0.0 -0.0124 0.0016 SPX920718P00250000 8 \n", "121289 -0.0008 0.0 -0.0209 0.0012 SPX920718P00250000 5 \n", "121479 -0.0008 0.0 -0.0273 0.0010 SPX920718P00250000 4 \n", "121669 -0.0008 0.0 -0.0390 0.0009 SPX920718P00250000 3 \n", "121859 -0.0008 0.0 -0.0683 0.0007 SPX920718P00250000 2 \n", "122049 -0.0008 0.0 -0.2727 0.0003 SPX920718P00250000 1 " ] }, "execution_count": 102, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['optionroot'] == 'SPX920718P00250000']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Another issue are contracts with missing entries like the following, which stops showing up at 358 dte (it also has almost all rows with both ask and bid set to zero, so this is a particularly problematic contract)." ] }, { "cell_type": "code", "execution_count": 109, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
underlyingunderlying_lastoptionroottypeexpirationquotedatestrikelastbidaskvolumeopeninterestimpliedvoldeltagammathetavegaoptionaliasdte
1120981SPX1165.25SXG031220P01450000put2003-12-202002-01-031450.00.00.00.0000.1837-0.71890.0011-4.9932550.1433SXG031220P01450000716
1121467SPX1172.50SXG031220P01450000put2003-12-202002-01-041450.00.00.00.002000.1780-0.71980.0012-4.3687552.3557SXG031220P01450000715
1121957SPX1164.90SXG031220P01450000put2003-12-202002-01-071450.00.00.00.002000.1820-0.72300.0011-4.5666544.5476SXG031220P01450000712
1122447SPX1160.70SXG031220P01450000put2003-12-202002-01-081450.00.00.00.002000.1830-0.72650.0011-4.3912538.8742SXG031220P01450000711
1122940SPX1155.15SXG031220P01450000put2003-12-202002-01-091450.00.00.00.002000.1846-0.73040.0011-4.2222532.0289SXG031220P01450000710
............................................................
1265123SPX895.82SXG031220P01450000put2003-12-202002-12-201450.00.00.00.0024210.2241-0.96480.00021.531443.4461SXG031220P01450000365
1265633SPX897.38SXG031220P01450000put2003-12-202002-12-231450.00.00.00.0024210.2170-0.96660.00020.531336.1597SXG031220P01450000362
1266143SPX892.47SXG031220P01450000put2003-12-202002-12-241450.00.00.00.0024190.2175-0.96670.0002-0.183433.7203SXG031220P01450000361
1266653SPX889.66SXG031220P01450000put2003-12-202002-12-261450.00.00.00.0024190.2145-0.96510.0002-3.371728.2564SXG031220P01450000359
1267163SPX875.40SXG031220P01450000put2003-12-202002-12-271450.0550.0571.3574.3024190.2282-0.96250.0002-3.867532.5230SXG031220P01450000358
\n", "

249 rows × 19 columns

\n", "
" ], "text/plain": [ " underlying underlying_last optionroot type expiration \\\n", "1120981 SPX 1165.25 SXG031220P01450000 put 2003-12-20 \n", "1121467 SPX 1172.50 SXG031220P01450000 put 2003-12-20 \n", "1121957 SPX 1164.90 SXG031220P01450000 put 2003-12-20 \n", "1122447 SPX 1160.70 SXG031220P01450000 put 2003-12-20 \n", "1122940 SPX 1155.15 SXG031220P01450000 put 2003-12-20 \n", "... ... ... ... ... ... \n", "1265123 SPX 895.82 SXG031220P01450000 put 2003-12-20 \n", "1265633 SPX 897.38 SXG031220P01450000 put 2003-12-20 \n", "1266143 SPX 892.47 SXG031220P01450000 put 2003-12-20 \n", "1266653 SPX 889.66 SXG031220P01450000 put 2003-12-20 \n", "1267163 SPX 875.40 SXG031220P01450000 put 2003-12-20 \n", "\n", " quotedate strike last bid ask volume openinterest \\\n", "1120981 2002-01-03 1450.0 0.0 0.0 0.0 0 0 \n", "1121467 2002-01-04 1450.0 0.0 0.0 0.0 0 200 \n", "1121957 2002-01-07 1450.0 0.0 0.0 0.0 0 200 \n", "1122447 2002-01-08 1450.0 0.0 0.0 0.0 0 200 \n", "1122940 2002-01-09 1450.0 0.0 0.0 0.0 0 200 \n", "... ... ... ... ... ... ... ... \n", "1265123 2002-12-20 1450.0 0.0 0.0 0.0 0 2421 \n", "1265633 2002-12-23 1450.0 0.0 0.0 0.0 0 2421 \n", "1266143 2002-12-24 1450.0 0.0 0.0 0.0 0 2419 \n", "1266653 2002-12-26 1450.0 0.0 0.0 0.0 0 2419 \n", "1267163 2002-12-27 1450.0 550.0 571.3 574.3 0 2419 \n", "\n", " impliedvol delta gamma theta vega optionalias dte \n", "1120981 0.1837 -0.7189 0.0011 -4.9932 550.1433 SXG031220P01450000 716 \n", "1121467 0.1780 -0.7198 0.0012 -4.3687 552.3557 SXG031220P01450000 715 \n", "1121957 0.1820 -0.7230 0.0011 -4.5666 544.5476 SXG031220P01450000 712 \n", "1122447 0.1830 -0.7265 0.0011 -4.3912 538.8742 SXG031220P01450000 711 \n", "1122940 0.1846 -0.7304 0.0011 -4.2222 532.0289 SXG031220P01450000 710 \n", "... ... ... ... ... ... ... ... \n", "1265123 0.2241 -0.9648 0.0002 1.5314 43.4461 SXG031220P01450000 365 \n", "1265633 0.2170 -0.9666 0.0002 0.5313 36.1597 SXG031220P01450000 362 \n", "1266143 0.2175 -0.9667 0.0002 -0.1834 33.7203 SXG031220P01450000 361 \n", "1266653 0.2145 -0.9651 0.0002 -3.3717 28.2564 SXG031220P01450000 359 \n", "1267163 0.2282 -0.9625 0.0002 -3.8675 32.5230 SXG031220P01450000 358 \n", "\n", "[249 rows x 19 columns]" ] }, "execution_count": 109, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df[df['optionroot'] == 'SXG031220P01450000']" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Once again, we will drop contracts with missing entries." ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "unique_contracts_per_day = df.groupby('quotedate').apply(lambda x: x['optionroot'].nunique())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Let's plot the number of contracts per day to compare after the cleanup." ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "unique_contracts_per_day.plot();" ] }, { "cell_type": "code", "execution_count": 71, "metadata": {}, "outputs": [], "source": [ "# to_clean is a set with the contracts with missing entries to then drop.\n", "current_contracts = set()\n", "to_clean = set()\n", "for _, options in df.groupby('quotedate'):\n", " current_contracts = current_contracts.union(set(options['optionroot']))\n", " current_contracts = current_contracts.difference(set(options[options['dte'] <= 1]['optionroot']))\n", " missing_contracts = current_contracts.difference(set(options['optionroot']))\n", " to_clean = to_clean.union(missing_contracts)\n", "to_clean = to_clean.union(current_contracts)" ] }, { "cell_type": "code", "execution_count": 54, "metadata": {}, "outputs": [], "source": [ "to_clean_df = df[df['optionroot'].isin(list(to_clean))]" ] }, { "cell_type": "code", "execution_count": 55, "metadata": {}, "outputs": [], "source": [ "new_df = df.drop(to_clean_df.index)" ] }, { "cell_type": "code", "execution_count": 56, "metadata": {}, "outputs": [], "source": [ "new_df.reset_index(inplace=True, drop=True)" ] }, { "cell_type": "code", "execution_count": 57, "metadata": {}, "outputs": [], "source": [ "# Drop the contracts that have a row with both their ask and bid zero.\n", "contracts_with_zero = new_df[(new_df['ask'] == 0) & (new_df['bid'] == 0)]['optionroot'].unique()" ] }, { "cell_type": "code", "execution_count": 58, "metadata": {}, "outputs": [], "source": [ "final_df = new_df.drop(new_df[new_df['optionroot'].isin(contracts_with_zero)].index)" ] }, { "cell_type": "code", "execution_count": 59, "metadata": {}, "outputs": [], "source": [ "final_df.reset_index(inplace=True, drop=True)" ] }, { "cell_type": "code", "execution_count": 72, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0.6339574482236837" ] }, "execution_count": 72, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_df['optionroot'].nunique() / df['optionroot'].nunique()" ] }, { "cell_type": "code", "execution_count": 64, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(9245562, 19)" ] }, "execution_count": 64, "metadata": {}, "output_type": "execute_result" } ], "source": [ "final_df.shape" ] }, { "cell_type": "code", "execution_count": 103, "metadata": {}, "outputs": [], "source": [ "unique_contracts_per_day_final = final_df.groupby('quotedate').apply(lambda x: x['optionroot'].nunique())" ] }, { "cell_type": "code", "execution_count": 105, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "unique_contracts_per_day_final.plot();" ] }, { "cell_type": "code", "execution_count": 66, "metadata": {}, "outputs": [], "source": [ "store_path = os.path.join(\"/Users/jrchatruc/Documents/backtester_options/allspx/\", \"options_data_v2_pruned.h5\")\n", "store = pd.HDFStore(store_path, complevel=9, complib=\"blosc\", fletcher32=True)" ] }, { "cell_type": "code", "execution_count": 68, "metadata": {}, "outputs": [], "source": [ "sizes = {\"optionroot\": 20, \"optionalias\": 20}\n", "store.append(\"/SPX\", final_df, index=False, data_columns=True, min_itemsize=sizes)" ] }, { "cell_type": "code", "execution_count": 69, "metadata": {}, "outputs": [], "source": [ "store.close()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.5" } }, "nbformat": 4, "nbformat_minor": 4 }