{ "cells": [ { "cell_type": "markdown", "id": "1891c5a3", "metadata": {}, "source": [ "\n", "# SPXW Dataset Demo\n", "\n", "This notebook demonstrates the simplified `spxw` loader from `volkit.datasets`.\n", "\n", "With the new API there are only two modes:\n", "- **Compact (default):** most relevant columns.\n", "- **Full (`full=True`):** everything, including dates, bid/ask sizes, and open interest.\n", "\n", "We also show filters on:\n", "- **Days-to-expiry (`D`)**\n", "- **Minimum volume (`min_volume`)**\n", "- **Custom CSV path (`data_path`)**\n" ] }, { "cell_type": "code", "execution_count": 1, "id": "89b24763", "metadata": {}, "outputs": [], "source": [ "\n", "from volkit.datasets import spxw\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "\n", "pd.set_option(\"display.max_columns\", 50)\n" ] }, { "cell_type": "markdown", "id": "0541c2b6", "metadata": {}, "source": [ "\n", "## 1. Load defaults (compact schema)\n", "\n", "Compact mode includes:\n", "- `K, D, T`\n", "- `F_bid, F_ask`\n", "- `C_bid, C_ask, P_bid, P_ask`\n", "- `C_vol, P_vol`\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "957a22d5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Rows: 5192\n", "Columns: ['K', 'D', 'T', 'F_bid', 'F_ask', 'C_bid', 'C_ask', 'P_bid', 'P_ask', 'C_vol', 'P_vol']\n" ] }, { "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", "
KDTF_bidF_askC_bidC_askP_bidP_askC_volP_vol
0170000.02917.82918.421209.11229.20.00.0500
1180000.02917.82918.421109.11129.20.00.0500
2185000.02917.82918.421059.11079.20.00.0500
3190000.02917.82918.421009.11029.20.00.0500
4195000.02917.82918.42959.1979.20.00.0500
5200000.02917.82918.42915.5920.80.00.0500
6205000.02917.82918.42865.6870.70.00.0500
7210000.02917.82918.42815.5820.80.00.0500
\n", "
" ], "text/plain": [ " K D T F_bid F_ask C_bid C_ask P_bid P_ask C_vol P_vol\n", "0 1700 0 0.0 2917.8 2918.42 1209.1 1229.2 0.0 0.05 0 0\n", "1 1800 0 0.0 2917.8 2918.42 1109.1 1129.2 0.0 0.05 0 0\n", "2 1850 0 0.0 2917.8 2918.42 1059.1 1079.2 0.0 0.05 0 0\n", "3 1900 0 0.0 2917.8 2918.42 1009.1 1029.2 0.0 0.05 0 0\n", "4 1950 0 0.0 2917.8 2918.42 959.1 979.2 0.0 0.05 0 0\n", "5 2000 0 0.0 2917.8 2918.42 915.5 920.8 0.0 0.05 0 0\n", "6 2050 0 0.0 2917.8 2918.42 865.6 870.7 0.0 0.05 0 0\n", "7 2100 0 0.0 2917.8 2918.42 815.5 820.8 0.0 0.05 0 0" ] }, "execution_count": 2, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "df = spxw()\n", "print(\"Rows:\", len(df))\n", "print(\"Columns:\", list(df.columns))\n", "df.head(8)\n" ] }, { "cell_type": "markdown", "id": "b2330e85", "metadata": {}, "source": [ "\n", "## 2. Full schema (`full=True`)\n", "\n", "Full mode additionally includes:\n", "- `quote_date`, `expiration_date`\n", "- bid/ask sizes for C/P\n", "- open interest for C/P\n" ] }, { "cell_type": "code", "execution_count": 3, "id": "c659bde8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Rows: 5192\n", "Columns: ['K', 'D', 'T', 'F_bid', 'F_ask', 'C_bid', 'C_ask', 'P_bid', 'P_ask', 'C_vol', 'P_vol', 'quote_date', 'expiration_date', 'C_bid_size', 'C_ask_size', 'P_bid_size', 'P_ask_size', 'C_oi', 'P_oi']\n" ] }, { "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", "
KDTF_bidF_askC_bidC_askP_bidP_askC_volP_volquote_dateexpiration_dateC_bid_sizeC_ask_sizeP_bid_sizeP_ask_sizeC_oiP_oi
0170000.02917.82918.421209.11229.20.00.05002019-06-262019-06-26787801699024
1180000.02917.82918.421109.11129.20.00.05002019-06-262019-06-2678780595604333
2185000.02917.82918.421059.11079.20.00.05002019-06-262019-06-26787807956011328
3190000.02917.82918.421009.11029.20.00.05002019-06-262019-06-26797905067203240
4195000.02917.82918.42959.1979.20.00.05002019-06-262019-06-267878020840382
5200000.02917.82918.42915.5920.80.00.05002019-06-262019-06-261010024517705
6205000.02917.82918.42865.6870.70.00.05002019-06-262019-06-26101001782063
7210000.02917.82918.42815.5820.80.00.05002019-06-262019-06-26101001767055
\n", "
" ], "text/plain": [ " K D T F_bid F_ask C_bid C_ask P_bid P_ask C_vol P_vol \\\n", "0 1700 0 0.0 2917.8 2918.42 1209.1 1229.2 0.0 0.05 0 0 \n", "1 1800 0 0.0 2917.8 2918.42 1109.1 1129.2 0.0 0.05 0 0 \n", "2 1850 0 0.0 2917.8 2918.42 1059.1 1079.2 0.0 0.05 0 0 \n", "3 1900 0 0.0 2917.8 2918.42 1009.1 1029.2 0.0 0.05 0 0 \n", "4 1950 0 0.0 2917.8 2918.42 959.1 979.2 0.0 0.05 0 0 \n", "5 2000 0 0.0 2917.8 2918.42 915.5 920.8 0.0 0.05 0 0 \n", "6 2050 0 0.0 2917.8 2918.42 865.6 870.7 0.0 0.05 0 0 \n", "7 2100 0 0.0 2917.8 2918.42 815.5 820.8 0.0 0.05 0 0 \n", "\n", " quote_date expiration_date C_bid_size C_ask_size P_bid_size P_ask_size \\\n", "0 2019-06-26 2019-06-26 78 78 0 1699 \n", "1 2019-06-26 2019-06-26 78 78 0 5956 \n", "2 2019-06-26 2019-06-26 78 78 0 7956 \n", "3 2019-06-26 2019-06-26 79 79 0 5067 \n", "4 2019-06-26 2019-06-26 78 78 0 2084 \n", "5 2019-06-26 2019-06-26 10 10 0 2451 \n", "6 2019-06-26 2019-06-26 10 10 0 1782 \n", "7 2019-06-26 2019-06-26 10 10 0 1767 \n", "\n", " C_oi P_oi \n", "0 0 24 \n", "1 0 4333 \n", "2 0 11328 \n", "3 20 3240 \n", "4 0 382 \n", "5 7 705 \n", "6 0 63 \n", "7 0 55 " ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "df_full = spxw(full=True)\n", "print(\"Rows:\", len(df_full))\n", "print(\"Columns:\", list(df_full.columns))\n", "df_full.head(8)\n" ] }, { "cell_type": "markdown", "id": "6c683812", "metadata": {}, "source": [ "\n", "## 3. Filter by days-to-expiry `D`\n", "\n", "First list available `D` values, then load a single slice.\n" ] }, { "cell_type": "code", "execution_count": 4, "id": "34e31337", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Available D values: [0, 2, 5, 7, 9, 12, 14, 16, 19, 21] ...\n", "Rows with D=0: 161\n" ] }, { "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", "
KDTF_bidF_askC_bidC_askP_bidP_askC_volP_vol
0170000.02917.82918.421209.11229.20.00.0500
1180000.02917.82918.421109.11129.20.00.0500
2185000.02917.82918.421059.11079.20.00.0500
3190000.02917.82918.421009.11029.20.00.0500
4195000.02917.82918.42959.1979.20.00.0500
5200000.02917.82918.42915.5920.80.00.0500
6205000.02917.82918.42865.6870.70.00.0500
7210000.02917.82918.42815.5820.80.00.0500
\n", "
" ], "text/plain": [ " K D T F_bid F_ask C_bid C_ask P_bid P_ask C_vol P_vol\n", "0 1700 0 0.0 2917.8 2918.42 1209.1 1229.2 0.0 0.05 0 0\n", "1 1800 0 0.0 2917.8 2918.42 1109.1 1129.2 0.0 0.05 0 0\n", "2 1850 0 0.0 2917.8 2918.42 1059.1 1079.2 0.0 0.05 0 0\n", "3 1900 0 0.0 2917.8 2918.42 1009.1 1029.2 0.0 0.05 0 0\n", "4 1950 0 0.0 2917.8 2918.42 959.1 979.2 0.0 0.05 0 0\n", "5 2000 0 0.0 2917.8 2918.42 915.5 920.8 0.0 0.05 0 0\n", "6 2050 0 0.0 2917.8 2918.42 865.6 870.7 0.0 0.05 0 0\n", "7 2100 0 0.0 2917.8 2918.42 815.5 820.8 0.0 0.05 0 0" ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "df_all = spxw()\n", "unique_D = sorted(df_all[\"D\"].unique().tolist())\n", "print(\"Available D values:\", unique_D[:10], \"...\" if len(unique_D) > 10 else \"\")\n", "some_D = unique_D[0]\n", "df_D = spxw(D=some_D)\n", "print(f\"Rows with D={some_D}:\", len(df_D))\n", "df_D.head(8)\n" ] }, { "cell_type": "code", "execution_count": 5, "id": "59569c69", "metadata": {}, "outputs": [ { "data": { "image/png": "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KoBRIKRt13lGQbTKnjp1qv0ueLF69eqLLpZomzWBqFeRCugSsm3bNt957brrrvNU1ieffGLuvPNOe4yE2+effx7v4y1btjRvvPGG3V9yzz33mOQarEcy4NWx8eGHH5qYmBhz+PBhe1/HqY6XQ4cOmWuvvdZ88803IV/M07k+c+bMvuNv+fLlZsKECb4LAt26dQv5exvJsq9WUKrPtXr16iYlOHr0qJkxY4Zv/+scquPKi0gd+3FxcaZfv362LNX7xK2aFy9e3IwZM8Y0a9bMePXvv//abfY/56seFdZAXUEF4lerVi3nsccec+Li4i5apse07Kabbgq5/C1btjglSpRw0qRJ46RNm9a57bbbnN27d/uW79271z4eqgoVKjiHDh2yf+/YscMpWbKkExMT49SsWdPJnTu3kz9/fufPP/8MuXx3u8uWLeu8/PLLzp49e5xwuvnmm50hQ4b47r/33nv2M5HDhw87VatWdZ588smQy9e+1r7Qe0iXLp3Tvn1758SJE2Hb/2+88Ua8N71W//79ffdDtXPnTufAgQO++998843Ttm1b55ZbbnHatWvnrFixwvHqn3/+cd59912nU6dOzh133OE0bdrU6d69u7Nw4UJP5R47dizR2/Llyz3t+3vvvde55557nJ9//tl56qmn7HdBj507d845c+aM06xZM+ehhx4KqeycOXM6v/32m/379ttvd3r16hWwfMCAAfbYDdUNN9zgvPDCC/bvDz/80ImNjXWGDRvmW/7aa6/ZYz9U+/bts8eIvr86/9x444325p6LtEzrhGrz5s22LH1+ZcqUseeY6tWrO9myZXOyZs3q5M2b17f/QtG1a1ff91THZ6tWrexrueejevXqBXyPr5TK0WfcpUsX5/vvvw+5nITKdrc1oZuX4/5S1q9f76n8Tz75xJ6/8uTJ42TPnt1ZsGCBPT4bNmzoNGnSxC774IMPQi5f79899vQ5V6xY0fcbpfOdjqMnnngi5PJ1nH/xxRf2708//dTuC50n+vbt67Ro0cLJkCGDb3lyKtv12WefxXvTfn/zzTd9973s/9KlSzsvvviis2vXLiecdO599tlnbfn63dXvij+vv7faxzNmzLB/b9iwwZ5n8uXLZ+sMBQoUcAoWLOj8+uuvyfLY79u3r/2N0vGhclUXfOWVV5xNmzY5AwcOdDJlyuTMmzcv5G2/cOGC89xzz9ntDT7f6DH9ZmmdcCCoSETmzJnth5oQLdM6oWrevLlz11132Yrh77//bv8uVaqU89dff4XlS+Z/glYls06dOs7Ro0ftff3o6svw4IMPeipflcuePXvaL7BOmjqJ6osRjgM0S5Yszh9//OG7rzL1GtovMn/+fKdw4cIhl//www/bE86aNWvsF1k/WDVq1LABi+h19B5DpecWLVrUBnP+Nz1epEgR+7c+71BF+kdMx6Qqhwo+ixUrZrdbx6j2mU6g999/v3P+/PmQynYrTwndvFau9GPy448/2r9Pnjxpy1Og4vruu++c4sWLh1S2KsfueUE/Vqqo+du6dav90QmVyt+2bZvv4oU+RwVHLn0nvJSvSnjt2rVt5T+YHtN54r777kuWAZ3ouHDPawrO9R1bvHixc+rUKefbb7+1lZZ+/fqFXL6OFQVx1apVs39XqlTJGTVqlHPw4EHHKwXm+g4FB23p06d3Nm7c6Ln8SAfrkQ54/X+zypUrd1EFWb83Xs6Z+m65QYrOY7oY5m/MmDH2c09uZV+toFTPVzCtc76OSR2rs2fPdv7991/Hq8GDB9vz5auvvmoruLrAqQuzLq+/t7ly5fKdl++88057ge3s2bP2vs49nTt3dho3bpwsj/1ChQrZi4Kuv//+257jdb4UvY7O2aFSMKffxAkTJtjfFl2M0U1/v/XWW/bz7tOnjxMOBBWJUKVvypQpCS7XMlW6QqUP0r+yoAqErsKosqOKQziDimuuucZWwv2pYqXKYjjK15d2+vTpvohdlf3//ve/tmIaKu1bVRL8Wxb0mvoyiL4QXoI6beOqVat8990Kj04MauHxuv8ff/xxW1bw1ZFwVSAi/SOmE7Peg9tSp/L1mOhKs74f+qEIha4E60rM0qVL47298847nva9AlI3OBedoFXZd6nlTld/QlG/fn1nxIgR9m9VwIPPETNnzgw5YBFdUVu7dq39WwGujvklS5b4lq9evdquEyrtix9++CHB5XptL0FLJAO64PPOdddd50ybNi1guSqi1157bVjK177QFXNVIHS8KJAOPo9eqZEjR9rzrn/AH65zQqSD9UgHvNq+/fv3+34fdcXZ3/bt20P+3ooqsj/99JOvfPdvl84Rak1LbmVfraDUPfZ1sUjnMbVM6/dcwYAqnepdESq1Wvof86ob6LGOHTvaY8nr763O+e45XpX04HOctl2fUXI89nPkyHHRBVR9pm7vD322Xo4dfX5z585NcLmW6ZgNB4KKRKg5UScwdbHRD5WawnXT33pMB/HYsWNDLl8HUnzNcd26dbNX3xS5eg0q3BO0KtC//PLLRSdoL5Vy/x9ff6rMqbLpdoEIlVpAVGn4+uuv7ZVIdWuoW7duwBdBVyW9nCSCu2HoZKoWpOuvv96eMLx2RZg1a5atQKiCH+4fgEj/iOm5/vtHV310InWv2Kp1RIFFKPQ5KqhIiK7+e7lqpePCvyI7btw45/jx477769atC7lirm5l2vc6xvW5qpVOzcdq+h40aJCtgCb23i5FV/EVJL7//vs2yFWgrm6WugqnlgR1ufLSkqDmewVuCVEAo3WSY0AXfF7Tvo+v4qltCOd57fTp087UqVPtcatzQqjHvUtBl7r26EqtWljCdU6IdLAe6YBX5akiq5ZWXXkObmnV768qSKFSC5rbiqXvVXD3U+0fdedNbmVfzaA0+NjXVXNdKdeFSR07t956a0hl6zvpVsr9y9YFAPWkUHcrL8emzplvv/22/VsX09TC4k8XA7wcm5E89uvUqeNrBfFvCXGp7qbvg5ffcv8AKJjqDqoPhQNBxSV89NFH9mDVl9ZtXtTfekxX5r1Qv0L9UMVHgYUOKq9BReXKle0XTD/suvLgb9myZbYbjpfyE+t7rWjey1U9ddFq3bq1b9/ri+c/BkR9DD/++OOQy9e+Cd4n/oGFrqaGo3+zTpy6uq2rTLryEK4fgEj/iCkQVeXbdeTIEfs5uJVzfRahVg518k9sPImuWvmPp7lSamHR+0/I8OHDbeUlVAosVNEP7nqg79Po0aMdL/TeGzVqZL+z+lzVZVHjWPzHMPlX0q/Uf/7zHxvwK+BVlxiX/tZjqjDr9ZJjQCfaD/p8NZZFwXTwOUblK9gIR/eq+OgKq1phvVKLq96HPk9dDQ7HOSHSwXqkA15dtfa/Bf/GqhuHXjNUuoingFldX59//nn7HdN70hgCPabz2aRJk5Jd2VcrKL3Usa/uZ+pWFAp1W4tvLJ6CCQUWOud5+b2dM2eOHSuqfaybzmP/93//Z1tGJ06caAMxHT/J8dhfuHChPT7UpVnjKfR5qsulS13GVIcIlX7r1PXLfwymS4+5LWDhQFBxmdS9R91vdNPf4fDSSy/5upPER83uXn4AVCnzvwU3fz3zzDNOmzZtQi5fX9pw9DO+FF0l9DLwMiFqzk2oj6UCC1Xavez/4ABLn7cqU+GqQET6R6xDhw72RKmTpgKIBx54IKA7la58euk+l5T0fvyTIoRKV8x19VRBRvBVuHBT87iuWIU6jsW/m5+6WWbMmNH+iKu1Ujf9rcd03nH78ibHgE7HpCrP7i34tfRd0DqRulgSbm7LdzheM9LBeqQD3ktRdzr9Hnih7dPvnnoKuBcD1AKri1bBV7dDKVvnyUiUfTWC0kge+xrT8MgjjyR44U1dobxexNNFQvXyCB53ovObxnd5GRsS6WN//fr19mLF008/7bmLZTC1DqvXh4IV/YYriNBNf+sx9czQOuFASlmkWkqvprTAOXPmTHD5rl27wpo7XunoNOeGUjrmypXLc3maI2HAgAHmyy+/NCdPnrSPKYVnzZo1zbPPPmvn8wjV/v37zb333mtWrVpl82Qr3aXSglarVs0unzlzps2nrdTCiD7Hjx+3x6N/ekGlk0zo+xDO9K9Kvan0r5Hw559/mowZM5qiRYuG9Py//vrLpnG8mrnhtb1KV6m0xNFI+1zn0vLly9vzTzRQ1UfnOKXzVBrYcKbVjGTZ8aUpXrJkienfv7/Jnz+/p7KWLVtmbr755oh8hvpeKaV3QmlXd+/ebRYsWGA6dOjg6XWUhvyHH36wx6T2v84zOq95TT0f7cd+XFycTWX//fffX5RGvHHjxnZejHAgqAASoDkOBg8ebCc2S+7lR/JH7Pfff7fzC4T7pBnpOVoiWX40b7ts2rTJ/rjoB0Wfq37sNU+CPueHHnrI5r334mqVr0lINUdItGx/7969431cZatcd96gkSNHmuQ4N1Fi5RcuXNi0adPGU/mqDOpiizt55HvvvRcw14Pmh9FrJFdM1orkNjfOVReW9g4gBfKa0z2py1dzpuaXSI7lR3qOlkiWH83bLkp8oG5O6n+sbgG6r4xNSjGtfrvqSrFo0SLKj0D5+kyVEc6/+5Zuelxj7PS3ElIk17mJgsvXcRrO8tUNQ+m9Rd3aNLhXXcPGjx9vu6+o60nw/AZXSskVNCeRBsOKxjXqfSmFrVIUh9q9UKnJtS+UmlxzvbhzH6k7lMZHqguU/9iiSNC5YejQoZ7L0Zwg8XU5VtdvjcUMJ4218DJvTWJdjpXgRV0CNag9HN3WVY7mjXCzUuo8oC7s6g6l1KzJcW4ct1uYxt5cDQQVSLUSmkjIvWmglJfKW6TLj+agKNJztESy/GjedlG+c+WJF1WslFXEf+CxBv+r7zDlh798jSfRZxkclEQie0+k5iaKZPkKIpS9S9Tf283m41KGNQ1QDpXG22i8g+Zq0fg2pcnWuDRl3tGYNwWPyuCWHCdrvRrn/EhOCBvpyWBVuXePRQW+2vc6XvWZapvLly/vyxoXCs3xoO+pgkYFAPp8dSw9+uijdmyLjt3RISbpiOTcOFcjaPFHUIFU62pMJBTJ8qM5KIr0HC2RLD+at1304+LOH+PmQ/fP6a7B4F7SdlJ+4pR6UtluNCDTvXoaiaAi0nMTRaJ8VfDdtJ36HsQ3saSXdMHKTKaZkUVlq0KrbD4uZT/TgOHkOFmrm/ozsZuyZXk5N0RyQthITwYb6dnYVZ4b5KoFRK2Y/lMKKClKhQoVkuXcOJEOWvwRVCDV0glecy0klrbPywk60uVHc1AU6TlaIll+NG+7W2n2z1KiLiX+lSGv89dQ/qXp6q8qcOruoyBFlc9wBRWRnpsokuUre52yBIkqU5r/xZ9aE5QKPFxzqGi/+89zou0PdW6fSE/WeqlzcjgmN4zkhLCRngw20rOxx3fs+B//+nyzhnjsRHpunEgHLf7CM9wbiELKCKHBsAlR9hcveQwiXb4GXs6aNcsOzo7vpkGPXkSyfA1+Xbt27UWPv/nmmzbj1D333ONp2yNZfjRvu5QsWdIOvnetXLnSZjtyaVCsl8xMlH9p2bNnN1OmTLEZexo2bGgz1oRLgwYNzA033GCze23ZsuWiDDxeB2pHsvxXXnnFLFq0yNx+++0229zrr79ubr31VvPYY4/Zx4YMGWJefvnlkMtXtptff/3V/q3PWPvdvS8bN24MOYOSBmM/8cQTZu7cuTYbU7t27ew2Z8mSxS7XvipSpIjxQokb3nnnHZtBLfimLERz5szxVP6xY8cCshJmypTJ/gboO1GvXj2bDCRUGnA/aNAgm/1J57JIcDO2HTlyxJQuXTpgWZkyZWyGqVDpuNbxLSpH2SF1LnBpWe7cuT1ttz9lyGvfvr09lnTstG3b1oSD6iXjxo2ziQR0LB04cMDccccdvuQIXiXf/FdAhCnlqrKXJEQnIX2hk2v5btCiimYkg6JIlN+iRQvz4Ycf2pNmMP3gKGjRj1CoIll+NG+7dO3aNaASe9111wUs//rrrz1lT6L8y6dMRrfccov9noUjdbWyyQUHL/6++OILW0lPruUrg9SPP/5oAweVpfPL6tWrbaY8pTr97rvvTI0aNUIuXxV9ZU3TOU3BS58+fcwzzzxjDh06ZM9nL774ornvvvtCKvuFF16wFbVmzZrZ40eZw95//33fcpU/fPhw44XOyarQJnSsHD161NM5X5mqfv75Z1O2bFnfY8r4N2PGDHP//febu+++23ihc9uNN95oPwOlQZ80aZIJJ2XYUiB0/vx5G2hVqlTJt0xpVGNjY0MuW8dM586dbcpbpfHVe3j66adthi99tvq9b9y4cUhlX+ozU11Bx2aoEgtadFP2tnB9FqSUBaLU8uXLbdCiqwzx0TJd8dbVsuRYPgBcTQrIFbCo9UnpiPv162emT59ugwvNNaCAQIF7tmzZQn4NpXzWVezggCscNE+QzrtKPxwfXaFXhTfUuR769u1r1q9fb+czCKb31KpVKxvsaT96oWqnPof//e9/9kq5Apng1NlXqlOnTgH3laK1devWvvv6jPU6akkKhfZ7r169fMfOmDFj7PY/99xzNojR7+D06dNDaumK9Nw4CnwUVHmdx+RyEFQAAACkcld7QthwTwZ7qaBA84ToCn04KYhUUBGpyfXC4WpO6MmYCgAAgCinbmKPPPJIyM9XV6eEAgpR966hQ4eacFF3rp49e9qAwuu2X8rhw4fNf/7zn7CXqyBFAYXX7T99+rQNsPzH+PgHLlOnTg25bAWBmsBTXZz0v+h/dfXUNi9evNiECy0VAAAAUe6nn36yg+jDOfD/apUfzdvutfzffvvNjsfQwG+1Jmic1UcffeRLCLFv3z473ijUbVeXL40JUZc8tUSpG51ah6pUqWK7si1btszMnz8/LGPFGKgNAACQzGm8RGKUASq5lh/N2x7p8vv27WsTQmiMogbbP/XUUzYxwdKlSwMyz4Vq2LBhdiC5kgkoWFEmKbVSuIO/lYVOY1zCEVTQUgEAAJDMuZmGEqu2aXmoV7QjWX40b3ukyy9QoIBZuHChqVy5sr2v11BXra+++spmiFTiAC8tFTExMXb8irJIqWVCGbKUVa1atWp2+YYNG2xqaw3m9ooxFQAAAMlcNM9NFM3bHunyT58+bcez+Acn48ePt9nIlFVK3aO8cgdpKzjSOBAFGi6NCdEcJeFAUAEAAJDMRfOErdG87ZEuv3yUT3jqjzEVAAAAyVw0T9gazdse6fJbRPmEp/4YUwEAAADAE7o/AQAAAPCEoAIAAACAJwQVAAAAADwhqAAAAADgCUEFAETQuXPnbGaQFStWhK1MpQgcPXq0ibS6deva2V2vhu3bt9u0jOvXr78qrxftwrW/fv31V1O0aNFEM9sAwOUgqACARHTs2NFW3nTLkCGDnf20UaNGZuLEiTbV36UoFWCpUqVMnTp1rsr2IvkHa+FQrFgxs2fPnovSQ16pihUrmptuusmMHDkybNsGIHUiqACAS7jjjjtsBU5Xh5XTu169eqZnz57m7rvvNv/++2+Cz1PGbuUZ79y5s0mN9P4T2z8IXbp06UzBggUDZuINdd936tTJzuDLZwXAC4IKALiETJky2QpckSJFzA033GD++9//ms8++8wGGJMnT07weZqB9Y8//jB33XVXwON///23efDBB03u3LlNtmzZTI0aNcyqVavsMq2vWVTVIpI9e3ZTs2ZNs3DhwkS37+jRo+bRRx81+fLlMzlz5rQTGf3000++5UOGDDFVq1Y17733nr0aHxMTY9q0aWNOnDjhW0fdXx5++GH7mppd9fXXX7/odfR8bWuOHDns/mjbtq3Zv3+/b/nSpUtti472i2ag1X779ttv493m1atXm2rVqpnMmTPbMn/88ceA5ZqsScGYWnmyZMliypUrZ9544w3f8m+++ca2HO3duzfgeequdeutt9q///rrL9OsWTOTK1cuu58rVapkvvrqqwS7emn9Xr16+VqmXJ988ol9rt6P9l98+yaYjg8dK3p/11xzjRk6dKiv0j5s2DBTuHBhc+jQId/6OkYUrLqtX3p9VfTvvPNO+/5VxsyZMxPs/hTfvn///fdN2rRpL5qtV60xJUqU8L2WWt4OHz5sli1bdsn3BQAJIagAgBCo4l6lShUza9asBNdZvny5ufbaa20l3HXy5Elz++23m127dpnPP//cVv779Onjq+BpedOmTc2iRYtsRVutJKoY79ixI8HXuf/++23lXhVKBTKqzDZo0MBWFF0KVj799FMzZ84ce1MF8uWXXw6YMVaPqTI8f/58W0n94YcfAl7n/Pnz5vnnn7fbrLJUsVX3sGD9+vWzZW/atMlcf/31Fy3Xe1Qrj7reaHsV9DzzzDMB62h/qK//jBkzbL//QYMG2WDu448/tstvu+02W9FWoOO/fR988IF55JFH7P1u3bqZs2fP2gDkl19+Ma+88ooNmuKjz1Gvpwq/WqV0E21f69atbRCmMrStAwcOTDSY1OeuAE2tWdr2t956y67/4osv2uXPPfecDU4UCMrYsWPtmJspU6bYIMCl12nVqpXd3+3atbPboH2aGP99f88995iGDRuaSZMmBayj+/rc3NfKmDGjDTq13QAQMs2oDQCIX4cOHZx777033mUPPPCAU6FChQSf27NnT6d+/foBj7311ltOjhw5nEOHDl32NlSqVMkZM2aM736JEiWcUaNG2b+XL1/u5MyZ0zlz5kzAc0qXLm1fSwYPHuxkzZrVOX78uG/5s88+69SqVcv+feLECSdjxozOxx9/7Fuu7cuSJYt9DwlZs2aNo58RPV+WLFli73/66aeJvh9tV548eZzTp0/7Hhs/frx97o8//pjg87p16+a0atXKd/+VV14J2P+ffPKJkz17dufkyZP2fuXKlZ0hQ4Y4l8t/v7ratm3rNGrUKOAx7buKFSsmWE6DBg2cl156KeCx9957zylUqJDv/h9//GGPg759+9r9/MEHHwSsr33xxBNPBDymz6tr1672723btgXsr4T2/fTp051cuXL5jo9169Y5adKksc/316JFC6djx46J7B0ASBwtFQAQItX9/LvJBDt9+rTt/uJP3VXU7Uddn+Kjq/i6al+hQgUTGxtrr6zrqnNCLRW6iq3n5MmTx67r3rZt22ZbJ1y6Mu7fYqIuTm7XJa2nLFW1atXyLdf2qcuRP121V6tJ8eLFbVlqcZHgbVN3psS4LRj++6Z27doXracr+OrKo25dek9vv/12wGvpavvWrVvN999/b++rNUCtCurqJE8++aR54YUXzM0332wGDx5sfv7550S3K6Ft1fP96f7vv/9uu2gl9JmoxcP/8+jSpYtt/fjnn3/sOmplee2112zriVoU1JUsWPA+0f1LtVQE7/vmzZvb8RezZ8/27SN1s9Lx4E9drNxtA4BQxD/CCwBwSargqc9/QvLmzWu7zARX3hKjgGLBggW2wqlUtFr/vvvus5X++CigUICg7krBFJS4NP7An4Khy8le5T/mokmTJvamLkaq6KuCr/vB2+ZW6r346KOP7L7Q+AVVphXEvPrqq76xJ5I/f34b5Kg7jz4Hdf/y3w/qXqTt+/LLL22XruHDh9vyevToYSJJn4nGULRs2fKiZf6BlLplqcKvbmQab5HQoOsrEbzv1bVJXbG0j7Q906ZNCxib4lJXudKlS3t+fQCpFy0VABCCxYsX24BBfd4TohaJzZs32xYNl67Qq7XCf7yDv++++85egW/RooWpXLmyHRCtSmdCNH5Cg5VVIVUQ4n9TUHM5VJlU0OFfYT9y5Ij57bfffPf1PjSwWP31NRC6fPnyAYO0r4RaYdRqcObMGd9jbmuD/35QGt7//Oc/dj/q/fi3vPgHDtOnT7etGHofwa0KSr36xBNP2DETTz/9tHnnnXcS3C5VwINbH7St2pbgbdNYGQUECX0mW7Zsuejz0M0dx6Bt1jYpCFJwprEqwYL3ie5re66U9pEG+48bN84GL/EFOxs2bLD7GQBCRVABAJegwb6quGtwtQYvv/TSSzZDkwYb6ypwQtTNRFetN27c6HtMWZ8UKKhbiiqnf/75p80utHLlSru8bNmytrKpwEPdaNQtJrEWBQ3E1ZV8laer8QpANOhXg4GDs/4kRN1zlGlJg7UVLKmC6T+QV9TlSZXuMWPG2G3WIPP4KsKXQ+9JLSXqEqSBzMrIpJYZf9oP2v558+bZ4EaDltesWXNRWWqJUMYrdXNSatTgTFB6vrqC6XNbsmRJopVydQlS64E+54MHD9rHFIho0Lzeq7ZDg6mVJjh4YLk/DSqfOnWqba3QZ68WLbW8DBgwwJf9q2vXrrbr0y233GJbEXRMBQcRGqSu+VD0uuq+pYxZ3bt3N1dK71lzUfTt29cef8GtZTpm9J51LAFAyC4x5gIAnNQ+UFunSt3Sp0/v5MuXz2nYsKEzceJE58KFC5d8fuvWrZ1+/foFPLZ9+3Y74FgDrDWAukaNGs6qVavsMg2grVevnh28W6xYMefNN990br/99oAB08EDijUAu0ePHk7hwoWdDBky2Oe1a9fO2bFjh2+gdpUqVQK2Qc9XOS4Ntn7ooYfs9hQoUMAZMWLERa87bdo0p2TJkk6mTJmc2rVrO59//nm8g4WPHDlyyf2ycuVKu00aIF61alU7yNq/LA0s1sDhmJgYJzY21g5Q1n4Mfh8ycOBAJ126dM7u3bsDHu/evbsdsK7t1efWvn175+DBg4lu0/XXX2/X9/95nDlzph2YrX1bvHhx59VXX73k+5s7d65Tp04d+znqc77xxhudt99+24mLi7MDuZs0aWL/dunz07a6g971+mPHjrWDxLU92u8adO1KaKB2Qvv+3XfftctXr1590TINKtf2AIAXafRP6CEJACAx6uajeQDUdSehdKbwRq0sBw4csK0nKYVacjS4Wi1Q4aCWFrV8BA9W13gYtQpprEVw1zEAuBJ0fwKACNIYCnVzURcchNexY8fs5HqqEEd68HW0Uvc7dWdTl6349pHGc2j+DwIKAF6R/QkAIiy+CeLgnca1aJyBBmKrNQgX0xiMDz/80LZ4uJMC+nMHkAOAV3R/AgAAAOAJ3Z8AAAAAeEJQAQAAAMATggoAAAAAnhBUAAAAAPCEoAIAAACAJwQVAAAAADwhqAAAAADgCUEFAAAAAE8IKgAAAAAYL/4fJX31cKy7kdsAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "# Tiny visualization: strike counts by D\n", "counts = df_all.groupby('D')['K'].count().sort_index()\n", "counts.plot(kind='bar', figsize=(8,3))\n", "plt.title(\"Strike count by D\")\n", "plt.xlabel(\"D (calendar days to expiry)\")\n", "plt.ylabel(\"Count\")\n", "plt.tight_layout()\n", "plt.show()\n" ] }, { "cell_type": "markdown", "id": "0ee5d18e", "metadata": {}, "source": [ "\n", "## 4. Volume filter (`min_volume`)\n", "\n", "Keep only strikes where **both call and put** volumes exceed the threshold.\n" ] }, { "cell_type": "code", "execution_count": 6, "id": "da9cd6a7", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Rows (no volume filter): 5192\n", "Rows (min_volume=100): 66\n" ] }, { "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", "
KDTF_bidF_askC_bidC_askP_bidP_askC_volP_vol
0287500.02917.82918.4240.845.50.00.0529434374
1288000.02917.82918.4236.040.40.00.051272145
2288500.02917.82918.4230.835.50.00.053004283
3289000.02917.82918.4225.830.50.00.051214415
4289500.02917.82918.4220.825.50.00.052305566
5290000.02917.82918.4215.820.50.00.0518012184
\n", "
" ], "text/plain": [ " K D T F_bid F_ask C_bid C_ask P_bid P_ask C_vol P_vol\n", "0 2875 0 0.0 2917.8 2918.42 40.8 45.5 0.0 0.05 2943 4374\n", "1 2880 0 0.0 2917.8 2918.42 36.0 40.4 0.0 0.05 127 2145\n", "2 2885 0 0.0 2917.8 2918.42 30.8 35.5 0.0 0.05 300 4283\n", "3 2890 0 0.0 2917.8 2918.42 25.8 30.5 0.0 0.05 121 4415\n", "4 2895 0 0.0 2917.8 2918.42 20.8 25.5 0.0 0.05 230 5566\n", "5 2900 0 0.0 2917.8 2918.42 15.8 20.5 0.0 0.05 180 12184" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "\n", "df_v0 = spxw(min_volume=0)\n", "df_v100 = spxw(min_volume=100)\n", "print(\"Rows (no volume filter):\", len(df_v0))\n", "print(\"Rows (min_volume=100): \", len(df_v100))\n", "df_v100.head(6)\n" ] } ], "metadata": { "kernelspec": { "display_name": "volkit-eeDo8oXc-py3.11", "language": "python", "name": "python3" }, "language_info": { "name": "python", "version": "3.11.8" } }, "nbformat": 4, "nbformat_minor": 5 }