{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "b8cef1f0", "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import pandas as pd\n", "import yfinance as yf\n", "from datetime import datetime, timedelta\n", "\n", "\n", "def conf_int_ind(symb, target_time=None):\n", " ticker = yf.Ticker(symb)\n", " expirations = ticker.options\n", " df_time = pd.to_datetime(expirations)\n", " if target_time is None:\n", " target_time = df_time[0]\n", " target_time_r = df_time[df_time <= target_time][-1].strftime(\"%Y-%m-%d\")\n", "\n", " time_now = datetime.now().strftime(\"%Y-%m-%d\")\n", " T = (pd.to_datetime(target_time_r) - pd.to_datetime(time_now)).days + 1\n", "\n", " opt_chain = ticker.option_chain(target_time_r)\n", " current_price = ticker.fast_info[\"lastPrice\"]\n", "\n", " lop = opt_chain.puts.strike[~opt_chain.puts.inTheMoney].iloc[-1]\n", " hip = opt_chain.puts.strike[opt_chain.puts.inTheMoney].iloc[0]\n", " iv1p = opt_chain.puts.loc[opt_chain.puts.strike == lop, \"impliedVolatility\"].item()\n", " iv2p = opt_chain.puts.loc[opt_chain.puts.strike == hip, \"impliedVolatility\"].item()\n", " ivp = (iv1p + iv2p) / 2\n", " sdp = ivp * np.sqrt(T / 365)\n", "\n", " loca = opt_chain.calls.strike[opt_chain.calls.inTheMoney].iloc[-1]\n", " hica = opt_chain.calls.strike[~opt_chain.calls.inTheMoney].iloc[0]\n", " iv1c = opt_chain.calls.loc[opt_chain.calls.strike == loca, \"impliedVolatility\"].item()\n", " iv2c = opt_chain.calls.loc[opt_chain.calls.strike == hica, \"impliedVolatility\"].item()\n", " ivc = (iv1c + iv2c) / 2\n", " sdc = ivc * np.sqrt(T / 365)\n", "\n", " row = {\n", " \"symbol\": [f\"{ticker.info['symbol']}\"],\n", " \"days\": [f\"{target_time_r}: ({T}) days\"],\n", " \"-2.5%(p)\": [current_price * (1 - 2 * sdp)],\n", " \"-6.5%(p)\": [current_price * (1 - 1.5 * sdp)],\n", " \"-16.5%(p)\": [current_price * (1 - 1 * sdp)],\n", " \"current\": [current_price],\n", " \"+16.5%(c)\": [current_price * (1 + 1 * sdc)],\n", " \"+6.5%(c)\": [current_price * (1 + 1.5 * sdc)],\n", " \"+2.5%(c)\": [current_price * (1 + 2 * sdc)],\n", " }\n", "\n", " df = pd.DataFrame(row).set_index(\"symbol\")\n", " return df\n", "\n", "\n", "def conf_int_duo(symb, target_time=None):\n", " if target_time is None:\n", " expirations = yf.Ticker(symb).options\n", " df_time = pd.to_datetime(expirations)\n", " dlist = expirations[: (df_time - datetime.now() <= timedelta(days=14)).sum()]\n", " df = pd.concat([conf_int_ind(symb, d) for d in dlist])\n", " else:\n", " df = conf_int_ind(symb, target_time)\n", " return df\n", "\n", "\n", "def conf_int(symblist, target_time=None):\n", " if isinstance(symblist, str):\n", " df = conf_int_duo(symblist)\n", " elif isinstance(symblist, list):\n", " df = pd.concat([conf_int_duo(symb, target_time) for symb in symblist])\n", " return df\n" ] }, { "cell_type": "code", "execution_count": 2, "id": "587f982a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
| \n", " | days | \n", "-2.5%(p) | \n", "-6.5%(p) | \n", "-16.5%(p) | \n", "current | \n", "+16.5%(c) | \n", "+6.5%(c) | \n", "+2.5%(c) | \n", "
|---|---|---|---|---|---|---|---|---|
| symbol | \n", "\n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " | \n", " |
| SOXL | \n", "2026-03-13: (5) days | \n", "53.222366 | \n", "53.246774 | \n", "53.271183 | \n", "53.320000 | \n", "53.368817 | \n", "53.393225 | \n", "53.417633 | \n", "
| SOXL | \n", "2026-03-20: (12) days | \n", "53.168746 | \n", "53.206560 | \n", "53.244373 | \n", "53.320000 | \n", "53.471157 | \n", "53.546735 | \n", "53.622313 | \n", "
| MSFT | \n", "2026-03-11: (3) days | \n", "408.829314 | \n", "408.974487 | \n", "409.119659 | \n", "409.410004 | \n", "409.555362 | \n", "409.628041 | \n", "409.700720 | \n", "
| MSFT | \n", "2026-03-13: (5) days | \n", "408.660337 | \n", "408.847754 | \n", "409.035170 | \n", "409.410004 | \n", "409.504071 | \n", "409.551105 | \n", "409.598139 | \n", "
| MSFT | \n", "2026-03-16: (8) days | \n", "408.935267 | \n", "409.053951 | \n", "409.172635 | \n", "409.410004 | \n", "409.528991 | \n", "409.588485 | \n", "409.647978 | \n", "
| MSFT | \n", "2026-03-18: (10) days | \n", "408.879232 | \n", "409.011925 | \n", "409.144618 | \n", "409.410004 | \n", "409.543036 | \n", "409.609551 | \n", "409.676067 | \n", "
| MSFT | \n", "2026-03-20: (12) days | \n", "408.828572 | \n", "408.973930 | \n", "409.119288 | \n", "409.410004 | \n", "409.483239 | \n", "409.519857 | \n", "409.556475 | \n", "