mirror of
https://github.com/OpenBB-finance/OpenBB.git
synced 2026-05-09 07:18:36 +08:00
* adds example notebook for the implied earnings move * remove commented out line --------- Co-authored-by: James Maslek <jmaslek11@gmail.com>
1491 lines
61 KiB
Plaintext
Vendored
1491 lines
61 KiB
Plaintext
Vendored
{
|
||
"cells": [
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"id": "BzQ2PSUMb1O7"
|
||
},
|
||
"source": [
|
||
"# Calculating the Implied Earnings Move Using Options Prices\n",
|
||
"\n",
|
||
"Earnings day can be a pivotal moment for a company's share price. The confluence of expectations and reality is a tradable event, drawing crowds to the options market. Observing the surrounding action can provide insight into the consensus view on, and general sentiment of, the company.\n",
|
||
"\n",
|
||
"The cost of a straddle - the combined price of an at-the-money call and put - is a common way to gauge the near-term volatility. It's the market's expectation of the price band until expiration. While this includes time value, the isolated price of volatility will generally be higher for the expiry immediately following an earnings release.\n",
|
||
"\n",
|
||
"Have a look at companies that trade weekly options and are reporting a on Thursday. If they report after the close, the price of the one-day straddle at the bell will be the purest sample of information.\n",
|
||
"\n",
|
||
"The cells below will demonstrate how to get the data from free sources, using the OpenBB Platform."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": null,
|
||
"metadata": {
|
||
"id": "da3wLFHJaK1n"
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"# If using in Google Colab, install the OpenBB library.\n",
|
||
"\n",
|
||
"!pip install openbb[\"all\"]\n",
|
||
"\n",
|
||
"# Restart the runtime before the next block"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 1,
|
||
"metadata": {
|
||
"colab": {
|
||
"base_uri": "https://localhost:8080/"
|
||
},
|
||
"id": "7xcKh78TaTot",
|
||
"outputId": "1b00dbc7-21cd-421a-b191-b2e8685f491d"
|
||
},
|
||
"outputs": [],
|
||
"source": [
|
||
"from datetime import datetime, timedelta\n",
|
||
"\n",
|
||
"import pandas as pd\n",
|
||
"from openbb import obb\n",
|
||
"\n",
|
||
"obb.user.preferences.output_type = \"dataframe\"\n",
|
||
"obb.user.credentials.nasdaq_api_key = \"PLACE_HOLDER\" # You don't actually need to replace this."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "markdown",
|
||
"metadata": {
|
||
"id": "WyKBFJg-R_r2"
|
||
},
|
||
"source": [
|
||
"If the earnings date falls on an option expiry, contracts expiring that day will not provide exposure to the after-market earnings reports."
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 2,
|
||
"metadata": {
|
||
"colab": {
|
||
"base_uri": "https://localhost:8080/",
|
||
"height": 711
|
||
},
|
||
"id": "49D8bfFFPEwC",
|
||
"outputId": "b2eebaaa-ef2c-456a-fca2-96f6bee41b2d"
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>report_date</th>\n",
|
||
" <th>symbol</th>\n",
|
||
" <th>name</th>\n",
|
||
" <th>eps_previous</th>\n",
|
||
" <th>eps_consensus</th>\n",
|
||
" <th>num_estimates</th>\n",
|
||
" <th>period_ending</th>\n",
|
||
" <th>previous_report_date</th>\n",
|
||
" <th>reporting_time</th>\n",
|
||
" <th>market_cap</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>26</th>\n",
|
||
" <td>2024-03-07</td>\n",
|
||
" <td>AVGO</td>\n",
|
||
" <td>Broadcom Inc.</td>\n",
|
||
" <td>9.83</td>\n",
|
||
" <td>9.06</td>\n",
|
||
" <td>8.0</td>\n",
|
||
" <td>2024-01</td>\n",
|
||
" <td>2023-03-02</td>\n",
|
||
" <td>after-hours</td>\n",
|
||
" <td>6.108766e+11</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>27</th>\n",
|
||
" <td>2024-03-07</td>\n",
|
||
" <td>COST</td>\n",
|
||
" <td>Costco Wholesale Corporation</td>\n",
|
||
" <td>3.30</td>\n",
|
||
" <td>3.60</td>\n",
|
||
" <td>14.0</td>\n",
|
||
" <td>2024-02</td>\n",
|
||
" <td>2023-03-02</td>\n",
|
||
" <td>after-hours</td>\n",
|
||
" <td>3.259489e+11</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>553</th>\n",
|
||
" <td>2024-02-28</td>\n",
|
||
" <td>CRM</td>\n",
|
||
" <td>Salesforce, Inc.</td>\n",
|
||
" <td>1.01</td>\n",
|
||
" <td>1.72</td>\n",
|
||
" <td>16.0</td>\n",
|
||
" <td>2024-01</td>\n",
|
||
" <td>2023-03-01</td>\n",
|
||
" <td>after-hours</td>\n",
|
||
" <td>2.842532e+11</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>554</th>\n",
|
||
" <td>2024-02-28</td>\n",
|
||
" <td>RY</td>\n",
|
||
" <td>Royal Bank Of Canada</td>\n",
|
||
" <td>2.26</td>\n",
|
||
" <td>2.10</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2024-01</td>\n",
|
||
" <td>2023-03-01</td>\n",
|
||
" <td>pre-market</td>\n",
|
||
" <td>1.380355e+11</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>796</th>\n",
|
||
" <td>2024-02-27</td>\n",
|
||
" <td>LOW</td>\n",
|
||
" <td>Lowe's Companies, Inc.</td>\n",
|
||
" <td>2.28</td>\n",
|
||
" <td>1.68</td>\n",
|
||
" <td>15.0</td>\n",
|
||
" <td>2024-01</td>\n",
|
||
" <td>2023-03-01</td>\n",
|
||
" <td>pre-market</td>\n",
|
||
" <td>1.325692e+11</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>28</th>\n",
|
||
" <td>2024-03-07</td>\n",
|
||
" <td>PBR</td>\n",
|
||
" <td>Petroleo Brasileiro S.A.- Petrobras</td>\n",
|
||
" <td>1.25</td>\n",
|
||
" <td>1.13</td>\n",
|
||
" <td>3.0</td>\n",
|
||
" <td>2023-12</td>\n",
|
||
" <td>2023-03-02</td>\n",
|
||
" <td>not-supplied</td>\n",
|
||
" <td>1.146585e+11</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>555</th>\n",
|
||
" <td>2024-02-28</td>\n",
|
||
" <td>TJX</td>\n",
|
||
" <td>TJX Companies, Inc. (The)</td>\n",
|
||
" <td>0.89</td>\n",
|
||
" <td>1.11</td>\n",
|
||
" <td>10.0</td>\n",
|
||
" <td>2024-01</td>\n",
|
||
" <td>2023-02-22</td>\n",
|
||
" <td>pre-market</td>\n",
|
||
" <td>1.129534e+11</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>29</th>\n",
|
||
" <td>2024-03-07</td>\n",
|
||
" <td>PBR.A</td>\n",
|
||
" <td>Petroleo Brasileiro S.A.- Petrobras</td>\n",
|
||
" <td>1.25</td>\n",
|
||
" <td>NaN</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>2023-12</td>\n",
|
||
" <td>None</td>\n",
|
||
" <td>not-supplied</td>\n",
|
||
" <td>1.108105e+11</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>383</th>\n",
|
||
" <td>2024-02-29</td>\n",
|
||
" <td>BUD</td>\n",
|
||
" <td>Anheuser-Busch Inbev SA</td>\n",
|
||
" <td>0.98</td>\n",
|
||
" <td>0.76</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2023-12</td>\n",
|
||
" <td>2023-03-02</td>\n",
|
||
" <td>pre-market</td>\n",
|
||
" <td>1.101379e+11</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>384</th>\n",
|
||
" <td>2024-02-29</td>\n",
|
||
" <td>TD</td>\n",
|
||
" <td>Toronto Dominion Bank (The)</td>\n",
|
||
" <td>1.64</td>\n",
|
||
" <td>1.46</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2024-01</td>\n",
|
||
" <td>2023-03-02</td>\n",
|
||
" <td>pre-market</td>\n",
|
||
" <td>1.074778e+11</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>797</th>\n",
|
||
" <td>2024-02-27</td>\n",
|
||
" <td>AMT</td>\n",
|
||
" <td>American Tower Corporation (REIT)</td>\n",
|
||
" <td>2.34</td>\n",
|
||
" <td>2.10</td>\n",
|
||
" <td>7.0</td>\n",
|
||
" <td>2023-12</td>\n",
|
||
" <td>2023-02-23</td>\n",
|
||
" <td>pre-market</td>\n",
|
||
" <td>8.764370e+10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1099</th>\n",
|
||
" <td>2024-02-26</td>\n",
|
||
" <td>WDAY</td>\n",
|
||
" <td>Workday, Inc.</td>\n",
|
||
" <td>-0.14</td>\n",
|
||
" <td>0.32</td>\n",
|
||
" <td>6.0</td>\n",
|
||
" <td>2024-01</td>\n",
|
||
" <td>2023-02-27</td>\n",
|
||
" <td>after-hours</td>\n",
|
||
" <td>8.064106e+10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>217</th>\n",
|
||
" <td>2024-03-05</td>\n",
|
||
" <td>CRWD</td>\n",
|
||
" <td>CrowdStrike Holdings, Inc.</td>\n",
|
||
" <td>-0.17</td>\n",
|
||
" <td>0.18</td>\n",
|
||
" <td>14.0</td>\n",
|
||
" <td>2024-01</td>\n",
|
||
" <td>2023-03-07</td>\n",
|
||
" <td>after-hours</td>\n",
|
||
" <td>7.466342e+10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>556</th>\n",
|
||
" <td>2024-02-28</td>\n",
|
||
" <td>SNOW</td>\n",
|
||
" <td>Snowflake Inc.</td>\n",
|
||
" <td>-0.60</td>\n",
|
||
" <td>-0.49</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2024-01</td>\n",
|
||
" <td>2023-03-01</td>\n",
|
||
" <td>after-hours</td>\n",
|
||
" <td>7.429667e+10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>385</th>\n",
|
||
" <td>2024-02-29</td>\n",
|
||
" <td>CNQ</td>\n",
|
||
" <td>Canadian Natural Resources Limited</td>\n",
|
||
" <td>1.44</td>\n",
|
||
" <td>1.53</td>\n",
|
||
" <td>5.0</td>\n",
|
||
" <td>2023-12</td>\n",
|
||
" <td>2023-03-02</td>\n",
|
||
" <td>pre-market</td>\n",
|
||
" <td>7.205709e+10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>386</th>\n",
|
||
" <td>2024-02-29</td>\n",
|
||
" <td>NTES</td>\n",
|
||
" <td>NetEase, Inc.</td>\n",
|
||
" <td>0.88</td>\n",
|
||
" <td>1.62</td>\n",
|
||
" <td>2.0</td>\n",
|
||
" <td>2023-12</td>\n",
|
||
" <td>2023-02-23</td>\n",
|
||
" <td>pre-market</td>\n",
|
||
" <td>7.017184e+10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>218</th>\n",
|
||
" <td>2024-03-05</td>\n",
|
||
" <td>TGT</td>\n",
|
||
" <td>Target Corporation</td>\n",
|
||
" <td>1.89</td>\n",
|
||
" <td>2.38</td>\n",
|
||
" <td>16.0</td>\n",
|
||
" <td>2024-01</td>\n",
|
||
" <td>2023-02-28</td>\n",
|
||
" <td>pre-market</td>\n",
|
||
" <td>6.940624e+10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>798</th>\n",
|
||
" <td>2024-02-27</td>\n",
|
||
" <td>BMO</td>\n",
|
||
" <td>Bank Of Montreal</td>\n",
|
||
" <td>2.39</td>\n",
|
||
" <td>2.28</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2024-01</td>\n",
|
||
" <td>2023-02-28</td>\n",
|
||
" <td>pre-market</td>\n",
|
||
" <td>6.832777e+10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>387</th>\n",
|
||
" <td>2024-02-29</td>\n",
|
||
" <td>DELL</td>\n",
|
||
" <td>Dell Technologies Inc.</td>\n",
|
||
" <td>1.55</td>\n",
|
||
" <td>1.47</td>\n",
|
||
" <td>4.0</td>\n",
|
||
" <td>2024-01</td>\n",
|
||
" <td>2023-03-02</td>\n",
|
||
" <td>after-hours</td>\n",
|
||
" <td>6.247146e+10</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>30</th>\n",
|
||
" <td>2024-03-07</td>\n",
|
||
" <td>MRVL</td>\n",
|
||
" <td>Marvell Technology, Inc.</td>\n",
|
||
" <td>0.34</td>\n",
|
||
" <td>0.29</td>\n",
|
||
" <td>12.0</td>\n",
|
||
" <td>2024-01</td>\n",
|
||
" <td>2023-03-02</td>\n",
|
||
" <td>after-hours</td>\n",
|
||
" <td>6.040262e+10</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" report_date symbol name eps_previous \\\n",
|
||
"26 2024-03-07 AVGO Broadcom Inc. 9.83 \n",
|
||
"27 2024-03-07 COST Costco Wholesale Corporation 3.30 \n",
|
||
"553 2024-02-28 CRM Salesforce, Inc. 1.01 \n",
|
||
"554 2024-02-28 RY Royal Bank Of Canada 2.26 \n",
|
||
"796 2024-02-27 LOW Lowe's Companies, Inc. 2.28 \n",
|
||
"28 2024-03-07 PBR Petroleo Brasileiro S.A.- Petrobras 1.25 \n",
|
||
"555 2024-02-28 TJX TJX Companies, Inc. (The) 0.89 \n",
|
||
"29 2024-03-07 PBR.A Petroleo Brasileiro S.A.- Petrobras 1.25 \n",
|
||
"383 2024-02-29 BUD Anheuser-Busch Inbev SA 0.98 \n",
|
||
"384 2024-02-29 TD Toronto Dominion Bank (The) 1.64 \n",
|
||
"797 2024-02-27 AMT American Tower Corporation (REIT) 2.34 \n",
|
||
"1099 2024-02-26 WDAY Workday, Inc. -0.14 \n",
|
||
"217 2024-03-05 CRWD CrowdStrike Holdings, Inc. -0.17 \n",
|
||
"556 2024-02-28 SNOW Snowflake Inc. -0.60 \n",
|
||
"385 2024-02-29 CNQ Canadian Natural Resources Limited 1.44 \n",
|
||
"386 2024-02-29 NTES NetEase, Inc. 0.88 \n",
|
||
"218 2024-03-05 TGT Target Corporation 1.89 \n",
|
||
"798 2024-02-27 BMO Bank Of Montreal 2.39 \n",
|
||
"387 2024-02-29 DELL Dell Technologies Inc. 1.55 \n",
|
||
"30 2024-03-07 MRVL Marvell Technology, Inc. 0.34 \n",
|
||
"\n",
|
||
" eps_consensus num_estimates period_ending previous_report_date \\\n",
|
||
"26 9.06 8.0 2024-01 2023-03-02 \n",
|
||
"27 3.60 14.0 2024-02 2023-03-02 \n",
|
||
"553 1.72 16.0 2024-01 2023-03-01 \n",
|
||
"554 2.10 4.0 2024-01 2023-03-01 \n",
|
||
"796 1.68 15.0 2024-01 2023-03-01 \n",
|
||
"28 1.13 3.0 2023-12 2023-03-02 \n",
|
||
"555 1.11 10.0 2024-01 2023-02-22 \n",
|
||
"29 NaN 5.0 2023-12 None \n",
|
||
"383 0.76 4.0 2023-12 2023-03-02 \n",
|
||
"384 1.46 4.0 2024-01 2023-03-02 \n",
|
||
"797 2.10 7.0 2023-12 2023-02-23 \n",
|
||
"1099 0.32 6.0 2024-01 2023-02-27 \n",
|
||
"217 0.18 14.0 2024-01 2023-03-07 \n",
|
||
"556 -0.49 4.0 2024-01 2023-03-01 \n",
|
||
"385 1.53 5.0 2023-12 2023-03-02 \n",
|
||
"386 1.62 2.0 2023-12 2023-02-23 \n",
|
||
"218 2.38 16.0 2024-01 2023-02-28 \n",
|
||
"798 2.28 4.0 2024-01 2023-02-28 \n",
|
||
"387 1.47 4.0 2024-01 2023-03-02 \n",
|
||
"30 0.29 12.0 2024-01 2023-03-02 \n",
|
||
"\n",
|
||
" reporting_time market_cap \n",
|
||
"26 after-hours 6.108766e+11 \n",
|
||
"27 after-hours 3.259489e+11 \n",
|
||
"553 after-hours 2.842532e+11 \n",
|
||
"554 pre-market 1.380355e+11 \n",
|
||
"796 pre-market 1.325692e+11 \n",
|
||
"28 not-supplied 1.146585e+11 \n",
|
||
"555 pre-market 1.129534e+11 \n",
|
||
"29 not-supplied 1.108105e+11 \n",
|
||
"383 pre-market 1.101379e+11 \n",
|
||
"384 pre-market 1.074778e+11 \n",
|
||
"797 pre-market 8.764370e+10 \n",
|
||
"1099 after-hours 8.064106e+10 \n",
|
||
"217 after-hours 7.466342e+10 \n",
|
||
"556 after-hours 7.429667e+10 \n",
|
||
"385 pre-market 7.205709e+10 \n",
|
||
"386 pre-market 7.017184e+10 \n",
|
||
"218 pre-market 6.940624e+10 \n",
|
||
"798 pre-market 6.832777e+10 \n",
|
||
"387 after-hours 6.247146e+10 \n",
|
||
"30 after-hours 6.040262e+10 "
|
||
]
|
||
},
|
||
"execution_count": 2,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Lookup some upcoming earnings dates and sort them by market cap.\n",
|
||
"\n",
|
||
"earnings_calendar = obb.equity.calendar.earnings(\n",
|
||
" start_date=(datetime.now()+timedelta(days=1)).date(),\n",
|
||
" end_date = (datetime.now()+timedelta(days=14)).date(),\n",
|
||
" provider=\"nasdaq\"\n",
|
||
")\n",
|
||
"\n",
|
||
"earnings_calendar.sort_values(by=[\"market_cap\", \"num_estimates\"], ascending=False).head(20)"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 3,
|
||
"metadata": {
|
||
"colab": {
|
||
"base_uri": "https://localhost:8080/"
|
||
},
|
||
"id": "1WNFH5_kPFHh",
|
||
"outputId": "7fb6be6c-4450-47b8-e73d-a0bf95cf8ecc"
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Last Price: $292.8\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# Get the last price of the underlying stock.\n",
|
||
"symbol = \"CRM\"\n",
|
||
"\n",
|
||
"quote = obb.equity.price.quote(symbol, provider=\"yfinance\").T\n",
|
||
"\n",
|
||
"last_price = quote.loc[\"last_price\", 0]\n",
|
||
"\n",
|
||
"print(f\"Last Price: ${last_price}\")\n"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 11,
|
||
"metadata": {
|
||
"colab": {
|
||
"base_uri": "https://localhost:8080/"
|
||
},
|
||
"id": "IzmLloIfTQJo",
|
||
"outputId": "1c08fa80-eaf2-4548-8c27-70c82fac79ea"
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"2024-03-01\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# Get the options chains data.\n",
|
||
"\n",
|
||
"options = obb.derivatives.options.chains(symbol, provider=\"cboe\")\n",
|
||
"\n",
|
||
"print(options.expiration.unique()[0])"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 12,
|
||
"metadata": {
|
||
"colab": {
|
||
"base_uri": "https://localhost:8080/",
|
||
"height": 444
|
||
},
|
||
"id": "pXM5lHrnUU26",
|
||
"outputId": "8641ff33-0802-42f0-864f-217dc64f6014"
|
||
},
|
||
"outputs": [
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>contract_symbol</th>\n",
|
||
" <th>expiration</th>\n",
|
||
" <th>strike</th>\n",
|
||
" <th>option_type</th>\n",
|
||
" <th>open_interest</th>\n",
|
||
" <th>volume</th>\n",
|
||
" <th>theoretical_price</th>\n",
|
||
" <th>last_trade_price</th>\n",
|
||
" <th>tick</th>\n",
|
||
" <th>bid</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>change</th>\n",
|
||
" <th>change_percent</th>\n",
|
||
" <th>implied_volatility</th>\n",
|
||
" <th>delta</th>\n",
|
||
" <th>gamma</th>\n",
|
||
" <th>theta</th>\n",
|
||
" <th>vega</th>\n",
|
||
" <th>rho</th>\n",
|
||
" <th>last_trade_timestamp</th>\n",
|
||
" <th>dte</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>0</th>\n",
|
||
" <td>CRM240301C00135000</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>135.0</td>\n",
|
||
" <td>call</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>157.9118</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>no_change</td>\n",
|
||
" <td>157.15</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000</td>\n",
|
||
" <td>0.000</td>\n",
|
||
" <td>2.1031</td>\n",
|
||
" <td>0.9997</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>0.0004</td>\n",
|
||
" <td>0.0210</td>\n",
|
||
" <td>NaT</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>1</th>\n",
|
||
" <td>CRM240301P00135000</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>135.0</td>\n",
|
||
" <td>put</td>\n",
|
||
" <td>64</td>\n",
|
||
" <td>5</td>\n",
|
||
" <td>0.0038</td>\n",
|
||
" <td>0.01</td>\n",
|
||
" <td>down</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>-0.070</td>\n",
|
||
" <td>-0.875</td>\n",
|
||
" <td>1.6854</td>\n",
|
||
" <td>-0.0002</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>-0.0026</td>\n",
|
||
" <td>0.0003</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>2024-02-23 13:27:03</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>2</th>\n",
|
||
" <td>CRM240301C00140000</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>140.0</td>\n",
|
||
" <td>call</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>152.9175</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>no_change</td>\n",
|
||
" <td>152.00</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000</td>\n",
|
||
" <td>0.000</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>0.9997</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>0.0004</td>\n",
|
||
" <td>0.0221</td>\n",
|
||
" <td>NaT</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>3</th>\n",
|
||
" <td>CRM240301P00140000</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>140.0</td>\n",
|
||
" <td>put</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0.0040</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>no_change</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000</td>\n",
|
||
" <td>0.000</td>\n",
|
||
" <td>1.6954</td>\n",
|
||
" <td>-0.0003</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>-0.0028</td>\n",
|
||
" <td>0.0004</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>NaT</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>4</th>\n",
|
||
" <td>CRM240301C00145000</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>145.0</td>\n",
|
||
" <td>call</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>147.9232</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>no_change</td>\n",
|
||
" <td>147.10</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000</td>\n",
|
||
" <td>0.000</td>\n",
|
||
" <td>1.7827</td>\n",
|
||
" <td>0.9997</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>0.0004</td>\n",
|
||
" <td>0.0232</td>\n",
|
||
" <td>NaT</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>...</th>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>...</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>163</th>\n",
|
||
" <td>CRM240301P00377500</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>377.5</td>\n",
|
||
" <td>put</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>84.7275</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>no_change</td>\n",
|
||
" <td>83.80</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000</td>\n",
|
||
" <td>0.000</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>-0.9971</td>\n",
|
||
" <td>0.0009</td>\n",
|
||
" <td>-0.0457</td>\n",
|
||
" <td>0.0032</td>\n",
|
||
" <td>-0.0049</td>\n",
|
||
" <td>NaT</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>164</th>\n",
|
||
" <td>CRM240301C00380000</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>380.0</td>\n",
|
||
" <td>call</td>\n",
|
||
" <td>41</td>\n",
|
||
" <td>3</td>\n",
|
||
" <td>0.0825</td>\n",
|
||
" <td>0.14</td>\n",
|
||
" <td>up</td>\n",
|
||
" <td>0.08</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.005</td>\n",
|
||
" <td>0.037</td>\n",
|
||
" <td>0.8024</td>\n",
|
||
" <td>0.0087</td>\n",
|
||
" <td>0.0008</td>\n",
|
||
" <td>-0.0416</td>\n",
|
||
" <td>0.0096</td>\n",
|
||
" <td>0.0004</td>\n",
|
||
" <td>2024-02-23 14:41:10</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>165</th>\n",
|
||
" <td>CRM240301P00380000</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>380.0</td>\n",
|
||
" <td>put</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>87.2249</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>no_change</td>\n",
|
||
" <td>86.30</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000</td>\n",
|
||
" <td>0.000</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>-0.9982</td>\n",
|
||
" <td>0.0006</td>\n",
|
||
" <td>-0.0432</td>\n",
|
||
" <td>0.0014</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>NaT</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>166</th>\n",
|
||
" <td>CRM240301C00390000</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>390.0</td>\n",
|
||
" <td>call</td>\n",
|
||
" <td>51</td>\n",
|
||
" <td>59</td>\n",
|
||
" <td>0.0441</td>\n",
|
||
" <td>0.11</td>\n",
|
||
" <td>up</td>\n",
|
||
" <td>0.04</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.010</td>\n",
|
||
" <td>0.100</td>\n",
|
||
" <td>0.8468</td>\n",
|
||
" <td>0.0049</td>\n",
|
||
" <td>0.0004</td>\n",
|
||
" <td>-0.0242</td>\n",
|
||
" <td>0.0057</td>\n",
|
||
" <td>0.0002</td>\n",
|
||
" <td>2024-02-23 13:57:21</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>167</th>\n",
|
||
" <td>CRM240301P00390000</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>390.0</td>\n",
|
||
" <td>put</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>0</td>\n",
|
||
" <td>97.2249</td>\n",
|
||
" <td>0.00</td>\n",
|
||
" <td>no_change</td>\n",
|
||
" <td>96.40</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.000</td>\n",
|
||
" <td>0.000</td>\n",
|
||
" <td>0.8974</td>\n",
|
||
" <td>-1.0000</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>-0.0432</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>0.0000</td>\n",
|
||
" <td>NaT</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>168 rows × 27 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" contract_symbol expiration strike option_type open_interest \\\n",
|
||
"0 CRM240301C00135000 2024-03-01 135.0 call 0 \n",
|
||
"1 CRM240301P00135000 2024-03-01 135.0 put 64 \n",
|
||
"2 CRM240301C00140000 2024-03-01 140.0 call 0 \n",
|
||
"3 CRM240301P00140000 2024-03-01 140.0 put 0 \n",
|
||
"4 CRM240301C00145000 2024-03-01 145.0 call 0 \n",
|
||
".. ... ... ... ... ... \n",
|
||
"163 CRM240301P00377500 2024-03-01 377.5 put 0 \n",
|
||
"164 CRM240301C00380000 2024-03-01 380.0 call 41 \n",
|
||
"165 CRM240301P00380000 2024-03-01 380.0 put 0 \n",
|
||
"166 CRM240301C00390000 2024-03-01 390.0 call 51 \n",
|
||
"167 CRM240301P00390000 2024-03-01 390.0 put 0 \n",
|
||
"\n",
|
||
" volume theoretical_price last_trade_price tick bid ... \\\n",
|
||
"0 0 157.9118 0.00 no_change 157.15 ... \n",
|
||
"1 5 0.0038 0.01 down 0.00 ... \n",
|
||
"2 0 152.9175 0.00 no_change 152.00 ... \n",
|
||
"3 0 0.0040 0.00 no_change 0.00 ... \n",
|
||
"4 0 147.9232 0.00 no_change 147.10 ... \n",
|
||
".. ... ... ... ... ... ... \n",
|
||
"163 0 84.7275 0.00 no_change 83.80 ... \n",
|
||
"164 3 0.0825 0.14 up 0.08 ... \n",
|
||
"165 0 87.2249 0.00 no_change 86.30 ... \n",
|
||
"166 59 0.0441 0.11 up 0.04 ... \n",
|
||
"167 0 97.2249 0.00 no_change 96.40 ... \n",
|
||
"\n",
|
||
" change change_percent implied_volatility delta gamma theta \\\n",
|
||
"0 0.000 0.000 2.1031 0.9997 0.0000 0.0000 \n",
|
||
"1 -0.070 -0.875 1.6854 -0.0002 0.0000 -0.0026 \n",
|
||
"2 0.000 0.000 0.0000 0.9997 0.0000 0.0000 \n",
|
||
"3 0.000 0.000 1.6954 -0.0003 0.0000 -0.0028 \n",
|
||
"4 0.000 0.000 1.7827 0.9997 0.0000 0.0000 \n",
|
||
".. ... ... ... ... ... ... \n",
|
||
"163 0.000 0.000 0.0000 -0.9971 0.0009 -0.0457 \n",
|
||
"164 0.005 0.037 0.8024 0.0087 0.0008 -0.0416 \n",
|
||
"165 0.000 0.000 0.0000 -0.9982 0.0006 -0.0432 \n",
|
||
"166 0.010 0.100 0.8468 0.0049 0.0004 -0.0242 \n",
|
||
"167 0.000 0.000 0.8974 -1.0000 0.0000 -0.0432 \n",
|
||
"\n",
|
||
" vega rho last_trade_timestamp dte \n",
|
||
"0 0.0004 0.0210 NaT 5 \n",
|
||
"1 0.0003 0.0000 2024-02-23 13:27:03 5 \n",
|
||
"2 0.0004 0.0221 NaT 5 \n",
|
||
"3 0.0004 0.0000 NaT 5 \n",
|
||
"4 0.0004 0.0232 NaT 5 \n",
|
||
".. ... ... ... ... \n",
|
||
"163 0.0032 -0.0049 NaT 5 \n",
|
||
"164 0.0096 0.0004 2024-02-23 14:41:10 5 \n",
|
||
"165 0.0014 0.0000 NaT 5 \n",
|
||
"166 0.0057 0.0002 2024-02-23 13:57:21 5 \n",
|
||
"167 0.0000 0.0000 NaT 5 \n",
|
||
"\n",
|
||
"[168 rows x 27 columns]"
|
||
]
|
||
},
|
||
"execution_count": 12,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Filter for the earnings expiration.\n",
|
||
"expiration = datetime(2024,3,1).date() # This date will not be evergreen, so change it to suit.\n",
|
||
"chain = options.query(\"`expiration` == @expiration\")\n",
|
||
"\n",
|
||
"chain"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 6,
|
||
"metadata": {
|
||
"colab": {
|
||
"base_uri": "https://localhost:8080/"
|
||
},
|
||
"id": "xkdAjQDyUVt-",
|
||
"outputId": "786025e0-e7c1-4ca4-b65f-a0c0ea489ea1"
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Last Price: $292.8\n",
|
||
"\n",
|
||
"Nearest Call Strike: $295.0\n",
|
||
"\n",
|
||
"Nearest Put Strike: $292.5\n"
|
||
]
|
||
}
|
||
],
|
||
"source": [
|
||
"# Find the nearest strike price to the last price.\n",
|
||
"\n",
|
||
"strikes = chain.strike.to_frame()\n",
|
||
"\n",
|
||
"call_strike = strikes.loc[strikes.query(\"`strike` > @last_price\").idxmin()][\"strike\"].iloc[0]\n",
|
||
"put_strike = strikes.loc[strikes.query(\"`strike` < @last_price\").idxmax()][\"strike\"].iloc[0]\n",
|
||
"\n",
|
||
"print(f\"Last Price: ${last_price}\\n\\nNearest Call Strike: ${call_strike}\\n\\nNearest Put Strike: ${put_strike}\")"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 13,
|
||
"metadata": {
|
||
"colab": {
|
||
"base_uri": "https://localhost:8080/",
|
||
"height": 283
|
||
},
|
||
"id": "aX1NUvNKZEQ9",
|
||
"outputId": "30949b18-40cb-482a-c25e-4e6026b72482"
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Cost of Straddle: $21.95\n",
|
||
"Cost as a % of Share Price: 7.4966%\n",
|
||
"Upper Breakeven Price: $314.75\n",
|
||
"Lower Breakeven Price: $270.85\n",
|
||
"Implied Daily Move: 1.4563%\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>contract_symbol</th>\n",
|
||
" <th>expiration</th>\n",
|
||
" <th>strike</th>\n",
|
||
" <th>option_type</th>\n",
|
||
" <th>open_interest</th>\n",
|
||
" <th>volume</th>\n",
|
||
" <th>theoretical_price</th>\n",
|
||
" <th>last_trade_price</th>\n",
|
||
" <th>tick</th>\n",
|
||
" <th>bid</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>change</th>\n",
|
||
" <th>change_percent</th>\n",
|
||
" <th>implied_volatility</th>\n",
|
||
" <th>delta</th>\n",
|
||
" <th>gamma</th>\n",
|
||
" <th>theta</th>\n",
|
||
" <th>vega</th>\n",
|
||
" <th>rho</th>\n",
|
||
" <th>last_trade_timestamp</th>\n",
|
||
" <th>dte</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>96</th>\n",
|
||
" <td>CRM240301C00295000</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>295.0</td>\n",
|
||
" <td>call</td>\n",
|
||
" <td>540</td>\n",
|
||
" <td>315</td>\n",
|
||
" <td>9.8163</td>\n",
|
||
" <td>10.05</td>\n",
|
||
" <td>down</td>\n",
|
||
" <td>9.85</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>-0.375</td>\n",
|
||
" <td>-0.0360</td>\n",
|
||
" <td>0.6666</td>\n",
|
||
" <td>0.4904</td>\n",
|
||
" <td>0.0148</td>\n",
|
||
" <td>-0.7900</td>\n",
|
||
" <td>0.1620</td>\n",
|
||
" <td>0.0254</td>\n",
|
||
" <td>2024-02-23 15:59:01</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>97</th>\n",
|
||
" <td>CRM240301P00295000</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>295.0</td>\n",
|
||
" <td>put</td>\n",
|
||
" <td>141</td>\n",
|
||
" <td>47</td>\n",
|
||
" <td>11.7541</td>\n",
|
||
" <td>11.85</td>\n",
|
||
" <td>up</td>\n",
|
||
" <td>11.75</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.375</td>\n",
|
||
" <td>0.0327</td>\n",
|
||
" <td>0.6658</td>\n",
|
||
" <td>-0.5107</td>\n",
|
||
" <td>0.0148</td>\n",
|
||
" <td>-0.7925</td>\n",
|
||
" <td>0.1619</td>\n",
|
||
" <td>-0.0272</td>\n",
|
||
" <td>2024-02-23 15:59:59</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>2 rows × 27 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" contract_symbol expiration strike option_type open_interest volume \\\n",
|
||
"96 CRM240301C00295000 2024-03-01 295.0 call 540 315 \n",
|
||
"97 CRM240301P00295000 2024-03-01 295.0 put 141 47 \n",
|
||
"\n",
|
||
" theoretical_price last_trade_price tick bid ... change \\\n",
|
||
"96 9.8163 10.05 down 9.85 ... -0.375 \n",
|
||
"97 11.7541 11.85 up 11.75 ... 0.375 \n",
|
||
"\n",
|
||
" change_percent implied_volatility delta gamma theta vega \\\n",
|
||
"96 -0.0360 0.6666 0.4904 0.0148 -0.7900 0.1620 \n",
|
||
"97 0.0327 0.6658 -0.5107 0.0148 -0.7925 0.1619 \n",
|
||
"\n",
|
||
" rho last_trade_timestamp dte \n",
|
||
"96 0.0254 2024-02-23 15:59:01 5 \n",
|
||
"97 -0.0272 2024-02-23 15:59:59 5 \n",
|
||
"\n",
|
||
"[2 rows x 27 columns]"
|
||
]
|
||
},
|
||
"execution_count": 13,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Using the same strike for the put as the call.\n",
|
||
"\n",
|
||
"atm_call = chain.query(\"`strike` == @call_strike and `option_type` == 'call'\")\n",
|
||
"atm_put = chain.query(\"`strike` == @call_strike and `option_type` == 'put'\")\n",
|
||
"\n",
|
||
"atm = pd.concat([atm_call, atm_put])\n",
|
||
"straddle_price = round(atm.ask.sum(), 2)\n",
|
||
"upper_price = round((last_price*(1+(straddle_price/last_price))), 2)\n",
|
||
"lower_price = round((last_price*(1-(straddle_price/last_price))), 2)\n",
|
||
"\n",
|
||
"# Calculate the expected daily move\n",
|
||
"days = (atm.expiration.iloc[0] - datetime.now().date()).days\n",
|
||
"implied_move = ((1+ straddle_price/last_price)**(1/days) - 1) * 100\n",
|
||
"\n",
|
||
"print(\n",
|
||
" f\"Cost of Straddle: ${straddle_price}\"\n",
|
||
" f\"\\nCost as a % of Share Price: {round((straddle_price/last_price) * 100, 4)}%\"\n",
|
||
" f\"\\nUpper Breakeven Price: ${upper_price}\"\n",
|
||
" f\"\\nLower Breakeven Price: ${lower_price}\"\n",
|
||
" f\"\\nImplied Daily Move: {round(implied_move, 4)}%\\n\"\n",
|
||
")\n",
|
||
"\n",
|
||
"atm"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 14,
|
||
"metadata": {
|
||
"colab": {
|
||
"base_uri": "https://localhost:8080/"
|
||
},
|
||
"id": "chKbReFl85OV",
|
||
"outputId": "a693c4be-a9b2-49eb-c478-4800a96703aa"
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Cost of Straddle: $21.8\n",
|
||
"Cost as a % of Share Price: 7.4454%\n",
|
||
"Upper Breakeven Price: $314.6\n",
|
||
"Lower Breakeven Price: $271.0\n",
|
||
"Implied Daily Move: 1.4466%\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>contract_symbol</th>\n",
|
||
" <th>expiration</th>\n",
|
||
" <th>strike</th>\n",
|
||
" <th>option_type</th>\n",
|
||
" <th>open_interest</th>\n",
|
||
" <th>volume</th>\n",
|
||
" <th>theoretical_price</th>\n",
|
||
" <th>last_trade_price</th>\n",
|
||
" <th>tick</th>\n",
|
||
" <th>bid</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>change</th>\n",
|
||
" <th>change_percent</th>\n",
|
||
" <th>implied_volatility</th>\n",
|
||
" <th>delta</th>\n",
|
||
" <th>gamma</th>\n",
|
||
" <th>theta</th>\n",
|
||
" <th>vega</th>\n",
|
||
" <th>rho</th>\n",
|
||
" <th>last_trade_timestamp</th>\n",
|
||
" <th>dte</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>94</th>\n",
|
||
" <td>CRM240301C00292500</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>292.5</td>\n",
|
||
" <td>call</td>\n",
|
||
" <td>155</td>\n",
|
||
" <td>154</td>\n",
|
||
" <td>10.9659</td>\n",
|
||
" <td>11.25</td>\n",
|
||
" <td>up</td>\n",
|
||
" <td>11.0</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>-0.350</td>\n",
|
||
" <td>-0.0302</td>\n",
|
||
" <td>0.6679</td>\n",
|
||
" <td>0.5271</td>\n",
|
||
" <td>0.0148</td>\n",
|
||
" <td>-0.7864</td>\n",
|
||
" <td>0.1617</td>\n",
|
||
" <td>0.0272</td>\n",
|
||
" <td>2024-02-23 15:50:02</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>95</th>\n",
|
||
" <td>CRM240301P00292500</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>292.5</td>\n",
|
||
" <td>put</td>\n",
|
||
" <td>96</td>\n",
|
||
" <td>119</td>\n",
|
||
" <td>10.4037</td>\n",
|
||
" <td>10.55</td>\n",
|
||
" <td>up</td>\n",
|
||
" <td>10.4</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.375</td>\n",
|
||
" <td>0.0369</td>\n",
|
||
" <td>0.6640</td>\n",
|
||
" <td>-0.4739</td>\n",
|
||
" <td>0.0148</td>\n",
|
||
" <td>-0.7890</td>\n",
|
||
" <td>0.1616</td>\n",
|
||
" <td>-0.0254</td>\n",
|
||
" <td>2024-02-23 15:59:59</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>2 rows × 27 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" contract_symbol expiration strike option_type open_interest volume \\\n",
|
||
"94 CRM240301C00292500 2024-03-01 292.5 call 155 154 \n",
|
||
"95 CRM240301P00292500 2024-03-01 292.5 put 96 119 \n",
|
||
"\n",
|
||
" theoretical_price last_trade_price tick bid ... change \\\n",
|
||
"94 10.9659 11.25 up 11.0 ... -0.350 \n",
|
||
"95 10.4037 10.55 up 10.4 ... 0.375 \n",
|
||
"\n",
|
||
" change_percent implied_volatility delta gamma theta vega \\\n",
|
||
"94 -0.0302 0.6679 0.5271 0.0148 -0.7864 0.1617 \n",
|
||
"95 0.0369 0.6640 -0.4739 0.0148 -0.7890 0.1616 \n",
|
||
"\n",
|
||
" rho last_trade_timestamp dte \n",
|
||
"94 0.0272 2024-02-23 15:50:02 5 \n",
|
||
"95 -0.0254 2024-02-23 15:59:59 5 \n",
|
||
"\n",
|
||
"[2 rows x 27 columns]"
|
||
]
|
||
},
|
||
"execution_count": 14,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# Using the same strike for the call as the put.\n",
|
||
"\n",
|
||
"atm_call = chain.query(\"`strike` == @put_strike and `option_type` == 'call'\")\n",
|
||
"atm_put = chain.query(\"`strike` == @put_strike and `option_type` == 'put'\")\n",
|
||
"\n",
|
||
"atm = pd.concat([atm_call, atm_put])\n",
|
||
"straddle_price = round(atm.ask.sum(), 2)\n",
|
||
"upper_price = round((last_price*(1+(straddle_price/last_price))), 2)\n",
|
||
"lower_price = round((last_price*(1-(straddle_price/last_price))), 2)\n",
|
||
"\n",
|
||
"# Calculate the expected daily move\n",
|
||
"days = (atm.expiration.iloc[0] - datetime.now().date()).days\n",
|
||
"implied_move = ((1+ straddle_price/last_price)**(1/days) - 1) * 100\n",
|
||
"\n",
|
||
"print(\n",
|
||
" f\"Cost of Straddle: ${straddle_price}\"\n",
|
||
" f\"\\nCost as a % of Share Price: {round((straddle_price/last_price) * 100, 4)}%\"\n",
|
||
" f\"\\nUpper Breakeven Price: ${upper_price}\"\n",
|
||
" f\"\\nLower Breakeven Price: ${lower_price}\"\n",
|
||
" f\"\\nImplied Daily Move: {round(implied_move, 4)}%\\n\"\n",
|
||
")\n",
|
||
"\n",
|
||
"atm"
|
||
]
|
||
},
|
||
{
|
||
"cell_type": "code",
|
||
"execution_count": 10,
|
||
"metadata": {
|
||
"colab": {
|
||
"base_uri": "https://localhost:8080/",
|
||
"height": 266
|
||
},
|
||
"id": "XSMb0vlEXB4S",
|
||
"outputId": "2c62e9c1-1c5b-4708-cc7f-9462818d82df"
|
||
},
|
||
"outputs": [
|
||
{
|
||
"name": "stdout",
|
||
"output_type": "stream",
|
||
"text": [
|
||
"Cost of Straddle: $20.55\n",
|
||
"Cost as a % of Share Price: 7.0184%\n",
|
||
"Upper Breakeven Price: $313.35\n",
|
||
"Lower Breakeven Price: $272.25\n",
|
||
"Implied Daily Move: 1.3659%\n",
|
||
"\n"
|
||
]
|
||
},
|
||
{
|
||
"data": {
|
||
"text/html": [
|
||
"<div>\n",
|
||
"<style scoped>\n",
|
||
" .dataframe tbody tr th:only-of-type {\n",
|
||
" vertical-align: middle;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe tbody tr th {\n",
|
||
" vertical-align: top;\n",
|
||
" }\n",
|
||
"\n",
|
||
" .dataframe thead th {\n",
|
||
" text-align: right;\n",
|
||
" }\n",
|
||
"</style>\n",
|
||
"<table border=\"1\" class=\"dataframe\">\n",
|
||
" <thead>\n",
|
||
" <tr style=\"text-align: right;\">\n",
|
||
" <th></th>\n",
|
||
" <th>contract_symbol</th>\n",
|
||
" <th>expiration</th>\n",
|
||
" <th>strike</th>\n",
|
||
" <th>option_type</th>\n",
|
||
" <th>open_interest</th>\n",
|
||
" <th>volume</th>\n",
|
||
" <th>theoretical_price</th>\n",
|
||
" <th>last_trade_price</th>\n",
|
||
" <th>tick</th>\n",
|
||
" <th>bid</th>\n",
|
||
" <th>...</th>\n",
|
||
" <th>change</th>\n",
|
||
" <th>change_percent</th>\n",
|
||
" <th>implied_volatility</th>\n",
|
||
" <th>delta</th>\n",
|
||
" <th>gamma</th>\n",
|
||
" <th>theta</th>\n",
|
||
" <th>vega</th>\n",
|
||
" <th>rho</th>\n",
|
||
" <th>last_trade_timestamp</th>\n",
|
||
" <th>dte</th>\n",
|
||
" </tr>\n",
|
||
" </thead>\n",
|
||
" <tbody>\n",
|
||
" <tr>\n",
|
||
" <th>96</th>\n",
|
||
" <td>CRM240301C00295000</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>295.0</td>\n",
|
||
" <td>call</td>\n",
|
||
" <td>540</td>\n",
|
||
" <td>315</td>\n",
|
||
" <td>9.8163</td>\n",
|
||
" <td>10.05</td>\n",
|
||
" <td>down</td>\n",
|
||
" <td>9.85</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>-0.375</td>\n",
|
||
" <td>-0.0360</td>\n",
|
||
" <td>0.6666</td>\n",
|
||
" <td>0.4904</td>\n",
|
||
" <td>0.0148</td>\n",
|
||
" <td>-0.790</td>\n",
|
||
" <td>0.1620</td>\n",
|
||
" <td>0.0254</td>\n",
|
||
" <td>2024-02-23 15:59:01</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" <tr>\n",
|
||
" <th>95</th>\n",
|
||
" <td>CRM240301P00292500</td>\n",
|
||
" <td>2024-03-01</td>\n",
|
||
" <td>292.5</td>\n",
|
||
" <td>put</td>\n",
|
||
" <td>96</td>\n",
|
||
" <td>119</td>\n",
|
||
" <td>10.4037</td>\n",
|
||
" <td>10.55</td>\n",
|
||
" <td>up</td>\n",
|
||
" <td>10.40</td>\n",
|
||
" <td>...</td>\n",
|
||
" <td>0.375</td>\n",
|
||
" <td>0.0369</td>\n",
|
||
" <td>0.6640</td>\n",
|
||
" <td>-0.4739</td>\n",
|
||
" <td>0.0148</td>\n",
|
||
" <td>-0.789</td>\n",
|
||
" <td>0.1616</td>\n",
|
||
" <td>-0.0254</td>\n",
|
||
" <td>2024-02-23 15:59:59</td>\n",
|
||
" <td>5</td>\n",
|
||
" </tr>\n",
|
||
" </tbody>\n",
|
||
"</table>\n",
|
||
"<p>2 rows × 27 columns</p>\n",
|
||
"</div>"
|
||
],
|
||
"text/plain": [
|
||
" contract_symbol expiration strike option_type open_interest volume \\\n",
|
||
"96 CRM240301C00295000 2024-03-01 295.0 call 540 315 \n",
|
||
"95 CRM240301P00292500 2024-03-01 292.5 put 96 119 \n",
|
||
"\n",
|
||
" theoretical_price last_trade_price tick bid ... change \\\n",
|
||
"96 9.8163 10.05 down 9.85 ... -0.375 \n",
|
||
"95 10.4037 10.55 up 10.40 ... 0.375 \n",
|
||
"\n",
|
||
" change_percent implied_volatility delta gamma theta vega rho \\\n",
|
||
"96 -0.0360 0.6666 0.4904 0.0148 -0.790 0.1620 0.0254 \n",
|
||
"95 0.0369 0.6640 -0.4739 0.0148 -0.789 0.1616 -0.0254 \n",
|
||
"\n",
|
||
" last_trade_timestamp dte \n",
|
||
"96 2024-02-23 15:59:01 5 \n",
|
||
"95 2024-02-23 15:59:59 5 \n",
|
||
"\n",
|
||
"[2 rows x 27 columns]"
|
||
]
|
||
},
|
||
"execution_count": 10,
|
||
"metadata": {},
|
||
"output_type": "execute_result"
|
||
}
|
||
],
|
||
"source": [
|
||
"# When using the same strike, one option will end up being in-the-money.\n",
|
||
"# This may inflate the cost of the position.\n",
|
||
"# It can be more favourable to use the nearest OTM strike to each instead.\n",
|
||
"\n",
|
||
"atm_call = chain.query(\"`strike` == @call_strike and `option_type` == 'call'\")\n",
|
||
"atm_put = chain.query(\"`strike` == @put_strike and `option_type` == 'put'\")\n",
|
||
"\n",
|
||
"atm = pd.concat([atm_call, atm_put])\n",
|
||
"straddle_price = round(atm.ask.sum(), 2)\n",
|
||
"upper_price = round((last_price*(1+(straddle_price/last_price))), 2)\n",
|
||
"lower_price = round((last_price*(1-(straddle_price/last_price))), 2)\n",
|
||
"\n",
|
||
"# Calculate the expected daily move\n",
|
||
"days = (atm.expiration.iloc[0] - datetime.now().date()).days\n",
|
||
"implied_move = ((1+ straddle_price/last_price)**(1/days) - 1) * 100\n",
|
||
"\n",
|
||
"print(\n",
|
||
" f\"Cost of Straddle: ${straddle_price}\"\n",
|
||
" f\"\\nCost as a % of Share Price: {round((straddle_price/last_price) * 100, 4)}%\"\n",
|
||
" f\"\\nUpper Breakeven Price: ${upper_price}\"\n",
|
||
" f\"\\nLower Breakeven Price: ${lower_price}\"\n",
|
||
" f\"\\nImplied Daily Move: {round(implied_move, 4)}%\\n\"\n",
|
||
")\n",
|
||
"\n",
|
||
"atm"
|
||
]
|
||
}
|
||
],
|
||
"metadata": {
|
||
"colab": {
|
||
"provenance": []
|
||
},
|
||
"kernelspec": {
|
||
"display_name": "Python 3",
|
||
"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.11.7"
|
||
}
|
||
},
|
||
"nbformat": 4,
|
||
"nbformat_minor": 0
|
||
}
|