← All archived writing

VIX Futures Expiry Dates

Originally published on quanttech.co. View saved original ↗

As VIX futures do not expire on the same day each month, I thought I'd share the following code you can use to determine the when the next expiry date is.

There is one caveat - if the CBOE is closed on the third Friday of the month the date moves back one day, you'll need to factor this in yourselves.

import datetime as dt


def get_expiry_date_for_month(curr_date):
    """
    http://cfe.cboe.com/products/spec_vix.aspx

    TERMINATION OF TRADING:

    Trading hours for expiring VIX futures contracts end at 7:00 a.m. Chicago
    time on the final settlement date.

    FINAL SETTLEMENT DATE:

    The Wednesday that is thirty days prior to the third Friday of the
    calendar month immediately following the month in which the contract
    expires ("Final Settlement Date"). If the third Friday of the month
    subsequent to expiration of the applicable VIX futures contract is a
    CBOE holiday, the Final Settlement Date for the contract shall be thirty
    days prior to the CBOE business day immediately preceding that Friday.
    """
    # Date of third friday of the following month
    if curr_date.month == 12:
        third_friday_next_month = dt.date(curr_date.year + 1, 1, 15)
    else:
        third_friday_next_month = dt.date(curr_date.year,
                                          curr_date.month + 1, 15)

    one_day = dt.timedelta(days=1)
    thirty_days = dt.timedelta(days=30)
    while third_friday_next_month.weekday() != 4:
        # Using += results in a timedelta object
        third_friday_next_month = third_friday_next_month + one_day

    # TODO: Incorporate check that it's a trading day, if so move the 3rd
    # Friday back by one day before subtracting
    return third_friday_next_month - thirty_days

Plus accompanying tests.

import datetime as dt
import unittest

from expiries import vix


class VixTests(unittest.TestCase):
    def test_get_expiry_date_for_month(self):
        self.assertEqual(
            dt.date(2014, 12, 17),
            vix.get_expiry_date_for_month(dt.date(2014, 12, 1)))
        self.assertEqual(
            dt.date(2015, 1, 21),
            vix.get_expiry_date_for_month(dt.date(2015, 1, 1)))
        self.assertEqual(
            dt.date(2015, 2, 18),
            vix.get_expiry_date_for_month(dt.date(2015, 2, 1)))


if __name__ == '__main__':
    unittest.main()

Full listing is available here.

Cite this post

Conor Svensson (29 June 2015). VIX Futures Expiry Dates. https://conorsvensson.com/archive/quanttech/vix-futures-expiry-dates/

BibTeX
@misc{svensson2015-vix-futures-expiry-dates,
  author = {Conor Svensson},
  title = {{VIX Futures Expiry Dates}},
  year = {2015},
  month = jun,
  url = {https://conorsvensson.com/archive/quanttech/vix-futures-expiry-dates/}
}