Sunday, November 17, 2019

014 - Revisiting Date & Root Exclusions

14_root_date_research

A Review of Option Chain Dates and Roots

Summary

The CBOE data I downloaded in November include several new option series 'roots'. There were also several unexpected expiration dates in the historical data. I expected to see mainly Monday, Wendesday, or Friday expirations. However, there are a large number of Saturday expirations in the early data. Thursday expirations occur on occasion, too. So I wanted to learn why those expiration days appear in the data.

Option Chain Dates

My original goal for this project was to use 'standard' options to perform backtests. That meant isolating option series that expired on the 'third Friday of the month'. Then I decided to expand the data to include all Friday expirations, becuase the CBOE volatility index (the VIX) uses both the 'standard' options as well as weeklies. The CBOE methodology white paper notes:

The VIX Index measures 30-day expected volatility of the S&P 500 Index. The components of the VIX Index are near- and next-term put and call options with more than 23 days and less than 37 days to expiration. These include SPX options with “standard” 3rd Friday expiration dates and “weekly” SPX options that expire every Friday, except the 3rd Friday of each month. Once each week, the SPX options used to calculate the VIX Index “roll” to new contract maturities. For example, on the second Tuesday in October, the VIX Index would be calculated using SPX options expiring 24 days later (i.e., “near-term”) and 31 days later (i.e., “next-term”). On the following day, the SPX options that expire in 30 calendar days would become the “near-term” options and SPX options that expire in 37 calendar days would be the “next-term” options.

Isolating Friday expirations turned-out to be more complicated than I orginally anticipated because some options in the history appear to expire on the Thursday before or Saturday following the 3rd Friday of a month. The Saturday expirations typically happen after the 3rd Friday of the month. However Saturday is not Friday, so I wanted to make sure that I should include these data in the final data frame.

Fortunately, Sheldon Natenberg in his book on Option Pricing and Volatility: Advanced Trading Strategies and Techniques explains why these Satruday dates appear early in the historical data.

On many stock option exchanges, the expiration date for stock and stock index options is the thrid Friday of the month. Of more importance to most traders is the last trading day, the last business day prior to the expiration on which an option can be bought or sold on an exchange. For most stock options, expiration day and the last trading day are the same, the third Friday of the month(1). However, Good Friday, a legal holiday in many countries, occasionally falls on the third Friday of April. When this occurs, the last trading day is the preceding Thursday.

(1)In the early days of option trading, exhange-traded options often expired on a non-business day, typically on a Saturday. This gave the exchange an extra day to process the paperwork associated with expiring options

Natenberg's description explains both the presence of Saturday expirations as well as the occasional Thursday expiration for standard (or 3rd Friday expiration) options.

As a sanity-check, I also used calendars published by the Options Clearing Corporation to verify certain peculiar expiration dates. For reference, the calendars from 2008 to the present are available.

To complicate things further, over time the CBOE introduced new series that could expire on a day that might get confused with the weeklies.

In 2006 the CBOE introduced Quarterlys -- options that expire at the end of calendar-year quarters (March, June, September and December). Those expirations can land on a Thursday or a Friday, so we need to prune those to avoid potential confusion with weeklies.

In 2014 the CBOE introduced PM-settled, End-of-Month options series (EOM) -- with expiration dates falling on the last business day of the month -- for its S&P 500 Index (SPXSM) options. CBOE added SPX EOM options to its SPX options product line in response to requests from asset managers who want to more precisely match SPX option expirations to end-of-month fund cycles and fund performance periods.

So, end-of-month SPX options expire on the last trading day of each month to coincide with end-of-month accounting practices. (By comparison, traditional options generally expire on the Saturday immediately following the third Friday of the expiration month until February 15, 2015. On and after February 15, 2015, the expiration date will be the third Friday of the expiration month.)

Option Chain Roots

Here I expand slightly on my previous post regarding option series roots.

Based on the occurrence of certain series on a given set of dates, we can cross-check the assumptions outlined in the previous post.

Option series types:

  1. Weeklies:
    • Series with a Friday expiration between 11/04/2005 and 05/14/2010 that does not include the third Friday of the month: {JXA, JXB, JXD, JXE}
    • Standard weeklies: {SPXW}
  2. Quarterlies:
    • Quarterlies with expirations between 06/30/2011 and 06/30/2015: {SPXQ}
    • Quarterlies with expirations between 06/30/2010 and 06/30/2015: {SPXPM}
    • Quarterlies with expirations between 03/20/2007 and 03/31/2011: {SKQ, SLQ}
    • Quarterlies with expirations between 09/30/2008 and 03/31/2011: {QSE, QSZ, QZQ}
    • Quarterlies with expirations between 03/30/2007 and 03/31/2011: {SQG, SQP}
    • Quarterlies with expirations between 09/28/2007 and 03/31/2011: {SZQ}
    • Other Quarterlies: {SAQ}
  3. AM-Settled Leaps / Wraps:
    • Long-term option series (LEAPS): {SPL, SXG, SXJ, SYZ, SZD, SZJ}
    • Wrap options series: {SPB, SPV, SVP, SYG, SYU, SYV, SZU}
    • Ambiguous LEAP/WRAP series: {SZT, SZV}
  4. Non-standard option series:
    • Binary options: {BSZ, BSF, BSK}
    • Range options: {SRO}
    • Variance strip options: {VSTRP}
  5. Option series with very low counts in the 1911 historical data:
    • Noisy roots (???): {AD, BJH, BNK, BQA, DFD, DFN, EOP, FSL, GEU, HBQ, HGC, IIQ, LZX, MLS, MYB, MZS, NXL, OBI, OSA, OSZ, QGR, QJV, QLJ, QNE, RDA, RXA, RXS, SBO, SFU, SOY, SQR, SXX, TMQ, TXF, UMO, USL, UWB, VAS, VOP, WCO, XAV, XGI, YDS, YFS, YKH, YRN, YXD, YXI, YZP, ZPO}
  6. Standard (?) option series:
    • Third friday expirations: {SPQ, SPT, SPX, SPZ, SXB, SXM, SXY, SXZ, SZP}

Using this research, I constructed the filtering logic shown below

In [1]:
# Remove low volume roots; Those with fewer that 250 observations
# across the historical window.  Adding manually because I want to
# see what is in the data.  (Note: These did not appear in the 1905 data)
low_volume_roots = ['AD',  'BJH', 'BNK', 'BQA', 'DFD', 'DFN', 'EOP', 'FSL',
                    'GEU', 'HBQ', 'HGC', 'IIQ', 'LZX', 'MLS', 'MYB', 'MZS',
                    'NXL', 'OBI', 'OSA', 'OSZ', 'QGR', 'QJV', 'QLJ', 'QNE',
                    'RDA', 'RXA', 'RXS', 'SBO', 'SFU', 'SOY', 'SQR', 'SXX',
                    'TMQ', 'TXF', 'UMO', 'USL', 'UWB', 'VAS', 'VOP', 'WCO',
                    'XAV', 'XGI', 'YDS', 'YFS', 'YKH', 'YRN', 'YXD', 'YXI',
                    'YZP', 'ZPO', ]
In [2]:
# Remove quarterly expirations
quarterly_roots = ['SPXQ', 'SPXPM', 'SAQ', 'SKQ', 'SLQ', 'QSE', 'QSZ', 'QZQ',
                   'SQG', 'SQP', 'SZQ', ]
In [3]:
# Remove binary options (B*), Variance Strip (VSTRP), Range Option (SRO)
# (Note: These no longer appear in the 1911 data)
binary_options = ['BSZ', 'BSF', 'BSK', 'SRO', 'VSTRP']
In [4]:
# Remove the PM expirations that occur on the third Friday of the month
weekly_roots = ['JXA', 'JXB', 'JXD', 'JXE', 'SPXW']

So, let's check and see what remains (in terms of roots) in the reduced dataframe.

In [5]:
# Import modules
import os
import pandas as pd
from datetime import timedelta

# =============================================================================
# Set-up
# =============================================================================

# Alter pandas display settings
pd.set_option('display.max_rows', 200)
pd.set_option('display.max_columns', 500)
pd.set_option('display.width', 500)

# Location of the processed CBOE csv files
proc_dir = r'/Users/alexstephens/data/cboe/proc/1911_SPX'

# Define the merged dataframe
mrg_pkl = r'cboe_spx_1911_clean_df_mrg.pkl'
mrg_pkl_file = os.path.join(proc_dir, mrg_pkl)
In [6]:
# =============================================================================
# Main
# =============================================================================

# Read the .pkl file
df_mrg = pd.read_pickle(mrg_pkl_file)

# (12762972, 34)
df_mrg.shape
Out[6]:
(4145554, 51)

Create a cross-tabulation of the roots that remain. What do we observe:

  • Most of the roots are weeklies (SPXW) and standard expiration (SPX) series
  • I retain the non-third Friday (J*) roots
  • There are still WRAP/LEAP series in the data (SY, SZ, etc.)
  • The quarterlies, end-of-month, binary, variance strip, and low-volume non-standard roots were successfully purged from the data

As I progress in the analysis of the data, it is possible that I will need to revisit some of the remaining roots.

In [7]:
pd.crosstab(df_mrg.root, 'Dummy')
Out[7]:
col_0 Dummy
root
JXA 2686
JXB 2868
JXD 2719
JXE 945
SPB 16863
SPL 90
SPQ 62681
SPT 78760
SPV 8331
SPX 1838807
SPXW 1737815
SPZ 39378
SVP 12066
SXB 54035
SXG 269
SXJ 10
SXM 33127
SXY 64915
SXZ 49060
SYF 3284
SYG 31407
SYU 15793
SYV 2455
SYZ 235
SZJ 98
SZP 80536
SZT 169
SZU 6090
SZV 62

No comments:

Post a Comment