├── config ├── commodities_config.csv ├── eia_file_list.txt ├── url_list.txt └── exchange_expiry_dates.csv ├── scripts ├── dailySettlementExtract.sh ├── stringFunctions.py ├── interpolation.py ├── downloadEiaHistoricalSurveyData.py ├── reprocessAllSettlementDataFiles.py ├── loadMarketDataForConsolePlay.py ├── deltaHedgePortfolio.py ├── Portfolio.py ├── csvdb.py ├── moveMarketDataFilesFromSettlementDataFilePath.py ├── downloadCmeSettlementFiles.py ├── Future.py ├── option_normal_model.py ├── cCurve.py ├── FuturesHashConvert.py ├── TimeSeriesFunctions.py ├── loadFuturesConfig.py ├── simulateDeltaHedgingSingleCallWithVaryingTimeFrequencies.py ├── TimeSeries.py ├── testRunNo001.py ├── FutureOption.py ├── black_scholes.py ├── generateFutureAndOptionLastTradeDates.py └── constructCurvesAndSurfacesFromSettlementDataFiles.py ├── README.md └── LICENSE /config/commodities_config.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/newmath/FuturesAndOptionsTradingSimulation/HEAD/config/commodities_config.csv -------------------------------------------------------------------------------- /scripts/dailySettlementExtract.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | cd ~/MarketData/scripts 3 | ./downloadCmeSettlementFiles.py 4 | python ./constructCurvesAndSurfacesFromSettlementDataFiles.py 5 | 6 | -------------------------------------------------------------------------------- /scripts/stringFunctions.py: -------------------------------------------------------------------------------- 1 | #DEFINE FUNCTIONS FOR USE IN PARSING FILES 2 | def clean(string = ''): 3 | return string.strip(' \t\n\r"') 4 | 5 | def left(string = '',c = 0): 6 | return string[:c] 7 | 8 | def right(string = '',c = 0): 9 | return string[len(string)-c:] 10 | 11 | def mid(string = '',start = 0, c = 0): 12 | return string[start:start+c] 13 | -------------------------------------------------------------------------------- /config/eia_file_list.txt: -------------------------------------------------------------------------------- 1 | http://www.eia.gov/dnav/pet/xls/PET_PRI_GND_DCUS_NUS_W.xls 2 | http://www.eia.gov/dnav/pet/xls/PET_PNP_WIUP_DCU_NUS_W.xls 3 | http://www.eia.gov/dnav/pet/xls/PET_PNP_WPRODRB_DCU_NUS_W.xls 4 | http://www.eia.gov/dnav/pet/xls/PET_PNP_WPRODE_S1_W.xls 5 | http://www.eia.gov/dnav/pet/xls/PET_MOVE_WKLY_DC_NUS-Z00_MBBLPD_W.xls 6 | http://www.eia.gov/dnav/pet/xls/PET_MOVE_WIMPC_S1_W.xls 7 | -------------------------------------------------------------------------------- /config/url_list.txt: -------------------------------------------------------------------------------- 1 | ftp://ftp.cmegroup.com/pub/settle/stlint,CME 2 | ftp://ftp.cmegroup.com/pub/settle/stleqt,CME 3 | ftp://ftp.cmegroup.com/pub/settle/stlags,CBOT 4 | ftp://ftp.cmegroup.com/pub/settle/stlcur,CME 5 | ftp://ftp.cmegroup.com/pub/settle/stlalt,CME 6 | ftp://ftp.cmegroup.com/pub/settle/stlcomex,COMEX 7 | ftp://ftp.cmegroup.com/pub/settle/stlnymex,NYMEX 8 | ftp://ftp.cmegroup.com/pub/settle/stlcpc,CLEARPORT 9 | -------------------------------------------------------------------------------- /scripts/interpolation.py: -------------------------------------------------------------------------------- 1 | def d1Interpolate(x,X,Y,method='linear'): 2 | if method == 'linear': 3 | # EXTRAPOLATE FLAT 4 | if x <= X[0]: 5 | return Y[0] 6 | if x >= X[-1]: 7 | return Y[-1] 8 | # OTHERWISE LOOP THROUGH EACH ITEM 9 | for i in range(len(X)-1): 10 | if x <= X[i+1]: 11 | slope = (Y[i+1] - Y[i]) / (X[i+1] - X[i]) 12 | return Y[i] + slope * (x - X[i]) 13 | else: 14 | return -1.0 15 | 16 | -------------------------------------------------------------------------------- /scripts/downloadEiaHistoricalSurveyData.py: -------------------------------------------------------------------------------- 1 | import os 2 | import urllib2 3 | #import shutil 4 | from datetime import date 5 | 6 | # READ URL LIST FROM CONFIG FILE 7 | urlFile = '../config/eia_file_list.txt' 8 | block_sz = 8192 9 | f = open(urlFile, 'r') 10 | url_list = f.readlines() 11 | f.close() 12 | 13 | dest_dir = '../eia_survey_data' 14 | 15 | #DOWNLOAD EACH OF THE FILES TO THE TEMP DIRECTORY 16 | for url in url_list: 17 | url = url.strip().split(',')[0] 18 | print 'Downloading ' + url 19 | u = urllib2.urlopen(url) 20 | file_name = dest_dir + '/' + url.split('/')[-1] 21 | f = open(file_name, 'wb') 22 | while 1: 23 | buffer = u.read(block_sz) 24 | if not buffer: 25 | break 26 | f.write(buffer) 27 | f.close() 28 | 29 | #CONVERT ALL FILES TO CSV 30 | 31 | -------------------------------------------------------------------------------- /scripts/reprocessAllSettlementDataFiles.py: -------------------------------------------------------------------------------- 1 | #!/opt/local/bin/python 2 | 3 | import os 4 | import sys 5 | 6 | settlement_file_path = '../settlement_data_files' 7 | data_process_script = 'constructCurvesAndSurfacesFromSettlementDataFiles.py' 8 | 9 | firstDate = '19000101' 10 | lastDate = '30001231' 11 | if len(sys.argv) > 1: 12 | firstDate = sys.argv[1] 13 | if len(sys.argv) > 2: 14 | lastDate = sys.argv[2] 15 | 16 | for o in os.listdir(settlement_file_path): 17 | # EACH SUBDIRECTORY OF THE SETTLEMENT FILE PATH IS NAMED BY A DATE, BUT CHECK ANYWAY 18 | if os.path.isdir(os.path.join(settlement_file_path,o)): 19 | if o >= firstDate and o <= lastDate: 20 | command = 'python ./' + data_process_script + ' ' + o 21 | os.system(command) 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # FuturesAndOptionsTradingSimulation 2 | class libraries, scripts and supporting functions for simulating futures and options trading stratgies 3 | 4 | There are currently 2 related projects in this repository: scraping market data from the CME website and simulating trading strategies. This started out as a data scraper and was expanded to evaluate market opportunities in commodities futures. So far the simulation only covers historical simluation over available data. I have started building portfolio risk analytics, but i still need to develop routines for systematically identifying relative value. 5 | 6 | Configuration files can be found in the config directory. This includes files identifying contract terms as well as trading conventions such as option expiry dates and exchange holidays. 7 | 8 | The scripts folder contains all of the python code required. 9 | -------------------------------------------------------------------------------- /scripts/loadMarketDataForConsolePlay.py: -------------------------------------------------------------------------------- 1 | import pickle 2 | import os 3 | import sys 4 | sys.path.insert(0,os.getcwd()) 5 | from datetime import date 6 | from FuturesHashConvert import * 7 | 8 | startDate = date(2013,8,30) 9 | endDate = date(2099,12,31) 10 | 11 | futFile = '../db/tsFutures.dat' 12 | volFile = '../db/tsVols.dat' 13 | rateFile = '../db/tsDFCurves.dat' 14 | 15 | dbfile = open(futFile,'r') 16 | FUTURESERIES = pickle.load(dbfile) 17 | dbfile.close() 18 | 19 | dbfile = open(volFile,'r') 20 | VOLSERIES = pickle.load(dbfile) 21 | dbfile.close() 22 | 23 | dbfile = open(rateFile,'r') 24 | DFS = pickle.load(dbfile) 25 | dbfile.close() 26 | 27 | print 'Futures, Vols, and Rates loaded' 28 | 29 | CURVES = dict() 30 | ConvertFuturesHashToCurvesHash(FUTURESERIES,CURVES,startDate,endDate) 31 | VOLS = dict() 32 | ConvertFuturesHashToCurvesHash(VOLSERIES,VOLS,startDate,endDate) 33 | 34 | print 'Market data converted into scenarios' 35 | 36 | 37 | -------------------------------------------------------------------------------- /scripts/deltaHedgePortfolio.py: -------------------------------------------------------------------------------- 1 | #!/opt/local/bin/python 2 | # 3 | # 20131227 4 | # Joshua Zimmerman 5 | # Subroutines for calculating trades required to mitigate delta risks to 6 | # individual futures contracts 7 | 8 | from loadFuturesConfig import * 9 | from Future import * 10 | 11 | def DeltaHedgePortfolio(PORTFOLIO,SCEN): 12 | #COMPUTE DELTAS TO INDIVIDUAL CONTRACTS 13 | DELTAS = dict() 14 | PORTFOLIO.Deltas(SCEN,DELTAS) 15 | #FOR EACH DELTA, ADD OFFSETTING FUTURE TRADE TO PORTFOLIO 16 | # DELTA HASH ORGANIZED BY COMMODITY AND CONTRACT EXPIRY 17 | for commodity in DELTAS.keys(): 18 | contractSize = GetContractQuantityByTicker(commodity) 19 | for expCode in DELTAS[commodity].keys(): 20 | delta = DELTAS[commodity][expCode] 21 | tradeSize = round(-1 * delta,0) 22 | if abs(tradeSize) > 0: 23 | fixedRate = SCEN['CURVES'][commodity][expCode]['Close'] 24 | X = Future(commodity,expCode,fixedRate,tradeSize,contractSize) 25 | PORTFOLIO.Trades.append(X) 26 | -------------------------------------------------------------------------------- /scripts/Portfolio.py: -------------------------------------------------------------------------------- 1 | 2 | class Portfolio: 3 | # define array of items that are the trades in the portfolio 4 | # run-time interpretation will handle polymorphism for me 5 | Trades = [] 6 | Cash = 0.0 7 | Name = '' 8 | 9 | def __init__(self,name=''): 10 | self.Name = name 11 | self.Trades = [] 12 | self.Cash = 0.0 13 | 14 | def Append(self,X): 15 | self.Trades.append(X) 16 | 17 | def TradeCount(self): 18 | return len(self.Trades) 19 | 20 | def NPV(self,SCENARIO): 21 | dblTotal = 0.0 22 | for trade in self.Trades: 23 | dblTotal += trade.NPV(SCENARIO) 24 | return dblTotal 25 | 26 | def Deltas(self,SCENARIO,RISK): 27 | for trade in self.Trades: 28 | trade.Deltas(SCENARIO,RISK) 29 | 30 | def Gammas(self,SCENARIO,RISK): 31 | for trade in self.Trades: 32 | trade.Gammas(SCENARIO,RISK) 33 | 34 | def Vegas(self,SCENARIO,RISK): 35 | for trade in self.Trades: 36 | trade.Vegas(SCENARIO,RISK) 37 | 38 | def Rhos(self,SCENARIO,RISK): 39 | for trade in self.Trades: 40 | trade.Rhos(SCENARIO,RISK) 41 | 42 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2015 newmath 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | 23 | -------------------------------------------------------------------------------- /scripts/csvdb.py: -------------------------------------------------------------------------------- 1 | #ROUTINES FOR TREATING CSV FILES LIKE RELATIONAL DATABASE TABLES 2 | 3 | #IMPORT OS FOR FILE I/O 4 | import os.path 5 | #IMPORT STRING FUNCTIONS 6 | from stringFunctions import clean 7 | 8 | def HashTableFromFileAsText(filename = '',sep=','): 9 | #INIT RESULT HASH 10 | _result = dict() 11 | 12 | #VALIDATE THAT FILE EXISTS 13 | if not os.path.isfile(filename): 14 | print 'file not found: ',filename 15 | return _result 16 | 17 | #READ DATA FROM FILE 18 | infile = open(filename,'r') 19 | linenum = 0 20 | col_headings = [] 21 | for line in infile: 22 | linenum += 1 23 | line = clean(line) 24 | #print line 25 | if linenum == 1: 26 | col_headings = line.split(sep) 27 | for j in range(len(col_headings)): 28 | col_headings[j] = clean(col_headings[j]) 29 | continue 30 | fields = line.split(sep) 31 | _id = fields[0] 32 | _result[_id] = dict() 33 | for j in range(len(fields)): 34 | _result[_id][col_headings[j]] = clean(fields[j]) 35 | #print _id,col_headings[j],_result[_id][col_headings[j]] 36 | #RETURN COMPILED TABLE 37 | return _result 38 | -------------------------------------------------------------------------------- /scripts/moveMarketDataFilesFromSettlementDataFilePath.py: -------------------------------------------------------------------------------- 1 | # Move market data files to location separate from settlement data files so 2 | # they can be easily backed up and transferred separately. This is probably a 3 | # write-once, run-once routine, but it's worth saving 4 | 5 | import os 6 | 7 | settle_base = '../settlement_data_files' 8 | market_base = '../market_data_files' 9 | 10 | # FOR EACH SUBDIRECTORY IN SETTLEMENT DATA FILES DIRECTORY 11 | # CREATE NEW MARKET SUBDIRECTORY IF NECESSARY 12 | # MOVE MARKET DATA FILES FROM SETTLE DIR TO MARKET DIR 13 | 14 | for list_item in os.listdir(settle_base): 15 | dir_path = settle_base + '/' + list_item 16 | if os.path.isdir(dir_path): 17 | #DETERMINE AND/OR CREATE OUTPUT FOLDER 18 | out_path = market_base + '/' + list_item 19 | if not os.path.exists(out_path): os.mkdir(out_path) 20 | #MOVE MARKET DATA FILES 21 | for filename in os.listdir(dir_path): 22 | header = filename[:7] 23 | if header == 'mktdata': 24 | settle_file = dir_path + '/' + filename 25 | market_file = out_path + '/' + filename 26 | os.rename(settle_file,market_file) 27 | -------------------------------------------------------------------------------- /scripts/downloadCmeSettlementFiles.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/python 2 | 3 | import os 4 | import urllib2 5 | import shutil 6 | from datetime import date 7 | 8 | #DEFINE SUPPORTING FUNCTIONS 9 | def getDateFromFirstLineOfDataFile_YYYYMMDD(file_name): 10 | _f = open(file_name, 'r') 11 | _line = _f.readline() 12 | _f.close() 13 | _fields = _line.split(' ') 14 | i = 0 15 | while i < len(_fields): 16 | if _fields[i] == 'AS' and _fields[i+1] == 'OF': 17 | dateString = _fields[i+2] 18 | _parts = dateString.split('/') 19 | return '20' + _parts[2] + _parts[0] + _parts[1] 20 | i += 1 21 | #OTHERWISE 22 | return "ERRRRROR" 23 | 24 | #DELETE TEMP DIRECTORY IF IT EXISTS 25 | temp_dir = '../settlement_data_files/temp' 26 | if os.path.exists(temp_dir): shutil.rmtree(temp_dir) 27 | 28 | #RECREATE TEMP DIRECTORY 29 | os.mkdir(temp_dir) 30 | 31 | # READ URL LIST FROM CONFIG FILE 32 | urlFile = '../config/url_list.txt' 33 | block_sz = 8192 34 | f = open(urlFile, 'r') 35 | url_list = f.readlines() 36 | f.close() 37 | 38 | #DOWNLOAD EACH OF THE FILES TO THE TEMP DIRECTORY 39 | for url in url_list: 40 | url = url.strip().split(',')[0] 41 | #print 'Downloading ' + url 42 | u = urllib2.urlopen(url) 43 | file_name = temp_dir + '/' + url.split('/')[-1] 44 | f = open(file_name, 'wb') 45 | while 1: 46 | buffer = u.read(block_sz) 47 | if not buffer: 48 | break 49 | f.write(buffer) 50 | f.close() 51 | 52 | #RENAME TEMP DIRECTORY BASED ON FIRST DATA FILE 53 | url = url_list[0].strip().split(',')[0] 54 | file_name = temp_dir + '/' + url.split('/')[-1] 55 | newPath = '../settlement_data_files/' + getDateFromFirstLineOfDataFile_YYYYMMDD(file_name) 56 | if os.path.exists(newPath): shutil.rmtree(newPath) 57 | os.rename(temp_dir,newPath) 58 | -------------------------------------------------------------------------------- /scripts/Future.py: -------------------------------------------------------------------------------- 1 | class Future: 2 | Ticker = '' 3 | ExpiryCode = '' 4 | Quantity = 0.0 5 | FixedRate = 0.0 6 | ContractSize = 0.0 7 | 8 | def __init__(self,ticker,expiryCode,fixedRate,quantity,contractSize): 9 | self.Ticker = ticker 10 | self.ExpiryCode = expiryCode 11 | self.Quantity = float(quantity) 12 | self.FixedRate = float(fixedRate) 13 | self.ContractSize = float(contractSize) 14 | 15 | def NPV(self,SCENARIO): 16 | dblForward = SCENARIO['CURVES'][self.Ticker][self.ExpiryCode]['Close'] 17 | dblNPV = float(self.Quantity) * float(self.ContractSize) * (dblForward - self.FixedRate) 18 | return round(dblNPV,2) 19 | 20 | def Deltas(self,SCENARIO,RISK): 21 | if not RISK.has_key(self.Ticker): RISK[self.Ticker] = dict() 22 | if not RISK[self.Ticker].has_key(self.ExpiryCode): RISK[self.Ticker][self.ExpiryCode] = 0.0 23 | dblDelta = self.Quantity 24 | RISK[self.Ticker][self.ExpiryCode] += dblDelta 25 | 26 | def Gammas(self,SCENARIO,RISK): 27 | if not RISK.has_key(self.Ticker): RISK[self.Ticker] = dict() 28 | if not RISK[self.Ticker].has_key(self.ExpiryCode): RISK[self.Ticker][self.ExpiryCode] = 0.0 29 | dblGamma = 0.0 30 | RISK[self.Ticker][self.ExpiryCode] += dblGamma 31 | 32 | def Vegas(self,SCENARIO,RISK): 33 | if not RISK.has_key(self.Ticker): RISK[self.Ticker] = dict() 34 | if not RISK[self.Ticker].has_key(self.ExpiryCode): RISK[self.Ticker][self.ExpiryCode] = 0.0 35 | dblVega = 0.0 36 | RISK[self.Ticker][self.ExpiryCode] += dblVega 37 | 38 | def Thetas(self,SCENARIO,RISK): 39 | if not RISK.has_key(self.Ticker): RISK[self.Ticker] = dict() 40 | if not RISK[self.Ticker].has_key(self.ExpiryCode): RISK[self.Ticker][self.ExpiryCode] = 0.0 41 | dblTheta = 0.0 42 | RISK[self.Ticker][self.ExpiryCode] += dblTheta 43 | 44 | def Rhos(self,SCENARIO,RISK): 45 | if not RISK.has_key(self.Ticker): RISK[self.Ticker] = dict() 46 | if not RISK[self.Ticker].has_key(self.ExpiryCode): RISK[self.Ticker][self.ExpiryCode] = 0.0 47 | dblRho = 0.0 48 | RISK[self.Ticker][self.ExpiryCode] += dblRho 49 | -------------------------------------------------------------------------------- /scripts/option_normal_model.py: -------------------------------------------------------------------------------- 1 | #IMPORT log and sqrt FROM math MODULE 2 | from math import log, sqrt, exp 3 | #IMPORT date AND timedelta FOR HANDLING EXPIRY TIMES 4 | from datetime import date, timedelta 5 | #IMPORT SciPy stats MODULE 6 | from scipy import stats 7 | 8 | def asian_vol_factor(valDate,startDate,endDate): 9 | #VALIDATE START DATE RELATIVE TO END DATE AND RETURN NO IMPACT IF ODD 10 | if startDate > endDate: return 1 11 | T = (endDate - valDate).days() 12 | L = (endDate - startDate).days() 13 | if days_to_expiry > avg_period_length: 14 | return sqrt(((T - L + 1) * L ** 2 + L * (L - 1) * (2 * L - 1) / 6) / (L ** 2 * T)) 15 | else: 16 | return sqrt((T + 1) * (2*T + 1) / (6 * L ** 2)) 17 | 18 | def F(z): 19 | return (1/sqrt(2*pi)) * exp(-(z ** 2) / 2) 20 | 21 | def option_price_normal(forward,strike,vol,rate,tenor,sign): 22 | if vol == 0: 23 | return sign * (forward - strike) 24 | #sign = +1 for calls and -1 for puts 25 | d1 = (forward - strike) / (vol * sqrt(tenor)) 26 | sameTerm = (vol * sqrt(tenor) * exp(-1*d1*d1/2)) / sqrt(2*3.141592653589793) 27 | return exp(-1 * rate * tenor) * (sign * (forward - strike) * stats.norm.cdf(sign * d1) + sameTerm) 28 | 29 | def option_price_normal(forward,strike,vol,rate,tenor,sign): 30 | def option_price_normal(forward,strike,vol,rate,tenor,sign): 31 | def option_price_normal(forward,strike,vol,rate,tenor,sign): 32 | 33 | def option_implied_vol_normal(forward,strike,price,rate,tenor,sign): 34 | #print 'imp vol calc:',forward,strike,price,rate,tenor,sign 35 | price_err_limit = price/10000 36 | iteration_limit = 20 37 | vmax = 1.0 #START SEARCH FOR UPPER VOL BOUND AT 100% 38 | tprice = 0 39 | while option_price(forward,strike,vmax,rate,tenor,sign) < price: 40 | vmax += 1 41 | if vmax > iteration_limit: return -1 #ERROR CONDITION 42 | #print 'vmax',vmax 43 | vmin = vmax - 1 44 | vmid = (vmin + vmax)/2 45 | tprice = option_price(forward,strike,vmid,rate,tenor,sign) 46 | count = 1 47 | while abs(tprice - price) > price_err_limit: 48 | if tprice > price: 49 | vmax = vmid 50 | else: 51 | vmin = vmid 52 | vmid = (vmin + vmax)/2 53 | count = count + 1 54 | if count > iteration_limit: 55 | print 'option_implied_vol: search iter limit reached' 56 | print forward,strike,price,rate,tenor,sign 57 | return vmid #EXIT CONDITION 58 | tprice = option_price_normal(forward,strike,vmid,rate,tenor,sign) 59 | #print 'imp_vol = ',vmid 60 | return vmid 61 | -------------------------------------------------------------------------------- /scripts/cCurve.py: -------------------------------------------------------------------------------- 1 | from datetime import date, timedelta 2 | import math 3 | 4 | class cCurvePoint: 5 | _default_date = date(1900,1,1) 6 | _default_value = 0 7 | 8 | def __init__(self,curveDate,pointValue): 9 | self.Date = curveDate 10 | self.Value = pointValue 11 | 12 | #DEFINE COMPARISON OPERATORS FOR SORTING 13 | def __eq__(self,point2): 14 | return point2.Date == self.Date 15 | 16 | def __gt__(self,point2): 17 | return self.Date > point2.Date 18 | 19 | def __lt__(self,point2): 20 | return self.Date < point2.Date 21 | 22 | def __ge__(self,point2): 23 | return self.Date >= point2.Date 24 | 25 | def __le__(self,point2): 26 | return self.Date <= point2.Date 27 | 28 | class cCurve: 29 | #DEFINE INTERPOLATION METHODS, DEFAULT TO LINEAR 30 | _interp_method = 0 31 | _interp_methods = ['linear','log-linear','flat-forward'] 32 | 33 | def __init__(self): 34 | self._interp_method = 0 35 | #DEFINE ARRAY TO STORE OBJECTS OF TYPE cCurvePoint 36 | self._curve_points = [] 37 | 38 | def SetInterpMethod(self,methodIndex): 39 | self._interp_method = methodIndex 40 | 41 | def length(self): 42 | return len(self._curve_points) 43 | 44 | def Add(self,point): 45 | self._curve_points.append(point) 46 | #SORT LIST IF NECESSARY 47 | if len(self._curve_points) > 1: 48 | if point <= self._curve_points[-2]: 49 | self._curve_points.sort() 50 | 51 | def Point(self,index): 52 | return self._curve_points[index] 53 | 54 | def GetValueByDate(self,refDate): 55 | if len(self._curve_points) == 0: 56 | return 0 57 | 58 | #EXTRAPOLATE FLAT 59 | if refDate <= self._curve_points[0].Date: 60 | return self._curve_points[0].Value 61 | if refDate >= self._curve_points[-1].Date: 62 | return self._curve_points[-1].Value 63 | 64 | #INTERPOLATE USING SET METHOD 65 | for i in range(len(self._curve_points)-1): 66 | if refDate < self._curve_points[i+1].Date: 67 | if self._interp_method == 0: 68 | slope = float((self._curve_points[i+1].Value - self._curve_points[i].Value)) / (self._curve_points[i+1].Date - self._curve_points[i].Date).days 69 | return self._curve_points[i].Value + slope * (refDate - self._curve_points[i].Date).days 70 | if self._interp_method == 1: 71 | log_slope = math.log(self._curve_points[i+1].Value / self._curve_points[i].Value) / (self._curve_points[i+1].Date - self._curve_points[i].Date).days 72 | log_val = math.log(self._curve_points[i].Value) + log_slope * (refDate - self._curve_points[i].Date).days 73 | return math.exp(log_val) 74 | if self._interp_method == 2: 75 | return self.curve_points[i].Value 76 | #OTHERWISE, RETURN DEFAULT VALUE 77 | return 0 78 | -------------------------------------------------------------------------------- /scripts/FuturesHashConvert.py: -------------------------------------------------------------------------------- 1 | from datetime import date 2 | from TimeSeriesFunctions import GetDatesAndValuesByDateRange 3 | 4 | def ConvertFuturesHashToCurvesHash(FUTURES,CURVES,minDate=date(1900,1,1),maxDate=date(2099,12,31)): 5 | for code in FUTURES.keys(): 6 | for year in FUTURES[code].keys(): 7 | for month in FUTURES[code][year].keys(): 8 | #COLLECT DATES AND VALUES FOR EACH FUTURE TIMESERIES 9 | (_dates,_values) = GetDatesAndValuesByDateRange(FUTURES[code][year][month],minDate,maxDate) 10 | #SAVE IN CURVES HASH 11 | for i in range(len(_dates)): 12 | tDate = _dates[i] 13 | tVal = _values[i] 14 | crvMonth = str(year) + ('00'+str(month))[-2:] 15 | 16 | if not tDate in CURVES.keys(): CURVES[tDate] = dict() 17 | if not code in CURVES[tDate].keys(): CURVES[tDate][code] = dict() 18 | if not crvMonth in CURVES[tDate][code].keys(): CURVES[tDate][code][crvMonth] = dict() 19 | 20 | CURVES[tDate][code][crvMonth] = tVal 21 | 22 | def ConvertFuturesHashToCurveSeriesHash(FUTURES,CURVES,minDate=date(1900,1,1),maxDate=date(2099,12,31)): 23 | for code in FUTURES.keys(): 24 | for year in FUTURES[code].keys(): 25 | for month in FUTURES[code][year].keys(): 26 | #COLLECT DATES AND VALUES FOR EACH FUTURE TIMESERIES 27 | (_dates,_values) = GetDatesAndValuesByDateRange(FUTURES[code][year][month],minDate,maxDate) 28 | #SAVE IN CURVES HASH 29 | for i in range(len(_dates)): 30 | tDate = _dates[i] 31 | tVal = _values[i] 32 | crvMonth = str(year) + ('00'+str(month))[-2:] 33 | 34 | if not code in CURVES.keys(): CURVES[code] = dict() 35 | if not tDate in CURVES[code].keys(): CURVES[code][tDate] = dict() 36 | if not crvMonth in CURVES[code][tDate].keys(): CURVES[code][tDate][crvMonth] = dict() 37 | 38 | CURVES[code][tDate][crvMonth] = tVal 39 | 40 | def PrintAverageCurveVolume(CURVES,contract=''): 41 | for code in CURVES.keys(): 42 | total = 0.0 43 | count = 0 44 | if len(contract) > 0 and contract != code: continue 45 | for refdate in CURVES[code].keys(): 46 | count += 1 47 | for crvmonth in CURVES[code][refdate].keys(): 48 | #print code, refdate, crvmonth 49 | if type(CURVES[code][refdate][crvmonth]) == type(dict()): 50 | total += CURVES[code][refdate][crvmonth]['Volume'] 51 | print code, str(int(round(total / count,0))) 52 | -------------------------------------------------------------------------------- /scripts/TimeSeriesFunctions.py: -------------------------------------------------------------------------------- 1 | from datetime import date 2 | 3 | def GetAverageValueByDateRange(TS,pValueField='',pDateStart=date(1900,1,1),pDateEnd=date(3000,12,31)): 4 | total = 0.0 5 | count = 0 6 | if len(TS.Dates) == 0: return 0.0 7 | if pDateStart > TS.Dates[len(TS.Dates)-1]: return 0.0 8 | if pDateStart <= TS.Dates[0]: 9 | idx = 0 10 | else: 11 | max = len(TS.Dates)-1 12 | min = 0 13 | mid = int((min+max)/2) 14 | while TS.Dates[mid] != pDateStart and min < (max - 1): 15 | mid = int((min + max)/2) 16 | if pDateStart > TS.Dates[mid]: 17 | min = mid 18 | else: 19 | max = mid 20 | idx = mid 21 | 22 | while idx < len(TS.Dates) and TS.Dates[idx] <= pDateEnd: 23 | if type(TS.Values[idx]) == type(dict()): 24 | total += TS.Values[idx][pValueField] 25 | else: 26 | total += TS.Values[idx] 27 | count += 1 28 | idx += 1 29 | 30 | if count > 0: 31 | return total / count 32 | else: 33 | return 0.0 34 | 35 | def GetDatesAndValuesByDateRange(series,pDateStart,pDateEnd): 36 | #START BY SEARCHING FOR START DATE AND THEN ITERATING THROUGH DATES COLLECTING RETURN VALUES 37 | #UNTIL END DATE IS REACHED 38 | rDates = []; rValues = [] #INIT RETURN LISTS 39 | if len(series.Dates) == 0: return rDates, rValues 40 | #print 'start',pDateStart,'end',pDateEnd 41 | if pDateStart > series.Dates[len(series.Dates)-1]: return rDates, rValues 42 | if pDateStart <= series.Dates[0]: 43 | idx = 0 44 | else: 45 | max = len(series.Dates)-1 46 | min = 0 47 | mid = int((min+max)/2) 48 | while series.Dates[mid] != pDateStart and min < (max - 1): 49 | mid = int((min + max)/2) 50 | if pDateStart > series.Dates[mid]: 51 | min = mid 52 | else: 53 | max = mid 54 | idx = mid 55 | if series.Dates[idx] < pDateStart: idx += 1 56 | 57 | while idx < len(series.Dates) and series.Dates[idx] <= pDateEnd: 58 | rDates.append(series.Dates[idx]) 59 | rValues.append(series.Values[idx]) 60 | idx += 1 61 | # RETURN COMPILED LISTS 62 | return rDates, rValues 63 | 64 | -------------------------------------------------------------------------------- /scripts/loadFuturesConfig.py: -------------------------------------------------------------------------------- 1 | #!/opt/local/bin/python 2 | 3 | #IMPORT DATE MODULE 4 | from datetime import date, timedelta 5 | #IMPORT csvdb FOR HANDING ROUTING TABLE FROM FILE 6 | from csvdb import HashTableFromFileAsText 7 | #IMPORT OWN STRING FUNCTION MODULE 8 | from stringFunctions import * 9 | 10 | _routing_table = dict() 11 | _opt_exp_dates = dict() 12 | _fut_exp_dates = dict() 13 | 14 | def get_routing(): 15 | #VALIDATE EXISTENCE OF HASH TABLE 16 | global _routing_table 17 | if len(_routing_table.keys()) > 0: 18 | return _routing_table 19 | else: 20 | _routing_table = HashTableFromFileAsText('../config/commodities_config.csv') 21 | return _routing_table 22 | 23 | 24 | def GetFutureTickerByOptionTicker(_ticker = '',_type = '',exchange='NYMEX'): 25 | #print 'GetFutureTickerByOptionTicker',_ticker,_type 26 | if _type == 1: 27 | _criteria = 'CallTicker' 28 | else: 29 | _criteria = 'PutTicker' 30 | _target = 'ExchangeTicker' 31 | for key in get_routing().keys(): 32 | #print 'routing key', key 33 | try: 34 | if get_routing()[key][_criteria] == _ticker and get_routing()[key]['Exchange'] == exchange: 35 | #print 'option ticker found' 36 | return get_routing()[key][_target] 37 | except ValueError: 38 | pass 39 | #OTHERWISE RETURN EMPTY STRING 40 | return '' 41 | 42 | def GetTickerByFutureTicker(_value1,_value2): 43 | _criteria1 = 'ExchangeTicker' 44 | _criteria2 = 'Exchange' 45 | _target = 'Ticker' 46 | for key in get_routing().keys(): 47 | if get_routing()[key][_criteria1] == _value1 and get_routing()[key][_criteria2] == _value2: 48 | return get_routing()[key][_target] 49 | 50 | def GetContractQuantityByTicker(_ticker): 51 | _criteria = 'Ticker' 52 | _target = 'ContractQuantity' 53 | for key in get_routing().keys(): 54 | if get_routing()[key][_criteria] == _ticker: 55 | #print 'quoteMultiplier',_ticker,get_routing()[key][_target] 56 | return float(get_routing()[key][_target]) 57 | return 1 58 | 59 | def GetQuoteMultiplierByTicker(_ticker): 60 | _criteria = 'Ticker' 61 | _target = 'QuoteMultiplier' 62 | for key in get_routing().keys(): 63 | if get_routing()[key][_criteria] == _ticker: 64 | #print 'quoteMultiplier',_ticker,get_routing()[key][_target] 65 | return float(get_routing()[key][_target]) 66 | return 1 67 | 68 | def GetStrikeMultiplierByTicker(_ticker): 69 | _criteria = 'Ticker' 70 | _target = 'StrikeMultiplier' 71 | for key in get_routing().keys(): 72 | if get_routing()[key][_criteria] == _ticker: 73 | #print 'strikeMultiplier',_ticker,get_routing()[key][_target] 74 | return float(get_routing()[key][_target]) 75 | return 1 76 | 77 | def fut_exp_dates(): 78 | global _fut_exp_dates 79 | if len(_fut_exp_dates.keys()) > 0: 80 | return _fut_exp_dates 81 | else: 82 | exp_file = open('../config/exchange_expiry_dates.csv','r') 83 | linenum = 0 84 | for line in exp_file: 85 | linenum += 1 86 | if linenum == 1: continue 87 | fields = line.split(',') 88 | for j in range(len(fields)): 89 | fields[j] = clean(fields[j]) 90 | _ticker = fields[2] 91 | _year = int(fields[3]) 92 | _month = int(fields[4]) 93 | 94 | dateParts = fields[8].split('-') 95 | if left(fields[9],1) == '#' or len(dateParts) != 3: continue 96 | _expDate = date(int(dateParts[0]),int(dateParts[1]),int(dateParts[2])) 97 | #if _expDate < _refDate: continue 98 | 99 | if not _fut_exp_dates.has_key(_ticker): _fut_exp_dates[_ticker] = dict() 100 | if not _fut_exp_dates[_ticker].has_key(_year): _fut_exp_dates[_ticker][_year] = dict() 101 | _fut_exp_dates[_ticker][_year][_month] = _expDate 102 | 103 | return _fut_exp_dates 104 | 105 | def opt_exp_dates(): 106 | global _opt_exp_dates 107 | if len(_opt_exp_dates.keys()) > 0: 108 | return _opt_exp_dates 109 | else: 110 | exp_file = open('../config/exchange_expiry_dates.csv','r') 111 | linenum = 0 112 | for line in exp_file: 113 | linenum += 1 114 | if linenum == 1: continue 115 | fields = line.split(',') 116 | for j in range(len(fields)): 117 | fields[j] = clean(fields[j]) 118 | _ticker = fields[2] 119 | _year = int(fields[3]) 120 | _month = int(fields[4]) 121 | #print fields 122 | dateParts = fields[9].split('-') 123 | if left(fields[9],1) == '#' or len(dateParts) != 3: continue 124 | _expDate = date(int(dateParts[0]),int(dateParts[1]),int(dateParts[2])) 125 | #if _expDate < _refDate: continue 126 | #if not FUTURES.has_key(contractCode): FUTURES[contractCode] = dict() 127 | if not _opt_exp_dates.has_key(_ticker): _opt_exp_dates[_ticker] = dict() 128 | if not _opt_exp_dates[_ticker].has_key(_year): _opt_exp_dates[_ticker][_year] = dict() 129 | _opt_exp_dates[_ticker][_year][_month] = _expDate 130 | #print 'OPT EXP DATE KEYS: ' + ' | '.join(_opt_exp_dates.keys()) 131 | return _opt_exp_dates 132 | 133 | def BuildHistoricalScenario(refDate,SCEN,CURVES,VOLS,RATES): 134 | #print '*building historical scenario for', refDate.isoformat() 135 | #SCEN = dict() #RE-INITIALIZE 136 | SCEN['SCENDATE'] = refDate 137 | SCEN['CURVES'] = CURVES[refDate] 138 | SCEN['VOLS'] = VOLS[refDate] 139 | SCEN['RATES'] = RATES.GetValueByDate(refDate) 140 | 141 | -------------------------------------------------------------------------------- /scripts/simulateDeltaHedgingSingleCallWithVaryingTimeFrequencies.py: -------------------------------------------------------------------------------- 1 | #!/opt/local/bin/python 2 | # 3 | # Test run for option-derived futures trading strategy 4 | 5 | #STANDARD PYTHON MODULES 6 | from datetime import datetime, time, date 7 | timeStart = datetime.now() 8 | 9 | #CUSTOM MODULES 10 | from loadFuturesConfig import * 11 | from Portfolio import * 12 | from Future import * 13 | from FutureOption import * 14 | from FuturesHashConvert import * 15 | from interpolation import * 16 | from deltaHedgePortfolio import * 17 | 18 | #DEFINE TARGET COMMODITY, REFERENCE FUTURE OPTION AND STRATEGY PARAMETERS 19 | 20 | def SimulateDeltaHedgingCallOptionWithVaryingTimeFrequencies(commodity,contract,moneyness,strike_round,quantity,longHedgeTime,shortHedgeTime,startDate,endDate,targetPnl,stopLoss,CURVES,VOLS,RATES,optionModel='lognormal'): 21 | contract_size = GetContractQuantityByTicker(commodity) 22 | refDates = CURVES.keys() 23 | refDates.sort() 24 | 25 | #START WITH FIRST DATE AFTER START DATE 26 | refDate = refDates[0] 27 | SCEN = dict() 28 | BuildHistoricalScenario(refDate,SCEN,CURVES,VOLS,RATES) 29 | 30 | #BUILD PORTFOLIO OF LONG AND SHORT ATM CALL OPTIONS 31 | SHORT_CALL = Portfolio('Short Call') 32 | LONG_CALL = Portfolio('Long Call') 33 | PORT = Portfolio('Combined') 34 | 35 | forward = CURVES[refDate][commodity][contract]['Close'] 36 | strike = float(round(forward * moneyness / strike_round,0)) * strike_round 37 | 38 | #GET EXPIRY DATES FOR RELEVANT CONTRACT IN SIMILAR WAY AS DONE WHEN CALCULATING THE VOL SURFACES 39 | optYear = int(contract[:4]) 40 | optMonth = int(contract[5:]) 41 | optExpDate = opt_exp_dates()[commodity][optYear][optMonth] 42 | 43 | #CREATE INITIAL OPTION POSITIONS 44 | LC = FutureOption(commodity,contract,optExpDate,strike,1,quantity,contract_size,optionModel) 45 | SC = FutureOption(commodity,contract,optExpDate,strike,1,(-1 * quantity),contract_size,optionModel) 46 | 47 | #ADD OPTIONS TO SUBPORTFOLIOS 48 | LONG_CALL.Trades.append(LC) 49 | SHORT_CALL.Trades.append(SC) 50 | #ADD SUBPORTFOLIOS TO PORTFOLIO 51 | PORT.Trades.append(LONG_CALL) 52 | PORT.Trades.append(SHORT_CALL) 53 | 54 | #DELTA HEDGE PORTFOLIOS TO START 55 | DeltaHedgePortfolio(LONG_CALL,SCEN) 56 | DeltaHedgePortfolio(SHORT_CALL,SCEN) 57 | 58 | #ANALYZE EXISTING PORTFOLIO TO TRACK P&L AND RISK 59 | longNPV = LONG_CALL.NPV(SCEN) 60 | shortNPV = SHORT_CALL.NPV(SCEN) 61 | netNPV = PORT.NPV(SCEN) 62 | LONG_DELTAS = dict() 63 | SHORT_DELTAS = dict() 64 | PORT_DELTAS = dict() 65 | LONG_CALL.Deltas(SCEN,LONG_DELTAS) 66 | SHORT_CALL.Deltas(SCEN,SHORT_DELTAS) 67 | PORT.Deltas(SCEN,PORT_DELTAS) 68 | longDelta = LONG_DELTAS[commodity][contract] 69 | shortDelta = SHORT_DELTAS[commodity][contract] 70 | netDelta = PORT_DELTAS[commodity][contract] 71 | 72 | i = 0 73 | while i < len(refDates)-1 and netNPV < targetNPV and netNPV > stopLoss: 74 | idx = i+1 75 | tDate = refDates[idx] 76 | 77 | BuildHistoricalScenario(tDate,SCEN,CURVES,VOLS,RATES) 78 | 79 | #GET MARKET DATA 80 | futurePrice = SCEN['CURVES'][commodity][contract]['Close'] 81 | 82 | #ANALYZE EXISTING PORTFOLIO TO TRACK P&L AND RISK 83 | longNPV = LONG_CALL.NPV(SCEN) 84 | shortNPV = SHORT_CALL.NPV(SCEN) 85 | netNPV = PORT.NPV(SCEN) 86 | 87 | LONG_DELTAS = dict() 88 | SHORT_DELTAS = dict() 89 | PORT_DELTAS = dict() 90 | 91 | LONG_CALL.Deltas(SCEN,LONG_DELTAS) 92 | SHORT_CALL.Deltas(SCEN,SHORT_DELTAS) 93 | PORT.Deltas(SCEN,PORT_DELTAS) 94 | longDelta = LONG_DELTAS[commodity][contract] 95 | shortDelta = SHORT_DELTAS[commodity][contract] 96 | netDelta = PORT_DELTAS[commodity][contract] 97 | 98 | #DELTA HEDGE SUBPORTFOLIOS ACCORDING TO PLAN 99 | if idx % longHedgeTime == 0: 100 | DeltaHedgePortfolio(LONG_CALL,SCEN) 101 | if idx % shortHedgeTime == 0: 102 | DeltaHedgePortfolio(SHORT_CALL,SCEN) 103 | 104 | #INCREMENT INDEX 105 | i += 1 106 | 107 | #FLATTEN POSITIONS, USING LAST DATE IF HAVEN'T PASSED EITHER EARLY EXIT THRESHOLD 108 | if i < len(refDates)-1: 109 | i += 1 110 | #ANALYZE AND FLATTEN ON LAST DATE 111 | lastDate = refDates[i] 112 | BuildHistoricalScenario(lastDate,SCEN,CURVES,VOLS,RATES) 113 | futurePrice = SCEN['CURVES'][commodity][contract]['Close'] 114 | 115 | DeltaHedgePortfolio(LONG_CALL,SCEN) 116 | DeltaHedgePortfolio(SHORT_CALL,SCEN) 117 | 118 | #ANALYZE EXISTING PORTFOLIO TO TRACK P&L AND RISK 119 | longNPV = LONG_CALL.NPV(SCEN) 120 | shortNPV = SHORT_CALL.NPV(SCEN) 121 | netNPV = PORT.NPV(SCEN) 122 | LONG_DELTAS = dict() 123 | SHORT_DELTAS = dict() 124 | PORT_DELTAS = dict() 125 | LONG_CALL.Deltas(SCEN,LONG_DELTAS) 126 | SHORT_CALL.Deltas(SCEN,SHORT_DELTAS) 127 | PORT.Deltas(SCEN,PORT_DELTAS) 128 | longDelta = LONG_DELTAS[commodity][contract] 129 | shortDelta = SHORT_DELTAS[commodity][contract] 130 | netDelta = PORT_DELTAS[commodity][contract] 131 | 132 | return netNPV 133 | -------------------------------------------------------------------------------- /scripts/TimeSeries.py: -------------------------------------------------------------------------------- 1 | 2 | from datetime import date,timedelta 3 | 4 | class TimeSeries: 5 | """date-ordered collection of cDataPoint objects 6 | Attributes: 7 | Dates[] - array of datetime.date 8 | Values[] - array of floats 9 | InterpolationMethod - string 10 | Allowable Interpolation Methods: 11 | FLAT 12 | LINEAR 13 | """ 14 | # DEFAULT LINEAR INTERPOLATION METHOD 15 | InterpolationMethod = 'FLAT' 16 | # DEFAULT TO EMPTY DATA ARRAY 17 | Dates = [] 18 | Values = [] 19 | # 20 | # CONSTRUCTORS 21 | # 22 | def __init__(self,pDates = [],pValues = []): 23 | self.Dates = pDates 24 | self.Values = pValues 25 | # 26 | # Add/Update/Delete 27 | # Additions and Updates will be handled by same function, Update 28 | # 29 | def Update(self,pDate,pValue): 30 | #pValue = float(pValue) #STANDARDIZE VALUES TO FLOATS 31 | if len(self.Dates) == 0: #TEST EMPTY ARRAY 32 | self.Dates = [pDate] 33 | self.Values = [pValue] 34 | elif pDate > self.Dates[len(self.Dates)-1]: #TEST AFTER END 35 | self.Dates.append(pDate) 36 | self.Values.append(pValue) 37 | elif pDate < self.Dates[0]: #TEST BEFORE START 38 | self.Dates.insert(0,pDate) 39 | self.Values.insert(0,pValue) 40 | elif pDate == self.Dates[len(self.Dates)-1]: 41 | self.Values[len(self.Dates)-1] = pValue 42 | else: #ELSE W/IN RANGE OF EXISTING DATA 43 | max = len(self.Dates)-1 44 | min = 0 45 | mid = int((min+max)/2) 46 | while self.Dates[mid] != pDate and min < (max - 1): 47 | mid = int((min + max)/2) 48 | if pDate > self.Dates[mid]: 49 | min = mid 50 | else: 51 | max = mid 52 | if self.Dates[mid] == pDate: 53 | self.Values[mid] = pValue 54 | else: 55 | self.Dates.insert(max,pDate) 56 | self.Values.insert(max,pValue) 57 | 58 | def GetValueByDate(self,pDate,pInterpolationMethod='FLAT'): 59 | if len(self.Dates) == 0: return None 60 | if pDate >= self.Dates[len(self.Dates)-1]: return self.Values[len(self.Dates)-1] 61 | if pDate <= self.Dates[0]: return self.Values[0] #FLAT EXTRAPOLATION 62 | #BINARY SEARCH ON DATES ARRAY TO GET INDEX AND RETURN CORRESPONDING VALUE 63 | max = len(self.Dates)-1 64 | min = 0 65 | mid = int((min+max)/2) 66 | while self.Dates[mid] != pDate and min < (max - 1): 67 | mid = int((min + max)/2) 68 | if pDate > self.Dates[mid]: 69 | min = mid 70 | else: 71 | max = mid 72 | if self.Dates[mid] == pDate: 73 | return self.Values[mid] 74 | else: 75 | if pInterpolationMethod == 'LINEAR': 76 | #USING DAYS AS UNIT FOR DIVISOR MAY LIMIT THIS TO DAILY TIME SERIES 77 | delta = (self.Dates[max] - self.Dates[min]) 78 | slope = (self.Values[max] - self.Values[min])/(delta.days * 86400 + delta.seconds) 79 | delta_secs = (pDate - self.Dates[min]).days * 86400 + (pDate - self.Dates[min]).seconds 80 | return self.Values[min] + (slope * delta_secs) 81 | else: 82 | return self.Values[min] # USE PRECEDING VALUE FOR ANY MISSING DATA 83 | 84 | def GetDatesAndValuesByDateRange(self,pDateStart,pDateEnd): 85 | #START BY SEARCHING FOR START DATE AND THEN ITERATING THROUGH DATES COLLECTING RETURN VALUES 86 | #UNTIL END DATE IS REACHED 87 | rDates = []; rValues = [] #INIT RETURN LISTS 88 | if len(self.Dates) == 0: return rDates, rValues 89 | #print 'start',pDateStart,'end',pDateEnd 90 | if pDateStart > self.Dates[len(self.Dates)-1]: return rDates, rValues 91 | if pDateStart <= self.Dates[0]: 92 | idx = 0 93 | else: 94 | max = len(self.Dates)-1 95 | min = 0 96 | mid = int((min+max)/2) 97 | while self.Dates[mid] != pDateStart and min < (max - 1): 98 | mid = int((min + max)/2) 99 | if pDateStart > self.Dates[mid]: 100 | min = mid 101 | else: 102 | max = mid 103 | idx = mid 104 | if self.Dates[idx] < pDateStart: idx += 1 105 | 106 | while idx < len(self.Dates) and self.Dates[idx] <= pDateEnd: 107 | rDates.append(self.Dates[idx]) 108 | rValues.append(self.Values[idx]) 109 | idx += 1 110 | # RETURN COMPILED LISTS 111 | return rDates, rValues 112 | 113 | def FirstDataDate(self): 114 | if self.Dates == []: return None 115 | return self.Dates[0] 116 | 117 | def LastDataDate(self): 118 | if self.Dates == []: return None 119 | return self.Dates[len(self.Dates)-1] 120 | 121 | def DataCount(self): 122 | return len(self.Dates) 123 | 124 | # 125 | # INPUT VALIDATION METHODS 126 | # 127 | def IsAllowableInterpolationMethod(pInterpolationMethod): 128 | _methods = ['FLAT','LINEAR'] 129 | # check passed string against list 130 | for x in _methods: 131 | if pInterpolationMethod == x: 132 | return 1 133 | #OTHERWISE 134 | return 0 135 | -------------------------------------------------------------------------------- /scripts/testRunNo001.py: -------------------------------------------------------------------------------- 1 | #!/opt/local/bin/python 2 | # 3 | # Test run for option-derived futures trading strategy 4 | 5 | #STANDARD PYTHON MODULES 6 | from datetime import datetime, time, date 7 | timeStart = datetime.now() 8 | 9 | import pickle 10 | print 'pickly loaded',str((datetime.now() - timeStart).seconds),'seconds' 11 | 12 | #CUSTOM MODULES 13 | from Portfolio import * 14 | from Future import * 15 | from FutureOption import * 16 | from FuturesHashConvert import * 17 | from interpolation import * 18 | from deltaHedgePortfolio import * 19 | print 'loaded custom modules',str((datetime.now() - timeStart).seconds),'seconds' 20 | 21 | #DEFINE TARGET COMMODITY, REFERENCE FUTURE OPTION AND STRATEGY PARAMETERS 22 | commodity = 'C' 23 | contract = '201403' 24 | contract_size = GetContractQuantityByTicker(commodity) 25 | quantity = 100 26 | strike_round = 1 27 | optionModel = 'lognormal' 28 | longHedgeTime = 3 29 | shortHedgeTime = 1 30 | startDate = date(2013,8,30) 31 | endDate = date(2099,12,31) 32 | print 'parameters set',str((datetime.now() - timeStart).seconds),'seconds' 33 | 34 | #LOAD FUTURES AND VOLS AND RATES 35 | dbfile = open('../db/tsFutures.dat','r') 36 | FUTURESERIES = pickle.load(dbfile) 37 | dbfile.close() 38 | print 'Futures Curves loaded',str((datetime.now() - timeStart).seconds),'seconds' 39 | dbfile = open('../db/tsVols.dat','r') 40 | VOLSERIES = pickle.load(dbfile) 41 | dbfile.close() 42 | print 'Vol Surfaces loaded',str((datetime.now() - timeStart).seconds),'seconds' 43 | dbfile = open('../db/tsDFCurves.dat','r') 44 | RATES = pickle.load(dbfile) 45 | dbfile.close() 46 | print 'DF curves loaded',str((datetime.now() - timeStart).seconds),'seconds' 47 | 48 | #CONVERT FUTURES HASHES TO SCENARIO HASHES 49 | CURVES = dict() 50 | ConvertFuturesHashToCurvesHash(FUTURESERIES,CURVES,startDate,endDate) 51 | VOLS = dict() 52 | ConvertFuturesHashToCurvesHash(VOLSERIES,VOLS,startDate,endDate) 53 | print 'Market data converted to scenarios',str((datetime.now() - timeStart).seconds),'seconds' 54 | 55 | refDates = CURVES.keys() 56 | refDates.sort() 57 | 58 | #START WITH FIRST DATE AFTER START DATE 59 | refDate = refDates[0] 60 | SCEN = dict() 61 | BuildHistoricalScenario(refDate,SCEN,CURVES,VOLS,RATES) 62 | 63 | #BUILD PORTFOLIO OF LONG AND SHORT ATM CALL OPTIONS 64 | SHORT_CALL = Portfolio('Short Call') 65 | LONG_CALL = Portfolio('Long Call') 66 | PORT = Portfolio('Combined') 67 | 68 | forward = CURVES[refDate][commodity][contract]['Close'] 69 | strike = float(round(forward / strike_round,0)) * strike_round 70 | #print forward, strike 71 | 72 | #GET EXPIRY DATES FOR RELEVANT CONTRACT IN SIMILAR WAY AS DONE WHEN CALCULATING THE VOL SURFACES 73 | optYear = int(contract[:4]) 74 | optMonth = int(contract[5:]) 75 | optExpDate = opt_exp_dates()[commodity][optYear][optMonth] 76 | 77 | #CREATE INITIAL OPTION POSITIONS 78 | LC = FutureOption(commodity,contract,optExpDate,strike,1,quantity,contract_size,optionModel) 79 | SC = FutureOption(commodity,contract,optExpDate,strike,1,(-1 * quantity),contract_size,optionModel) 80 | 81 | #ADD OPTIONS TO SUBPORTFOLIOS 82 | LONG_CALL.Trades.append(LC) 83 | SHORT_CALL.Trades.append(SC) 84 | #ADD SUBPORTFOLIOS TO PORTFOLIO 85 | PORT.Trades.append(LONG_CALL) 86 | PORT.Trades.append(SHORT_CALL) 87 | 88 | #DELTA HEDGE PORTFOLIOS TO START 89 | DeltaHedgePortfolio(LONG_CALL,SCEN) 90 | DeltaHedgePortfolio(SHORT_CALL,SCEN) 91 | 92 | #ANALYZE EXISTING PORTFOLIO TO TRACK P&L AND RISK 93 | longNPV = LONG_CALL.NPV(SCEN) 94 | shortNPV = SHORT_CALL.NPV(SCEN) 95 | netNPV = PORT.NPV(SCEN) 96 | LONG_DELTAS = dict() 97 | SHORT_DELTAS = dict() 98 | PORT_DELTAS = dict() 99 | LONG_CALL.Deltas(SCEN,LONG_DELTAS) 100 | SHORT_CALL.Deltas(SCEN,SHORT_DELTAS) 101 | PORT.Deltas(SCEN,PORT_DELTAS) 102 | longDelta = LONG_DELTAS[commodity][contract] 103 | shortDelta = SHORT_DELTAS[commodity][contract] 104 | netDelta = PORT_DELTAS[commodity][contract] 105 | 106 | strOut = 'refDate,Forward,Long NPV,Long Delta,Long Trades,Short NPV,Short Delta,Short Trades,Net NPV,Net Delta' 107 | strOut += '\n' + refDate.isoformat() + "," + str(forward) + ',' + str(longNPV) + ',' + str(longDelta) + ',' + str(LONG_CALL.TradeCount()) 108 | strOut += "," + str(shortNPV) + ',' + str(shortDelta) + ',' + str(SHORT_CALL.TradeCount()) 109 | strOut += "," + str(netNPV) + ',' + str(netDelta) 110 | 111 | for i in range(len(refDates)-2): 112 | idx = i+1 113 | tDate = refDates[idx] 114 | 115 | BuildHistoricalScenario(tDate,SCEN,CURVES,VOLS,RATES) 116 | 117 | #GET MARKET DATA 118 | futurePrice = SCEN['CURVES'][commodity][contract]['Close'] 119 | 120 | #ANALYZE EXISTING PORTFOLIO TO TRACK P&L AND RISK 121 | longNPV = LONG_CALL.NPV(SCEN) 122 | shortNPV = SHORT_CALL.NPV(SCEN) 123 | netNPV = PORT.NPV(SCEN) 124 | 125 | LONG_DELTAS = dict() 126 | SHORT_DELTAS = dict() 127 | PORT_DELTAS = dict() 128 | 129 | LONG_CALL.Deltas(SCEN,LONG_DELTAS) 130 | SHORT_CALL.Deltas(SCEN,SHORT_DELTAS) 131 | PORT.Deltas(SCEN,PORT_DELTAS) 132 | longDelta = LONG_DELTAS[commodity][contract] 133 | shortDelta = SHORT_DELTAS[commodity][contract] 134 | netDelta = PORT_DELTAS[commodity][contract] 135 | 136 | #DELTA HEDGE SUBPORTFOLIOS ACCORDING TO PLAN 137 | if idx % longHedgeTime == 0: 138 | DeltaHedgePortfolio(LONG_CALL,SCEN) 139 | if idx % shortHedgeTime == 0: 140 | DeltaHedgePortfolio(SHORT_CALL,SCEN) 141 | 142 | strOut += '\n' + tDate.isoformat() + "," + str(futurePrice) + "," + str(longNPV) + ',' + str(longDelta) + ',' + str(LONG_CALL.TradeCount()) 143 | strOut += "," + str(shortNPV) + ',' + str(shortDelta) + ',' + str(SHORT_CALL.TradeCount()) 144 | strOut += "," + str(netNPV) + ',' + str(netDelta) 145 | 146 | #ANALYZE AND FLATTEN ON LAST DATE 147 | lastDate = refDates[-1] 148 | BuildHistoricalScenario(lastDate,SCEN,CURVES,VOLS,RATES) 149 | futurePrice = SCEN['CURVES'][commodity][contract]['Close'] 150 | 151 | DeltaHedgePortfolio(LONG_CALL,SCEN) 152 | DeltaHedgePortfolio(SHORT_CALL,SCEN) 153 | 154 | #ANALYZE EXISTING PORTFOLIO TO TRACK P&L AND RISK 155 | longNPV = LONG_CALL.NPV(SCEN) 156 | shortNPV = SHORT_CALL.NPV(SCEN) 157 | netNPV = PORT.NPV(SCEN) 158 | LONG_DELTAS = dict() 159 | SHORT_DELTAS = dict() 160 | PORT_DELTAS = dict() 161 | LONG_CALL.Deltas(SCEN,LONG_DELTAS) 162 | SHORT_CALL.Deltas(SCEN,SHORT_DELTAS) 163 | PORT.Deltas(SCEN,PORT_DELTAS) 164 | longDelta = LONG_DELTAS[commodity][contract] 165 | shortDelta = SHORT_DELTAS[commodity][contract] 166 | netDelta = PORT_DELTAS[commodity][contract] 167 | 168 | strOut += '\n' + lastDate.isoformat() + "," + str(futurePrice) + "," + str(longNPV) + ',' + str(longDelta) + ',' + str(LONG_CALL.TradeCount()) 169 | strOut += ',' + str(shortNPV) + ',' + str(shortDelta) + ',' + str(SHORT_CALL.TradeCount()) 170 | strOut += ',' + str(netNPV) + ',' + str(netDelta) 171 | 172 | outfile = open('testRun001_output.csv','w') 173 | outfile.write(strOut) 174 | outfile.close() 175 | 176 | print 'Single simulation completed',str((datetime.now() - timeStart).seconds),'seconds' 177 | -------------------------------------------------------------------------------- /scripts/FutureOption.py: -------------------------------------------------------------------------------- 1 | execfile('black_scholes.py') 2 | execfile('interpolation.py') 3 | 4 | from math import log 5 | 6 | class FutureOption: 7 | Ticker = '' 8 | ExpiryCode = '' 9 | Quantity = 0.0 10 | Strike = 0.0 11 | ContractSize = 0.0 12 | Type = 1 # 1 for call (default), -1 for put 13 | Model = 'lognormal' 14 | ExpiryDate = date(1900,1,1) 15 | 16 | _skews = [0.5,0.8,0.9,0.95,1,1.05,1.1,1.2,1.5] 17 | 18 | def __init__(self,ticker,futureExpiryCode,expiryDate,strike,type,quantity,contractSize,model='lognormal'): 19 | self.Ticker = ticker 20 | self.ExpiryCode = futureExpiryCode 21 | self.ExpiryDate = expiryDate 22 | self.Quantity = quantity 23 | self.Strike = strike 24 | self.ContractSize = contractSize 25 | self.Type = type 26 | self.Model = model 27 | 28 | def ImpliedVol(self,SCENARIO,price): 29 | dblForward = SCENARIO['CURVES'][self.Ticker][self.ExpiryCode]['Close'] 30 | dblRate = 0.0035 31 | dblTenor = (self.ExpiryDate - SCENARIO['SCENDATE']).days / 365.25 32 | 33 | return option_implied_vol(dblForward,self.Strike,price,dblRate,dblTenor,self.Type) 34 | 35 | def NPV(self,SCENARIO): 36 | dblForward = SCENARIO['CURVES'][self.Ticker][self.ExpiryCode]['Close'] 37 | dblDF = SCENARIO['RATES'].GetValueByDate(self.ExpiryDate) 38 | dblMoneyness = float(self.Strike) / dblForward 39 | dblTenor = float((self.ExpiryDate - SCENARIO['SCENDATE']).days) / float(365) 40 | dblRate = log(dblDF) * (-1 / dblTenor) 41 | 42 | if self.Model == 'lognormal': 43 | smile = SCENARIO['VOLS'][self.Ticker][self.ExpiryCode] 44 | dblVol = d1Interpolate(dblMoneyness,self._skews,smile) 45 | dblOptionPrice = option_price(dblForward,self.Strike,dblVol,dblRate,dblTenor,self.Type) 46 | elif self.Model == 'normal': 47 | smile = SCENARIO['VOLS'][self.Ticker][self.ExpiryCode] 48 | dblVol = d1Interpolate(dblMoneyness,self._skews,smile) 49 | dblOptionPrice = option_price_normal(dblForward,self.Strike,dblVol,dblRate,dblTenor,self.Type) 50 | else: 51 | dblOptionPrice = -1.0 52 | 53 | dblNPV = dblOptionPrice * float(self.Quantity) * float(self.ContractSize) 54 | #print dblForward,self.Strike,dblTenor,dblMoneyness,dblVol,dblRate 55 | return round(dblNPV,2) 56 | 57 | def Deltas(self,SCENARIO,RISK): 58 | if not RISK.has_key(self.Ticker): RISK[self.Ticker] = dict() 59 | if not RISK[self.Ticker].has_key(self.ExpiryCode): RISK[self.Ticker][self.ExpiryCode] = 0.0 60 | #COLLECT MARKET DATA REQUIRED FOR ALL OPTION MODELS 61 | dblForward = SCENARIO['CURVES'][self.Ticker][self.ExpiryCode]['Close'] 62 | dblDF = SCENARIO['RATES'].GetValueByDate(self.ExpiryDate) 63 | dblMoneyness = float(self.Strike) / dblForward 64 | dblTenor = float((self.ExpiryDate - SCENARIO['SCENDATE']).days) / float(365) 65 | dblRate = log(dblDF) * (-1 / dblTenor) 66 | #CALCULATE DELTAS DEPENDING ON MODEL 67 | if self.Model == 'lognormal': 68 | smile = SCENARIO['VOLS'][self.Ticker][self.ExpiryCode] 69 | dblVol = d1Interpolate(dblMoneyness,self._skews,smile) 70 | dblDelta = black_delta(dblForward,self.Strike,dblVol,dblRate,dblTenor,self.Type) 71 | elif self.Model == 'normal': 72 | dblDelta = 0.0 73 | else: 74 | dblDelta = 0.0 75 | #ADD DELTA TO HASH 76 | RISK[self.Ticker][self.ExpiryCode] += dblDelta * self.Quantity 77 | 78 | def Gammas(self,SCENARIO,RISK): 79 | if not RISK.has_key(self.Ticker): RISK[self.Ticker] = dict() 80 | if not RISK[self.Ticker].has_key(self.ExpiryCode): RISK[self.Ticker][self.ExpiryCode] = 0.0 81 | #COLLECT MARKET DATA REQUIRED FOR ALL OPTION MODELS 82 | dblForward = SCENARIO['CURVES'][self.Ticker][self.ExpiryCode]['Close'] 83 | dblDF = SCENARIO['RATES'].GetValueByDate(self.ExpiryDate) 84 | dblMoneyness = float(self.Strike) / dblForward 85 | dblTenor = float((self.ExpiryDate - SCENARIO['SCENDATE']).days) / float(365) 86 | dblRate = log(dblDF) * (-1 / dblTenor) 87 | #CALCULATE RISK DEPENDING ON MODEL 88 | if self.Model == 'lognormal': 89 | smile = SCENARIO['VOLS'][self.Ticker][self.ExpiryCode] 90 | dblVol = d1Interpolate(dblMoneyness,_skews,smile) 91 | dblGamma = black_gamma(dblForward,self.Strike,dblVol,dblRate,dblTenor,self.Type) 92 | elif self.Model == 'normal': 93 | dblGamma = 0.0 94 | else: 95 | dblGamma = -1.0 96 | #ADD RISK TO HASH 97 | RISK[self.Ticker][self.ExpiryCode] += dblGamma * self.Quantity 98 | 99 | def Vegas(self,SCENARIO,RISK): 100 | if not RISK.has_key(self.Ticker): RISK[self.Ticker] = dict() 101 | if not RISK[self.Ticker].has_key(self.ExpiryCode): RISK[self.Ticker][self.ExpiryCode] = 0.0 102 | #COLLECT MARKET DATA REQUIRED FOR ALL OPTION MODELS 103 | dblForward = SCENARIO['CURVES'][self.Ticker][self.ExpiryCode]['Close'] 104 | dblDF = SCENARIO['RATES'].GetValueByDate(self.ExpiryDate) 105 | dblMoneyness = float(self.Strike) / dblForward 106 | dblTenor = float((self.ExpiryDate - SCENARIO['SCENDATE']).days) / float(365) 107 | dblRate = log(dblDF) * (-1 / dblTenor) 108 | #CALCULATE RISK DEPENDING ON MODEL 109 | if self.Model == 'lognormal': 110 | smile = SCENARIO['VOLS'][self.Ticker][self.ExpiryCode] 111 | dblVol = d1Interpolate(dblMoneyness,_skews,smile) 112 | dblVega = black_vega(dblForward,self.Strike,dblVol,dblRate,dblTenor,self.Type) 113 | elif self.Model == 'normal': 114 | dblVega = 0.0 115 | else: 116 | dblVega = -1.0 117 | #ADD RISK TO HASH 118 | RISK[self.Ticker][self.ExpiryCode] += dblVega * self.Quantity * self.ContractSize 119 | 120 | def Thetas(self,SCENARIO,RISK): 121 | if not RISK.has_key(self.Ticker): RISK[self.Ticker] = dict() 122 | if not RISK[self.Ticker].has_key(self.ExpiryCode): RISK[self.Ticker][self.ExpiryCode] = 0.0 123 | #COLLECT MARKET DATA REQUIRED FOR ALL OPTION MODELS 124 | dblForward = SCENARIO['CURVES'][self.Ticker][self.ExpiryCode]['Close'] 125 | dblDF = SCENARIO['RATES'].GetValueByDate(self.ExpiryDate) 126 | dblMoneyness = float(self.Strike) / dblForward 127 | dblTenor = float((self.ExpiryDate - SCENARIO['SCENDATE']).days) / float(365) 128 | dblRate = log(dblDF) * (-1 / dblTenor) 129 | #CALCULATE RISK DEPENDING ON MODEL 130 | if self.Model == 'lognormal': 131 | smile = SCENARIO['VOLS'][self.Ticker][self.ExpiryCode] 132 | dblVol = d1Interpolate(dblMoneyness,_skews,smile) 133 | dblTheta = black_theta(dblForward,self.Strike,dblVol,dblRate,dblTenor,self.Type) 134 | elif self.Model == 'normal': 135 | dblTheta = 0.0 136 | else: 137 | dblTheta = -1.0 138 | #ADD RISK TO HASH 139 | RISK[self.Ticker][self.ExpiryCode] += dblTheta * self.Quantity * self.ContractSize 140 | 141 | def Rhos(self,SCENARIO,RISK): 142 | if not RISK.has_key(self.Ticker): RISK[self.Ticker] = dict() 143 | if not RISK[self.Ticker].has_key(self.ExpiryCode): RISK[self.Ticker][self.ExpiryCode] = 0.0 144 | #COLLECT MARKET DATA REQUIRED FOR ALL OPTION MODELS 145 | dblForward = SCENARIO['CURVES'][self.Ticker][self.ExpiryCode]['Close'] 146 | dblDF = SCENARIO['RATES'].GetValueByDate(self.ExpiryDate) 147 | dblMoneyness = float(self.Strike) / dblForward 148 | dblTenor = float((self.ExpiryDate - SCENARIO['SCENDATE']).days) / float(365) 149 | dblRate = log(dblDF) * (-1 / dblTenor) 150 | #CALCULATE RISK DEPENDING ON MODEL 151 | if self.Model == 'lognormal': 152 | smile = SCENARIO['VOLS'][self.Ticker][self.ExpiryCode] 153 | dblVol = d1Interpolate(dblMoneyness,_skews,smile) 154 | dblRho = black_rho(dblForward,self.Strike,dblVol,dblRate,dblTenor,self.Type) 155 | elif self.Model == 'normal': 156 | dblRho = 0.0 157 | else: 158 | dblRho = -1.0 159 | #ADD RISK TO HASH 160 | RISK[self.Ticker][self.ExpiryCode] += dblRho * self.Quantity * self.ContractSize 161 | -------------------------------------------------------------------------------- /scripts/black_scholes.py: -------------------------------------------------------------------------------- 1 | #IMPORT log and sqrt FROM math MODULE 2 | from math import log, sqrt, exp, pi 3 | #IMPORT date AND timedelta FOR HANDLING EXPIRY TIMES 4 | from datetime import date, timedelta 5 | 6 | def asian_vol_factor(valDate,startDate,endDate): 7 | #VALIDATE START DATE RELATIVE TO END DATE AND RETURN NO IMPACT IF ODD 8 | if startDate > endDate: return 1 9 | T = (endDate - valDate).days() 10 | L = (endDate - startDate).days() 11 | if days_to_expiry > avg_period_length: 12 | return sqrt(((T - L + 1) * L ** 2 + L * (L - 1) * (2 * L - 1) / 6) / (L ** 2 * T)) 13 | else: 14 | return sqrt((T + 1) * (2*T + 1) / (6 * L ** 2)) 15 | 16 | def F(z): 17 | return (1/sqrt(2*pi)) * exp(-(z ** 2) / 2) 18 | 19 | #COPIED APPROX FOR NORMAL CDF TO REPLACE SCIPY, WHICH WAS TOO HARD TO INSTALL AT WORK 20 | # TAKEN FROM http://stackoverflow.com/questions/809362/cumulative-normal-distribution-in-python 21 | def erfcc(x): 22 | """Complementary error function.""" 23 | z = abs(x) 24 | t = 1. / (1. + 0.5*z) 25 | r = t * exp(-z*z-1.26551223+t*(1.00002368+t*(.37409196+ 26 | t*(.09678418+t*(-.18628806+t*(.27886807+ 27 | t*(-1.13520398+t*(1.48851587+t*(-.82215223+ 28 | t*.17087277))))))))) 29 | if (x >= 0.): 30 | return r 31 | else: 32 | return 2. - r 33 | 34 | def normalcdf(x): 35 | return 1. - 0.5*erfcc(x/(2**0.5)) 36 | 37 | #COPIED FROM GRAEME WEST AND TRANSLATED TO PYTHON 38 | #https://lyle.smu.edu/~aleskovs/emis/sqc2/accuratecumnorm.pdf 39 | def normalcdf_gw(x): 40 | XAbs = abs(x) 41 | if XAbs > 37: 42 | result = 0 43 | else: 44 | Exponential = exp(-1.0 * (XAbs ** 2) / 2.0) 45 | if XAbs < 7.07106781186547: 46 | Build = 3.52624965998911E-02 * XAbs + 0.700383064443688 47 | Build = Build * XAbs + 6.37396220353165 48 | Build = Build * XAbs + 33.912866078383 49 | Build = Build * XAbs + 112.079291497871 50 | Build = Build * XAbs + 221.213596169931 51 | Build = Build * XAbs + 220.206867912376 52 | result = Exponential * Build 53 | Build = 8.83883476483184E-02 * XAbs + 1.75566716318264 54 | Build = Build * XAbs + 16.064177579207 55 | Build = Build * XAbs + 86.7807322029461 56 | Build = Build * XAbs + 296.564248779674 57 | Build = Build * XAbs + 637.333633378831 58 | Build = Build * XAbs + 793.826512519948 59 | Build = Build * XAbs + 440.413735824752 60 | result = result / Build 61 | else: 62 | Build = XAbs + 0.65 63 | Build = XAbs + 4 / Build 64 | Build = XAbs + 3 / Build 65 | Build = XAbs + 2 / Build 66 | Build = XAbs + 1 / Build 67 | result = Exponential / Build / 2.506628274631 68 | 69 | if x > 0: result = 1 - result 70 | return result 71 | 72 | def option_price(forward,strike,vol,rate,tenor,sign): 73 | if vol == 0: 74 | print 'zero vol error' 75 | return -1 76 | if strike == 0: 77 | print 'zero strike error' 78 | return -1 79 | #sign = +1 for calls and -1 for puts 80 | if tenor == 0: 81 | return sign * (forward - strike) 82 | #OTHERWISE 83 | d1 = (log(forward/strike) + (.5 * (vol ** 2) * tenor)) / (vol * sqrt(tenor)) 84 | d2 = d1 - vol * sqrt(tenor) 85 | return exp(-1 * rate * tenor) * (sign * forward * normalcdf_gw(sign * d1) - strike * sign * normalcdf_gw(sign * d2)) 86 | 87 | def black_delta(forward,strike,vol,rate,tenor,sign): 88 | if vol == 0: 89 | if type == 1: 90 | if forward >= strike: 91 | return 1 92 | else: 93 | return 0 94 | else: 95 | if forward <= strike: 96 | return -1 97 | else: 98 | return 0 99 | d1 = (log(forward/strike) + (.5 * (vol ** 2) * tenor)) / (vol * sqrt(tenor)) 100 | forwardCallDelta = normalcdf_gw(d1) 101 | if type == 1: 102 | return exp(-1*rate*tenor) * forwardCallDelta 103 | else: 104 | return exp(-1*rate*tenor) * (forwardCallDelta - 1) 105 | 106 | def black_gamma(forward,strike,vol,rate,tenor,sign): 107 | if vol == 0: return 0 108 | d1 = (log(forward/strike) + (.5 * (vol ** 2) * tenor)) / (vol * sqrt(tenor)) 109 | return F(d1) / (forward * vol * sqrt(tenor)) 110 | 111 | def black_vega(forward,strike,vol,rate,tenor,sign): 112 | d1 = (log(forward/strike) + (.5 * (vol ** 2) * tenor)) / (vol * sqrt(tenor)) 113 | vega = forward * sqrt(tenor) * F(d1) * exp(-1 * rate * tenor) * .01 114 | return vega 115 | 116 | def black_theta(forward,strike,vol,rate,tenor,sign): 117 | d1 = (log(forward/strike) + (.5 * (vol ** 2) * tenor)) / (vol * sqrt(tenor)) 118 | d2 = d1 - vol * sqrt(tenor) 119 | theta = forward * F(d1) * vol * exp(-1*rate*tenor) / sqrt(tenor) / float(-2) 120 | theta += sign * rate * forward * normalcdf_gw(sign * d1) * exp(-1 * rate * tenor) 121 | theta -= sign * rate * strike * normalcdf_gw(sign * d2) 122 | theta /= 365 123 | return theta 124 | 125 | def black_rho(forward,strike,vol,rate,tenor,sign): 126 | d1 = (log(forward/strike) + (.5 * (vol ** 2) * tenor)) / (vol * sqrt(tenor)) 127 | d2 = d1 - vol * sqrt(tenor) 128 | rho = sign * strike * tenor * exp(-1 * rate * tenor) * normalcdf_gw(sign * d2) * .0001 129 | return rho 130 | 131 | def option_implied_vol(forward,strike,price,rate,tenor,sign): 132 | #print 'imp vol calc:',forward,strike,price,rate,tenor,sign 133 | price_err_limit = price/10000 134 | iteration_limit = 20 135 | vmax = 1.0 #START SEARCH FOR UPPER VOL BOUND AT 100% 136 | tprice = 0.0 137 | while option_price(forward,strike,vmax,rate,tenor,sign) < price: 138 | vmax += 1 139 | if vmax > iteration_limit: return -1 #ERROR CONDITION 140 | vmin = vmax - 1 141 | vmid = (vmin + vmax)/2 142 | tprice = option_price(forward,strike,vmid,rate,tenor,sign) 143 | count = 1 144 | while abs(tprice - price) > price_err_limit: 145 | if tprice > price: 146 | vmax = vmid 147 | else: 148 | vmin = vmid 149 | vmid = (vmin + vmax)/2 150 | count = count + 1 151 | if count > iteration_limit: 152 | print 'option_implied_vol: search iter limit reached' 153 | print forward,strike,price,rate,tenor,sign 154 | return vmid #EXIT CONDITION 155 | tprice = option_price(forward,strike,vmid,rate,tenor,sign) 156 | return vmid 157 | 158 | def option_price_normal(forward,strike,vol,rate,tenor,sign): 159 | if vol == 0: 160 | return -1 161 | #sign = +1 for calls and -1 for puts 162 | if tenor == 0: 163 | return sign * (forward - strike) 164 | d1 = (forward - strike) / (vol * sqrt(tenor)) 165 | return exp(-1 * rate * tenor) * (sign * (forward - strike) * normalcdf_gw(sign * d1) + vol * sqrt(tenor) * F(d1)) 166 | 167 | def option_implied_vol_normal(forward,strike,price,rate,tenor,sign): 168 | price_err_limit = price/10000 169 | iteration_limit = 25 170 | vmax = forward 171 | tprice = 0.0 172 | count = 0 173 | while option_price_normal(forward,strike,vmax,rate,tenor,sign) < price: 174 | vmax += forward 175 | count += 1 176 | if count > iteration_limit: return -1 #ERROR CONDITION 177 | vmin = vmax - forward 178 | vmid = (vmin + vmax)/2 179 | tprice = option_price_normal(forward,strike,vmid,rate,tenor,sign) 180 | count = 1 181 | while abs(tprice - price) > price_err_limit: 182 | if tprice > price: 183 | vmax = vmid 184 | else: 185 | vmin = vmid 186 | vmid = (vmin + vmax)/2 187 | count += 1 188 | if count > iteration_limit: 189 | print 'option_implied_vol_normal: search iter limit reached' 190 | print forward,strike,price,rate,tenor,sign, vmid 191 | return vmid #EXIT CONDITION 192 | tprice = option_price_normal(forward,strike,vmid,rate,tenor,sign) 193 | return vmid 194 | -------------------------------------------------------------------------------- /scripts/generateFutureAndOptionLastTradeDates.py: -------------------------------------------------------------------------------- 1 | import sys 2 | from datetime import date, timedelta 3 | import calendar 4 | 5 | config_file = '../config/commodities_config.csv' 6 | holiday_file = '../config/cme_holidays.csv' 7 | 8 | HOLIDAYS = dict() 9 | def LoadHolidaysFromFile(): 10 | f = open(holiday_file,'r') 11 | lines = f.readlines() 12 | f.close() 13 | for line in lines: 14 | fields = line.split(',') 15 | calendar = fields[0] 16 | if not calendar == 'USNY': 17 | continue 18 | dateString = fields[2] 19 | parts = dateString.split('/') 20 | if len(parts) < 3: 21 | continue 22 | year = int(parts[2]) 23 | month = int(parts[0]) 24 | day = int(parts[1]) 25 | HOLIDAYS[date(year,month,day)] = 1 26 | 27 | def IsBusinessDate(pDate): 28 | #LOAD HOLIDAYS IF NOT ALREADY DONE 29 | if len(HOLIDAYS.keys()) == 0: 30 | LoadHolidaysFromFile() 31 | 32 | #EXCLUDE WEEKENDS AND HOLIDAYS 33 | if pDate.weekday() == 5 or pDate.weekday() == 6: 34 | return 0 35 | if pDate in HOLIDAYS: 36 | return 0 37 | #OTHERWISE 38 | return 1 39 | 40 | def AddBusinessDays(pDate,n): 41 | if n == 0: 42 | return pDate 43 | bus_shifts = 1 44 | tDate = pDate 45 | while bus_shifts <= abs(n): 46 | if n > 0: 47 | tDate = tDate + timedelta(days=1) 48 | else: 49 | tDate = tDate + timedelta(days=-1) 50 | 51 | if IsBusinessDate(tDate): 52 | bus_shifts += 1 53 | return tDate 54 | 55 | def BusinessDateOnOrBefore(pDate): 56 | if IsBusinessDate(pDate): 57 | return pDate 58 | tDate = AddBusinessDays(pDate,-1) 59 | while not IsBusinessDate(tDate): 60 | tDate = AddBusinessDays(tDate,-1) 61 | return tDate 62 | 63 | def BusinessDateOnOrAfter(pDate): 64 | if IsBusinessDate(pDate): 65 | return pDate 66 | tDate = AddBusinessDays(pDate,1) 67 | while not IsBusinessDate(tDate): 68 | tDate = AddBusinessDays(tDate,1) 69 | return tDate 70 | 71 | def AddMonths(sourcedate,months): 72 | month = sourcedate.month - 1 + months 73 | year = sourcedate.year + month / 12 74 | month = month % 12 + 1 75 | day = min(sourcedate.day,calendar.monthrange(year,month)[1]) 76 | return date(year,month,day) 77 | 78 | def DetermineFutureAndOptionExpiry(ticker, year, month): 79 | result = [] #DEFINE OUTPUT AS LIST WITH 2 ITEMS, THE FUTURE AND THE OPTION LAST TRADE DATES 80 | 81 | if ticker == 'CL': 82 | tDate = AddMonths(date(year,month,25),-1) 83 | fut_exp_date = AddBusinessDays(BusinessDateOnOrBefore(tDate),-3) 84 | result.append(fut_exp_date) 85 | opt_exp_date = AddBusinessDays(fut_exp_date,-3) 86 | result.append(opt_exp_date) 87 | elif ticker == 'HO' or ticker == 'RB': 88 | fut_exp_date = AddBusinessDays(date(year,month,1),-1) 89 | result.append(fut_exp_date) 90 | opt_exp_date = AddBusinessDays(fut_exp_date,-3) 91 | result.append(opt_exp_date) 92 | elif ticker == 'C' or ticker == 'S' or ticker == 'W' or ticker == 'MW' or ticker == 'KW' or ticker == 'BO' or ticker == 'SM': 93 | # COMPUTE FUT EXP DATE AS LAST BIZ DATE BEFORE 15TH OF CAL MONTH 94 | tDate = AddBusinessDays(date(year,month,15),-1) 95 | result.append(tDate) 96 | # COMPUTE OPT EXP DATE AS LAST FRI AT LEAST 2 BIZ DATES BEFORE LAST BIZ DATE OF PRIOR CAL MONTH 97 | tDate = date(year,month,1) 98 | tDate = AddBusinessDays(tDate,-3) 99 | while not tDate.weekday() == 4: 100 | tDate = tDate + timedelta(days=-1) 101 | if not IsBusinessDate(tDate): 102 | tDate = AddBusinessDays(tDate,-1) 103 | result.append(tDate) 104 | elif ticker == 'DOED': 105 | #LAST MONDAY OF CALENDAR MONTH 106 | tDate = date(year,month,calendar.monthrange(year,month)[1]) 107 | while tDate.weekday() != 0: 108 | tDate = tDate + timedelta(days=-1) 109 | result.append(tDate) 110 | result.append(tDate) 111 | elif ticker == 'LH': 112 | tDate = BusinessDateOnOrAfter(date(year,month,1)) 113 | fut_exp_date = AddBusinessDays(tDate,9) 114 | result.append(fut_exp_date) 115 | opt_exp_date = fut_exp_date 116 | result.append(opt_exp_date) 117 | elif ticker == 'ED': 118 | #THIRD WEDS MINUS 2 BUS DAYS 119 | tDate = date(year,month,1) 120 | wedCount = 0 121 | while wedCount < 3: 122 | if tDate.weekday() == 2: 123 | wedCount += 1 124 | tDate = tDate + timedelta(days=1) 125 | tDate = tDate + timedelta(days=-1) 126 | fut_exp_date = AddBusinessDays(tDate,-2) 127 | result.append(fut_exp_date) 128 | result.append(fut_exp_date) 129 | elif ticker == 'GC' or ticker == 'SI' or ticker == 'HG': 130 | #FUT EXP THIRD TO LAST BIZ DATE 131 | if month == 12: 132 | tDate = date(year+1,1,1) 133 | else: 134 | tDate = date(year,month+1,1) 135 | fut_exp_date = AddBusinessDays(tDate,-3) 136 | result.append(fut_exp_date) 137 | #OPT EXP 4TH TO LAST BIZ DATE OF PRIOR MONTH 138 | tDate = date(year,month,1) 139 | opt_exp_date = AddBusinessDays(tDate,-4) 140 | if not IsBusinessDate(opt_exp_date + timedelta(days=1)): 141 | opt_exp_date = AddBusinessDays(opt_exp_date,-1) 142 | result.append(opt_exp_date) 143 | elif ticker == 'PL': 144 | #FUT EXP THIRD TO LAST BIZ DATE 145 | if month == 12: 146 | tDate = date(year+1,1,1) 147 | else: 148 | tDate = date(year,month+1,1) 149 | fut_exp_date = AddBusinessDays(tDate,-3) 150 | result.append(fut_exp_date) 151 | # OPT EXP THIRD WED OF PREV MONTH 152 | if month == 1: 153 | tDate = date(year-1,12,1) 154 | else: 155 | tDate = date(year,month-1,1) 156 | wedCount = 0 157 | while wedCount < 3: 158 | if tDate.weekday() == 2: 159 | wedCount += 1 160 | tDate = tDate + timedelta(days=1) 161 | opt_exp_date = tDate + timedelta(days=-1) 162 | if not IsBusinessDate(opt_exp_date + timedelta(days=1)): 163 | opt_exp_date = AddBusinessDays(opt_exp_date,-1) 164 | result.append(opt_exp_date) 165 | elif ticker == 'ES': 166 | #THIRD FRIDAY 167 | tDate = date(year,month,1) 168 | friCount = 0 169 | while friCount < 3: 170 | if tDate.weekday() == 4: 171 | friCount += 1 172 | tDate = tDate + timedelta(days=1) 173 | fut_exp_date = tDate + timedelta(days=-1) 174 | opt_exp_date = fut_exp_date 175 | result.append(fut_exp_date) 176 | result.append(opt_exp_date) 177 | else: 178 | result = result 179 | return result 180 | 181 | def FutureContractCode(month,year): 182 | months = {1:'F',2:'G',3:'H',4:'J',5:'K',6:'M',7:'N',8:'Q',9:'U',10:'V',11:'X',12:'Z'} 183 | yr = str(year)[2:4] 184 | return months[month] + yr 185 | 186 | #READ COMMAND LINE ARGS, DATES IN YYYYMMDD FORMAT 187 | _config_file = sys.argv[1] 188 | _output_file = sys.argv[2] 189 | _start_date = sys.argv[3] 190 | _end_date = sys.argv[4] 191 | 192 | # PARSE START AND END DATES 193 | year = int(_start_date[:4]) 194 | month = int(_start_date[4:6]) 195 | day = 1 196 | startDate = date(year,month,day) 197 | year = int(_end_date[:4]) 198 | month = int(_end_date[4:6]) 199 | endDate = date(year,month,day) 200 | 201 | #READ TICKER LIST FROM CONFIG FILE 202 | f = open(_config_file, 'r') 203 | lines = f.readlines() 204 | f.close() 205 | tickers = [] 206 | exchanges = [] 207 | for line in lines: 208 | fields = line.strip().split(',') 209 | ticker = fields[1] 210 | if ticker == 'Ticker': 211 | continue 212 | tickers.append(ticker) 213 | exchange = fields[2] 214 | exchanges.append(exchange) 215 | 216 | #START BUILDING OUTPUT FILE 217 | id = 1 218 | f = open(_output_file,'w') 219 | 220 | f.write('ID,Exchange,Commodity,Year,Month,Contract,FutureTicker,OptionTicker,FutureExpiry,OptionExpiry') 221 | 222 | # FOR EACH TICKER, LOOP THROUGH DATE RANGE 223 | for i in range(len(tickers)): 224 | ticker = tickers[i] 225 | exchange = exchanges[i] 226 | print ticker + '\t' + exchange 227 | 228 | tDate = startDate 229 | while tDate <= endDate: 230 | tYear = tDate.year 231 | tMonth = tDate.month 232 | #print tDate.isoformat() 233 | 234 | tDate = AddMonths(tDate,1) 235 | 236 | result = DetermineFutureAndOptionExpiry(ticker,tYear,tMonth) 237 | if len(result) < 2: 238 | continue 239 | 240 | fut_exp_date = result[0] 241 | opt_exp_date = result[1] 242 | 243 | output = '\n'+ str(id) + ',' + exchange + ',' + ticker + ',' 244 | output += str(tYear) + ',' + str(tMonth) + ',' + FutureContractCode(tMonth,tYear) + ',,,' 245 | output += fut_exp_date.isoformat() + ',' + opt_exp_date.isoformat() 246 | f.write(output) 247 | id += 1 248 | f.close() 249 | 250 | -------------------------------------------------------------------------------- /scripts/constructCurvesAndSurfacesFromSettlementDataFiles.py: -------------------------------------------------------------------------------- 1 | #IMPORT SYS FOR HANDLING COMMAND LINE ARGUMENTS 2 | import sys 3 | #IMPORT OS FOR FILE I/O 4 | import os.path 5 | import os 6 | #IMPORT datetime for using dates to reference data 7 | from datetime import date, timedelta 8 | #IMPORT pickle FOR first pass at database 9 | import pickle 10 | 11 | 12 | #IMPORT MATH MODULE FOR NATURAL LOG 13 | from math import log 14 | #IMPORT OWN STRING FUNCTION MODULE 15 | from stringFunctions import * 16 | #IMPORT BLACK SCHOLES MODULE 17 | from black_scholes import * 18 | #IMPORT TimeSeries 19 | from TimeSeries import * 20 | from cCurve import * 21 | from loadFuturesConfig import * 22 | 23 | 24 | #CONFIG VARS 25 | futDbFileName = '../db/tsFutures.dat' 26 | optDbFileName = '../db/tsVols.dat' 27 | noptDbFileName = '../db/tsNVols.dat' 28 | dfCurveFileName = '../db/tsDFCurves.dat' 29 | 30 | #PRICE ERROR CODE 31 | ncPRICE_ERROR = -666.666 32 | 33 | #PROCESS REFERENCE DATE FROM ARGS 34 | tDate = date.today() 35 | if len(sys.argv) > 1: 36 | dateString = sys.argv[1] 37 | else: 38 | dateString = str(tDate.year) + right('00'+str(tDate.month),2) + right('00'+str(tDate.day),2) 39 | 40 | refYear = int(dateString[:4]) 41 | refMonth = int(dateString[4:6]) 42 | refDay = int(dateString[6:8]) 43 | refDate = date(refYear,refMonth,refDay) 44 | 45 | print 'refDate: ' + refDate.isoformat() 46 | 47 | #CREATE LIST OF FILES TO LOOP THROUGH USING RELATIVE PATHS 48 | urlFile = '../config/url_list.txt' 49 | f = open(urlFile,'r') 50 | urlList = f.readlines() 51 | f.close() 52 | 53 | file_path = '../settlement_data_files/' + dateString 54 | out_file_path = '/var/www/html/' + dateString 55 | 56 | fileList =[] 57 | exchList = [] 58 | for line in urlList: 59 | fields = line.strip().split(',') 60 | url = fields[0] 61 | file_name = file_path + '/' + url.split('/')[-1] 62 | fileList.append(file_name) 63 | exchList.append(fields[1]) 64 | 65 | def cmeSettlementDataFileRowType(rowString = ''): 66 | #HANDLE EMPTY CASE 67 | if rowString == '': return '' 68 | #IDENTIFY TOTALS ROWS 69 | if left(rowString,5) == 'TOTAL': return 'TOTAL' 70 | words = line.split(' ') 71 | #IDENTIFY FUTURES CONTRACT HEADERS 72 | if rowString.find('Future') > -1 or rowString.find('FUTURE') > -1: 73 | return 'FUTURES CONTRACT HEADER' 74 | #IDENTIFY OPTION HEADER ROW BY LAST WORD BEING 'CALL' OR 'PUT' 75 | if words[-1] == 'CALL' or words[-1] == 'PUT': 76 | return 'OPTION CONTRACT HEADER' 77 | #IDENTIFY SINGLE OPTION STRIKES 78 | if words[0].isdigit() or left(words[0],1) == '-': 79 | return 'OPTION CONTRACT RECORD' 80 | #IDENTIFY FUTURES CONTRACT RECORDS BY CHECKING FIRST WORD IS CONTRACT MONTH CODE 81 | if len(words[0])==5 and left(words[0],3).isalpha() and right(words[0],2).isdigit(): 82 | return 'FUTURE CONTRACT RECORD' 83 | #OTHERWISE A FUTURES CONTRACT HEADER 84 | return 'FUTURES CONTRACT HEADER' 85 | 86 | def cmeIntMonthFromThreeLetterMonth(mmm = ''): 87 | if mmm == '': return -1 88 | months = {'JAN':1,'FEB':2,'MAR':3,'APR':4,'MAY':5,'JUN':6,'JLY':7,'AUG':8,'SEP':9,'OCT':10,'NOV':11,'DEC':12} 89 | retVal = months[mmm.upper()] 90 | if retVal != None: 91 | return retVal 92 | else: 93 | return -1 94 | 95 | def convertPriceStringToFloat(strPrice = ''): 96 | #VALIDATE EMPTY SETTLES 97 | if strPrice == '----' or len(strPrice) == 0: return ncPRICE_ERROR 98 | #CONVERT PRICE TO FLOAT 99 | parts = strPrice.split("'") 100 | fltPrice = float(parts[0]) 101 | if len(parts) > 1: 102 | fltPrice += float(parts[1])/8.0 103 | return fltPrice 104 | 105 | #INIT MARKET DATA HASH TABLE 106 | FUTURES = dict() 107 | VOLS = dict() 108 | NVOLS = dict() 109 | 110 | dfCurve = cCurve() 111 | dfCurve.SetInterpMethod(1) #log-linear, for discount factors 112 | dfCurve.Add(cCurvePoint(refDate,1.0)) 113 | 114 | #INIT refDate global to script 115 | fileNum = 0 116 | for file_name in fileList: 117 | fileNum += 1 118 | #VALIDATE FILE NAME 119 | #if not os.path.isfile(fileName): 120 | #print 'cant find file:', fileName 121 | # continue 122 | #IDENTIFY EXCHANGE FOR THIS FILE 123 | exchange = exchList[fileNum-1] 124 | #TEST IF FILE EXISTS, SKIPPING IF NOT 125 | if not os.path.exists(file_name): continue 126 | #OPEN FILE FOR READING 127 | dataFile = open(file_name,'r') 128 | #GET DATA REFERENCE DATE FROM TOP LINE OF EACH FILE 129 | line = dataFile.readline().strip(' ') 130 | words = line.split(' ') 131 | dateString = words[5] 132 | dateParts = dateString.split('/') 133 | #print 'Date String for ' + file_name + ': ' + dateString 134 | #refDate = date(2000+int(dateParts[2]),int(dateParts[0]),int(dateParts[1])) 135 | _refDate = refDate 136 | #print file_name 137 | #print 'Reference Date: ' + refDate.isoformat() 138 | #LoadDiscountFactorsFromFile(refDate) 139 | 140 | #INIT RUNNING DISCOUNT FACTOR TO 1 141 | dblRunningDF = 1.0 142 | 143 | #SKIP NEXT 2 LINES 144 | dataFile.readline(); dataFile.readline() 145 | 146 | #INITIALIZE FILE LINE VARIABLES 147 | lineCount = 3 148 | contractCode = '' 149 | contractType = '' 150 | contractMonth = -1 151 | contractYear = -1 152 | contractOptionType = 0 153 | optionForward = -1 154 | contractTicker = '' 155 | rowType = '' 156 | iTicker = '' 157 | quoteMultiplier = 1.0 158 | strikeMultiplier = 1.0 159 | for line in dataFile: 160 | lineCount += 1 161 | #IDENTIFY ROW TYPE 162 | line = clean(line) 163 | rowType = cmeSettlementDataFileRowType(line) 164 | if rowType == '': 165 | continue 166 | elif rowType == 'TOTAL': 167 | continue 168 | elif rowType == 'FUTURES CONTRACT HEADER': 169 | contractCode = line.split(' ')[0] 170 | iTicker = GetTickerByFutureTicker(contractCode,exchange) 171 | quoteMultiplier = GetQuoteMultiplierByTicker(iTicker) 172 | elif rowType == 'FUTURE CONTRACT RECORD': 173 | #ONLY INCLUDE VALID TICKERS 174 | if iTicker == None: continue 175 | if quoteMultiplier == None: continue 176 | #DETERMINE CONTRACT MONTH FROM CODE 177 | strContractMonth = line.split(' ')[0] 178 | contractMonth = cmeIntMonthFromThreeLetterMonth(left(strContractMonth,3)) 179 | contractYear = 2000 + int(right(strContractMonth,2)) 180 | #GET SETTLEMENT PRICE 181 | strSettlePrice = clean(mid(line,46,9)) 182 | strOpenPrice = clean(mid(line,6,9)) 183 | strHighPrice = clean(mid(line,16,9)) 184 | strLowPrice = clean(mid(line,26,9)) 185 | strVolume = clean(mid(line,66,9)) 186 | #CONVERT PRICE STRINGS TO FLOATS 187 | fltSettlePrice = convertPriceStringToFloat(strSettlePrice) 188 | if fltSettlePrice == ncPRICE_ERROR: continue 189 | fltOpenPrice = convertPriceStringToFloat(strOpenPrice) 190 | fltHighPrice = convertPriceStringToFloat(strHighPrice) 191 | fltLowPrice = convertPriceStringToFloat(strLowPrice) 192 | fltVolume = convertPriceStringToFloat(strVolume) 193 | if fltVolume == ncPRICE_ERROR: fltVolume = 0 194 | #SAVE PRICES TO DATATBASE 195 | if not FUTURES.has_key(iTicker): FUTURES[iTicker] = dict() 196 | if not FUTURES[iTicker].has_key(contractYear): 197 | FUTURES[iTicker][contractYear] = dict() 198 | if not FUTURES[iTicker][contractYear].has_key(contractMonth): 199 | FUTURES[iTicker][contractYear][contractMonth] = dict() 200 | FUTURES[iTicker][contractYear][contractMonth]["Close"] = fltSettlePrice * quoteMultiplier 201 | if fltOpenPrice != ncPRICE_ERROR: FUTURES[iTicker][contractYear][contractMonth]["Open"] = fltOpenPrice * quoteMultiplier 202 | if fltHighPrice != ncPRICE_ERROR: FUTURES[iTicker][contractYear][contractMonth]["High"] = fltHighPrice * quoteMultiplier 203 | if fltLowPrice != ncPRICE_ERROR: FUTURES[iTicker][contractYear][contractMonth]["Low"] = fltLowPrice * quoteMultiplier 204 | FUTURES[iTicker][contractYear][contractMonth]["Volume"] = fltVolume 205 | #BUILD DISCOUNT FACTOR CURVE FROM EURODOLLAR FUTURES (W/O CONVEXITY ADJUSTMENT TO START) 206 | if iTicker == 'ED': 207 | #IGNORE NON-CORE FUTURES, USING ONLY H,M,U,Z 208 | if contractMonth == 3 or contractMonth == 6 or contractMonth == 9 or contractMonth == 12: 209 | dblForwardRate = (100 - fltSettlePrice) / 100 #ABS VAL 210 | 211 | if dfCurve.length() == 1: 212 | dfDate = fut_exp_dates()[iTicker][contractYear][contractMonth] 213 | dblTenor = float((dfDate - refDate).days) / 365.0 214 | dblDF = (1+ dblForwardRate / 4) ** (-4 * dblTenor) 215 | dblRunningDF *= dblDF 216 | dfCurve.Add(cCurvePoint(dfDate,dblRunningDF)) 217 | #print iTicker,contractYear,contractMonth,fltSettlePrice,dblForwardRate,dfCurve.length() 218 | 219 | dblForwardDF = (1 + dblForwardRate / 4) ** (-1) 220 | dblRunningDF *= dblForwardDF 221 | if contractMonth + 3 > 12: 222 | forwardContractMonth = 3 223 | forwardContractYear = contractYear + 1 224 | else: 225 | forwardContractMonth = contractMonth + 3 226 | forwardContractYear = contractYear 227 | if not fut_exp_dates()[iTicker].has_key(forwardContractYear): 228 | continue 229 | dfDate = fut_exp_dates()[iTicker][forwardContractYear][forwardContractMonth] 230 | dfCurve.Add(cCurvePoint(dfDate,dblRunningDF)) 231 | #print iTicker,contractYear,contractMonth,fltSettlePrice,dblForwardRate,dfCurve.length() 232 | elif rowType == 'OPTION CONTRACT HEADER': 233 | words = line.split(' ') 234 | if words[-1].upper() == 'CALL': 235 | contractOptionType = 1 236 | else: 237 | contractOptionType = -1 238 | #GET FUTURE TICKER 239 | optionTicker = words[0] 240 | contractCode = GetFutureTickerByOptionTicker(optionTicker,contractOptionType,exchange) 241 | iTicker = GetTickerByFutureTicker(contractCode,exchange) 242 | quoteMultiplier = GetQuoteMultiplierByTicker(iTicker) 243 | strikeMultiplier = GetStrikeMultiplierByTicker(iTicker) 244 | #GET CONTRACT MONTH 245 | strContractMonth = words[1] 246 | contractMonth = cmeIntMonthFromThreeLetterMonth(left(strContractMonth,3)) 247 | if right(strContractMonth,2).isdigit(): 248 | contractYear = 2000 + int(right(strContractMonth,2)) 249 | else: 250 | contractYear = -1 251 | elif rowType == 'OPTION CONTRACT RECORD': 252 | #IGNORE OPTIONS FOR WHICH WE DONT HAVE CONTRACT CODES 253 | if contractCode == '': continue 254 | if contractMonth == -1: continue 255 | if contractYear == -1: continue 256 | if iTicker == None: continue 257 | words = line.split(' ') 258 | #GET STRIKE 259 | fltStrike = float(words[0]) * strikeMultiplier 260 | #GET FORWARD PRICE FOR OPTION CONTRACT 261 | if not FUTURES[iTicker].has_key(contractYear): continue 262 | if FUTURES[iTicker][contractYear].has_key(contractMonth): 263 | #print contractCode,contractYear,contractMonth,fltStrike 264 | fltForward = FUTURES[iTicker][contractYear][contractMonth]["Close"] 265 | else: 266 | #IGNORE OPTIONS 267 | continue 268 | if fltForward <= 0: 269 | #print 'zero forward',contractCode,contractYear,contractMonth 270 | continue 271 | #GET SETTLEMENT PRICE 272 | strSettlePrice = clean(mid(line,46,9)) 273 | if strSettlePrice.isalpha(): continue 274 | if strSettlePrice == '----': continue 275 | parts = strSettlePrice.split("'") 276 | if len(parts[0]) == 0: 277 | fltSettlePrice = 0 278 | else: 279 | fltSettlePrice = float(parts[0]) * quoteMultiplier 280 | if len(parts) > 1: 281 | fltSettlePrice += (float(parts[1])/8.0 * quoteMultiplier) 282 | #GET EXPIRY DATE AND TENOR 283 | #print contractCode,iTicker,contractYear,contractMonth 284 | if not opt_exp_dates().has_key(iTicker): continue 285 | if not opt_exp_dates()[iTicker].has_key(contractYear): continue 286 | if opt_exp_dates()[iTicker][contractYear].has_key(contractMonth): 287 | expDate = opt_exp_dates()[iTicker][contractYear][contractMonth] 288 | else: 289 | continue 290 | tenor = float((expDate - refDate).days)/365.0 291 | #GET DISCOUNT RATE 292 | dblDF = dfCurve.GetValueByDate(expDate) 293 | if tenor == 0: 294 | dblRate = 0.01 295 | else: 296 | dblRate = (float(-1) / tenor) * log(dblDF) 297 | 298 | #rate = .01 299 | 300 | #CALC IMP VOL 301 | fltSkew = fltStrike / fltForward 302 | #IGNORE IN-THE-MONEY OPTIONS 303 | if contractOptionType == 1 and fltSkew < 1: continue 304 | if contractOptionType == -1 and fltSkew > 1: continue 305 | #STILL NEEDS TO BE WRITTEN 306 | sigma = option_implied_vol(fltForward,fltStrike,fltSettlePrice,dblRate,tenor,contractOptionType) 307 | normal_sigma = option_implied_vol_normal(fltForward,fltStrike,fltSettlePrice,dblRate,tenor,contractOptionType) 308 | #SAVE IN HASH TABLE 309 | if not VOLS.has_key(iTicker): VOLS[iTicker] = dict() 310 | if not VOLS[iTicker].has_key(contractYear): VOLS[iTicker][contractYear] = dict() 311 | if not VOLS[iTicker][contractYear].has_key(contractMonth): 312 | VOLS[iTicker][contractYear][contractMonth] = dict() 313 | if not NVOLS.has_key(iTicker): NVOLS[iTicker] = dict() 314 | if not NVOLS[iTicker].has_key(contractYear): NVOLS[iTicker][contractYear] = dict() 315 | if not NVOLS[iTicker][contractYear].has_key(contractMonth): 316 | NVOLS[iTicker][contractYear][contractMonth] = dict() 317 | # 318 | #if contractCode == 'C' and contractYear == 2010 and contractMonth == 12: 319 | # print contractCode,contractYear,contractMonth,fltForward,fltStrike,fltSettlePrice,rate,tenor,sigma 320 | # 321 | VOLS[iTicker][contractYear][contractMonth][fltSkew] = sigma 322 | NVOLS[iTicker][contractYear][contractMonth][fltSkew] = normal_sigma 323 | #CLOSE FILE 324 | dataFile.close() 325 | 326 | #DEFINE SKEWS FOR USE IN VOL SURFACES, USE ONE OR THE OTHER 327 | skews = [.5,.8,.9,.95,1,1.05,1.1,1.2,1.5] 328 | SMILES = dict() 329 | NSMILES = dict() 330 | 331 | # COMPUTE AND SAVE DESIRED SKEWS FROM STORED SKEWS 332 | for code in sorted(VOLS.keys()): 333 | if not SMILES.has_key(code):SMILES[code] = dict() 334 | if not NSMILES.has_key(code):NSMILES[code] = dict() 335 | for year in sorted(VOLS[code].keys()): 336 | if not SMILES[code].has_key(year): SMILES[code][year] = dict() 337 | if not NSMILES[code].has_key(year): NSMILES[code][year] = dict() 338 | for month in sorted(VOLS[code][year].keys()): 339 | _skews = [] 340 | _vols = [] 341 | _nvols = [] 342 | _smile = [] 343 | _nsmile = [] 344 | #BUILD ORDERED SKEW ARRAY 345 | for skew in sorted(VOLS[code][year][month].keys()): 346 | _skews.append(skew) 347 | _vols.append(VOLS[code][year][month][skew]) 348 | _nvols.append(NVOLS[code][year][month][skew]) 349 | #INTERPOLATE TO FIND DESIRED SKEWS 350 | for i in range(len(skews)): 351 | v = 0 352 | nv = 0 353 | if skews[i] <= _skews[0]: #FLAT EXTRAPOLATION 354 | v = _vols[0] 355 | nv = _nvols[0] 356 | elif skews[i] >= _skews[-1]: 357 | v = _vols[-1] 358 | nv= _nvols[-1] 359 | else: 360 | j = 1 361 | while j < (len(_skews)) and skews[i] >= _skews[j]: 362 | j += 1 363 | #j -= 1 #STEP BACK ONE 364 | v = _vols[j-1] + ((_vols[j] - _vols[j-1])/(_skews[j] - _skews[j-1])) * (skews[i] - _skews[j-1]) 365 | nv = _nvols[j-1] + ((_nvols[j] - _nvols[j-1])/(_skews[j] - _skews[j-1])) * (skews[i] - _skews[j-1]) 366 | _smile.append(v) 367 | _nsmile.append(nv) 368 | #SAVE SMILE TO RESULT HASH 369 | SMILES[code][year][month] = _smile 370 | NSMILES[code][year][month] = _nsmile 371 | 372 | # CREATE OUTPUT DIRECTORY IF NECESSARY 373 | if not os.path.exists(out_file_path): os.mkdir(out_file_path) 374 | 375 | # PRINT FUTURES HASH TABLE TO FILE FOR TEST 376 | output = 'Code,Year,Month' 377 | fields = ['Open','High','Low','Close','Volume'] 378 | for field in fields: 379 | output += "," + field 380 | 381 | for code in sorted(FUTURES.keys()): 382 | for year in sorted(FUTURES[code].keys()): 383 | for month in sorted(FUTURES[code][year].keys()): 384 | output += '\n' + code + ',' + str(year) + ',' + str(month) 385 | for field in fields: 386 | output += ',' 387 | if FUTURES[code][year][month].has_key(field): 388 | output += str(FUTURES[code][year][month][field]) 389 | 390 | outFile = open(out_file_path + '/' + 'mktdata_futures_'+refDate.isoformat() + '.csv','w') 391 | print >> outFile, output 392 | outFile.close() 393 | 394 | #SAVE FUTURES PRICES TO FUTURES PRICE TIME SERIES DB 395 | _FUT = dict() 396 | # LOAD DATABASE FROM FILE IF IT EXISTS 397 | if os.path.isfile(futDbFileName): 398 | dbfile = open(futDbFileName) 399 | _FUT = pickle.load(dbfile) 400 | dbfile.close() 401 | #SAVE PRICES TO HASH TABLE 402 | for code in FUTURES.keys(): 403 | if not _FUT.has_key(code): _FUT[code] = dict() 404 | for year in FUTURES[code].keys(): 405 | if not _FUT[code].has_key(year): _FUT[code][year] = dict() 406 | for month in FUTURES[code][year].keys(): 407 | if not _FUT[code][year].has_key(month): 408 | _FUT[code][year][month] = TimeSeries() 409 | _FUT[code][year][month].Update(refDate,FUTURES[code][year][month]) 410 | #SAVE HASH DB TO FILE 411 | dbfile = open(futDbFileName,'w') 412 | pickle.dump(_FUT,dbfile) 413 | dbfile.close() 414 | 415 | 416 | #PRINT VOL SURFACE DATA TO FILE FOR TEST 417 | output = 'Code,Year,Month,Future' 418 | for j in range(len(skews)): 419 | output += ',' + str(skews[j]) 420 | #COPY OUTPUT HEADER TO NORMAL VOLS OUTPUT 421 | n_output = output 422 | for code in sorted(SMILES.keys()): 423 | for year in sorted(SMILES[code].keys()): 424 | for month in sorted(SMILES[code][year].keys()): 425 | output += '\n' + code + ',' + str(year) + ',' + str(month) 426 | n_output += '\n' + code + ',' + str(year) + ',' + str(month) 427 | output += ',' + str(FUTURES[code][year][month]['Close']) 428 | n_output += ',' + str(FUTURES[code][year][month]['Close']) 429 | for vol in SMILES[code][year][month]: 430 | output += ',' + str(round(vol*100,2)) 431 | for vol in NSMILES[code][year][month]: 432 | n_output += ',' + str(round(vol*1,2)) 433 | 434 | outFile = open(out_file_path + '/' + 'mktdata_vols_'+refDate.isoformat() + '.csv','w') 435 | print >> outFile, output 436 | outFile.close() 437 | 438 | outFile = open(out_file_path + '/' + 'mktdata_normal_vols_'+refDate.isoformat() + '.csv','w') 439 | print >> outFile, n_output 440 | outFile.close() 441 | 442 | #SAVE LOGNORMAL VOLS TO VOL SURFACE TIME SERIES DB 443 | _VOLS = dict() 444 | # LOAD DATABASE FROM FILE IF IT EXISTS 445 | if os.path.isfile(optDbFileName): 446 | dbfile = open(optDbFileName) 447 | _VOLS = pickle.load(dbfile) 448 | dbfile.close() 449 | #SAVE PRICES TO HASH TABLE 450 | for code in SMILES.keys(): 451 | if not _VOLS.has_key(code): _VOLS[code] = dict() 452 | for year in SMILES[code].keys(): 453 | if not _VOLS[code].has_key(year): _VOLS[code][year] = dict() 454 | for month in SMILES[code][year].keys(): 455 | if not _VOLS[code][year].has_key(month): 456 | _VOLS[code][year][month] = TimeSeries() 457 | _VOLS[code][year][month].Update(refDate,SMILES[code][year][month]) 458 | #SAVE HASH DB TO FILE 459 | dbfile = open(optDbFileName,'w') 460 | pickle.dump(_VOLS,dbfile) 461 | dbfile.close() 462 | 463 | #SAVE NORMAL VOLS TO VOL SURFACE TIME SERIES DB 464 | _VOLS = dict() 465 | # LOAD DATABASE FROM FILE IF IT EXISTS 466 | if os.path.isfile(noptDbFileName): 467 | dbfile = open(noptDbFileName) 468 | _VOLS = pickle.load(dbfile) 469 | dbfile.close() 470 | #SAVE PRICES TO HASH TABLE 471 | for code in NSMILES.keys(): 472 | if not _VOLS.has_key(code): _VOLS[code] = dict() 473 | for year in NSMILES[code].keys(): 474 | if not _VOLS[code].has_key(year): _VOLS[code][year] = dict() 475 | for month in NSMILES[code][year].keys(): 476 | if not _VOLS[code][year].has_key(month): 477 | _VOLS[code][year][month] = TimeSeries() 478 | _VOLS[code][year][month].Update(refDate,NSMILES[code][year][month]) 479 | #SAVE HASH DB TO FILE 480 | dbfile = open(noptDbFileName,'w') 481 | pickle.dump(_VOLS,dbfile) 482 | dbfile.close() 483 | 484 | #UPDATE DF CURVE DB 485 | dfCurveSeries = TimeSeries() 486 | if os.path.isfile(dfCurveFileName): 487 | dbfile = open(dfCurveFileName,'r') 488 | dfCurveSeries = pickle.load(dbfile) 489 | dbfile.close() 490 | dfCurveSeries.Update(refDate,dfCurve) 491 | dbfile = open(dfCurveFileName,'w') 492 | pickle.dump(dfCurveSeries,dbfile) 493 | dbfile.close() 494 | 495 | -------------------------------------------------------------------------------- /config/exchange_expiry_dates.csv: -------------------------------------------------------------------------------- 1 | ID,Exchange,Commodity,Year,Month,Contract,FutureTicker,OptionTicker,FutureExpiry,OptionExpiry 2 | 1,CBOT,C,2013,8,Q13,,,2013-08-14,2013-07-26 3 | 2,CBOT,C,2013,9,U13,,,2013-09-13,2013-08-23 4 | 3,CBOT,C,2013,10,V13,,,2013-10-11,2013-09-20 5 | 4,CBOT,C,2013,11,X13,,,2013-11-14,2013-10-25 6 | 5,CBOT,C,2013,12,Z13,,,2013-12-13,2013-11-22 7 | 6,CBOT,C,2014,1,F14,,,2014-01-14,2013-12-27 8 | 7,CBOT,C,2014,2,G14,,,2014-02-14,2014-01-24 9 | 8,CBOT,C,2014,3,H14,,,2014-03-14,2014-02-21 10 | 9,CBOT,C,2014,4,J14,,,2014-04-14,2014-03-21 11 | 10,CBOT,C,2014,5,K14,,,2014-05-14,2014-04-25 12 | 11,CBOT,C,2014,6,M14,,,2014-06-13,2014-05-23 13 | 12,CBOT,C,2014,7,N14,,,2014-07-14,2014-06-20 14 | 13,CBOT,C,2014,8,Q14,,,2014-08-14,2014-07-25 15 | 14,CBOT,C,2014,9,U14,,,2014-09-12,2014-08-22 16 | 15,CBOT,C,2014,10,V14,,,2014-10-14,2014-09-26 17 | 16,CBOT,C,2014,11,X14,,,2014-11-14,2014-10-24 18 | 17,CBOT,C,2014,12,Z14,,,2014-12-12,2014-11-21 19 | 18,CBOT,C,2015,1,F15,,,2015-01-14,2014-12-26 20 | 19,CBOT,C,2015,2,G15,,,2015-02-13,2015-01-23 21 | 20,CBOT,C,2015,3,H15,,,2015-03-13,2015-02-20 22 | 21,CBOT,C,2015,4,J15,,,2015-04-14,2015-03-27 23 | 22,CBOT,C,2015,5,K15,,,2015-05-14,2015-04-24 24 | 23,CBOT,C,2015,6,M15,,,2015-06-12,2015-05-22 25 | 24,CBOT,C,2015,7,N15,,,2015-07-14,2015-06-26 26 | 25,CBOT,C,2015,8,Q15,,,2015-08-14,2015-07-24 27 | 26,CBOT,C,2015,9,U15,,,2015-09-14,2015-08-21 28 | 27,CBOT,C,2015,10,V15,,,2015-10-14,2015-09-25 29 | 28,CBOT,C,2015,11,X15,,,2015-11-13,2015-10-23 30 | 29,CBOT,C,2015,12,Z15,,,2015-12-14,2015-11-20 31 | 30,CBOT,C,2016,1,F16,,,2016-01-14,2015-12-24 32 | 31,CBOT,C,2016,2,G16,,,2016-02-12,2016-01-22 33 | 32,CBOT,C,2016,3,H16,,,2016-03-14,2016-02-19 34 | 33,CBOT,C,2016,4,J16,,,2016-04-14,2016-03-25 35 | 34,CBOT,C,2016,5,K16,,,2016-05-13,2016-04-22 36 | 35,CBOT,C,2016,6,M16,,,2016-06-14,2016-05-20 37 | 36,CBOT,C,2016,7,N16,,,2016-07-14,2016-06-24 38 | 37,CBOT,C,2016,8,Q16,,,2016-08-12,2016-07-22 39 | 38,CBOT,C,2016,9,U16,,,2016-09-14,2016-08-26 40 | 39,CBOT,C,2016,10,V16,,,2016-10-14,2016-09-23 41 | 40,CBOT,C,2016,11,X16,,,2016-11-14,2016-10-21 42 | 41,CBOT,C,2016,12,Z16,,,2016-12-14,2016-11-25 43 | 42,CBOT,C,2017,1,F17,,,2017-01-13,2016-12-23 44 | 43,CBOT,C,2017,2,G17,,,2017-02-14,2017-01-27 45 | 44,CBOT,C,2017,3,H17,,,2017-03-14,2017-02-24 46 | 45,CBOT,C,2017,4,J17,,,2017-04-14,2017-03-24 47 | 46,CBOT,C,2017,5,K17,,,2017-05-12,2017-04-21 48 | 47,CBOT,C,2017,6,M17,,,2017-06-14,2017-05-26 49 | 48,CBOT,C,2017,7,N17,,,2017-07-14,2017-06-23 50 | 49,CBOT,C,2017,8,Q17,,,2017-08-14,2017-07-21 51 | 50,CBOT,C,2017,9,U17,,,2017-09-14,2017-08-25 52 | 51,CBOT,C,2017,10,V17,,,2017-10-13,2017-09-22 53 | 52,CBOT,C,2017,11,X17,,,2017-11-14,2017-10-27 54 | 53,CBOT,C,2017,12,Z17,,,2017-12-14,2017-11-24 55 | 54,CBOT,C,2018,1,F18,,,2018-01-12,2017-12-22 56 | 55,CBOT,C,2018,2,G18,,,2018-02-14,2018-01-26 57 | 56,CBOT,C,2018,3,H18,,,2018-03-14,2018-02-23 58 | 57,CBOT,C,2018,4,J18,,,2018-04-13,2018-03-23 59 | 58,CBOT,C,2018,5,K18,,,2018-05-14,2018-04-20 60 | 59,CBOT,C,2018,6,M18,,,2018-06-14,2018-05-25 61 | 60,CBOT,C,2018,7,N18,,,2018-07-13,2018-06-22 62 | 61,CBOT,C,2018,8,Q18,,,2018-08-14,2018-07-27 63 | 62,CBOT,C,2018,9,U18,,,2018-09-14,2018-08-24 64 | 63,CBOT,C,2018,10,V18,,,2018-10-12,2018-09-21 65 | 64,CBOT,C,2018,11,X18,,,2018-11-14,2018-10-26 66 | 65,CBOT,C,2018,12,Z18,,,2018-12-14,2018-11-23 67 | 66,CBOT,C,2019,1,F19,,,2019-01-14,2018-12-21 68 | 67,CBOT,C,2019,2,G19,,,2019-02-14,2019-01-25 69 | 68,CBOT,C,2019,3,H19,,,2019-03-14,2019-02-22 70 | 69,CBOT,C,2019,4,J19,,,2019-04-12,2019-03-22 71 | 70,CBOT,C,2019,5,K19,,,2019-05-14,2019-04-26 72 | 71,CBOT,C,2019,6,M19,,,2019-06-14,2019-05-24 73 | 72,CBOT,C,2019,7,N19,,,2019-07-12,2019-06-21 74 | 73,CBOT,C,2019,8,Q19,,,2019-08-14,2019-07-26 75 | 74,CBOT,C,2019,9,U19,,,2019-09-13,2019-08-23 76 | 75,CBOT,C,2019,10,V19,,,2019-10-11,2019-09-20 77 | 76,CBOT,C,2019,11,X19,,,2019-11-14,2019-10-25 78 | 77,CBOT,C,2019,12,Z19,,,2019-12-13,2019-11-22 79 | 78,CBOT,C,2020,1,F20,,,2020-01-14,2019-12-27 80 | 79,CBOT,C,2020,2,G20,,,2020-02-14,2020-01-24 81 | 80,CBOT,C,2020,3,H20,,,2020-03-13,2020-02-21 82 | 81,CBOT,C,2020,4,J20,,,2020-04-14,2020-03-27 83 | 82,CBOT,C,2020,5,K20,,,2020-05-14,2020-04-24 84 | 83,CBOT,C,2020,6,M20,,,2020-06-12,2020-05-22 85 | 84,CBOT,C,2020,7,N20,,,2020-07-14,2020-06-26 86 | 85,CBOT,C,2020,8,Q20,,,2020-08-14,2020-07-24 87 | 86,CBOT,C,2020,9,U20,,,2020-09-14,2020-08-21 88 | 87,CBOT,C,2020,10,V20,,,2020-10-14,2020-09-25 89 | 88,CBOT,C,2020,11,X20,,,2020-11-13,2020-10-23 90 | 89,CBOT,C,2020,12,Z20,,,2020-12-14,2020-11-20 91 | 90,CBOT,C,2021,1,F21,,,2021-01-14,2020-12-24 92 | 91,CBOT,C,2021,2,G21,,,2021-02-12,2021-01-22 93 | 92,CBOT,C,2021,3,H21,,,2021-03-12,2021-02-19 94 | 93,CBOT,C,2021,4,J21,,,2021-04-14,2021-03-26 95 | 94,CBOT,C,2021,5,K21,,,2021-05-14,2021-04-23 96 | 95,CBOT,C,2021,6,M21,,,2021-06-14,2021-05-21 97 | 96,CBOT,C,2021,7,N21,,,2021-07-14,2021-06-25 98 | 97,CBOT,C,2021,8,Q21,,,2021-08-13,2021-07-23 99 | 98,CBOT,C,2021,9,U21,,,2021-09-14,2021-08-27 100 | 99,CBOT,C,2021,10,V21,,,2021-10-14,2021-09-24 101 | 100,CBOT,C,2021,11,X21,,,2021-11-12,2021-10-22 102 | 101,CBOT,C,2021,12,Z21,,,2021-12-14,2021-11-26 103 | 102,CBOT,C,2022,1,F22,,,2022-01-14,2021-12-24 104 | 103,CBOT,C,2022,2,G22,,,2022-02-14,2022-01-21 105 | 104,CBOT,C,2022,3,H22,,,2022-03-14,2022-02-18 106 | 105,CBOT,C,2022,4,J22,,,2022-04-14,2022-03-25 107 | 106,CBOT,C,2022,5,K22,,,2022-05-13,2022-04-22 108 | 107,CBOT,C,2022,6,M22,,,2022-06-14,2022-05-20 109 | 108,CBOT,C,2022,7,N22,,,2022-07-14,2022-06-24 110 | 109,CBOT,C,2022,8,Q22,,,2022-08-12,2022-07-22 111 | 110,CBOT,C,2022,9,U22,,,2022-09-14,2022-08-26 112 | 111,CBOT,C,2022,10,V22,,,2022-10-14,2022-09-23 113 | 112,CBOT,C,2022,11,X22,,,2022-11-14,2022-10-21 114 | 113,CBOT,C,2022,12,Z22,,,2022-12-14,2022-11-25 115 | 114,CBOT,C,2023,1,F23,,,2023-01-13,2022-12-23 116 | 115,CBOT,C,2023,2,G23,,,2023-02-14,2023-01-27 117 | 116,CBOT,C,2023,3,H23,,,2023-03-14,2023-02-24 118 | 117,CBOT,C,2023,4,J23,,,2023-04-14,2023-03-24 119 | 118,CBOT,C,2023,5,K23,,,2023-05-12,2023-04-21 120 | 119,CBOT,C,2023,6,M23,,,2023-06-14,2023-05-26 121 | 120,CBOT,C,2023,7,N23,,,2023-07-14,2023-06-23 122 | 121,CBOT,C,2023,8,Q23,,,2023-08-14,2023-07-21 123 | 122,CBOT,C,2023,9,U23,,,2023-09-14,2023-08-25 124 | 123,CBOT,C,2023,10,V23,,,2023-10-13,2023-09-22 125 | 124,CBOT,C,2023,11,X23,,,2023-11-14,2023-10-27 126 | 125,CBOT,C,2023,12,Z23,,,2023-12-14,2023-11-24 127 | 126,CBOT,S,2013,8,Q13,,,2013-08-14,2013-07-26 128 | 127,CBOT,S,2013,9,U13,,,2013-09-13,2013-08-23 129 | 128,CBOT,S,2013,10,V13,,,2013-10-11,2013-09-20 130 | 129,CBOT,S,2013,11,X13,,,2013-11-14,2013-10-25 131 | 130,CBOT,S,2013,12,Z13,,,2013-12-13,2013-11-22 132 | 131,CBOT,S,2014,1,F14,,,2014-01-14,2013-12-27 133 | 132,CBOT,S,2014,2,G14,,,2014-02-14,2014-01-24 134 | 133,CBOT,S,2014,3,H14,,,2014-03-14,2014-02-21 135 | 134,CBOT,S,2014,4,J14,,,2014-04-14,2014-03-21 136 | 135,CBOT,S,2014,5,K14,,,2014-05-14,2014-04-25 137 | 136,CBOT,S,2014,6,M14,,,2014-06-13,2014-05-23 138 | 137,CBOT,S,2014,7,N14,,,2014-07-14,2014-06-20 139 | 138,CBOT,S,2014,8,Q14,,,2014-08-14,2014-07-25 140 | 139,CBOT,S,2014,9,U14,,,2014-09-12,2014-08-22 141 | 140,CBOT,S,2014,10,V14,,,2014-10-14,2014-09-26 142 | 141,CBOT,S,2014,11,X14,,,2014-11-14,2014-10-24 143 | 142,CBOT,S,2014,12,Z14,,,2014-12-12,2014-11-21 144 | 143,CBOT,S,2015,1,F15,,,2015-01-14,2014-12-26 145 | 144,CBOT,S,2015,2,G15,,,2015-02-13,2015-01-23 146 | 145,CBOT,S,2015,3,H15,,,2015-03-13,2015-02-20 147 | 146,CBOT,S,2015,4,J15,,,2015-04-14,2015-03-27 148 | 147,CBOT,S,2015,5,K15,,,2015-05-14,2015-04-24 149 | 148,CBOT,S,2015,6,M15,,,2015-06-12,2015-05-22 150 | 149,CBOT,S,2015,7,N15,,,2015-07-14,2015-06-26 151 | 150,CBOT,S,2015,8,Q15,,,2015-08-14,2015-07-24 152 | 151,CBOT,S,2015,9,U15,,,2015-09-14,2015-08-21 153 | 152,CBOT,S,2015,10,V15,,,2015-10-14,2015-09-25 154 | 153,CBOT,S,2015,11,X15,,,2015-11-13,2015-10-23 155 | 154,CBOT,S,2015,12,Z15,,,2015-12-14,2015-11-20 156 | 155,CBOT,S,2016,1,F16,,,2016-01-14,2015-12-24 157 | 156,CBOT,S,2016,2,G16,,,2016-02-12,2016-01-22 158 | 157,CBOT,S,2016,3,H16,,,2016-03-14,2016-02-19 159 | 158,CBOT,S,2016,4,J16,,,2016-04-14,2016-03-25 160 | 159,CBOT,S,2016,5,K16,,,2016-05-13,2016-04-22 161 | 160,CBOT,S,2016,6,M16,,,2016-06-14,2016-05-20 162 | 161,CBOT,S,2016,7,N16,,,2016-07-14,2016-06-24 163 | 162,CBOT,S,2016,8,Q16,,,2016-08-12,2016-07-22 164 | 163,CBOT,S,2016,9,U16,,,2016-09-14,2016-08-26 165 | 164,CBOT,S,2016,10,V16,,,2016-10-14,2016-09-23 166 | 165,CBOT,S,2016,11,X16,,,2016-11-14,2016-10-21 167 | 166,CBOT,S,2016,12,Z16,,,2016-12-14,2016-11-25 168 | 167,CBOT,S,2017,1,F17,,,2017-01-13,2016-12-23 169 | 168,CBOT,S,2017,2,G17,,,2017-02-14,2017-01-27 170 | 169,CBOT,S,2017,3,H17,,,2017-03-14,2017-02-24 171 | 170,CBOT,S,2017,4,J17,,,2017-04-14,2017-03-24 172 | 171,CBOT,S,2017,5,K17,,,2017-05-12,2017-04-21 173 | 172,CBOT,S,2017,6,M17,,,2017-06-14,2017-05-26 174 | 173,CBOT,S,2017,7,N17,,,2017-07-14,2017-06-23 175 | 174,CBOT,S,2017,8,Q17,,,2017-08-14,2017-07-21 176 | 175,CBOT,S,2017,9,U17,,,2017-09-14,2017-08-25 177 | 176,CBOT,S,2017,10,V17,,,2017-10-13,2017-09-22 178 | 177,CBOT,S,2017,11,X17,,,2017-11-14,2017-10-27 179 | 178,CBOT,S,2017,12,Z17,,,2017-12-14,2017-11-24 180 | 179,CBOT,S,2018,1,F18,,,2018-01-12,2017-12-22 181 | 180,CBOT,S,2018,2,G18,,,2018-02-14,2018-01-26 182 | 181,CBOT,S,2018,3,H18,,,2018-03-14,2018-02-23 183 | 182,CBOT,S,2018,4,J18,,,2018-04-13,2018-03-23 184 | 183,CBOT,S,2018,5,K18,,,2018-05-14,2018-04-20 185 | 184,CBOT,S,2018,6,M18,,,2018-06-14,2018-05-25 186 | 185,CBOT,S,2018,7,N18,,,2018-07-13,2018-06-22 187 | 186,CBOT,S,2018,8,Q18,,,2018-08-14,2018-07-27 188 | 187,CBOT,S,2018,9,U18,,,2018-09-14,2018-08-24 189 | 188,CBOT,S,2018,10,V18,,,2018-10-12,2018-09-21 190 | 189,CBOT,S,2018,11,X18,,,2018-11-14,2018-10-26 191 | 190,CBOT,S,2018,12,Z18,,,2018-12-14,2018-11-23 192 | 191,CBOT,S,2019,1,F19,,,2019-01-14,2018-12-21 193 | 192,CBOT,S,2019,2,G19,,,2019-02-14,2019-01-25 194 | 193,CBOT,S,2019,3,H19,,,2019-03-14,2019-02-22 195 | 194,CBOT,S,2019,4,J19,,,2019-04-12,2019-03-22 196 | 195,CBOT,S,2019,5,K19,,,2019-05-14,2019-04-26 197 | 196,CBOT,S,2019,6,M19,,,2019-06-14,2019-05-24 198 | 197,CBOT,S,2019,7,N19,,,2019-07-12,2019-06-21 199 | 198,CBOT,S,2019,8,Q19,,,2019-08-14,2019-07-26 200 | 199,CBOT,S,2019,9,U19,,,2019-09-13,2019-08-23 201 | 200,CBOT,S,2019,10,V19,,,2019-10-11,2019-09-20 202 | 201,CBOT,S,2019,11,X19,,,2019-11-14,2019-10-25 203 | 202,CBOT,S,2019,12,Z19,,,2019-12-13,2019-11-22 204 | 203,CBOT,S,2020,1,F20,,,2020-01-14,2019-12-27 205 | 204,CBOT,S,2020,2,G20,,,2020-02-14,2020-01-24 206 | 205,CBOT,S,2020,3,H20,,,2020-03-13,2020-02-21 207 | 206,CBOT,S,2020,4,J20,,,2020-04-14,2020-03-27 208 | 207,CBOT,S,2020,5,K20,,,2020-05-14,2020-04-24 209 | 208,CBOT,S,2020,6,M20,,,2020-06-12,2020-05-22 210 | 209,CBOT,S,2020,7,N20,,,2020-07-14,2020-06-26 211 | 210,CBOT,S,2020,8,Q20,,,2020-08-14,2020-07-24 212 | 211,CBOT,S,2020,9,U20,,,2020-09-14,2020-08-21 213 | 212,CBOT,S,2020,10,V20,,,2020-10-14,2020-09-25 214 | 213,CBOT,S,2020,11,X20,,,2020-11-13,2020-10-23 215 | 214,CBOT,S,2020,12,Z20,,,2020-12-14,2020-11-20 216 | 215,CBOT,S,2021,1,F21,,,2021-01-14,2020-12-24 217 | 216,CBOT,S,2021,2,G21,,,2021-02-12,2021-01-22 218 | 217,CBOT,S,2021,3,H21,,,2021-03-12,2021-02-19 219 | 218,CBOT,S,2021,4,J21,,,2021-04-14,2021-03-26 220 | 219,CBOT,S,2021,5,K21,,,2021-05-14,2021-04-23 221 | 220,CBOT,S,2021,6,M21,,,2021-06-14,2021-05-21 222 | 221,CBOT,S,2021,7,N21,,,2021-07-14,2021-06-25 223 | 222,CBOT,S,2021,8,Q21,,,2021-08-13,2021-07-23 224 | 223,CBOT,S,2021,9,U21,,,2021-09-14,2021-08-27 225 | 224,CBOT,S,2021,10,V21,,,2021-10-14,2021-09-24 226 | 225,CBOT,S,2021,11,X21,,,2021-11-12,2021-10-22 227 | 226,CBOT,S,2021,12,Z21,,,2021-12-14,2021-11-26 228 | 227,CBOT,S,2022,1,F22,,,2022-01-14,2021-12-24 229 | 228,CBOT,S,2022,2,G22,,,2022-02-14,2022-01-21 230 | 229,CBOT,S,2022,3,H22,,,2022-03-14,2022-02-18 231 | 230,CBOT,S,2022,4,J22,,,2022-04-14,2022-03-25 232 | 231,CBOT,S,2022,5,K22,,,2022-05-13,2022-04-22 233 | 232,CBOT,S,2022,6,M22,,,2022-06-14,2022-05-20 234 | 233,CBOT,S,2022,7,N22,,,2022-07-14,2022-06-24 235 | 234,CBOT,S,2022,8,Q22,,,2022-08-12,2022-07-22 236 | 235,CBOT,S,2022,9,U22,,,2022-09-14,2022-08-26 237 | 236,CBOT,S,2022,10,V22,,,2022-10-14,2022-09-23 238 | 237,CBOT,S,2022,11,X22,,,2022-11-14,2022-10-21 239 | 238,CBOT,S,2022,12,Z22,,,2022-12-14,2022-11-25 240 | 239,CBOT,S,2023,1,F23,,,2023-01-13,2022-12-23 241 | 240,CBOT,S,2023,2,G23,,,2023-02-14,2023-01-27 242 | 241,CBOT,S,2023,3,H23,,,2023-03-14,2023-02-24 243 | 242,CBOT,S,2023,4,J23,,,2023-04-14,2023-03-24 244 | 243,CBOT,S,2023,5,K23,,,2023-05-12,2023-04-21 245 | 244,CBOT,S,2023,6,M23,,,2023-06-14,2023-05-26 246 | 245,CBOT,S,2023,7,N23,,,2023-07-14,2023-06-23 247 | 246,CBOT,S,2023,8,Q23,,,2023-08-14,2023-07-21 248 | 247,CBOT,S,2023,9,U23,,,2023-09-14,2023-08-25 249 | 248,CBOT,S,2023,10,V23,,,2023-10-13,2023-09-22 250 | 249,CBOT,S,2023,11,X23,,,2023-11-14,2023-10-27 251 | 250,CBOT,S,2023,12,Z23,,,2023-12-14,2023-11-24 252 | 251,CBOT,W,2013,8,Q13,,,2013-08-14,2013-07-26 253 | 252,CBOT,W,2013,9,U13,,,2013-09-13,2013-08-23 254 | 253,CBOT,W,2013,10,V13,,,2013-10-11,2013-09-20 255 | 254,CBOT,W,2013,11,X13,,,2013-11-14,2013-10-25 256 | 255,CBOT,W,2013,12,Z13,,,2013-12-13,2013-11-22 257 | 256,CBOT,W,2014,1,F14,,,2014-01-14,2013-12-27 258 | 257,CBOT,W,2014,2,G14,,,2014-02-14,2014-01-24 259 | 258,CBOT,W,2014,3,H14,,,2014-03-14,2014-02-21 260 | 259,CBOT,W,2014,4,J14,,,2014-04-14,2014-03-21 261 | 260,CBOT,W,2014,5,K14,,,2014-05-14,2014-04-25 262 | 261,CBOT,W,2014,6,M14,,,2014-06-13,2014-05-23 263 | 262,CBOT,W,2014,7,N14,,,2014-07-14,2014-06-20 264 | 263,CBOT,W,2014,8,Q14,,,2014-08-14,2014-07-25 265 | 264,CBOT,W,2014,9,U14,,,2014-09-12,2014-08-22 266 | 265,CBOT,W,2014,10,V14,,,2014-10-14,2014-09-26 267 | 266,CBOT,W,2014,11,X14,,,2014-11-14,2014-10-24 268 | 267,CBOT,W,2014,12,Z14,,,2014-12-12,2014-11-21 269 | 268,CBOT,W,2015,1,F15,,,2015-01-14,2014-12-26 270 | 269,CBOT,W,2015,2,G15,,,2015-02-13,2015-01-23 271 | 270,CBOT,W,2015,3,H15,,,2015-03-13,2015-02-20 272 | 271,CBOT,W,2015,4,J15,,,2015-04-14,2015-03-27 273 | 272,CBOT,W,2015,5,K15,,,2015-05-14,2015-04-24 274 | 273,CBOT,W,2015,6,M15,,,2015-06-12,2015-05-22 275 | 274,CBOT,W,2015,7,N15,,,2015-07-14,2015-06-26 276 | 275,CBOT,W,2015,8,Q15,,,2015-08-14,2015-07-24 277 | 276,CBOT,W,2015,9,U15,,,2015-09-14,2015-08-21 278 | 277,CBOT,W,2015,10,V15,,,2015-10-14,2015-09-25 279 | 278,CBOT,W,2015,11,X15,,,2015-11-13,2015-10-23 280 | 279,CBOT,W,2015,12,Z15,,,2015-12-14,2015-11-20 281 | 280,CBOT,W,2016,1,F16,,,2016-01-14,2015-12-24 282 | 281,CBOT,W,2016,2,G16,,,2016-02-12,2016-01-22 283 | 282,CBOT,W,2016,3,H16,,,2016-03-14,2016-02-19 284 | 283,CBOT,W,2016,4,J16,,,2016-04-14,2016-03-25 285 | 284,CBOT,W,2016,5,K16,,,2016-05-13,2016-04-22 286 | 285,CBOT,W,2016,6,M16,,,2016-06-14,2016-05-20 287 | 286,CBOT,W,2016,7,N16,,,2016-07-14,2016-06-24 288 | 287,CBOT,W,2016,8,Q16,,,2016-08-12,2016-07-22 289 | 288,CBOT,W,2016,9,U16,,,2016-09-14,2016-08-26 290 | 289,CBOT,W,2016,10,V16,,,2016-10-14,2016-09-23 291 | 290,CBOT,W,2016,11,X16,,,2016-11-14,2016-10-21 292 | 291,CBOT,W,2016,12,Z16,,,2016-12-14,2016-11-25 293 | 292,CBOT,W,2017,1,F17,,,2017-01-13,2016-12-23 294 | 293,CBOT,W,2017,2,G17,,,2017-02-14,2017-01-27 295 | 294,CBOT,W,2017,3,H17,,,2017-03-14,2017-02-24 296 | 295,CBOT,W,2017,4,J17,,,2017-04-14,2017-03-24 297 | 296,CBOT,W,2017,5,K17,,,2017-05-12,2017-04-21 298 | 297,CBOT,W,2017,6,M17,,,2017-06-14,2017-05-26 299 | 298,CBOT,W,2017,7,N17,,,2017-07-14,2017-06-23 300 | 299,CBOT,W,2017,8,Q17,,,2017-08-14,2017-07-21 301 | 300,CBOT,W,2017,9,U17,,,2017-09-14,2017-08-25 302 | 301,CBOT,W,2017,10,V17,,,2017-10-13,2017-09-22 303 | 302,CBOT,W,2017,11,X17,,,2017-11-14,2017-10-27 304 | 303,CBOT,W,2017,12,Z17,,,2017-12-14,2017-11-24 305 | 304,CBOT,W,2018,1,F18,,,2018-01-12,2017-12-22 306 | 305,CBOT,W,2018,2,G18,,,2018-02-14,2018-01-26 307 | 306,CBOT,W,2018,3,H18,,,2018-03-14,2018-02-23 308 | 307,CBOT,W,2018,4,J18,,,2018-04-13,2018-03-23 309 | 308,CBOT,W,2018,5,K18,,,2018-05-14,2018-04-20 310 | 309,CBOT,W,2018,6,M18,,,2018-06-14,2018-05-25 311 | 310,CBOT,W,2018,7,N18,,,2018-07-13,2018-06-22 312 | 311,CBOT,W,2018,8,Q18,,,2018-08-14,2018-07-27 313 | 312,CBOT,W,2018,9,U18,,,2018-09-14,2018-08-24 314 | 313,CBOT,W,2018,10,V18,,,2018-10-12,2018-09-21 315 | 314,CBOT,W,2018,11,X18,,,2018-11-14,2018-10-26 316 | 315,CBOT,W,2018,12,Z18,,,2018-12-14,2018-11-23 317 | 316,CBOT,W,2019,1,F19,,,2019-01-14,2018-12-21 318 | 317,CBOT,W,2019,2,G19,,,2019-02-14,2019-01-25 319 | 318,CBOT,W,2019,3,H19,,,2019-03-14,2019-02-22 320 | 319,CBOT,W,2019,4,J19,,,2019-04-12,2019-03-22 321 | 320,CBOT,W,2019,5,K19,,,2019-05-14,2019-04-26 322 | 321,CBOT,W,2019,6,M19,,,2019-06-14,2019-05-24 323 | 322,CBOT,W,2019,7,N19,,,2019-07-12,2019-06-21 324 | 323,CBOT,W,2019,8,Q19,,,2019-08-14,2019-07-26 325 | 324,CBOT,W,2019,9,U19,,,2019-09-13,2019-08-23 326 | 325,CBOT,W,2019,10,V19,,,2019-10-11,2019-09-20 327 | 326,CBOT,W,2019,11,X19,,,2019-11-14,2019-10-25 328 | 327,CBOT,W,2019,12,Z19,,,2019-12-13,2019-11-22 329 | 328,CBOT,W,2020,1,F20,,,2020-01-14,2019-12-27 330 | 329,CBOT,W,2020,2,G20,,,2020-02-14,2020-01-24 331 | 330,CBOT,W,2020,3,H20,,,2020-03-13,2020-02-21 332 | 331,CBOT,W,2020,4,J20,,,2020-04-14,2020-03-27 333 | 332,CBOT,W,2020,5,K20,,,2020-05-14,2020-04-24 334 | 333,CBOT,W,2020,6,M20,,,2020-06-12,2020-05-22 335 | 334,CBOT,W,2020,7,N20,,,2020-07-14,2020-06-26 336 | 335,CBOT,W,2020,8,Q20,,,2020-08-14,2020-07-24 337 | 336,CBOT,W,2020,9,U20,,,2020-09-14,2020-08-21 338 | 337,CBOT,W,2020,10,V20,,,2020-10-14,2020-09-25 339 | 338,CBOT,W,2020,11,X20,,,2020-11-13,2020-10-23 340 | 339,CBOT,W,2020,12,Z20,,,2020-12-14,2020-11-20 341 | 340,CBOT,W,2021,1,F21,,,2021-01-14,2020-12-24 342 | 341,CBOT,W,2021,2,G21,,,2021-02-12,2021-01-22 343 | 342,CBOT,W,2021,3,H21,,,2021-03-12,2021-02-19 344 | 343,CBOT,W,2021,4,J21,,,2021-04-14,2021-03-26 345 | 344,CBOT,W,2021,5,K21,,,2021-05-14,2021-04-23 346 | 345,CBOT,W,2021,6,M21,,,2021-06-14,2021-05-21 347 | 346,CBOT,W,2021,7,N21,,,2021-07-14,2021-06-25 348 | 347,CBOT,W,2021,8,Q21,,,2021-08-13,2021-07-23 349 | 348,CBOT,W,2021,9,U21,,,2021-09-14,2021-08-27 350 | 349,CBOT,W,2021,10,V21,,,2021-10-14,2021-09-24 351 | 350,CBOT,W,2021,11,X21,,,2021-11-12,2021-10-22 352 | 351,CBOT,W,2021,12,Z21,,,2021-12-14,2021-11-26 353 | 352,CBOT,W,2022,1,F22,,,2022-01-14,2021-12-24 354 | 353,CBOT,W,2022,2,G22,,,2022-02-14,2022-01-21 355 | 354,CBOT,W,2022,3,H22,,,2022-03-14,2022-02-18 356 | 355,CBOT,W,2022,4,J22,,,2022-04-14,2022-03-25 357 | 356,CBOT,W,2022,5,K22,,,2022-05-13,2022-04-22 358 | 357,CBOT,W,2022,6,M22,,,2022-06-14,2022-05-20 359 | 358,CBOT,W,2022,7,N22,,,2022-07-14,2022-06-24 360 | 359,CBOT,W,2022,8,Q22,,,2022-08-12,2022-07-22 361 | 360,CBOT,W,2022,9,U22,,,2022-09-14,2022-08-26 362 | 361,CBOT,W,2022,10,V22,,,2022-10-14,2022-09-23 363 | 362,CBOT,W,2022,11,X22,,,2022-11-14,2022-10-21 364 | 363,CBOT,W,2022,12,Z22,,,2022-12-14,2022-11-25 365 | 364,CBOT,W,2023,1,F23,,,2023-01-13,2022-12-23 366 | 365,CBOT,W,2023,2,G23,,,2023-02-14,2023-01-27 367 | 366,CBOT,W,2023,3,H23,,,2023-03-14,2023-02-24 368 | 367,CBOT,W,2023,4,J23,,,2023-04-14,2023-03-24 369 | 368,CBOT,W,2023,5,K23,,,2023-05-12,2023-04-21 370 | 369,CBOT,W,2023,6,M23,,,2023-06-14,2023-05-26 371 | 370,CBOT,W,2023,7,N23,,,2023-07-14,2023-06-23 372 | 371,CBOT,W,2023,8,Q23,,,2023-08-14,2023-07-21 373 | 372,CBOT,W,2023,9,U23,,,2023-09-14,2023-08-25 374 | 373,CBOT,W,2023,10,V23,,,2023-10-13,2023-09-22 375 | 374,CBOT,W,2023,11,X23,,,2023-11-14,2023-10-27 376 | 375,CBOT,W,2023,12,Z23,,,2023-12-14,2023-11-24 377 | 376,CBOT,MW,2013,8,Q13,,,2013-08-14,2013-07-26 378 | 377,CBOT,MW,2013,9,U13,,,2013-09-13,2013-08-23 379 | 378,CBOT,MW,2013,10,V13,,,2013-10-11,2013-09-20 380 | 379,CBOT,MW,2013,11,X13,,,2013-11-14,2013-10-25 381 | 380,CBOT,MW,2013,12,Z13,,,2013-12-13,2013-11-22 382 | 381,CBOT,MW,2014,1,F14,,,2014-01-14,2013-12-27 383 | 382,CBOT,MW,2014,2,G14,,,2014-02-14,2014-01-24 384 | 383,CBOT,MW,2014,3,H14,,,2014-03-14,2014-02-21 385 | 384,CBOT,MW,2014,4,J14,,,2014-04-14,2014-03-21 386 | 385,CBOT,MW,2014,5,K14,,,2014-05-14,2014-04-25 387 | 386,CBOT,MW,2014,6,M14,,,2014-06-13,2014-05-23 388 | 387,CBOT,MW,2014,7,N14,,,2014-07-14,2014-06-20 389 | 388,CBOT,MW,2014,8,Q14,,,2014-08-14,2014-07-25 390 | 389,CBOT,MW,2014,9,U14,,,2014-09-12,2014-08-22 391 | 390,CBOT,MW,2014,10,V14,,,2014-10-14,2014-09-26 392 | 391,CBOT,MW,2014,11,X14,,,2014-11-14,2014-10-24 393 | 392,CBOT,MW,2014,12,Z14,,,2014-12-12,2014-11-21 394 | 393,CBOT,MW,2015,1,F15,,,2015-01-14,2014-12-26 395 | 394,CBOT,MW,2015,2,G15,,,2015-02-13,2015-01-23 396 | 395,CBOT,MW,2015,3,H15,,,2015-03-13,2015-02-20 397 | 396,CBOT,MW,2015,4,J15,,,2015-04-14,2015-03-27 398 | 397,CBOT,MW,2015,5,K15,,,2015-05-14,2015-04-24 399 | 398,CBOT,MW,2015,6,M15,,,2015-06-12,2015-05-22 400 | 399,CBOT,MW,2015,7,N15,,,2015-07-14,2015-06-26 401 | 400,CBOT,MW,2015,8,Q15,,,2015-08-14,2015-07-24 402 | 401,CBOT,MW,2015,9,U15,,,2015-09-14,2015-08-21 403 | 402,CBOT,MW,2015,10,V15,,,2015-10-14,2015-09-25 404 | 403,CBOT,MW,2015,11,X15,,,2015-11-13,2015-10-23 405 | 404,CBOT,MW,2015,12,Z15,,,2015-12-14,2015-11-20 406 | 405,CBOT,MW,2016,1,F16,,,2016-01-14,2015-12-24 407 | 406,CBOT,MW,2016,2,G16,,,2016-02-12,2016-01-22 408 | 407,CBOT,MW,2016,3,H16,,,2016-03-14,2016-02-19 409 | 408,CBOT,MW,2016,4,J16,,,2016-04-14,2016-03-25 410 | 409,CBOT,MW,2016,5,K16,,,2016-05-13,2016-04-22 411 | 410,CBOT,MW,2016,6,M16,,,2016-06-14,2016-05-20 412 | 411,CBOT,MW,2016,7,N16,,,2016-07-14,2016-06-24 413 | 412,CBOT,MW,2016,8,Q16,,,2016-08-12,2016-07-22 414 | 413,CBOT,MW,2016,9,U16,,,2016-09-14,2016-08-26 415 | 414,CBOT,MW,2016,10,V16,,,2016-10-14,2016-09-23 416 | 415,CBOT,MW,2016,11,X16,,,2016-11-14,2016-10-21 417 | 416,CBOT,MW,2016,12,Z16,,,2016-12-14,2016-11-25 418 | 417,CBOT,MW,2017,1,F17,,,2017-01-13,2016-12-23 419 | 418,CBOT,MW,2017,2,G17,,,2017-02-14,2017-01-27 420 | 419,CBOT,MW,2017,3,H17,,,2017-03-14,2017-02-24 421 | 420,CBOT,MW,2017,4,J17,,,2017-04-14,2017-03-24 422 | 421,CBOT,MW,2017,5,K17,,,2017-05-12,2017-04-21 423 | 422,CBOT,MW,2017,6,M17,,,2017-06-14,2017-05-26 424 | 423,CBOT,MW,2017,7,N17,,,2017-07-14,2017-06-23 425 | 424,CBOT,MW,2017,8,Q17,,,2017-08-14,2017-07-21 426 | 425,CBOT,MW,2017,9,U17,,,2017-09-14,2017-08-25 427 | 426,CBOT,MW,2017,10,V17,,,2017-10-13,2017-09-22 428 | 427,CBOT,MW,2017,11,X17,,,2017-11-14,2017-10-27 429 | 428,CBOT,MW,2017,12,Z17,,,2017-12-14,2017-11-24 430 | 429,CBOT,MW,2018,1,F18,,,2018-01-12,2017-12-22 431 | 430,CBOT,MW,2018,2,G18,,,2018-02-14,2018-01-26 432 | 431,CBOT,MW,2018,3,H18,,,2018-03-14,2018-02-23 433 | 432,CBOT,MW,2018,4,J18,,,2018-04-13,2018-03-23 434 | 433,CBOT,MW,2018,5,K18,,,2018-05-14,2018-04-20 435 | 434,CBOT,MW,2018,6,M18,,,2018-06-14,2018-05-25 436 | 435,CBOT,MW,2018,7,N18,,,2018-07-13,2018-06-22 437 | 436,CBOT,MW,2018,8,Q18,,,2018-08-14,2018-07-27 438 | 437,CBOT,MW,2018,9,U18,,,2018-09-14,2018-08-24 439 | 438,CBOT,MW,2018,10,V18,,,2018-10-12,2018-09-21 440 | 439,CBOT,MW,2018,11,X18,,,2018-11-14,2018-10-26 441 | 440,CBOT,MW,2018,12,Z18,,,2018-12-14,2018-11-23 442 | 441,CBOT,MW,2019,1,F19,,,2019-01-14,2018-12-21 443 | 442,CBOT,MW,2019,2,G19,,,2019-02-14,2019-01-25 444 | 443,CBOT,MW,2019,3,H19,,,2019-03-14,2019-02-22 445 | 444,CBOT,MW,2019,4,J19,,,2019-04-12,2019-03-22 446 | 445,CBOT,MW,2019,5,K19,,,2019-05-14,2019-04-26 447 | 446,CBOT,MW,2019,6,M19,,,2019-06-14,2019-05-24 448 | 447,CBOT,MW,2019,7,N19,,,2019-07-12,2019-06-21 449 | 448,CBOT,MW,2019,8,Q19,,,2019-08-14,2019-07-26 450 | 449,CBOT,MW,2019,9,U19,,,2019-09-13,2019-08-23 451 | 450,CBOT,MW,2019,10,V19,,,2019-10-11,2019-09-20 452 | 451,CBOT,MW,2019,11,X19,,,2019-11-14,2019-10-25 453 | 452,CBOT,MW,2019,12,Z19,,,2019-12-13,2019-11-22 454 | 453,CBOT,MW,2020,1,F20,,,2020-01-14,2019-12-27 455 | 454,CBOT,MW,2020,2,G20,,,2020-02-14,2020-01-24 456 | 455,CBOT,MW,2020,3,H20,,,2020-03-13,2020-02-21 457 | 456,CBOT,MW,2020,4,J20,,,2020-04-14,2020-03-27 458 | 457,CBOT,MW,2020,5,K20,,,2020-05-14,2020-04-24 459 | 458,CBOT,MW,2020,6,M20,,,2020-06-12,2020-05-22 460 | 459,CBOT,MW,2020,7,N20,,,2020-07-14,2020-06-26 461 | 460,CBOT,MW,2020,8,Q20,,,2020-08-14,2020-07-24 462 | 461,CBOT,MW,2020,9,U20,,,2020-09-14,2020-08-21 463 | 462,CBOT,MW,2020,10,V20,,,2020-10-14,2020-09-25 464 | 463,CBOT,MW,2020,11,X20,,,2020-11-13,2020-10-23 465 | 464,CBOT,MW,2020,12,Z20,,,2020-12-14,2020-11-20 466 | 465,CBOT,MW,2021,1,F21,,,2021-01-14,2020-12-24 467 | 466,CBOT,MW,2021,2,G21,,,2021-02-12,2021-01-22 468 | 467,CBOT,MW,2021,3,H21,,,2021-03-12,2021-02-19 469 | 468,CBOT,MW,2021,4,J21,,,2021-04-14,2021-03-26 470 | 469,CBOT,MW,2021,5,K21,,,2021-05-14,2021-04-23 471 | 470,CBOT,MW,2021,6,M21,,,2021-06-14,2021-05-21 472 | 471,CBOT,MW,2021,7,N21,,,2021-07-14,2021-06-25 473 | 472,CBOT,MW,2021,8,Q21,,,2021-08-13,2021-07-23 474 | 473,CBOT,MW,2021,9,U21,,,2021-09-14,2021-08-27 475 | 474,CBOT,MW,2021,10,V21,,,2021-10-14,2021-09-24 476 | 475,CBOT,MW,2021,11,X21,,,2021-11-12,2021-10-22 477 | 476,CBOT,MW,2021,12,Z21,,,2021-12-14,2021-11-26 478 | 477,CBOT,MW,2022,1,F22,,,2022-01-14,2021-12-24 479 | 478,CBOT,MW,2022,2,G22,,,2022-02-14,2022-01-21 480 | 479,CBOT,MW,2022,3,H22,,,2022-03-14,2022-02-18 481 | 480,CBOT,MW,2022,4,J22,,,2022-04-14,2022-03-25 482 | 481,CBOT,MW,2022,5,K22,,,2022-05-13,2022-04-22 483 | 482,CBOT,MW,2022,6,M22,,,2022-06-14,2022-05-20 484 | 483,CBOT,MW,2022,7,N22,,,2022-07-14,2022-06-24 485 | 484,CBOT,MW,2022,8,Q22,,,2022-08-12,2022-07-22 486 | 485,CBOT,MW,2022,9,U22,,,2022-09-14,2022-08-26 487 | 486,CBOT,MW,2022,10,V22,,,2022-10-14,2022-09-23 488 | 487,CBOT,MW,2022,11,X22,,,2022-11-14,2022-10-21 489 | 488,CBOT,MW,2022,12,Z22,,,2022-12-14,2022-11-25 490 | 489,CBOT,MW,2023,1,F23,,,2023-01-13,2022-12-23 491 | 490,CBOT,MW,2023,2,G23,,,2023-02-14,2023-01-27 492 | 491,CBOT,MW,2023,3,H23,,,2023-03-14,2023-02-24 493 | 492,CBOT,MW,2023,4,J23,,,2023-04-14,2023-03-24 494 | 493,CBOT,MW,2023,5,K23,,,2023-05-12,2023-04-21 495 | 494,CBOT,MW,2023,6,M23,,,2023-06-14,2023-05-26 496 | 495,CBOT,MW,2023,7,N23,,,2023-07-14,2023-06-23 497 | 496,CBOT,MW,2023,8,Q23,,,2023-08-14,2023-07-21 498 | 497,CBOT,MW,2023,9,U23,,,2023-09-14,2023-08-25 499 | 498,CBOT,MW,2023,10,V23,,,2023-10-13,2023-09-22 500 | 499,CBOT,MW,2023,11,X23,,,2023-11-14,2023-10-27 501 | 500,CBOT,MW,2023,12,Z23,,,2023-12-14,2023-11-24 502 | 501,CBOT,KW,2013,8,Q13,,,2013-08-14,2013-07-26 503 | 502,CBOT,KW,2013,9,U13,,,2013-09-13,2013-08-23 504 | 503,CBOT,KW,2013,10,V13,,,2013-10-11,2013-09-20 505 | 504,CBOT,KW,2013,11,X13,,,2013-11-14,2013-10-25 506 | 505,CBOT,KW,2013,12,Z13,,,2013-12-13,2013-11-22 507 | 506,CBOT,KW,2014,1,F14,,,2014-01-14,2013-12-27 508 | 507,CBOT,KW,2014,2,G14,,,2014-02-14,2014-01-24 509 | 508,CBOT,KW,2014,3,H14,,,2014-03-14,2014-02-21 510 | 509,CBOT,KW,2014,4,J14,,,2014-04-14,2014-03-21 511 | 510,CBOT,KW,2014,5,K14,,,2014-05-14,2014-04-25 512 | 511,CBOT,KW,2014,6,M14,,,2014-06-13,2014-05-23 513 | 512,CBOT,KW,2014,7,N14,,,2014-07-14,2014-06-20 514 | 513,CBOT,KW,2014,8,Q14,,,2014-08-14,2014-07-25 515 | 514,CBOT,KW,2014,9,U14,,,2014-09-12,2014-08-22 516 | 515,CBOT,KW,2014,10,V14,,,2014-10-14,2014-09-26 517 | 516,CBOT,KW,2014,11,X14,,,2014-11-14,2014-10-24 518 | 517,CBOT,KW,2014,12,Z14,,,2014-12-12,2014-11-21 519 | 518,CBOT,KW,2015,1,F15,,,2015-01-14,2014-12-26 520 | 519,CBOT,KW,2015,2,G15,,,2015-02-13,2015-01-23 521 | 520,CBOT,KW,2015,3,H15,,,2015-03-13,2015-02-20 522 | 521,CBOT,KW,2015,4,J15,,,2015-04-14,2015-03-27 523 | 522,CBOT,KW,2015,5,K15,,,2015-05-14,2015-04-24 524 | 523,CBOT,KW,2015,6,M15,,,2015-06-12,2015-05-22 525 | 524,CBOT,KW,2015,7,N15,,,2015-07-14,2015-06-26 526 | 525,CBOT,KW,2015,8,Q15,,,2015-08-14,2015-07-24 527 | 526,CBOT,KW,2015,9,U15,,,2015-09-14,2015-08-21 528 | 527,CBOT,KW,2015,10,V15,,,2015-10-14,2015-09-25 529 | 528,CBOT,KW,2015,11,X15,,,2015-11-13,2015-10-23 530 | 529,CBOT,KW,2015,12,Z15,,,2015-12-14,2015-11-20 531 | 530,CBOT,KW,2016,1,F16,,,2016-01-14,2015-12-24 532 | 531,CBOT,KW,2016,2,G16,,,2016-02-12,2016-01-22 533 | 532,CBOT,KW,2016,3,H16,,,2016-03-14,2016-02-19 534 | 533,CBOT,KW,2016,4,J16,,,2016-04-14,2016-03-25 535 | 534,CBOT,KW,2016,5,K16,,,2016-05-13,2016-04-22 536 | 535,CBOT,KW,2016,6,M16,,,2016-06-14,2016-05-20 537 | 536,CBOT,KW,2016,7,N16,,,2016-07-14,2016-06-24 538 | 537,CBOT,KW,2016,8,Q16,,,2016-08-12,2016-07-22 539 | 538,CBOT,KW,2016,9,U16,,,2016-09-14,2016-08-26 540 | 539,CBOT,KW,2016,10,V16,,,2016-10-14,2016-09-23 541 | 540,CBOT,KW,2016,11,X16,,,2016-11-14,2016-10-21 542 | 541,CBOT,KW,2016,12,Z16,,,2016-12-14,2016-11-25 543 | 542,CBOT,KW,2017,1,F17,,,2017-01-13,2016-12-23 544 | 543,CBOT,KW,2017,2,G17,,,2017-02-14,2017-01-27 545 | 544,CBOT,KW,2017,3,H17,,,2017-03-14,2017-02-24 546 | 545,CBOT,KW,2017,4,J17,,,2017-04-14,2017-03-24 547 | 546,CBOT,KW,2017,5,K17,,,2017-05-12,2017-04-21 548 | 547,CBOT,KW,2017,6,M17,,,2017-06-14,2017-05-26 549 | 548,CBOT,KW,2017,7,N17,,,2017-07-14,2017-06-23 550 | 549,CBOT,KW,2017,8,Q17,,,2017-08-14,2017-07-21 551 | 550,CBOT,KW,2017,9,U17,,,2017-09-14,2017-08-25 552 | 551,CBOT,KW,2017,10,V17,,,2017-10-13,2017-09-22 553 | 552,CBOT,KW,2017,11,X17,,,2017-11-14,2017-10-27 554 | 553,CBOT,KW,2017,12,Z17,,,2017-12-14,2017-11-24 555 | 554,CBOT,KW,2018,1,F18,,,2018-01-12,2017-12-22 556 | 555,CBOT,KW,2018,2,G18,,,2018-02-14,2018-01-26 557 | 556,CBOT,KW,2018,3,H18,,,2018-03-14,2018-02-23 558 | 557,CBOT,KW,2018,4,J18,,,2018-04-13,2018-03-23 559 | 558,CBOT,KW,2018,5,K18,,,2018-05-14,2018-04-20 560 | 559,CBOT,KW,2018,6,M18,,,2018-06-14,2018-05-25 561 | 560,CBOT,KW,2018,7,N18,,,2018-07-13,2018-06-22 562 | 561,CBOT,KW,2018,8,Q18,,,2018-08-14,2018-07-27 563 | 562,CBOT,KW,2018,9,U18,,,2018-09-14,2018-08-24 564 | 563,CBOT,KW,2018,10,V18,,,2018-10-12,2018-09-21 565 | 564,CBOT,KW,2018,11,X18,,,2018-11-14,2018-10-26 566 | 565,CBOT,KW,2018,12,Z18,,,2018-12-14,2018-11-23 567 | 566,CBOT,KW,2019,1,F19,,,2019-01-14,2018-12-21 568 | 567,CBOT,KW,2019,2,G19,,,2019-02-14,2019-01-25 569 | 568,CBOT,KW,2019,3,H19,,,2019-03-14,2019-02-22 570 | 569,CBOT,KW,2019,4,J19,,,2019-04-12,2019-03-22 571 | 570,CBOT,KW,2019,5,K19,,,2019-05-14,2019-04-26 572 | 571,CBOT,KW,2019,6,M19,,,2019-06-14,2019-05-24 573 | 572,CBOT,KW,2019,7,N19,,,2019-07-12,2019-06-21 574 | 573,CBOT,KW,2019,8,Q19,,,2019-08-14,2019-07-26 575 | 574,CBOT,KW,2019,9,U19,,,2019-09-13,2019-08-23 576 | 575,CBOT,KW,2019,10,V19,,,2019-10-11,2019-09-20 577 | 576,CBOT,KW,2019,11,X19,,,2019-11-14,2019-10-25 578 | 577,CBOT,KW,2019,12,Z19,,,2019-12-13,2019-11-22 579 | 578,CBOT,KW,2020,1,F20,,,2020-01-14,2019-12-27 580 | 579,CBOT,KW,2020,2,G20,,,2020-02-14,2020-01-24 581 | 580,CBOT,KW,2020,3,H20,,,2020-03-13,2020-02-21 582 | 581,CBOT,KW,2020,4,J20,,,2020-04-14,2020-03-27 583 | 582,CBOT,KW,2020,5,K20,,,2020-05-14,2020-04-24 584 | 583,CBOT,KW,2020,6,M20,,,2020-06-12,2020-05-22 585 | 584,CBOT,KW,2020,7,N20,,,2020-07-14,2020-06-26 586 | 585,CBOT,KW,2020,8,Q20,,,2020-08-14,2020-07-24 587 | 586,CBOT,KW,2020,9,U20,,,2020-09-14,2020-08-21 588 | 587,CBOT,KW,2020,10,V20,,,2020-10-14,2020-09-25 589 | 588,CBOT,KW,2020,11,X20,,,2020-11-13,2020-10-23 590 | 589,CBOT,KW,2020,12,Z20,,,2020-12-14,2020-11-20 591 | 590,CBOT,KW,2021,1,F21,,,2021-01-14,2020-12-24 592 | 591,CBOT,KW,2021,2,G21,,,2021-02-12,2021-01-22 593 | 592,CBOT,KW,2021,3,H21,,,2021-03-12,2021-02-19 594 | 593,CBOT,KW,2021,4,J21,,,2021-04-14,2021-03-26 595 | 594,CBOT,KW,2021,5,K21,,,2021-05-14,2021-04-23 596 | 595,CBOT,KW,2021,6,M21,,,2021-06-14,2021-05-21 597 | 596,CBOT,KW,2021,7,N21,,,2021-07-14,2021-06-25 598 | 597,CBOT,KW,2021,8,Q21,,,2021-08-13,2021-07-23 599 | 598,CBOT,KW,2021,9,U21,,,2021-09-14,2021-08-27 600 | 599,CBOT,KW,2021,10,V21,,,2021-10-14,2021-09-24 601 | 600,CBOT,KW,2021,11,X21,,,2021-11-12,2021-10-22 602 | 601,CBOT,KW,2021,12,Z21,,,2021-12-14,2021-11-26 603 | 602,CBOT,KW,2022,1,F22,,,2022-01-14,2021-12-24 604 | 603,CBOT,KW,2022,2,G22,,,2022-02-14,2022-01-21 605 | 604,CBOT,KW,2022,3,H22,,,2022-03-14,2022-02-18 606 | 605,CBOT,KW,2022,4,J22,,,2022-04-14,2022-03-25 607 | 606,CBOT,KW,2022,5,K22,,,2022-05-13,2022-04-22 608 | 607,CBOT,KW,2022,6,M22,,,2022-06-14,2022-05-20 609 | 608,CBOT,KW,2022,7,N22,,,2022-07-14,2022-06-24 610 | 609,CBOT,KW,2022,8,Q22,,,2022-08-12,2022-07-22 611 | 610,CBOT,KW,2022,9,U22,,,2022-09-14,2022-08-26 612 | 611,CBOT,KW,2022,10,V22,,,2022-10-14,2022-09-23 613 | 612,CBOT,KW,2022,11,X22,,,2022-11-14,2022-10-21 614 | 613,CBOT,KW,2022,12,Z22,,,2022-12-14,2022-11-25 615 | 614,CBOT,KW,2023,1,F23,,,2023-01-13,2022-12-23 616 | 615,CBOT,KW,2023,2,G23,,,2023-02-14,2023-01-27 617 | 616,CBOT,KW,2023,3,H23,,,2023-03-14,2023-02-24 618 | 617,CBOT,KW,2023,4,J23,,,2023-04-14,2023-03-24 619 | 618,CBOT,KW,2023,5,K23,,,2023-05-12,2023-04-21 620 | 619,CBOT,KW,2023,6,M23,,,2023-06-14,2023-05-26 621 | 620,CBOT,KW,2023,7,N23,,,2023-07-14,2023-06-23 622 | 621,CBOT,KW,2023,8,Q23,,,2023-08-14,2023-07-21 623 | 622,CBOT,KW,2023,9,U23,,,2023-09-14,2023-08-25 624 | 623,CBOT,KW,2023,10,V23,,,2023-10-13,2023-09-22 625 | 624,CBOT,KW,2023,11,X23,,,2023-11-14,2023-10-27 626 | 625,CBOT,KW,2023,12,Z23,,,2023-12-14,2023-11-24 627 | 626,CBOT,LH,2013,8,Q13,,,2013-08-14,2013-08-14 628 | 627,CBOT,LH,2013,9,U13,,,2013-09-16,2013-09-16 629 | 628,CBOT,LH,2013,10,V13,,,2013-10-15,2013-10-15 630 | 629,CBOT,LH,2013,11,X13,,,2013-11-15,2013-11-15 631 | 630,CBOT,LH,2013,12,Z13,,,2013-12-13,2013-12-13 632 | 631,CBOT,LH,2014,1,F14,,,2014-01-15,2014-01-15 633 | 632,CBOT,LH,2014,2,G14,,,2014-02-14,2014-02-14 634 | 633,CBOT,LH,2014,3,H14,,,2014-03-14,2014-03-14 635 | 634,CBOT,LH,2014,4,J14,,,2014-04-14,2014-04-14 636 | 635,CBOT,LH,2014,5,K14,,,2014-05-14,2014-05-14 637 | 636,CBOT,LH,2014,6,M14,,,2014-06-13,2014-06-13 638 | 637,CBOT,LH,2014,7,N14,,,2014-07-15,2014-07-15 639 | 638,CBOT,LH,2014,8,Q14,,,2014-08-14,2014-08-14 640 | 639,CBOT,LH,2014,9,U14,,,2014-09-15,2014-09-15 641 | 640,CBOT,LH,2014,10,V14,,,2014-10-15,2014-10-15 642 | 641,CBOT,LH,2014,11,X14,,,2014-11-17,2014-11-17 643 | 642,CBOT,LH,2014,12,Z14,,,2014-12-12,2014-12-12 644 | 643,CBOT,LH,2015,1,F15,,,2015-01-15,2015-01-15 645 | 644,CBOT,LH,2015,2,G15,,,2015-02-13,2015-02-13 646 | 645,CBOT,LH,2015,3,H15,,,2015-03-13,2015-03-13 647 | 646,CBOT,LH,2015,4,J15,,,2015-04-14,2015-04-14 648 | 647,CBOT,LH,2015,5,K15,,,2015-05-14,2015-05-14 649 | 648,CBOT,LH,2015,6,M15,,,2015-06-12,2015-06-12 650 | 649,CBOT,LH,2015,7,N15,,,2015-07-14,2015-07-14 651 | 650,CBOT,LH,2015,8,Q15,,,2015-08-14,2015-08-14 652 | 651,CBOT,LH,2015,9,U15,,,2015-09-15,2015-09-15 653 | 652,CBOT,LH,2015,10,V15,,,2015-10-15,2015-10-15 654 | 653,CBOT,LH,2015,11,X15,,,2015-11-16,2015-11-16 655 | 654,CBOT,LH,2015,12,Z15,,,2015-12-14,2015-12-14 656 | 655,CBOT,LH,2016,1,F16,,,2016-01-15,2016-01-15 657 | 656,CBOT,LH,2016,2,G16,,,2016-02-12,2016-02-12 658 | 657,CBOT,LH,2016,3,H16,,,2016-03-14,2016-03-14 659 | 658,CBOT,LH,2016,4,J16,,,2016-04-14,2016-04-14 660 | 659,CBOT,LH,2016,5,K16,,,2016-05-13,2016-05-13 661 | 660,CBOT,LH,2016,6,M16,,,2016-06-14,2016-06-14 662 | 661,CBOT,LH,2016,7,N16,,,2016-07-15,2016-07-15 663 | 662,CBOT,LH,2016,8,Q16,,,2016-08-12,2016-08-12 664 | 663,CBOT,LH,2016,9,U16,,,2016-09-15,2016-09-15 665 | 664,CBOT,LH,2016,10,V16,,,2016-10-17,2016-10-17 666 | 665,CBOT,LH,2016,11,X16,,,2016-11-15,2016-11-15 667 | 666,CBOT,LH,2016,12,Z16,,,2016-12-14,2016-12-14 668 | 667,CBOT,LH,2017,1,F17,,,2017-01-17,2017-01-17 669 | 668,CBOT,LH,2017,2,G17,,,2017-02-14,2017-02-14 670 | 669,CBOT,LH,2017,3,H17,,,2017-03-14,2017-03-14 671 | 670,CBOT,LH,2017,4,J17,,,2017-04-14,2017-04-14 672 | 671,CBOT,LH,2017,5,K17,,,2017-05-12,2017-05-12 673 | 672,CBOT,LH,2017,6,M17,,,2017-06-14,2017-06-14 674 | 673,CBOT,LH,2017,7,N17,,,2017-07-17,2017-07-17 675 | 674,CBOT,LH,2017,8,Q17,,,2017-08-14,2017-08-14 676 | 675,CBOT,LH,2017,9,U17,,,2017-09-15,2017-09-15 677 | 676,CBOT,LH,2017,10,V17,,,2017-10-16,2017-10-16 678 | 677,CBOT,LH,2017,11,X17,,,2017-11-14,2017-11-14 679 | 678,CBOT,LH,2017,12,Z17,,,2017-12-14,2017-12-14 680 | 679,CBOT,LH,2018,1,F18,,,2018-01-16,2018-01-16 681 | 680,CBOT,LH,2018,2,G18,,,2018-02-14,2018-02-14 682 | 681,CBOT,LH,2018,3,H18,,,2018-03-14,2018-03-14 683 | 682,CBOT,LH,2018,4,J18,,,2018-04-13,2018-04-13 684 | 683,CBOT,LH,2018,5,K18,,,2018-05-14,2018-05-14 685 | 684,CBOT,LH,2018,6,M18,,,2018-06-14,2018-06-14 686 | 685,CBOT,LH,2018,7,N18,,,2018-07-16,2018-07-16 687 | 686,CBOT,LH,2018,8,Q18,,,2018-08-14,2018-08-14 688 | 687,CBOT,LH,2018,9,U18,,,2018-09-17,2018-09-17 689 | 688,CBOT,LH,2018,10,V18,,,2018-10-15,2018-10-15 690 | 689,CBOT,LH,2018,11,X18,,,2018-11-15,2018-11-15 691 | 690,CBOT,LH,2018,12,Z18,,,2018-12-14,2018-12-14 692 | 691,CBOT,LH,2019,1,F19,,,2019-01-15,2019-01-15 693 | 692,CBOT,LH,2019,2,G19,,,2019-02-14,2019-02-14 694 | 693,CBOT,LH,2019,3,H19,,,2019-03-14,2019-03-14 695 | 694,CBOT,LH,2019,4,J19,,,2019-04-12,2019-04-12 696 | 695,CBOT,LH,2019,5,K19,,,2019-05-14,2019-05-14 697 | 696,CBOT,LH,2019,6,M19,,,2019-06-14,2019-06-14 698 | 697,CBOT,LH,2019,7,N19,,,2019-07-15,2019-07-15 699 | 698,CBOT,LH,2019,8,Q19,,,2019-08-14,2019-08-14 700 | 699,CBOT,LH,2019,9,U19,,,2019-09-16,2019-09-16 701 | 700,CBOT,LH,2019,10,V19,,,2019-10-15,2019-10-15 702 | 701,CBOT,LH,2019,11,X19,,,2019-11-15,2019-11-15 703 | 702,CBOT,LH,2019,12,Z19,,,2019-12-13,2019-12-13 704 | 703,CBOT,LH,2020,1,F20,,,2020-01-15,2020-01-15 705 | 704,CBOT,LH,2020,2,G20,,,2020-02-14,2020-02-14 706 | 705,CBOT,LH,2020,3,H20,,,2020-03-13,2020-03-13 707 | 706,CBOT,LH,2020,4,J20,,,2020-04-14,2020-04-14 708 | 707,CBOT,LH,2020,5,K20,,,2020-05-14,2020-05-14 709 | 708,CBOT,LH,2020,6,M20,,,2020-06-12,2020-06-12 710 | 709,CBOT,LH,2020,7,N20,,,2020-07-14,2020-07-14 711 | 710,CBOT,LH,2020,8,Q20,,,2020-08-14,2020-08-14 712 | 711,CBOT,LH,2020,9,U20,,,2020-09-15,2020-09-15 713 | 712,CBOT,LH,2020,10,V20,,,2020-10-15,2020-10-15 714 | 713,CBOT,LH,2020,11,X20,,,2020-11-16,2020-11-16 715 | 714,CBOT,LH,2020,12,Z20,,,2020-12-14,2020-12-14 716 | 715,CBOT,LH,2021,1,F21,,,2021-01-15,2021-01-15 717 | 716,CBOT,LH,2021,2,G21,,,2021-02-12,2021-02-12 718 | 717,CBOT,LH,2021,3,H21,,,2021-03-12,2021-03-12 719 | 718,CBOT,LH,2021,4,J21,,,2021-04-14,2021-04-14 720 | 719,CBOT,LH,2021,5,K21,,,2021-05-14,2021-05-14 721 | 720,CBOT,LH,2021,6,M21,,,2021-06-14,2021-06-14 722 | 721,CBOT,LH,2021,7,N21,,,2021-07-15,2021-07-15 723 | 722,CBOT,LH,2021,8,Q21,,,2021-08-13,2021-08-13 724 | 723,CBOT,LH,2021,9,U21,,,2021-09-15,2021-09-15 725 | 724,CBOT,LH,2021,10,V21,,,2021-10-15,2021-10-15 726 | 725,CBOT,LH,2021,11,X21,,,2021-11-15,2021-11-15 727 | 726,CBOT,LH,2021,12,Z21,,,2021-12-14,2021-12-14 728 | 727,CBOT,LH,2022,1,F22,,,2022-01-14,2022-01-14 729 | 728,CBOT,LH,2022,2,G22,,,2022-02-14,2022-02-14 730 | 729,CBOT,LH,2022,3,H22,,,2022-03-14,2022-03-14 731 | 730,CBOT,LH,2022,4,J22,,,2022-04-14,2022-04-14 732 | 731,CBOT,LH,2022,5,K22,,,2022-05-13,2022-05-13 733 | 732,CBOT,LH,2022,6,M22,,,2022-06-14,2022-06-14 734 | 733,CBOT,LH,2022,7,N22,,,2022-07-15,2022-07-15 735 | 734,CBOT,LH,2022,8,Q22,,,2022-08-12,2022-08-12 736 | 735,CBOT,LH,2022,9,U22,,,2022-09-15,2022-09-15 737 | 736,CBOT,LH,2022,10,V22,,,2022-10-17,2022-10-17 738 | 737,CBOT,LH,2022,11,X22,,,2022-11-15,2022-11-15 739 | 738,CBOT,LH,2022,12,Z22,,,2022-12-14,2022-12-14 740 | 739,CBOT,LH,2023,1,F23,,,2023-01-17,2023-01-17 741 | 740,CBOT,LH,2023,2,G23,,,2023-02-14,2023-02-14 742 | 741,CBOT,LH,2023,3,H23,,,2023-03-14,2023-03-14 743 | 742,CBOT,LH,2023,4,J23,,,2023-04-14,2023-04-14 744 | 743,CBOT,LH,2023,5,K23,,,2023-05-12,2023-05-12 745 | 744,CBOT,LH,2023,6,M23,,,2023-06-14,2023-06-14 746 | 745,CBOT,LH,2023,7,N23,,,2023-07-17,2023-07-17 747 | 746,CBOT,LH,2023,8,Q23,,,2023-08-14,2023-08-14 748 | 747,CBOT,LH,2023,9,U23,,,2023-09-15,2023-09-15 749 | 748,CBOT,LH,2023,10,V23,,,2023-10-16,2023-10-16 750 | 749,CBOT,LH,2023,11,X23,,,2023-11-14,2023-11-14 751 | 750,CBOT,LH,2023,12,Z23,,,2023-12-14,2023-12-14 752 | 751,CBOT,BO,2013,8,Q13,,,2013-08-14,2013-07-26 753 | 752,CBOT,BO,2013,9,U13,,,2013-09-13,2013-08-23 754 | 753,CBOT,BO,2013,10,V13,,,2013-10-11,2013-09-20 755 | 754,CBOT,BO,2013,11,X13,,,2013-11-14,2013-10-25 756 | 755,CBOT,BO,2013,12,Z13,,,2013-12-13,2013-11-22 757 | 756,CBOT,BO,2014,1,F14,,,2014-01-14,2013-12-27 758 | 757,CBOT,BO,2014,2,G14,,,2014-02-14,2014-01-24 759 | 758,CBOT,BO,2014,3,H14,,,2014-03-14,2014-02-21 760 | 759,CBOT,BO,2014,4,J14,,,2014-04-14,2014-03-21 761 | 760,CBOT,BO,2014,5,K14,,,2014-05-14,2014-04-25 762 | 761,CBOT,BO,2014,6,M14,,,2014-06-13,2014-05-23 763 | 762,CBOT,BO,2014,7,N14,,,2014-07-14,2014-06-20 764 | 763,CBOT,BO,2014,8,Q14,,,2014-08-14,2014-07-25 765 | 764,CBOT,BO,2014,9,U14,,,2014-09-12,2014-08-22 766 | 765,CBOT,BO,2014,10,V14,,,2014-10-14,2014-09-26 767 | 766,CBOT,BO,2014,11,X14,,,2014-11-14,2014-10-24 768 | 767,CBOT,BO,2014,12,Z14,,,2014-12-12,2014-11-21 769 | 768,CBOT,BO,2015,1,F15,,,2015-01-14,2014-12-26 770 | 769,CBOT,BO,2015,2,G15,,,2015-02-13,2015-01-23 771 | 770,CBOT,BO,2015,3,H15,,,2015-03-13,2015-02-20 772 | 771,CBOT,BO,2015,4,J15,,,2015-04-14,2015-03-27 773 | 772,CBOT,BO,2015,5,K15,,,2015-05-14,2015-04-24 774 | 773,CBOT,BO,2015,6,M15,,,2015-06-12,2015-05-22 775 | 774,CBOT,BO,2015,7,N15,,,2015-07-14,2015-06-26 776 | 775,CBOT,BO,2015,8,Q15,,,2015-08-14,2015-07-24 777 | 776,CBOT,BO,2015,9,U15,,,2015-09-14,2015-08-21 778 | 777,CBOT,BO,2015,10,V15,,,2015-10-14,2015-09-25 779 | 778,CBOT,BO,2015,11,X15,,,2015-11-13,2015-10-23 780 | 779,CBOT,BO,2015,12,Z15,,,2015-12-14,2015-11-20 781 | 780,CBOT,BO,2016,1,F16,,,2016-01-14,2015-12-24 782 | 781,CBOT,BO,2016,2,G16,,,2016-02-12,2016-01-22 783 | 782,CBOT,BO,2016,3,H16,,,2016-03-14,2016-02-19 784 | 783,CBOT,BO,2016,4,J16,,,2016-04-14,2016-03-25 785 | 784,CBOT,BO,2016,5,K16,,,2016-05-13,2016-04-22 786 | 785,CBOT,BO,2016,6,M16,,,2016-06-14,2016-05-20 787 | 786,CBOT,BO,2016,7,N16,,,2016-07-14,2016-06-24 788 | 787,CBOT,BO,2016,8,Q16,,,2016-08-12,2016-07-22 789 | 788,CBOT,BO,2016,9,U16,,,2016-09-14,2016-08-26 790 | 789,CBOT,BO,2016,10,V16,,,2016-10-14,2016-09-23 791 | 790,CBOT,BO,2016,11,X16,,,2016-11-14,2016-10-21 792 | 791,CBOT,BO,2016,12,Z16,,,2016-12-14,2016-11-25 793 | 792,CBOT,BO,2017,1,F17,,,2017-01-13,2016-12-23 794 | 793,CBOT,BO,2017,2,G17,,,2017-02-14,2017-01-27 795 | 794,CBOT,BO,2017,3,H17,,,2017-03-14,2017-02-24 796 | 795,CBOT,BO,2017,4,J17,,,2017-04-14,2017-03-24 797 | 796,CBOT,BO,2017,5,K17,,,2017-05-12,2017-04-21 798 | 797,CBOT,BO,2017,6,M17,,,2017-06-14,2017-05-26 799 | 798,CBOT,BO,2017,7,N17,,,2017-07-14,2017-06-23 800 | 799,CBOT,BO,2017,8,Q17,,,2017-08-14,2017-07-21 801 | 800,CBOT,BO,2017,9,U17,,,2017-09-14,2017-08-25 802 | 801,CBOT,BO,2017,10,V17,,,2017-10-13,2017-09-22 803 | 802,CBOT,BO,2017,11,X17,,,2017-11-14,2017-10-27 804 | 803,CBOT,BO,2017,12,Z17,,,2017-12-14,2017-11-24 805 | 804,CBOT,BO,2018,1,F18,,,2018-01-12,2017-12-22 806 | 805,CBOT,BO,2018,2,G18,,,2018-02-14,2018-01-26 807 | 806,CBOT,BO,2018,3,H18,,,2018-03-14,2018-02-23 808 | 807,CBOT,BO,2018,4,J18,,,2018-04-13,2018-03-23 809 | 808,CBOT,BO,2018,5,K18,,,2018-05-14,2018-04-20 810 | 809,CBOT,BO,2018,6,M18,,,2018-06-14,2018-05-25 811 | 810,CBOT,BO,2018,7,N18,,,2018-07-13,2018-06-22 812 | 811,CBOT,BO,2018,8,Q18,,,2018-08-14,2018-07-27 813 | 812,CBOT,BO,2018,9,U18,,,2018-09-14,2018-08-24 814 | 813,CBOT,BO,2018,10,V18,,,2018-10-12,2018-09-21 815 | 814,CBOT,BO,2018,11,X18,,,2018-11-14,2018-10-26 816 | 815,CBOT,BO,2018,12,Z18,,,2018-12-14,2018-11-23 817 | 816,CBOT,BO,2019,1,F19,,,2019-01-14,2018-12-21 818 | 817,CBOT,BO,2019,2,G19,,,2019-02-14,2019-01-25 819 | 818,CBOT,BO,2019,3,H19,,,2019-03-14,2019-02-22 820 | 819,CBOT,BO,2019,4,J19,,,2019-04-12,2019-03-22 821 | 820,CBOT,BO,2019,5,K19,,,2019-05-14,2019-04-26 822 | 821,CBOT,BO,2019,6,M19,,,2019-06-14,2019-05-24 823 | 822,CBOT,BO,2019,7,N19,,,2019-07-12,2019-06-21 824 | 823,CBOT,BO,2019,8,Q19,,,2019-08-14,2019-07-26 825 | 824,CBOT,BO,2019,9,U19,,,2019-09-13,2019-08-23 826 | 825,CBOT,BO,2019,10,V19,,,2019-10-11,2019-09-20 827 | 826,CBOT,BO,2019,11,X19,,,2019-11-14,2019-10-25 828 | 827,CBOT,BO,2019,12,Z19,,,2019-12-13,2019-11-22 829 | 828,CBOT,BO,2020,1,F20,,,2020-01-14,2019-12-27 830 | 829,CBOT,BO,2020,2,G20,,,2020-02-14,2020-01-24 831 | 830,CBOT,BO,2020,3,H20,,,2020-03-13,2020-02-21 832 | 831,CBOT,BO,2020,4,J20,,,2020-04-14,2020-03-27 833 | 832,CBOT,BO,2020,5,K20,,,2020-05-14,2020-04-24 834 | 833,CBOT,BO,2020,6,M20,,,2020-06-12,2020-05-22 835 | 834,CBOT,BO,2020,7,N20,,,2020-07-14,2020-06-26 836 | 835,CBOT,BO,2020,8,Q20,,,2020-08-14,2020-07-24 837 | 836,CBOT,BO,2020,9,U20,,,2020-09-14,2020-08-21 838 | 837,CBOT,BO,2020,10,V20,,,2020-10-14,2020-09-25 839 | 838,CBOT,BO,2020,11,X20,,,2020-11-13,2020-10-23 840 | 839,CBOT,BO,2020,12,Z20,,,2020-12-14,2020-11-20 841 | 840,CBOT,BO,2021,1,F21,,,2021-01-14,2020-12-24 842 | 841,CBOT,BO,2021,2,G21,,,2021-02-12,2021-01-22 843 | 842,CBOT,BO,2021,3,H21,,,2021-03-12,2021-02-19 844 | 843,CBOT,BO,2021,4,J21,,,2021-04-14,2021-03-26 845 | 844,CBOT,BO,2021,5,K21,,,2021-05-14,2021-04-23 846 | 845,CBOT,BO,2021,6,M21,,,2021-06-14,2021-05-21 847 | 846,CBOT,BO,2021,7,N21,,,2021-07-14,2021-06-25 848 | 847,CBOT,BO,2021,8,Q21,,,2021-08-13,2021-07-23 849 | 848,CBOT,BO,2021,9,U21,,,2021-09-14,2021-08-27 850 | 849,CBOT,BO,2021,10,V21,,,2021-10-14,2021-09-24 851 | 850,CBOT,BO,2021,11,X21,,,2021-11-12,2021-10-22 852 | 851,CBOT,BO,2021,12,Z21,,,2021-12-14,2021-11-26 853 | 852,CBOT,BO,2022,1,F22,,,2022-01-14,2021-12-24 854 | 853,CBOT,BO,2022,2,G22,,,2022-02-14,2022-01-21 855 | 854,CBOT,BO,2022,3,H22,,,2022-03-14,2022-02-18 856 | 855,CBOT,BO,2022,4,J22,,,2022-04-14,2022-03-25 857 | 856,CBOT,BO,2022,5,K22,,,2022-05-13,2022-04-22 858 | 857,CBOT,BO,2022,6,M22,,,2022-06-14,2022-05-20 859 | 858,CBOT,BO,2022,7,N22,,,2022-07-14,2022-06-24 860 | 859,CBOT,BO,2022,8,Q22,,,2022-08-12,2022-07-22 861 | 860,CBOT,BO,2022,9,U22,,,2022-09-14,2022-08-26 862 | 861,CBOT,BO,2022,10,V22,,,2022-10-14,2022-09-23 863 | 862,CBOT,BO,2022,11,X22,,,2022-11-14,2022-10-21 864 | 863,CBOT,BO,2022,12,Z22,,,2022-12-14,2022-11-25 865 | 864,CBOT,BO,2023,1,F23,,,2023-01-13,2022-12-23 866 | 865,CBOT,BO,2023,2,G23,,,2023-02-14,2023-01-27 867 | 866,CBOT,BO,2023,3,H23,,,2023-03-14,2023-02-24 868 | 867,CBOT,BO,2023,4,J23,,,2023-04-14,2023-03-24 869 | 868,CBOT,BO,2023,5,K23,,,2023-05-12,2023-04-21 870 | 869,CBOT,BO,2023,6,M23,,,2023-06-14,2023-05-26 871 | 870,CBOT,BO,2023,7,N23,,,2023-07-14,2023-06-23 872 | 871,CBOT,BO,2023,8,Q23,,,2023-08-14,2023-07-21 873 | 872,CBOT,BO,2023,9,U23,,,2023-09-14,2023-08-25 874 | 873,CBOT,BO,2023,10,V23,,,2023-10-13,2023-09-22 875 | 874,CBOT,BO,2023,11,X23,,,2023-11-14,2023-10-27 876 | 875,CBOT,BO,2023,12,Z23,,,2023-12-14,2023-11-24 877 | 876,CBOT,SM,2013,8,Q13,,,2013-08-14,2013-07-26 878 | 877,CBOT,SM,2013,9,U13,,,2013-09-13,2013-08-23 879 | 878,CBOT,SM,2013,10,V13,,,2013-10-11,2013-09-20 880 | 879,CBOT,SM,2013,11,X13,,,2013-11-14,2013-10-25 881 | 880,CBOT,SM,2013,12,Z13,,,2013-12-13,2013-11-22 882 | 881,CBOT,SM,2014,1,F14,,,2014-01-14,2013-12-27 883 | 882,CBOT,SM,2014,2,G14,,,2014-02-14,2014-01-24 884 | 883,CBOT,SM,2014,3,H14,,,2014-03-14,2014-02-21 885 | 884,CBOT,SM,2014,4,J14,,,2014-04-14,2014-03-21 886 | 885,CBOT,SM,2014,5,K14,,,2014-05-14,2014-04-25 887 | 886,CBOT,SM,2014,6,M14,,,2014-06-13,2014-05-23 888 | 887,CBOT,SM,2014,7,N14,,,2014-07-14,2014-06-20 889 | 888,CBOT,SM,2014,8,Q14,,,2014-08-14,2014-07-25 890 | 889,CBOT,SM,2014,9,U14,,,2014-09-12,2014-08-22 891 | 890,CBOT,SM,2014,10,V14,,,2014-10-14,2014-09-26 892 | 891,CBOT,SM,2014,11,X14,,,2014-11-14,2014-10-24 893 | 892,CBOT,SM,2014,12,Z14,,,2014-12-12,2014-11-21 894 | 893,CBOT,SM,2015,1,F15,,,2015-01-14,2014-12-26 895 | 894,CBOT,SM,2015,2,G15,,,2015-02-13,2015-01-23 896 | 895,CBOT,SM,2015,3,H15,,,2015-03-13,2015-02-20 897 | 896,CBOT,SM,2015,4,J15,,,2015-04-14,2015-03-27 898 | 897,CBOT,SM,2015,5,K15,,,2015-05-14,2015-04-24 899 | 898,CBOT,SM,2015,6,M15,,,2015-06-12,2015-05-22 900 | 899,CBOT,SM,2015,7,N15,,,2015-07-14,2015-06-26 901 | 900,CBOT,SM,2015,8,Q15,,,2015-08-14,2015-07-24 902 | 901,CBOT,SM,2015,9,U15,,,2015-09-14,2015-08-21 903 | 902,CBOT,SM,2015,10,V15,,,2015-10-14,2015-09-25 904 | 903,CBOT,SM,2015,11,X15,,,2015-11-13,2015-10-23 905 | 904,CBOT,SM,2015,12,Z15,,,2015-12-14,2015-11-20 906 | 905,CBOT,SM,2016,1,F16,,,2016-01-14,2015-12-24 907 | 906,CBOT,SM,2016,2,G16,,,2016-02-12,2016-01-22 908 | 907,CBOT,SM,2016,3,H16,,,2016-03-14,2016-02-19 909 | 908,CBOT,SM,2016,4,J16,,,2016-04-14,2016-03-25 910 | 909,CBOT,SM,2016,5,K16,,,2016-05-13,2016-04-22 911 | 910,CBOT,SM,2016,6,M16,,,2016-06-14,2016-05-20 912 | 911,CBOT,SM,2016,7,N16,,,2016-07-14,2016-06-24 913 | 912,CBOT,SM,2016,8,Q16,,,2016-08-12,2016-07-22 914 | 913,CBOT,SM,2016,9,U16,,,2016-09-14,2016-08-26 915 | 914,CBOT,SM,2016,10,V16,,,2016-10-14,2016-09-23 916 | 915,CBOT,SM,2016,11,X16,,,2016-11-14,2016-10-21 917 | 916,CBOT,SM,2016,12,Z16,,,2016-12-14,2016-11-25 918 | 917,CBOT,SM,2017,1,F17,,,2017-01-13,2016-12-23 919 | 918,CBOT,SM,2017,2,G17,,,2017-02-14,2017-01-27 920 | 919,CBOT,SM,2017,3,H17,,,2017-03-14,2017-02-24 921 | 920,CBOT,SM,2017,4,J17,,,2017-04-14,2017-03-24 922 | 921,CBOT,SM,2017,5,K17,,,2017-05-12,2017-04-21 923 | 922,CBOT,SM,2017,6,M17,,,2017-06-14,2017-05-26 924 | 923,CBOT,SM,2017,7,N17,,,2017-07-14,2017-06-23 925 | 924,CBOT,SM,2017,8,Q17,,,2017-08-14,2017-07-21 926 | 925,CBOT,SM,2017,9,U17,,,2017-09-14,2017-08-25 927 | 926,CBOT,SM,2017,10,V17,,,2017-10-13,2017-09-22 928 | 927,CBOT,SM,2017,11,X17,,,2017-11-14,2017-10-27 929 | 928,CBOT,SM,2017,12,Z17,,,2017-12-14,2017-11-24 930 | 929,CBOT,SM,2018,1,F18,,,2018-01-12,2017-12-22 931 | 930,CBOT,SM,2018,2,G18,,,2018-02-14,2018-01-26 932 | 931,CBOT,SM,2018,3,H18,,,2018-03-14,2018-02-23 933 | 932,CBOT,SM,2018,4,J18,,,2018-04-13,2018-03-23 934 | 933,CBOT,SM,2018,5,K18,,,2018-05-14,2018-04-20 935 | 934,CBOT,SM,2018,6,M18,,,2018-06-14,2018-05-25 936 | 935,CBOT,SM,2018,7,N18,,,2018-07-13,2018-06-22 937 | 936,CBOT,SM,2018,8,Q18,,,2018-08-14,2018-07-27 938 | 937,CBOT,SM,2018,9,U18,,,2018-09-14,2018-08-24 939 | 938,CBOT,SM,2018,10,V18,,,2018-10-12,2018-09-21 940 | 939,CBOT,SM,2018,11,X18,,,2018-11-14,2018-10-26 941 | 940,CBOT,SM,2018,12,Z18,,,2018-12-14,2018-11-23 942 | 941,CBOT,SM,2019,1,F19,,,2019-01-14,2018-12-21 943 | 942,CBOT,SM,2019,2,G19,,,2019-02-14,2019-01-25 944 | 943,CBOT,SM,2019,3,H19,,,2019-03-14,2019-02-22 945 | 944,CBOT,SM,2019,4,J19,,,2019-04-12,2019-03-22 946 | 945,CBOT,SM,2019,5,K19,,,2019-05-14,2019-04-26 947 | 946,CBOT,SM,2019,6,M19,,,2019-06-14,2019-05-24 948 | 947,CBOT,SM,2019,7,N19,,,2019-07-12,2019-06-21 949 | 948,CBOT,SM,2019,8,Q19,,,2019-08-14,2019-07-26 950 | 949,CBOT,SM,2019,9,U19,,,2019-09-13,2019-08-23 951 | 950,CBOT,SM,2019,10,V19,,,2019-10-11,2019-09-20 952 | 951,CBOT,SM,2019,11,X19,,,2019-11-14,2019-10-25 953 | 952,CBOT,SM,2019,12,Z19,,,2019-12-13,2019-11-22 954 | 953,CBOT,SM,2020,1,F20,,,2020-01-14,2019-12-27 955 | 954,CBOT,SM,2020,2,G20,,,2020-02-14,2020-01-24 956 | 955,CBOT,SM,2020,3,H20,,,2020-03-13,2020-02-21 957 | 956,CBOT,SM,2020,4,J20,,,2020-04-14,2020-03-27 958 | 957,CBOT,SM,2020,5,K20,,,2020-05-14,2020-04-24 959 | 958,CBOT,SM,2020,6,M20,,,2020-06-12,2020-05-22 960 | 959,CBOT,SM,2020,7,N20,,,2020-07-14,2020-06-26 961 | 960,CBOT,SM,2020,8,Q20,,,2020-08-14,2020-07-24 962 | 961,CBOT,SM,2020,9,U20,,,2020-09-14,2020-08-21 963 | 962,CBOT,SM,2020,10,V20,,,2020-10-14,2020-09-25 964 | 963,CBOT,SM,2020,11,X20,,,2020-11-13,2020-10-23 965 | 964,CBOT,SM,2020,12,Z20,,,2020-12-14,2020-11-20 966 | 965,CBOT,SM,2021,1,F21,,,2021-01-14,2020-12-24 967 | 966,CBOT,SM,2021,2,G21,,,2021-02-12,2021-01-22 968 | 967,CBOT,SM,2021,3,H21,,,2021-03-12,2021-02-19 969 | 968,CBOT,SM,2021,4,J21,,,2021-04-14,2021-03-26 970 | 969,CBOT,SM,2021,5,K21,,,2021-05-14,2021-04-23 971 | 970,CBOT,SM,2021,6,M21,,,2021-06-14,2021-05-21 972 | 971,CBOT,SM,2021,7,N21,,,2021-07-14,2021-06-25 973 | 972,CBOT,SM,2021,8,Q21,,,2021-08-13,2021-07-23 974 | 973,CBOT,SM,2021,9,U21,,,2021-09-14,2021-08-27 975 | 974,CBOT,SM,2021,10,V21,,,2021-10-14,2021-09-24 976 | 975,CBOT,SM,2021,11,X21,,,2021-11-12,2021-10-22 977 | 976,CBOT,SM,2021,12,Z21,,,2021-12-14,2021-11-26 978 | 977,CBOT,SM,2022,1,F22,,,2022-01-14,2021-12-24 979 | 978,CBOT,SM,2022,2,G22,,,2022-02-14,2022-01-21 980 | 979,CBOT,SM,2022,3,H22,,,2022-03-14,2022-02-18 981 | 980,CBOT,SM,2022,4,J22,,,2022-04-14,2022-03-25 982 | 981,CBOT,SM,2022,5,K22,,,2022-05-13,2022-04-22 983 | 982,CBOT,SM,2022,6,M22,,,2022-06-14,2022-05-20 984 | 983,CBOT,SM,2022,7,N22,,,2022-07-14,2022-06-24 985 | 984,CBOT,SM,2022,8,Q22,,,2022-08-12,2022-07-22 986 | 985,CBOT,SM,2022,9,U22,,,2022-09-14,2022-08-26 987 | 986,CBOT,SM,2022,10,V22,,,2022-10-14,2022-09-23 988 | 987,CBOT,SM,2022,11,X22,,,2022-11-14,2022-10-21 989 | 988,CBOT,SM,2022,12,Z22,,,2022-12-14,2022-11-25 990 | 989,CBOT,SM,2023,1,F23,,,2023-01-13,2022-12-23 991 | 990,CBOT,SM,2023,2,G23,,,2023-02-14,2023-01-27 992 | 991,CBOT,SM,2023,3,H23,,,2023-03-14,2023-02-24 993 | 992,CBOT,SM,2023,4,J23,,,2023-04-14,2023-03-24 994 | 993,CBOT,SM,2023,5,K23,,,2023-05-12,2023-04-21 995 | 994,CBOT,SM,2023,6,M23,,,2023-06-14,2023-05-26 996 | 995,CBOT,SM,2023,7,N23,,,2023-07-14,2023-06-23 997 | 996,CBOT,SM,2023,8,Q23,,,2023-08-14,2023-07-21 998 | 997,CBOT,SM,2023,9,U23,,,2023-09-14,2023-08-25 999 | 998,CBOT,SM,2023,10,V23,,,2023-10-13,2023-09-22 1000 | 999,CBOT,SM,2023,11,X23,,,2023-11-14,2023-10-27 1001 | 1000,CBOT,SM,2023,12,Z23,,,2023-12-14,2023-11-24 1002 | 1001,NYMEX,CL,2013,8,Q13,,,2013-07-22,2013-07-17 1003 | 1002,NYMEX,CL,2013,9,U13,,,2013-08-20,2013-08-15 1004 | 1003,NYMEX,CL,2013,10,V13,,,2013-09-20,2013-09-17 1005 | 1004,NYMEX,CL,2013,11,X13,,,2013-10-22,2013-10-17 1006 | 1005,NYMEX,CL,2013,12,Z13,,,2013-11-20,2013-11-15 1007 | 1006,NYMEX,CL,2014,1,F14,,,2013-12-19,2013-12-16 1008 | 1007,NYMEX,CL,2014,2,G14,,,2014-01-21,2014-01-15 1009 | 1008,NYMEX,CL,2014,3,H14,,,2014-02-20,2014-02-14 1010 | 1009,NYMEX,CL,2014,4,J14,,,2014-03-20,2014-03-17 1011 | 1010,NYMEX,CL,2014,5,K14,,,2014-04-22,2014-04-17 1012 | 1011,NYMEX,CL,2014,6,M14,,,2014-05-20,2014-05-15 1013 | 1012,NYMEX,CL,2014,7,N14,,,2014-06-20,2014-06-17 1014 | 1013,NYMEX,CL,2014,8,Q14,,,2014-07-22,2014-07-17 1015 | 1014,NYMEX,CL,2014,9,U14,,,2014-08-20,2014-08-15 1016 | 1015,NYMEX,CL,2014,10,V14,,,2014-09-22,2014-09-17 1017 | 1016,NYMEX,CL,2014,11,X14,,,2014-10-21,2014-10-16 1018 | 1017,NYMEX,CL,2014,12,Z14,,,2014-11-20,2014-11-17 1019 | 1018,NYMEX,CL,2015,1,F15,,,2014-12-19,2014-12-16 1020 | 1019,NYMEX,CL,2015,2,G15,,,2015-01-20,2015-01-14 1021 | 1020,NYMEX,CL,2015,3,H15,,,2015-02-20,2015-02-17 1022 | 1021,NYMEX,CL,2015,4,J15,,,2015-03-20,2015-03-17 1023 | 1022,NYMEX,CL,2015,5,K15,,,2015-04-21,2015-04-16 1024 | 1023,NYMEX,CL,2015,6,M15,,,2015-05-19,2015-05-14 1025 | 1024,NYMEX,CL,2015,7,N15,,,2015-06-22,2015-06-17 1026 | 1025,NYMEX,CL,2015,8,Q15,,,2015-07-21,2015-07-16 1027 | 1026,NYMEX,CL,2015,9,U15,,,2015-08-20,2015-08-17 1028 | 1027,NYMEX,CL,2015,10,V15,,,2015-09-22,2015-09-17 1029 | 1028,NYMEX,CL,2015,11,X15,,,2015-10-20,2015-10-15 1030 | 1029,NYMEX,CL,2015,12,Z15,,,2015-11-20,2015-11-17 1031 | 1030,NYMEX,CL,2016,1,F16,,,2015-12-21,2015-12-16 1032 | 1031,NYMEX,CL,2016,2,G16,,,2016-01-20,2016-01-14 1033 | 1032,NYMEX,CL,2016,3,H16,,,2016-02-22,2016-02-17 1034 | 1033,NYMEX,CL,2016,4,J16,,,2016-03-22,2016-03-17 1035 | 1034,NYMEX,CL,2016,5,K16,,,2016-04-20,2016-04-15 1036 | 1035,NYMEX,CL,2016,6,M16,,,2016-05-20,2016-05-17 1037 | 1036,NYMEX,CL,2016,7,N16,,,2016-06-21,2016-06-16 1038 | 1037,NYMEX,CL,2016,8,Q16,,,2016-07-20,2016-07-15 1039 | 1038,NYMEX,CL,2016,9,U16,,,2016-08-22,2016-08-17 1040 | 1039,NYMEX,CL,2016,10,V16,,,2016-09-20,2016-09-15 1041 | 1040,NYMEX,CL,2016,11,X16,,,2016-10-20,2016-10-17 1042 | 1041,NYMEX,CL,2016,12,Z16,,,2016-11-21,2016-11-16 1043 | 1042,NYMEX,CL,2017,1,F17,,,2016-12-20,2016-12-15 1044 | 1043,NYMEX,CL,2017,2,G17,,,2017-01-20,2017-01-17 1045 | 1044,NYMEX,CL,2017,3,H17,,,2017-02-21,2017-02-15 1046 | 1045,NYMEX,CL,2017,4,J17,,,2017-03-21,2017-03-16 1047 | 1046,NYMEX,CL,2017,5,K17,,,2017-04-20,2017-04-17 1048 | 1047,NYMEX,CL,2017,6,M17,,,2017-05-22,2017-05-17 1049 | 1048,NYMEX,CL,2017,7,N17,,,2017-06-20,2017-06-15 1050 | 1049,NYMEX,CL,2017,8,Q17,,,2017-07-20,2017-07-17 1051 | 1050,NYMEX,CL,2017,9,U17,,,2017-08-22,2017-08-17 1052 | 1051,NYMEX,CL,2017,10,V17,,,2017-09-20,2017-09-15 1053 | 1052,NYMEX,CL,2017,11,X17,,,2017-10-20,2017-10-17 1054 | 1053,NYMEX,CL,2017,12,Z17,,,2017-11-20,2017-11-15 1055 | 1054,NYMEX,CL,2018,1,F18,,,2017-12-19,2017-12-14 1056 | 1055,NYMEX,CL,2018,2,G18,,,2018-01-22,2018-01-17 1057 | 1056,NYMEX,CL,2018,3,H18,,,2018-02-20,2018-02-14 1058 | 1057,NYMEX,CL,2018,4,J18,,,2018-03-20,2018-03-15 1059 | 1058,NYMEX,CL,2018,5,K18,,,2018-04-20,2018-04-17 1060 | 1059,NYMEX,CL,2018,6,M18,,,2018-05-22,2018-05-17 1061 | 1060,NYMEX,CL,2018,7,N18,,,2018-06-20,2018-06-15 1062 | 1061,NYMEX,CL,2018,8,Q18,,,2018-07-20,2018-07-17 1063 | 1062,NYMEX,CL,2018,9,U18,,,2018-08-21,2018-08-16 1064 | 1063,NYMEX,CL,2018,10,V18,,,2018-09-20,2018-09-17 1065 | 1064,NYMEX,CL,2018,11,X18,,,2018-10-22,2018-10-17 1066 | 1065,NYMEX,CL,2018,12,Z18,,,2018-11-19,2018-11-14 1067 | 1066,NYMEX,CL,2019,1,F19,,,2018-12-19,2018-12-14 1068 | 1067,NYMEX,CL,2019,2,G19,,,2019-01-22,2019-01-16 1069 | 1068,NYMEX,CL,2019,3,H19,,,2019-02-20,2019-02-14 1070 | 1069,NYMEX,CL,2019,4,J19,,,2019-03-20,2019-03-15 1071 | 1070,NYMEX,CL,2019,5,K19,,,2019-04-22,2019-04-17 1072 | 1071,NYMEX,CL,2019,6,M19,,,2019-05-21,2019-05-16 1073 | 1072,NYMEX,CL,2019,7,N19,,,2019-06-20,2019-06-17 1074 | 1073,NYMEX,CL,2019,8,Q19,,,2019-07-22,2019-07-17 1075 | 1074,NYMEX,CL,2019,9,U19,,,2019-08-20,2019-08-15 1076 | 1075,NYMEX,CL,2019,10,V19,,,2019-09-20,2019-09-17 1077 | 1076,NYMEX,CL,2019,11,X19,,,2019-10-22,2019-10-17 1078 | 1077,NYMEX,CL,2019,12,Z19,,,2019-11-20,2019-11-15 1079 | 1078,NYMEX,CL,2020,1,F20,,,2019-12-19,2019-12-16 1080 | 1079,NYMEX,CL,2020,2,G20,,,2020-01-21,2020-01-15 1081 | 1080,NYMEX,CL,2020,3,H20,,,2020-02-20,2020-02-14 1082 | 1081,NYMEX,CL,2020,4,J20,,,2020-03-20,2020-03-17 1083 | 1082,NYMEX,CL,2020,5,K20,,,2020-04-21,2020-04-16 1084 | 1083,NYMEX,CL,2020,6,M20,,,2020-05-19,2020-05-14 1085 | 1084,NYMEX,CL,2020,7,N20,,,2020-06-22,2020-06-17 1086 | 1085,NYMEX,CL,2020,8,Q20,,,2020-07-21,2020-07-16 1087 | 1086,NYMEX,CL,2020,9,U20,,,2020-08-20,2020-08-17 1088 | 1087,NYMEX,CL,2020,10,V20,,,2020-09-22,2020-09-17 1089 | 1088,NYMEX,CL,2020,11,X20,,,2020-10-20,2020-10-15 1090 | 1089,NYMEX,CL,2020,12,Z20,,,2020-11-20,2020-11-17 1091 | 1090,NYMEX,CL,2021,1,F21,,,2020-12-21,2020-12-16 1092 | 1091,NYMEX,CL,2021,2,G21,,,2021-01-20,2021-01-14 1093 | 1092,NYMEX,CL,2021,3,H21,,,2021-02-22,2021-02-17 1094 | 1093,NYMEX,CL,2021,4,J21,,,2021-03-22,2021-03-17 1095 | 1094,NYMEX,CL,2021,5,K21,,,2021-04-20,2021-04-15 1096 | 1095,NYMEX,CL,2021,6,M21,,,2021-05-20,2021-05-17 1097 | 1096,NYMEX,CL,2021,7,N21,,,2021-06-22,2021-06-17 1098 | 1097,NYMEX,CL,2021,8,Q21,,,2021-07-20,2021-07-15 1099 | 1098,NYMEX,CL,2021,9,U21,,,2021-08-20,2021-08-17 1100 | 1099,NYMEX,CL,2021,10,V21,,,2021-09-21,2021-09-16 1101 | 1100,NYMEX,CL,2021,11,X21,,,2021-10-20,2021-10-15 1102 | 1101,NYMEX,CL,2021,12,Z21,,,2021-11-19,2021-11-16 1103 | 1102,NYMEX,CL,2022,1,F22,,,2021-12-21,2021-12-16 1104 | 1103,NYMEX,CL,2022,2,G22,,,2022-01-20,2022-01-14 1105 | 1104,NYMEX,CL,2022,3,H22,,,2022-02-22,2022-02-16 1106 | 1105,NYMEX,CL,2022,4,J22,,,2022-03-22,2022-03-17 1107 | 1106,NYMEX,CL,2022,5,K22,,,2022-04-20,2022-04-15 1108 | 1107,NYMEX,CL,2022,6,M22,,,2022-05-20,2022-05-17 1109 | 1108,NYMEX,CL,2022,7,N22,,,2022-06-21,2022-06-16 1110 | 1109,NYMEX,CL,2022,8,Q22,,,2022-07-20,2022-07-15 1111 | 1110,NYMEX,CL,2022,9,U22,,,2022-08-22,2022-08-17 1112 | 1111,NYMEX,CL,2022,10,V22,,,2022-09-20,2022-09-15 1113 | 1112,NYMEX,CL,2022,11,X22,,,2022-10-20,2022-10-17 1114 | 1113,NYMEX,CL,2022,12,Z22,,,2022-11-21,2022-11-16 1115 | 1114,NYMEX,CL,2023,1,F23,,,2022-12-20,2022-12-15 1116 | 1115,NYMEX,CL,2023,2,G23,,,2023-01-20,2023-01-17 1117 | 1116,NYMEX,CL,2023,3,H23,,,2023-02-21,2023-02-15 1118 | 1117,NYMEX,CL,2023,4,J23,,,2023-03-21,2023-03-16 1119 | 1118,NYMEX,CL,2023,5,K23,,,2023-04-20,2023-04-17 1120 | 1119,NYMEX,CL,2023,6,M23,,,2023-05-22,2023-05-17 1121 | 1120,NYMEX,CL,2023,7,N23,,,2023-06-20,2023-06-15 1122 | 1121,NYMEX,CL,2023,8,Q23,,,2023-07-20,2023-07-17 1123 | 1122,NYMEX,CL,2023,9,U23,,,2023-08-22,2023-08-17 1124 | 1123,NYMEX,CL,2023,10,V23,,,2023-09-20,2023-09-15 1125 | 1124,NYMEX,CL,2023,11,X23,,,2023-10-20,2023-10-17 1126 | 1125,NYMEX,CL,2023,12,Z23,,,2023-11-20,2023-11-15 1127 | 1126,NYMEX,RB,2013,8,Q13,,,2013-07-31,2013-07-26 1128 | 1127,NYMEX,RB,2013,9,U13,,,2013-08-30,2013-08-27 1129 | 1128,NYMEX,RB,2013,10,V13,,,2013-09-30,2013-09-25 1130 | 1129,NYMEX,RB,2013,11,X13,,,2013-10-31,2013-10-28 1131 | 1130,NYMEX,RB,2013,12,Z13,,,2013-11-29,2013-11-25 1132 | 1131,NYMEX,RB,2014,1,F14,,,2013-12-31,2013-12-26 1133 | 1132,NYMEX,RB,2014,2,G14,,,2014-01-31,2014-01-28 1134 | 1133,NYMEX,RB,2014,3,H14,,,2014-02-28,2014-02-25 1135 | 1134,NYMEX,RB,2014,4,J14,,,2014-03-31,2014-03-26 1136 | 1135,NYMEX,RB,2014,5,K14,,,2014-04-30,2014-04-25 1137 | 1136,NYMEX,RB,2014,6,M14,,,2014-05-30,2014-05-27 1138 | 1137,NYMEX,RB,2014,7,N14,,,2014-06-30,2014-06-25 1139 | 1138,NYMEX,RB,2014,8,Q14,,,2014-07-31,2014-07-28 1140 | 1139,NYMEX,RB,2014,9,U14,,,2014-08-29,2014-08-26 1141 | 1140,NYMEX,RB,2014,10,V14,,,2014-09-30,2014-09-25 1142 | 1141,NYMEX,RB,2014,11,X14,,,2014-10-31,2014-10-28 1143 | 1142,NYMEX,RB,2014,12,Z14,,,2014-11-28,2014-11-24 1144 | 1143,NYMEX,RB,2015,1,F15,,,2014-12-31,2014-12-26 1145 | 1144,NYMEX,RB,2015,2,G15,,,2015-01-30,2015-01-27 1146 | 1145,NYMEX,RB,2015,3,H15,,,2015-02-27,2015-02-24 1147 | 1146,NYMEX,RB,2015,4,J15,,,2015-03-31,2015-03-26 1148 | 1147,NYMEX,RB,2015,5,K15,,,2015-04-30,2015-04-27 1149 | 1148,NYMEX,RB,2015,6,M15,,,2015-05-29,2015-05-26 1150 | 1149,NYMEX,RB,2015,7,N15,,,2015-06-30,2015-06-25 1151 | 1150,NYMEX,RB,2015,8,Q15,,,2015-07-31,2015-07-28 1152 | 1151,NYMEX,RB,2015,9,U15,,,2015-08-31,2015-08-26 1153 | 1152,NYMEX,RB,2015,10,V15,,,2015-09-30,2015-09-25 1154 | 1153,NYMEX,RB,2015,11,X15,,,2015-10-30,2015-10-27 1155 | 1154,NYMEX,RB,2015,12,Z15,,,2015-11-30,2015-11-24 1156 | 1155,NYMEX,RB,2016,1,F16,,,2015-12-31,2015-12-28 1157 | 1156,NYMEX,RB,2016,2,G16,,,2016-01-29,2016-01-26 1158 | 1157,NYMEX,RB,2016,3,H16,,,2016-02-29,2016-02-24 1159 | 1158,NYMEX,RB,2016,4,J16,,,2016-03-31,2016-03-28 1160 | 1159,NYMEX,RB,2016,5,K16,,,2016-04-29,2016-04-26 1161 | 1160,NYMEX,RB,2016,6,M16,,,2016-05-31,2016-05-25 1162 | 1161,NYMEX,RB,2016,7,N16,,,2016-06-30,2016-06-27 1163 | 1162,NYMEX,RB,2016,8,Q16,,,2016-07-29,2016-07-26 1164 | 1163,NYMEX,RB,2016,9,U16,,,2016-08-31,2016-08-26 1165 | 1164,NYMEX,RB,2016,10,V16,,,2016-09-30,2016-09-27 1166 | 1165,NYMEX,RB,2016,11,X16,,,2016-10-31,2016-10-26 1167 | 1166,NYMEX,RB,2016,12,Z16,,,2016-11-30,2016-11-25 1168 | 1167,NYMEX,RB,2017,1,F17,,,2016-12-30,2016-12-27 1169 | 1168,NYMEX,RB,2017,2,G17,,,2017-01-31,2017-01-26 1170 | 1169,NYMEX,RB,2017,3,H17,,,2017-02-28,2017-02-23 1171 | 1170,NYMEX,RB,2017,4,J17,,,2017-03-31,2017-03-28 1172 | 1171,NYMEX,RB,2017,5,K17,,,2017-04-28,2017-04-25 1173 | 1172,NYMEX,RB,2017,6,M17,,,2017-05-31,2017-05-25 1174 | 1173,NYMEX,RB,2017,7,N17,,,2017-06-30,2017-06-27 1175 | 1174,NYMEX,RB,2017,8,Q17,,,2017-07-31,2017-07-26 1176 | 1175,NYMEX,RB,2017,9,U17,,,2017-08-31,2017-08-28 1177 | 1176,NYMEX,RB,2017,10,V17,,,2017-09-29,2017-09-26 1178 | 1177,NYMEX,RB,2017,11,X17,,,2017-10-31,2017-10-26 1179 | 1178,NYMEX,RB,2017,12,Z17,,,2017-11-30,2017-11-27 1180 | 1179,NYMEX,RB,2018,1,F18,,,2017-12-29,2017-12-26 1181 | 1180,NYMEX,RB,2018,2,G18,,,2018-01-31,2018-01-26 1182 | 1181,NYMEX,RB,2018,3,H18,,,2018-02-28,2018-02-23 1183 | 1182,NYMEX,RB,2018,4,J18,,,2018-03-30,2018-03-27 1184 | 1183,NYMEX,RB,2018,5,K18,,,2018-04-30,2018-04-25 1185 | 1184,NYMEX,RB,2018,6,M18,,,2018-05-31,2018-05-25 1186 | 1185,NYMEX,RB,2018,7,N18,,,2018-06-29,2018-06-26 1187 | 1186,NYMEX,RB,2018,8,Q18,,,2018-07-31,2018-07-26 1188 | 1187,NYMEX,RB,2018,9,U18,,,2018-08-31,2018-08-28 1189 | 1188,NYMEX,RB,2018,10,V18,,,2018-09-28,2018-09-25 1190 | 1189,NYMEX,RB,2018,11,X18,,,2018-10-31,2018-10-26 1191 | 1190,NYMEX,RB,2018,12,Z18,,,2018-11-30,2018-11-27 1192 | 1191,NYMEX,RB,2019,1,F19,,,2018-12-31,2018-12-26 1193 | 1192,NYMEX,RB,2019,2,G19,,,2019-01-31,2019-01-28 1194 | 1193,NYMEX,RB,2019,3,H19,,,2019-02-28,2019-02-25 1195 | 1194,NYMEX,RB,2019,4,J19,,,2019-03-29,2019-03-26 1196 | 1195,NYMEX,RB,2019,5,K19,,,2019-04-30,2019-04-25 1197 | 1196,NYMEX,RB,2019,6,M19,,,2019-05-31,2019-05-28 1198 | 1197,NYMEX,RB,2019,7,N19,,,2019-06-28,2019-06-25 1199 | 1198,NYMEX,RB,2019,8,Q19,,,2019-07-31,2019-07-26 1200 | 1199,NYMEX,RB,2019,9,U19,,,2019-08-30,2019-08-27 1201 | 1200,NYMEX,RB,2019,10,V19,,,2019-09-30,2019-09-25 1202 | 1201,NYMEX,RB,2019,11,X19,,,2019-10-31,2019-10-28 1203 | 1202,NYMEX,RB,2019,12,Z19,,,2019-11-29,2019-11-25 1204 | 1203,NYMEX,RB,2020,1,F20,,,2019-12-31,2019-12-26 1205 | 1204,NYMEX,RB,2020,2,G20,,,2020-01-31,2020-01-28 1206 | 1205,NYMEX,RB,2020,3,H20,,,2020-02-28,2020-02-25 1207 | 1206,NYMEX,RB,2020,4,J20,,,2020-03-31,2020-03-26 1208 | 1207,NYMEX,RB,2020,5,K20,,,2020-04-30,2020-04-27 1209 | 1208,NYMEX,RB,2020,6,M20,,,2020-05-29,2020-05-26 1210 | 1209,NYMEX,RB,2020,7,N20,,,2020-06-30,2020-06-25 1211 | 1210,NYMEX,RB,2020,8,Q20,,,2020-07-31,2020-07-28 1212 | 1211,NYMEX,RB,2020,9,U20,,,2020-08-31,2020-08-26 1213 | 1212,NYMEX,RB,2020,10,V20,,,2020-09-30,2020-09-25 1214 | 1213,NYMEX,RB,2020,11,X20,,,2020-10-30,2020-10-27 1215 | 1214,NYMEX,RB,2020,12,Z20,,,2020-11-30,2020-11-24 1216 | 1215,NYMEX,RB,2021,1,F21,,,2020-12-31,2020-12-28 1217 | 1216,NYMEX,RB,2021,2,G21,,,2021-01-29,2021-01-26 1218 | 1217,NYMEX,RB,2021,3,H21,,,2021-02-26,2021-02-23 1219 | 1218,NYMEX,RB,2021,4,J21,,,2021-03-31,2021-03-26 1220 | 1219,NYMEX,RB,2021,5,K21,,,2021-04-30,2021-04-27 1221 | 1220,NYMEX,RB,2021,6,M21,,,2021-05-28,2021-05-25 1222 | 1221,NYMEX,RB,2021,7,N21,,,2021-06-30,2021-06-25 1223 | 1222,NYMEX,RB,2021,8,Q21,,,2021-07-30,2021-07-27 1224 | 1223,NYMEX,RB,2021,9,U21,,,2021-08-31,2021-08-26 1225 | 1224,NYMEX,RB,2021,10,V21,,,2021-09-30,2021-09-27 1226 | 1225,NYMEX,RB,2021,11,X21,,,2021-10-29,2021-10-26 1227 | 1226,NYMEX,RB,2021,12,Z21,,,2021-11-30,2021-11-24 1228 | 1227,NYMEX,RB,2022,1,F22,,,2021-12-31,2021-12-28 1229 | 1228,NYMEX,RB,2022,2,G22,,,2022-01-31,2022-01-26 1230 | 1229,NYMEX,RB,2022,3,H22,,,2022-02-28,2022-02-23 1231 | 1230,NYMEX,RB,2022,4,J22,,,2022-03-31,2022-03-28 1232 | 1231,NYMEX,RB,2022,5,K22,,,2022-04-29,2022-04-26 1233 | 1232,NYMEX,RB,2022,6,M22,,,2022-05-31,2022-05-25 1234 | 1233,NYMEX,RB,2022,7,N22,,,2022-06-30,2022-06-27 1235 | 1234,NYMEX,RB,2022,8,Q22,,,2022-07-29,2022-07-26 1236 | 1235,NYMEX,RB,2022,9,U22,,,2022-08-31,2022-08-26 1237 | 1236,NYMEX,RB,2022,10,V22,,,2022-09-30,2022-09-27 1238 | 1237,NYMEX,RB,2022,11,X22,,,2022-10-31,2022-10-26 1239 | 1238,NYMEX,RB,2022,12,Z22,,,2022-11-30,2022-11-25 1240 | 1239,NYMEX,RB,2023,1,F23,,,2022-12-30,2022-12-27 1241 | 1240,NYMEX,RB,2023,2,G23,,,2023-01-31,2023-01-26 1242 | 1241,NYMEX,RB,2023,3,H23,,,2023-02-28,2023-02-23 1243 | 1242,NYMEX,RB,2023,4,J23,,,2023-03-31,2023-03-28 1244 | 1243,NYMEX,RB,2023,5,K23,,,2023-04-28,2023-04-25 1245 | 1244,NYMEX,RB,2023,6,M23,,,2023-05-31,2023-05-25 1246 | 1245,NYMEX,RB,2023,7,N23,,,2023-06-30,2023-06-27 1247 | 1246,NYMEX,RB,2023,8,Q23,,,2023-07-31,2023-07-26 1248 | 1247,NYMEX,RB,2023,9,U23,,,2023-08-31,2023-08-28 1249 | 1248,NYMEX,RB,2023,10,V23,,,2023-09-29,2023-09-26 1250 | 1249,NYMEX,RB,2023,11,X23,,,2023-10-31,2023-10-26 1251 | 1250,NYMEX,RB,2023,12,Z23,,,2023-11-30,2023-11-27 1252 | 1251,NYMEX,HO,2013,8,Q13,,,2013-07-31,2013-07-26 1253 | 1252,NYMEX,HO,2013,9,U13,,,2013-08-30,2013-08-27 1254 | 1253,NYMEX,HO,2013,10,V13,,,2013-09-30,2013-09-25 1255 | 1254,NYMEX,HO,2013,11,X13,,,2013-10-31,2013-10-28 1256 | 1255,NYMEX,HO,2013,12,Z13,,,2013-11-29,2013-11-25 1257 | 1256,NYMEX,HO,2014,1,F14,,,2013-12-31,2013-12-26 1258 | 1257,NYMEX,HO,2014,2,G14,,,2014-01-31,2014-01-28 1259 | 1258,NYMEX,HO,2014,3,H14,,,2014-02-28,2014-02-25 1260 | 1259,NYMEX,HO,2014,4,J14,,,2014-03-31,2014-03-26 1261 | 1260,NYMEX,HO,2014,5,K14,,,2014-04-30,2014-04-25 1262 | 1261,NYMEX,HO,2014,6,M14,,,2014-05-30,2014-05-27 1263 | 1262,NYMEX,HO,2014,7,N14,,,2014-06-30,2014-06-25 1264 | 1263,NYMEX,HO,2014,8,Q14,,,2014-07-31,2014-07-28 1265 | 1264,NYMEX,HO,2014,9,U14,,,2014-08-29,2014-08-26 1266 | 1265,NYMEX,HO,2014,10,V14,,,2014-09-30,2014-09-25 1267 | 1266,NYMEX,HO,2014,11,X14,,,2014-10-31,2014-10-28 1268 | 1267,NYMEX,HO,2014,12,Z14,,,2014-11-28,2014-11-24 1269 | 1268,NYMEX,HO,2015,1,F15,,,2014-12-31,2014-12-26 1270 | 1269,NYMEX,HO,2015,2,G15,,,2015-01-30,2015-01-27 1271 | 1270,NYMEX,HO,2015,3,H15,,,2015-02-27,2015-02-24 1272 | 1271,NYMEX,HO,2015,4,J15,,,2015-03-31,2015-03-26 1273 | 1272,NYMEX,HO,2015,5,K15,,,2015-04-30,2015-04-27 1274 | 1273,NYMEX,HO,2015,6,M15,,,2015-05-29,2015-05-26 1275 | 1274,NYMEX,HO,2015,7,N15,,,2015-06-30,2015-06-25 1276 | 1275,NYMEX,HO,2015,8,Q15,,,2015-07-31,2015-07-28 1277 | 1276,NYMEX,HO,2015,9,U15,,,2015-08-31,2015-08-26 1278 | 1277,NYMEX,HO,2015,10,V15,,,2015-09-30,2015-09-25 1279 | 1278,NYMEX,HO,2015,11,X15,,,2015-10-30,2015-10-27 1280 | 1279,NYMEX,HO,2015,12,Z15,,,2015-11-30,2015-11-24 1281 | 1280,NYMEX,HO,2016,1,F16,,,2015-12-31,2015-12-28 1282 | 1281,NYMEX,HO,2016,2,G16,,,2016-01-29,2016-01-26 1283 | 1282,NYMEX,HO,2016,3,H16,,,2016-02-29,2016-02-24 1284 | 1283,NYMEX,HO,2016,4,J16,,,2016-03-31,2016-03-28 1285 | 1284,NYMEX,HO,2016,5,K16,,,2016-04-29,2016-04-26 1286 | 1285,NYMEX,HO,2016,6,M16,,,2016-05-31,2016-05-25 1287 | 1286,NYMEX,HO,2016,7,N16,,,2016-06-30,2016-06-27 1288 | 1287,NYMEX,HO,2016,8,Q16,,,2016-07-29,2016-07-26 1289 | 1288,NYMEX,HO,2016,9,U16,,,2016-08-31,2016-08-26 1290 | 1289,NYMEX,HO,2016,10,V16,,,2016-09-30,2016-09-27 1291 | 1290,NYMEX,HO,2016,11,X16,,,2016-10-31,2016-10-26 1292 | 1291,NYMEX,HO,2016,12,Z16,,,2016-11-30,2016-11-25 1293 | 1292,NYMEX,HO,2017,1,F17,,,2016-12-30,2016-12-27 1294 | 1293,NYMEX,HO,2017,2,G17,,,2017-01-31,2017-01-26 1295 | 1294,NYMEX,HO,2017,3,H17,,,2017-02-28,2017-02-23 1296 | 1295,NYMEX,HO,2017,4,J17,,,2017-03-31,2017-03-28 1297 | 1296,NYMEX,HO,2017,5,K17,,,2017-04-28,2017-04-25 1298 | 1297,NYMEX,HO,2017,6,M17,,,2017-05-31,2017-05-25 1299 | 1298,NYMEX,HO,2017,7,N17,,,2017-06-30,2017-06-27 1300 | 1299,NYMEX,HO,2017,8,Q17,,,2017-07-31,2017-07-26 1301 | 1300,NYMEX,HO,2017,9,U17,,,2017-08-31,2017-08-28 1302 | 1301,NYMEX,HO,2017,10,V17,,,2017-09-29,2017-09-26 1303 | 1302,NYMEX,HO,2017,11,X17,,,2017-10-31,2017-10-26 1304 | 1303,NYMEX,HO,2017,12,Z17,,,2017-11-30,2017-11-27 1305 | 1304,NYMEX,HO,2018,1,F18,,,2017-12-29,2017-12-26 1306 | 1305,NYMEX,HO,2018,2,G18,,,2018-01-31,2018-01-26 1307 | 1306,NYMEX,HO,2018,3,H18,,,2018-02-28,2018-02-23 1308 | 1307,NYMEX,HO,2018,4,J18,,,2018-03-30,2018-03-27 1309 | 1308,NYMEX,HO,2018,5,K18,,,2018-04-30,2018-04-25 1310 | 1309,NYMEX,HO,2018,6,M18,,,2018-05-31,2018-05-25 1311 | 1310,NYMEX,HO,2018,7,N18,,,2018-06-29,2018-06-26 1312 | 1311,NYMEX,HO,2018,8,Q18,,,2018-07-31,2018-07-26 1313 | 1312,NYMEX,HO,2018,9,U18,,,2018-08-31,2018-08-28 1314 | 1313,NYMEX,HO,2018,10,V18,,,2018-09-28,2018-09-25 1315 | 1314,NYMEX,HO,2018,11,X18,,,2018-10-31,2018-10-26 1316 | 1315,NYMEX,HO,2018,12,Z18,,,2018-11-30,2018-11-27 1317 | 1316,NYMEX,HO,2019,1,F19,,,2018-12-31,2018-12-26 1318 | 1317,NYMEX,HO,2019,2,G19,,,2019-01-31,2019-01-28 1319 | 1318,NYMEX,HO,2019,3,H19,,,2019-02-28,2019-02-25 1320 | 1319,NYMEX,HO,2019,4,J19,,,2019-03-29,2019-03-26 1321 | 1320,NYMEX,HO,2019,5,K19,,,2019-04-30,2019-04-25 1322 | 1321,NYMEX,HO,2019,6,M19,,,2019-05-31,2019-05-28 1323 | 1322,NYMEX,HO,2019,7,N19,,,2019-06-28,2019-06-25 1324 | 1323,NYMEX,HO,2019,8,Q19,,,2019-07-31,2019-07-26 1325 | 1324,NYMEX,HO,2019,9,U19,,,2019-08-30,2019-08-27 1326 | 1325,NYMEX,HO,2019,10,V19,,,2019-09-30,2019-09-25 1327 | 1326,NYMEX,HO,2019,11,X19,,,2019-10-31,2019-10-28 1328 | 1327,NYMEX,HO,2019,12,Z19,,,2019-11-29,2019-11-25 1329 | 1328,NYMEX,HO,2020,1,F20,,,2019-12-31,2019-12-26 1330 | 1329,NYMEX,HO,2020,2,G20,,,2020-01-31,2020-01-28 1331 | 1330,NYMEX,HO,2020,3,H20,,,2020-02-28,2020-02-25 1332 | 1331,NYMEX,HO,2020,4,J20,,,2020-03-31,2020-03-26 1333 | 1332,NYMEX,HO,2020,5,K20,,,2020-04-30,2020-04-27 1334 | 1333,NYMEX,HO,2020,6,M20,,,2020-05-29,2020-05-26 1335 | 1334,NYMEX,HO,2020,7,N20,,,2020-06-30,2020-06-25 1336 | 1335,NYMEX,HO,2020,8,Q20,,,2020-07-31,2020-07-28 1337 | 1336,NYMEX,HO,2020,9,U20,,,2020-08-31,2020-08-26 1338 | 1337,NYMEX,HO,2020,10,V20,,,2020-09-30,2020-09-25 1339 | 1338,NYMEX,HO,2020,11,X20,,,2020-10-30,2020-10-27 1340 | 1339,NYMEX,HO,2020,12,Z20,,,2020-11-30,2020-11-24 1341 | 1340,NYMEX,HO,2021,1,F21,,,2020-12-31,2020-12-28 1342 | 1341,NYMEX,HO,2021,2,G21,,,2021-01-29,2021-01-26 1343 | 1342,NYMEX,HO,2021,3,H21,,,2021-02-26,2021-02-23 1344 | 1343,NYMEX,HO,2021,4,J21,,,2021-03-31,2021-03-26 1345 | 1344,NYMEX,HO,2021,5,K21,,,2021-04-30,2021-04-27 1346 | 1345,NYMEX,HO,2021,6,M21,,,2021-05-28,2021-05-25 1347 | 1346,NYMEX,HO,2021,7,N21,,,2021-06-30,2021-06-25 1348 | 1347,NYMEX,HO,2021,8,Q21,,,2021-07-30,2021-07-27 1349 | 1348,NYMEX,HO,2021,9,U21,,,2021-08-31,2021-08-26 1350 | 1349,NYMEX,HO,2021,10,V21,,,2021-09-30,2021-09-27 1351 | 1350,NYMEX,HO,2021,11,X21,,,2021-10-29,2021-10-26 1352 | 1351,NYMEX,HO,2021,12,Z21,,,2021-11-30,2021-11-24 1353 | 1352,NYMEX,HO,2022,1,F22,,,2021-12-31,2021-12-28 1354 | 1353,NYMEX,HO,2022,2,G22,,,2022-01-31,2022-01-26 1355 | 1354,NYMEX,HO,2022,3,H22,,,2022-02-28,2022-02-23 1356 | 1355,NYMEX,HO,2022,4,J22,,,2022-03-31,2022-03-28 1357 | 1356,NYMEX,HO,2022,5,K22,,,2022-04-29,2022-04-26 1358 | 1357,NYMEX,HO,2022,6,M22,,,2022-05-31,2022-05-25 1359 | 1358,NYMEX,HO,2022,7,N22,,,2022-06-30,2022-06-27 1360 | 1359,NYMEX,HO,2022,8,Q22,,,2022-07-29,2022-07-26 1361 | 1360,NYMEX,HO,2022,9,U22,,,2022-08-31,2022-08-26 1362 | 1361,NYMEX,HO,2022,10,V22,,,2022-09-30,2022-09-27 1363 | 1362,NYMEX,HO,2022,11,X22,,,2022-10-31,2022-10-26 1364 | 1363,NYMEX,HO,2022,12,Z22,,,2022-11-30,2022-11-25 1365 | 1364,NYMEX,HO,2023,1,F23,,,2022-12-30,2022-12-27 1366 | 1365,NYMEX,HO,2023,2,G23,,,2023-01-31,2023-01-26 1367 | 1366,NYMEX,HO,2023,3,H23,,,2023-02-28,2023-02-23 1368 | 1367,NYMEX,HO,2023,4,J23,,,2023-03-31,2023-03-28 1369 | 1368,NYMEX,HO,2023,5,K23,,,2023-04-28,2023-04-25 1370 | 1369,NYMEX,HO,2023,6,M23,,,2023-05-31,2023-05-25 1371 | 1370,NYMEX,HO,2023,7,N23,,,2023-06-30,2023-06-27 1372 | 1371,NYMEX,HO,2023,8,Q23,,,2023-07-31,2023-07-26 1373 | 1372,NYMEX,HO,2023,9,U23,,,2023-08-31,2023-08-28 1374 | 1373,NYMEX,HO,2023,10,V23,,,2023-09-29,2023-09-26 1375 | 1374,NYMEX,HO,2023,11,X23,,,2023-10-31,2023-10-26 1376 | 1375,NYMEX,HO,2023,12,Z23,,,2023-11-30,2023-11-27 1377 | 1376,CLEARPORT,DOED,2013,8,Q13,,,2013-08-26,2013-08-26 1378 | 1377,CLEARPORT,DOED,2013,9,U13,,,2013-09-30,2013-09-30 1379 | 1378,CLEARPORT,DOED,2013,10,V13,,,2013-10-28,2013-10-28 1380 | 1379,CLEARPORT,DOED,2013,11,X13,,,2013-11-25,2013-11-25 1381 | 1380,CLEARPORT,DOED,2013,12,Z13,,,2013-12-30,2013-12-30 1382 | 1381,CLEARPORT,DOED,2014,1,F14,,,2014-01-27,2014-01-27 1383 | 1382,CLEARPORT,DOED,2014,2,G14,,,2014-02-24,2014-02-24 1384 | 1383,CLEARPORT,DOED,2014,3,H14,,,2014-03-31,2014-03-31 1385 | 1384,CLEARPORT,DOED,2014,4,J14,,,2014-04-28,2014-04-28 1386 | 1385,CLEARPORT,DOED,2014,5,K14,,,2014-05-26,2014-05-26 1387 | 1386,CLEARPORT,DOED,2014,6,M14,,,2014-06-30,2014-06-30 1388 | 1387,CLEARPORT,DOED,2014,7,N14,,,2014-07-28,2014-07-28 1389 | 1388,CLEARPORT,DOED,2014,8,Q14,,,2014-08-25,2014-08-25 1390 | 1389,CLEARPORT,DOED,2014,9,U14,,,2014-09-29,2014-09-29 1391 | 1390,CLEARPORT,DOED,2014,10,V14,,,2014-10-27,2014-10-27 1392 | 1391,CLEARPORT,DOED,2014,11,X14,,,2014-11-24,2014-11-24 1393 | 1392,CLEARPORT,DOED,2014,12,Z14,,,2014-12-29,2014-12-29 1394 | 1393,CLEARPORT,DOED,2015,1,F15,,,2015-01-26,2015-01-26 1395 | 1394,CLEARPORT,DOED,2015,2,G15,,,2015-02-23,2015-02-23 1396 | 1395,CLEARPORT,DOED,2015,3,H15,,,2015-03-30,2015-03-30 1397 | 1396,CLEARPORT,DOED,2015,4,J15,,,2015-04-27,2015-04-27 1398 | 1397,CLEARPORT,DOED,2015,5,K15,,,2015-05-25,2015-05-25 1399 | 1398,CLEARPORT,DOED,2015,6,M15,,,2015-06-29,2015-06-29 1400 | 1399,CLEARPORT,DOED,2015,7,N15,,,2015-07-27,2015-07-27 1401 | 1400,CLEARPORT,DOED,2015,8,Q15,,,2015-08-31,2015-08-31 1402 | 1401,CLEARPORT,DOED,2015,9,U15,,,2015-09-28,2015-09-28 1403 | 1402,CLEARPORT,DOED,2015,10,V15,,,2015-10-26,2015-10-26 1404 | 1403,CLEARPORT,DOED,2015,11,X15,,,2015-11-30,2015-11-30 1405 | 1404,CLEARPORT,DOED,2015,12,Z15,,,2015-12-28,2015-12-28 1406 | 1405,CLEARPORT,DOED,2016,1,F16,,,2016-01-25,2016-01-25 1407 | 1406,CLEARPORT,DOED,2016,2,G16,,,2016-02-29,2016-02-29 1408 | 1407,CLEARPORT,DOED,2016,3,H16,,,2016-03-28,2016-03-28 1409 | 1408,CLEARPORT,DOED,2016,4,J16,,,2016-04-25,2016-04-25 1410 | 1409,CLEARPORT,DOED,2016,5,K16,,,2016-05-30,2016-05-30 1411 | 1410,CLEARPORT,DOED,2016,6,M16,,,2016-06-27,2016-06-27 1412 | 1411,CLEARPORT,DOED,2016,7,N16,,,2016-07-25,2016-07-25 1413 | 1412,CLEARPORT,DOED,2016,8,Q16,,,2016-08-29,2016-08-29 1414 | 1413,CLEARPORT,DOED,2016,9,U16,,,2016-09-26,2016-09-26 1415 | 1414,CLEARPORT,DOED,2016,10,V16,,,2016-10-31,2016-10-31 1416 | 1415,CLEARPORT,DOED,2016,11,X16,,,2016-11-28,2016-11-28 1417 | 1416,CLEARPORT,DOED,2016,12,Z16,,,2016-12-26,2016-12-26 1418 | 1417,CLEARPORT,DOED,2017,1,F17,,,2017-01-30,2017-01-30 1419 | 1418,CLEARPORT,DOED,2017,2,G17,,,2017-02-27,2017-02-27 1420 | 1419,CLEARPORT,DOED,2017,3,H17,,,2017-03-27,2017-03-27 1421 | 1420,CLEARPORT,DOED,2017,4,J17,,,2017-04-24,2017-04-24 1422 | 1421,CLEARPORT,DOED,2017,5,K17,,,2017-05-29,2017-05-29 1423 | 1422,CLEARPORT,DOED,2017,6,M17,,,2017-06-26,2017-06-26 1424 | 1423,CLEARPORT,DOED,2017,7,N17,,,2017-07-31,2017-07-31 1425 | 1424,CLEARPORT,DOED,2017,8,Q17,,,2017-08-28,2017-08-28 1426 | 1425,CLEARPORT,DOED,2017,9,U17,,,2017-09-25,2017-09-25 1427 | 1426,CLEARPORT,DOED,2017,10,V17,,,2017-10-30,2017-10-30 1428 | 1427,CLEARPORT,DOED,2017,11,X17,,,2017-11-27,2017-11-27 1429 | 1428,CLEARPORT,DOED,2017,12,Z17,,,2017-12-25,2017-12-25 1430 | 1429,CLEARPORT,DOED,2018,1,F18,,,2018-01-29,2018-01-29 1431 | 1430,CLEARPORT,DOED,2018,2,G18,,,2018-02-26,2018-02-26 1432 | 1431,CLEARPORT,DOED,2018,3,H18,,,2018-03-26,2018-03-26 1433 | 1432,CLEARPORT,DOED,2018,4,J18,,,2018-04-30,2018-04-30 1434 | 1433,CLEARPORT,DOED,2018,5,K18,,,2018-05-28,2018-05-28 1435 | 1434,CLEARPORT,DOED,2018,6,M18,,,2018-06-25,2018-06-25 1436 | 1435,CLEARPORT,DOED,2018,7,N18,,,2018-07-30,2018-07-30 1437 | 1436,CLEARPORT,DOED,2018,8,Q18,,,2018-08-27,2018-08-27 1438 | 1437,CLEARPORT,DOED,2018,9,U18,,,2018-09-24,2018-09-24 1439 | 1438,CLEARPORT,DOED,2018,10,V18,,,2018-10-29,2018-10-29 1440 | 1439,CLEARPORT,DOED,2018,11,X18,,,2018-11-26,2018-11-26 1441 | 1440,CLEARPORT,DOED,2018,12,Z18,,,2018-12-31,2018-12-31 1442 | 1441,CLEARPORT,DOED,2019,1,F19,,,2019-01-28,2019-01-28 1443 | 1442,CLEARPORT,DOED,2019,2,G19,,,2019-02-25,2019-02-25 1444 | 1443,CLEARPORT,DOED,2019,3,H19,,,2019-03-25,2019-03-25 1445 | 1444,CLEARPORT,DOED,2019,4,J19,,,2019-04-29,2019-04-29 1446 | 1445,CLEARPORT,DOED,2019,5,K19,,,2019-05-27,2019-05-27 1447 | 1446,CLEARPORT,DOED,2019,6,M19,,,2019-06-24,2019-06-24 1448 | 1447,CLEARPORT,DOED,2019,7,N19,,,2019-07-29,2019-07-29 1449 | 1448,CLEARPORT,DOED,2019,8,Q19,,,2019-08-26,2019-08-26 1450 | 1449,CLEARPORT,DOED,2019,9,U19,,,2019-09-30,2019-09-30 1451 | 1450,CLEARPORT,DOED,2019,10,V19,,,2019-10-28,2019-10-28 1452 | 1451,CLEARPORT,DOED,2019,11,X19,,,2019-11-25,2019-11-25 1453 | 1452,CLEARPORT,DOED,2019,12,Z19,,,2019-12-30,2019-12-30 1454 | 1453,CLEARPORT,DOED,2020,1,F20,,,2020-01-27,2020-01-27 1455 | 1454,CLEARPORT,DOED,2020,2,G20,,,2020-02-24,2020-02-24 1456 | 1455,CLEARPORT,DOED,2020,3,H20,,,2020-03-30,2020-03-30 1457 | 1456,CLEARPORT,DOED,2020,4,J20,,,2020-04-27,2020-04-27 1458 | 1457,CLEARPORT,DOED,2020,5,K20,,,2020-05-25,2020-05-25 1459 | 1458,CLEARPORT,DOED,2020,6,M20,,,2020-06-29,2020-06-29 1460 | 1459,CLEARPORT,DOED,2020,7,N20,,,2020-07-27,2020-07-27 1461 | 1460,CLEARPORT,DOED,2020,8,Q20,,,2020-08-31,2020-08-31 1462 | 1461,CLEARPORT,DOED,2020,9,U20,,,2020-09-28,2020-09-28 1463 | 1462,CLEARPORT,DOED,2020,10,V20,,,2020-10-26,2020-10-26 1464 | 1463,CLEARPORT,DOED,2020,11,X20,,,2020-11-30,2020-11-30 1465 | 1464,CLEARPORT,DOED,2020,12,Z20,,,2020-12-28,2020-12-28 1466 | 1465,CLEARPORT,DOED,2021,1,F21,,,2021-01-25,2021-01-25 1467 | 1466,CLEARPORT,DOED,2021,2,G21,,,2021-02-22,2021-02-22 1468 | 1467,CLEARPORT,DOED,2021,3,H21,,,2021-03-29,2021-03-29 1469 | 1468,CLEARPORT,DOED,2021,4,J21,,,2021-04-26,2021-04-26 1470 | 1469,CLEARPORT,DOED,2021,5,K21,,,2021-05-31,2021-05-31 1471 | 1470,CLEARPORT,DOED,2021,6,M21,,,2021-06-28,2021-06-28 1472 | 1471,CLEARPORT,DOED,2021,7,N21,,,2021-07-26,2021-07-26 1473 | 1472,CLEARPORT,DOED,2021,8,Q21,,,2021-08-30,2021-08-30 1474 | 1473,CLEARPORT,DOED,2021,9,U21,,,2021-09-27,2021-09-27 1475 | 1474,CLEARPORT,DOED,2021,10,V21,,,2021-10-25,2021-10-25 1476 | 1475,CLEARPORT,DOED,2021,11,X21,,,2021-11-29,2021-11-29 1477 | 1476,CLEARPORT,DOED,2021,12,Z21,,,2021-12-27,2021-12-27 1478 | 1477,CLEARPORT,DOED,2022,1,F22,,,2022-01-31,2022-01-31 1479 | 1478,CLEARPORT,DOED,2022,2,G22,,,2022-02-28,2022-02-28 1480 | 1479,CLEARPORT,DOED,2022,3,H22,,,2022-03-28,2022-03-28 1481 | 1480,CLEARPORT,DOED,2022,4,J22,,,2022-04-25,2022-04-25 1482 | 1481,CLEARPORT,DOED,2022,5,K22,,,2022-05-30,2022-05-30 1483 | 1482,CLEARPORT,DOED,2022,6,M22,,,2022-06-27,2022-06-27 1484 | 1483,CLEARPORT,DOED,2022,7,N22,,,2022-07-25,2022-07-25 1485 | 1484,CLEARPORT,DOED,2022,8,Q22,,,2022-08-29,2022-08-29 1486 | 1485,CLEARPORT,DOED,2022,9,U22,,,2022-09-26,2022-09-26 1487 | 1486,CLEARPORT,DOED,2022,10,V22,,,2022-10-31,2022-10-31 1488 | 1487,CLEARPORT,DOED,2022,11,X22,,,2022-11-28,2022-11-28 1489 | 1488,CLEARPORT,DOED,2022,12,Z22,,,2022-12-26,2022-12-26 1490 | 1489,CLEARPORT,DOED,2023,1,F23,,,2023-01-30,2023-01-30 1491 | 1490,CLEARPORT,DOED,2023,2,G23,,,2023-02-27,2023-02-27 1492 | 1491,CLEARPORT,DOED,2023,3,H23,,,2023-03-27,2023-03-27 1493 | 1492,CLEARPORT,DOED,2023,4,J23,,,2023-04-24,2023-04-24 1494 | 1493,CLEARPORT,DOED,2023,5,K23,,,2023-05-29,2023-05-29 1495 | 1494,CLEARPORT,DOED,2023,6,M23,,,2023-06-26,2023-06-26 1496 | 1495,CLEARPORT,DOED,2023,7,N23,,,2023-07-31,2023-07-31 1497 | 1496,CLEARPORT,DOED,2023,8,Q23,,,2023-08-28,2023-08-28 1498 | 1497,CLEARPORT,DOED,2023,9,U23,,,2023-09-25,2023-09-25 1499 | 1498,CLEARPORT,DOED,2023,10,V23,,,2023-10-30,2023-10-30 1500 | 1499,CLEARPORT,DOED,2023,11,X23,,,2023-11-27,2023-11-27 1501 | 1500,CLEARPORT,DOED,2023,12,Z23,,,2023-12-25,2023-12-25 1502 | 1501,CME,ED,2013,8,Q13,,,2013-08-19,2013-08-19 1503 | 1502,CME,ED,2013,9,U13,,,2013-09-16,2013-09-16 1504 | 1503,CME,ED,2013,10,V13,,,2013-10-11,2013-10-11 1505 | 1504,CME,ED,2013,11,X13,,,2013-11-18,2013-11-18 1506 | 1505,CME,ED,2013,12,Z13,,,2013-12-16,2013-12-16 1507 | 1506,CME,ED,2014,1,F14,,,2014-01-13,2014-01-13 1508 | 1507,CME,ED,2014,2,G14,,,2014-02-14,2014-02-14 1509 | 1508,CME,ED,2014,3,H14,,,2014-03-17,2014-03-17 1510 | 1509,CME,ED,2014,4,J14,,,2014-04-14,2014-04-14 1511 | 1510,CME,ED,2014,5,K14,,,2014-05-19,2014-05-19 1512 | 1511,CME,ED,2014,6,M14,,,2014-06-16,2014-06-16 1513 | 1512,CME,ED,2014,7,N14,,,2014-07-14,2014-07-14 1514 | 1513,CME,ED,2014,8,Q14,,,2014-08-18,2014-08-18 1515 | 1514,CME,ED,2014,9,U14,,,2014-09-15,2014-09-15 1516 | 1515,CME,ED,2014,10,V14,,,2014-10-10,2014-10-10 1517 | 1516,CME,ED,2014,11,X14,,,2014-11-17,2014-11-17 1518 | 1517,CME,ED,2014,12,Z14,,,2014-12-15,2014-12-15 1519 | 1518,CME,ED,2015,1,F15,,,2015-01-16,2015-01-16 1520 | 1519,CME,ED,2015,2,G15,,,2015-02-13,2015-02-13 1521 | 1520,CME,ED,2015,3,H15,,,2015-03-16,2015-03-16 1522 | 1521,CME,ED,2015,4,J15,,,2015-04-13,2015-04-13 1523 | 1522,CME,ED,2015,5,K15,,,2015-05-18,2015-05-18 1524 | 1523,CME,ED,2015,6,M15,,,2015-06-15,2015-06-15 1525 | 1524,CME,ED,2015,7,N15,,,2015-07-13,2015-07-13 1526 | 1525,CME,ED,2015,8,Q15,,,2015-08-17,2015-08-17 1527 | 1526,CME,ED,2015,9,U15,,,2015-09-14,2015-09-14 1528 | 1527,CME,ED,2015,10,V15,,,2015-10-19,2015-10-19 1529 | 1528,CME,ED,2015,11,X15,,,2015-11-16,2015-11-16 1530 | 1529,CME,ED,2015,12,Z15,,,2015-12-14,2015-12-14 1531 | 1530,CME,ED,2016,1,F16,,,2016-01-15,2016-01-15 1532 | 1531,CME,ED,2016,2,G16,,,2016-02-12,2016-02-12 1533 | 1532,CME,ED,2016,3,H16,,,2016-03-14,2016-03-14 1534 | 1533,CME,ED,2016,4,J16,,,2016-04-18,2016-04-18 1535 | 1534,CME,ED,2016,5,K16,,,2016-05-16,2016-05-16 1536 | 1535,CME,ED,2016,6,M16,,,2016-06-13,2016-06-13 1537 | 1536,CME,ED,2016,7,N16,,,2016-07-18,2016-07-18 1538 | 1537,CME,ED,2016,8,Q16,,,2016-08-15,2016-08-15 1539 | 1538,CME,ED,2016,9,U16,,,2016-09-19,2016-09-19 1540 | 1539,CME,ED,2016,10,V16,,,2016-10-17,2016-10-17 1541 | 1540,CME,ED,2016,11,X16,,,2016-11-14,2016-11-14 1542 | 1541,CME,ED,2016,12,Z16,,,2016-12-19,2016-12-19 1543 | 1542,CME,ED,2017,1,F17,,,2017-01-13,2017-01-13 1544 | 1543,CME,ED,2017,2,G17,,,2017-02-13,2017-02-13 1545 | 1544,CME,ED,2017,3,H17,,,2017-03-13,2017-03-13 1546 | 1545,CME,ED,2017,4,J17,,,2017-04-17,2017-04-17 1547 | 1546,CME,ED,2017,5,K17,,,2017-05-15,2017-05-15 1548 | 1547,CME,ED,2017,6,M17,,,2017-06-19,2017-06-19 1549 | 1548,CME,ED,2017,7,N17,,,2017-07-17,2017-07-17 1550 | 1549,CME,ED,2017,8,Q17,,,2017-08-14,2017-08-14 1551 | 1550,CME,ED,2017,9,U17,,,2017-09-18,2017-09-18 1552 | 1551,CME,ED,2017,10,V17,,,2017-10-16,2017-10-16 1553 | 1552,CME,ED,2017,11,X17,,,2017-11-13,2017-11-13 1554 | 1553,CME,ED,2017,12,Z17,,,2017-12-18,2017-12-18 1555 | 1554,CME,ED,2018,1,F18,,,2018-01-12,2018-01-12 1556 | 1555,CME,ED,2018,2,G18,,,2018-02-16,2018-02-16 1557 | 1556,CME,ED,2018,3,H18,,,2018-03-19,2018-03-19 1558 | 1557,CME,ED,2018,4,J18,,,2018-04-16,2018-04-16 1559 | 1558,CME,ED,2018,5,K18,,,2018-05-14,2018-05-14 1560 | 1559,CME,ED,2018,6,M18,,,2018-06-18,2018-06-18 1561 | 1560,CME,ED,2018,7,N18,,,2018-07-16,2018-07-16 1562 | 1561,CME,ED,2018,8,Q18,,,2018-08-13,2018-08-13 1563 | 1562,CME,ED,2018,9,U18,,,2018-09-17,2018-09-17 1564 | 1563,CME,ED,2018,10,V18,,,2018-10-15,2018-10-15 1565 | 1564,CME,ED,2018,11,X18,,,2018-11-19,2018-11-19 1566 | 1565,CME,ED,2018,12,Z18,,,2018-12-17,2018-12-17 1567 | 1566,CME,ED,2019,1,F19,,,2019-01-14,2019-01-14 1568 | 1567,CME,ED,2019,2,G19,,,2019-02-15,2019-02-15 1569 | 1568,CME,ED,2019,3,H19,,,2019-03-18,2019-03-18 1570 | 1569,CME,ED,2019,4,J19,,,2019-04-15,2019-04-15 1571 | 1570,CME,ED,2019,5,K19,,,2019-05-13,2019-05-13 1572 | 1571,CME,ED,2019,6,M19,,,2019-06-17,2019-06-17 1573 | 1572,CME,ED,2019,7,N19,,,2019-07-15,2019-07-15 1574 | 1573,CME,ED,2019,8,Q19,,,2019-08-19,2019-08-19 1575 | 1574,CME,ED,2019,9,U19,,,2019-09-16,2019-09-16 1576 | 1575,CME,ED,2019,10,V19,,,2019-10-11,2019-10-11 1577 | 1576,CME,ED,2019,11,X19,,,2019-11-18,2019-11-18 1578 | 1577,CME,ED,2019,12,Z19,,,2019-12-16,2019-12-16 1579 | 1578,CME,ED,2020,1,F20,,,2020-01-13,2020-01-13 1580 | 1579,CME,ED,2020,2,G20,,,2020-02-14,2020-02-14 1581 | 1580,CME,ED,2020,3,H20,,,2020-03-16,2020-03-16 1582 | 1581,CME,ED,2020,4,J20,,,2020-04-13,2020-04-13 1583 | 1582,CME,ED,2020,5,K20,,,2020-05-18,2020-05-18 1584 | 1583,CME,ED,2020,6,M20,,,2020-06-15,2020-06-15 1585 | 1584,CME,ED,2020,7,N20,,,2020-07-13,2020-07-13 1586 | 1585,CME,ED,2020,8,Q20,,,2020-08-17,2020-08-17 1587 | 1586,CME,ED,2020,9,U20,,,2020-09-14,2020-09-14 1588 | 1587,CME,ED,2020,10,V20,,,2020-10-19,2020-10-19 1589 | 1588,CME,ED,2020,11,X20,,,2020-11-16,2020-11-16 1590 | 1589,CME,ED,2020,12,Z20,,,2020-12-14,2020-12-14 1591 | 1590,CME,ED,2021,1,F21,,,2021-01-15,2021-01-15 1592 | 1591,CME,ED,2021,2,G21,,,2021-02-12,2021-02-12 1593 | 1592,CME,ED,2021,3,H21,,,2021-03-15,2021-03-15 1594 | 1593,CME,ED,2021,4,J21,,,2021-04-19,2021-04-19 1595 | 1594,CME,ED,2021,5,K21,,,2021-05-17,2021-05-17 1596 | 1595,CME,ED,2021,6,M21,,,2021-06-14,2021-06-14 1597 | 1596,CME,ED,2021,7,N21,,,2021-07-19,2021-07-19 1598 | 1597,CME,ED,2021,8,Q21,,,2021-08-16,2021-08-16 1599 | 1598,CME,ED,2021,9,U21,,,2021-09-13,2021-09-13 1600 | 1599,CME,ED,2021,10,V21,,,2021-10-18,2021-10-18 1601 | 1600,CME,ED,2021,11,X21,,,2021-11-15,2021-11-15 1602 | 1601,CME,ED,2021,12,Z21,,,2021-12-13,2021-12-13 1603 | 1602,CME,ED,2022,1,F22,,,2022-01-14,2022-01-14 1604 | 1603,CME,ED,2022,2,G22,,,2022-02-14,2022-02-14 1605 | 1604,CME,ED,2022,3,H22,,,2022-03-14,2022-03-14 1606 | 1605,CME,ED,2022,4,J22,,,2022-04-18,2022-04-18 1607 | 1606,CME,ED,2022,5,K22,,,2022-05-16,2022-05-16 1608 | 1607,CME,ED,2022,6,M22,,,2022-06-13,2022-06-13 1609 | 1608,CME,ED,2022,7,N22,,,2022-07-18,2022-07-18 1610 | 1609,CME,ED,2022,8,Q22,,,2022-08-15,2022-08-15 1611 | 1610,CME,ED,2022,9,U22,,,2022-09-19,2022-09-19 1612 | 1611,CME,ED,2022,10,V22,,,2022-10-17,2022-10-17 1613 | 1612,CME,ED,2022,11,X22,,,2022-11-14,2022-11-14 1614 | 1613,CME,ED,2022,12,Z22,,,2022-12-19,2022-12-19 1615 | 1614,CME,ED,2023,1,F23,,,2023-01-13,2023-01-13 1616 | 1615,CME,ED,2023,2,G23,,,2023-02-13,2023-02-13 1617 | 1616,CME,ED,2023,3,H23,,,2023-03-13,2023-03-13 1618 | 1617,CME,ED,2023,4,J23,,,2023-04-17,2023-04-17 1619 | 1618,CME,ED,2023,5,K23,,,2023-05-15,2023-05-15 1620 | 1619,CME,ED,2023,6,M23,,,2023-06-19,2023-06-19 1621 | 1620,CME,ED,2023,7,N23,,,2023-07-17,2023-07-17 1622 | 1621,CME,ED,2023,8,Q23,,,2023-08-14,2023-08-14 1623 | 1622,CME,ED,2023,9,U23,,,2023-09-18,2023-09-18 1624 | 1623,CME,ED,2023,10,V23,,,2023-10-16,2023-10-16 1625 | 1624,CME,ED,2023,11,X23,,,2023-11-13,2023-11-13 1626 | 1625,CME,ED,2023,12,Z23,,,2023-12-18,2023-12-18 1627 | 1626,COMEX,GC,2013,8,Q13,,,2013-08-28,2013-07-25 1628 | 1627,COMEX,GC,2013,9,U13,,,2013-09-26,2013-08-27 1629 | 1628,COMEX,GC,2013,10,V13,,,2013-10-29,2013-09-25 1630 | 1629,COMEX,GC,2013,11,X13,,,2013-11-26,2013-10-28 1631 | 1630,COMEX,GC,2013,12,Z13,,,2013-12-27,2013-11-25 1632 | 1631,COMEX,GC,2014,1,F14,,,2014-01-29,2013-12-26 1633 | 1632,COMEX,GC,2014,2,G14,,,2014-02-26,2014-01-28 1634 | 1633,COMEX,GC,2014,3,H14,,,2014-03-27,2014-02-25 1635 | 1634,COMEX,GC,2014,4,J14,,,2014-04-28,2014-03-26 1636 | 1635,COMEX,GC,2014,5,K14,,,2014-05-28,2014-04-24 1637 | 1636,COMEX,GC,2014,6,M14,,,2014-06-26,2014-05-27 1638 | 1637,COMEX,GC,2014,7,N14,,,2014-07-29,2014-06-25 1639 | 1638,COMEX,GC,2014,8,Q14,,,2014-08-27,2014-07-28 1640 | 1639,COMEX,GC,2014,9,U14,,,2014-09-26,2014-08-26 1641 | 1640,COMEX,GC,2014,10,V14,,,2014-10-29,2014-09-25 1642 | 1641,COMEX,GC,2014,11,X14,,,2014-11-25,2014-10-28 1643 | 1642,COMEX,GC,2014,12,Z14,,,2014-12-29,2014-11-24 1644 | 1643,COMEX,GC,2015,1,F15,,,2015-01-28,2014-12-24 1645 | 1644,COMEX,GC,2015,2,G15,,,2015-02-25,2015-01-27 1646 | 1645,COMEX,GC,2015,3,H15,,,2015-03-27,2015-02-24 1647 | 1646,COMEX,GC,2015,4,J15,,,2015-04-28,2015-03-26 1648 | 1647,COMEX,GC,2015,5,K15,,,2015-05-27,2015-04-27 1649 | 1648,COMEX,GC,2015,6,M15,,,2015-06-26,2015-05-26 1650 | 1649,COMEX,GC,2015,7,N15,,,2015-07-29,2015-06-25 1651 | 1650,COMEX,GC,2015,8,Q15,,,2015-08-27,2015-07-28 1652 | 1651,COMEX,GC,2015,9,U15,,,2015-09-28,2015-08-26 1653 | 1652,COMEX,GC,2015,10,V15,,,2015-10-28,2015-09-24 1654 | 1653,COMEX,GC,2015,11,X15,,,2015-11-25,2015-10-27 1655 | 1654,COMEX,GC,2015,12,Z15,,,2015-12-29,2015-11-24 1656 | 1655,COMEX,GC,2016,1,F16,,,2016-01-27,2015-12-28 1657 | 1656,COMEX,GC,2016,2,G16,,,2016-02-25,2016-01-26 1658 | 1657,COMEX,GC,2016,3,H16,,,2016-03-29,2016-02-24 1659 | 1658,COMEX,GC,2016,4,J16,,,2016-04-27,2016-03-28 1660 | 1659,COMEX,GC,2016,5,K16,,,2016-05-26,2016-04-26 1661 | 1660,COMEX,GC,2016,6,M16,,,2016-06-28,2016-05-25 1662 | 1661,COMEX,GC,2016,7,N16,,,2016-07-27,2016-06-27 1663 | 1662,COMEX,GC,2016,8,Q16,,,2016-08-29,2016-07-26 1664 | 1663,COMEX,GC,2016,9,U16,,,2016-09-28,2016-08-25 1665 | 1664,COMEX,GC,2016,10,V16,,,2016-10-27,2016-09-27 1666 | 1665,COMEX,GC,2016,11,X16,,,2016-11-28,2016-10-26 1667 | 1666,COMEX,GC,2016,12,Z16,,,2016-12-28,2016-11-23 1668 | 1667,COMEX,GC,2017,1,F17,,,2017-01-27,2016-12-27 1669 | 1668,COMEX,GC,2017,2,G17,,,2017-02-24,2017-01-26 1670 | 1669,COMEX,GC,2017,3,H17,,,2017-03-29,2017-02-23 1671 | 1670,COMEX,GC,2017,4,J17,,,2017-04-26,2017-03-28 1672 | 1671,COMEX,GC,2017,5,K17,,,2017-05-26,2017-04-25 1673 | 1672,COMEX,GC,2017,6,M17,,,2017-06-28,2017-05-25 1674 | 1673,COMEX,GC,2017,7,N17,,,2017-07-27,2017-06-27 1675 | 1674,COMEX,GC,2017,8,Q17,,,2017-08-29,2017-07-26 1676 | 1675,COMEX,GC,2017,9,U17,,,2017-09-27,2017-08-28 1677 | 1676,COMEX,GC,2017,10,V17,,,2017-10-27,2017-09-26 1678 | 1677,COMEX,GC,2017,11,X17,,,2017-11-28,2017-10-26 1679 | 1678,COMEX,GC,2017,12,Z17,,,2017-12-27,2017-11-27 1680 | 1679,COMEX,GC,2018,1,F18,,,2018-01-29,2017-12-26 1681 | 1680,COMEX,GC,2018,2,G18,,,2018-02-26,2018-01-25 1682 | 1681,COMEX,GC,2018,3,H18,,,2018-03-28,2018-02-22 1683 | 1682,COMEX,GC,2018,4,J18,,,2018-04-26,2018-03-27 1684 | 1683,COMEX,GC,2018,5,K18,,,2018-05-29,2018-04-25 1685 | 1684,COMEX,GC,2018,6,M18,,,2018-06-27,2018-05-24 1686 | 1685,COMEX,GC,2018,7,N18,,,2018-07-27,2018-06-26 1687 | 1686,COMEX,GC,2018,8,Q18,,,2018-08-29,2018-07-26 1688 | 1687,COMEX,GC,2018,9,U18,,,2018-09-26,2018-08-28 1689 | 1688,COMEX,GC,2018,10,V18,,,2018-10-29,2018-09-25 1690 | 1689,COMEX,GC,2018,11,X18,,,2018-11-28,2018-10-25 1691 | 1690,COMEX,GC,2018,12,Z18,,,2018-12-27,2018-11-27 1692 | 1691,COMEX,GC,2019,1,F19,,,2019-01-29,2018-12-26 1693 | 1692,COMEX,GC,2019,2,G19,,,2019-02-26,2019-01-28 1694 | 1693,COMEX,GC,2019,3,H19,,,2019-03-27,2019-02-25 1695 | 1694,COMEX,GC,2019,4,J19,,,2019-04-26,2019-03-26 1696 | 1695,COMEX,GC,2019,5,K19,,,2019-05-29,2019-04-25 1697 | 1696,COMEX,GC,2019,6,M19,,,2019-06-26,2019-05-28 1698 | 1697,COMEX,GC,2019,7,N19,,,2019-07-29,2019-06-25 1699 | 1698,COMEX,GC,2019,8,Q19,,,2019-08-28,2019-07-25 1700 | 1699,COMEX,GC,2019,9,U19,,,2019-09-26,2019-08-27 1701 | 1700,COMEX,GC,2019,10,V19,,,2019-10-29,2019-09-25 1702 | 1701,COMEX,GC,2019,11,X19,,,2019-11-26,2019-10-28 1703 | 1702,COMEX,GC,2019,12,Z19,,,2019-12-27,2019-11-25 1704 | 1703,COMEX,GC,2020,1,F20,,,2020-01-29,2019-12-26 1705 | 1704,COMEX,GC,2020,2,G20,,,2020-02-26,2020-01-28 1706 | 1705,COMEX,GC,2020,3,H20,,,2020-03-27,2020-02-25 1707 | 1706,COMEX,GC,2020,4,J20,,,2020-04-28,2020-03-26 1708 | 1707,COMEX,GC,2020,5,K20,,,2020-05-27,2020-04-27 1709 | 1708,COMEX,GC,2020,6,M20,,,2020-06-26,2020-05-26 1710 | 1709,COMEX,GC,2020,7,N20,,,2020-07-29,2020-06-25 1711 | 1710,COMEX,GC,2020,8,Q20,,,2020-08-27,2020-07-28 1712 | 1711,COMEX,GC,2020,9,U20,,,2020-09-28,2020-08-26 1713 | 1712,COMEX,GC,2020,10,V20,,,2020-10-28,2020-09-24 1714 | 1713,COMEX,GC,2020,11,X20,,,2020-11-25,2020-10-27 1715 | 1714,COMEX,GC,2020,12,Z20,,,2020-12-29,2020-11-24 1716 | 1715,COMEX,GC,2021,1,F21,,,2021-01-27,2020-12-28 1717 | 1716,COMEX,GC,2021,2,G21,,,2021-02-24,2021-01-26 1718 | 1717,COMEX,GC,2021,3,H21,,,2021-03-29,2021-02-23 1719 | 1718,COMEX,GC,2021,4,J21,,,2021-04-28,2021-03-25 1720 | 1719,COMEX,GC,2021,5,K21,,,2021-05-26,2021-04-27 1721 | 1720,COMEX,GC,2021,6,M21,,,2021-06-28,2021-05-25 1722 | 1721,COMEX,GC,2021,7,N21,,,2021-07-28,2021-06-24 1723 | 1722,COMEX,GC,2021,8,Q21,,,2021-08-27,2021-07-27 1724 | 1723,COMEX,GC,2021,9,U21,,,2021-09-28,2021-08-26 1725 | 1724,COMEX,GC,2021,10,V21,,,2021-10-27,2021-09-27 1726 | 1725,COMEX,GC,2021,11,X21,,,2021-11-26,2021-10-26 1727 | 1726,COMEX,GC,2021,12,Z21,,,2021-12-29,2021-11-23 1728 | 1727,COMEX,GC,2022,1,F22,,,2022-01-27,2021-12-28 1729 | 1728,COMEX,GC,2022,2,G22,,,2022-02-24,2022-01-26 1730 | 1729,COMEX,GC,2022,3,H22,,,2022-03-29,2022-02-23 1731 | 1730,COMEX,GC,2022,4,J22,,,2022-04-27,2022-03-28 1732 | 1731,COMEX,GC,2022,5,K22,,,2022-05-26,2022-04-26 1733 | 1732,COMEX,GC,2022,6,M22,,,2022-06-28,2022-05-25 1734 | 1733,COMEX,GC,2022,7,N22,,,2022-07-27,2022-06-27 1735 | 1734,COMEX,GC,2022,8,Q22,,,2022-08-29,2022-07-26 1736 | 1735,COMEX,GC,2022,9,U22,,,2022-09-28,2022-08-25 1737 | 1736,COMEX,GC,2022,10,V22,,,2022-10-27,2022-09-27 1738 | 1737,COMEX,GC,2022,11,X22,,,2022-11-28,2022-10-26 1739 | 1738,COMEX,GC,2022,12,Z22,,,2022-12-28,2022-11-23 1740 | 1739,COMEX,GC,2023,1,F23,,,2023-01-27,2022-12-27 1741 | 1740,COMEX,GC,2023,2,G23,,,2023-02-24,2023-01-26 1742 | 1741,COMEX,GC,2023,3,H23,,,2023-03-29,2023-02-23 1743 | 1742,COMEX,GC,2023,4,J23,,,2023-04-26,2023-03-28 1744 | 1743,COMEX,GC,2023,5,K23,,,2023-05-26,2023-04-25 1745 | 1744,COMEX,GC,2023,6,M23,,,2023-06-28,2023-05-25 1746 | 1745,COMEX,GC,2023,7,N23,,,2023-07-27,2023-06-27 1747 | 1746,COMEX,GC,2023,8,Q23,,,2023-08-29,2023-07-26 1748 | 1747,COMEX,GC,2023,9,U23,,,2023-09-27,2023-08-28 1749 | 1748,COMEX,GC,2023,10,V23,,,2023-10-27,2023-09-26 1750 | 1749,COMEX,GC,2023,11,X23,,,2023-11-28,2023-10-26 1751 | 1750,COMEX,GC,2023,12,Z23,,,2023-12-27,2023-11-27 1752 | 1751,COMEX,SI,2013,8,Q13,,,2013-08-28,2013-07-25 1753 | 1752,COMEX,SI,2013,9,U13,,,2013-09-26,2013-08-27 1754 | 1753,COMEX,SI,2013,10,V13,,,2013-10-29,2013-09-25 1755 | 1754,COMEX,SI,2013,11,X13,,,2013-11-26,2013-10-28 1756 | 1755,COMEX,SI,2013,12,Z13,,,2013-12-27,2013-11-25 1757 | 1756,COMEX,SI,2014,1,F14,,,2014-01-29,2013-12-26 1758 | 1757,COMEX,SI,2014,2,G14,,,2014-02-26,2014-01-28 1759 | 1758,COMEX,SI,2014,3,H14,,,2014-03-27,2014-02-25 1760 | 1759,COMEX,SI,2014,4,J14,,,2014-04-28,2014-03-26 1761 | 1760,COMEX,SI,2014,5,K14,,,2014-05-28,2014-04-24 1762 | 1761,COMEX,SI,2014,6,M14,,,2014-06-26,2014-05-27 1763 | 1762,COMEX,SI,2014,7,N14,,,2014-07-29,2014-06-25 1764 | 1763,COMEX,SI,2014,8,Q14,,,2014-08-27,2014-07-28 1765 | 1764,COMEX,SI,2014,9,U14,,,2014-09-26,2014-08-26 1766 | 1765,COMEX,SI,2014,10,V14,,,2014-10-29,2014-09-25 1767 | 1766,COMEX,SI,2014,11,X14,,,2014-11-25,2014-10-28 1768 | 1767,COMEX,SI,2014,12,Z14,,,2014-12-29,2014-11-24 1769 | 1768,COMEX,SI,2015,1,F15,,,2015-01-28,2014-12-24 1770 | 1769,COMEX,SI,2015,2,G15,,,2015-02-25,2015-01-27 1771 | 1770,COMEX,SI,2015,3,H15,,,2015-03-27,2015-02-24 1772 | 1771,COMEX,SI,2015,4,J15,,,2015-04-28,2015-03-26 1773 | 1772,COMEX,SI,2015,5,K15,,,2015-05-27,2015-04-27 1774 | 1773,COMEX,SI,2015,6,M15,,,2015-06-26,2015-05-26 1775 | 1774,COMEX,SI,2015,7,N15,,,2015-07-29,2015-06-25 1776 | 1775,COMEX,SI,2015,8,Q15,,,2015-08-27,2015-07-28 1777 | 1776,COMEX,SI,2015,9,U15,,,2015-09-28,2015-08-26 1778 | 1777,COMEX,SI,2015,10,V15,,,2015-10-28,2015-09-24 1779 | 1778,COMEX,SI,2015,11,X15,,,2015-11-25,2015-10-27 1780 | 1779,COMEX,SI,2015,12,Z15,,,2015-12-29,2015-11-24 1781 | 1780,COMEX,SI,2016,1,F16,,,2016-01-27,2015-12-28 1782 | 1781,COMEX,SI,2016,2,G16,,,2016-02-25,2016-01-26 1783 | 1782,COMEX,SI,2016,3,H16,,,2016-03-29,2016-02-24 1784 | 1783,COMEX,SI,2016,4,J16,,,2016-04-27,2016-03-28 1785 | 1784,COMEX,SI,2016,5,K16,,,2016-05-26,2016-04-26 1786 | 1785,COMEX,SI,2016,6,M16,,,2016-06-28,2016-05-25 1787 | 1786,COMEX,SI,2016,7,N16,,,2016-07-27,2016-06-27 1788 | 1787,COMEX,SI,2016,8,Q16,,,2016-08-29,2016-07-26 1789 | 1788,COMEX,SI,2016,9,U16,,,2016-09-28,2016-08-25 1790 | 1789,COMEX,SI,2016,10,V16,,,2016-10-27,2016-09-27 1791 | 1790,COMEX,SI,2016,11,X16,,,2016-11-28,2016-10-26 1792 | 1791,COMEX,SI,2016,12,Z16,,,2016-12-28,2016-11-23 1793 | 1792,COMEX,SI,2017,1,F17,,,2017-01-27,2016-12-27 1794 | 1793,COMEX,SI,2017,2,G17,,,2017-02-24,2017-01-26 1795 | 1794,COMEX,SI,2017,3,H17,,,2017-03-29,2017-02-23 1796 | 1795,COMEX,SI,2017,4,J17,,,2017-04-26,2017-03-28 1797 | 1796,COMEX,SI,2017,5,K17,,,2017-05-26,2017-04-25 1798 | 1797,COMEX,SI,2017,6,M17,,,2017-06-28,2017-05-25 1799 | 1798,COMEX,SI,2017,7,N17,,,2017-07-27,2017-06-27 1800 | 1799,COMEX,SI,2017,8,Q17,,,2017-08-29,2017-07-26 1801 | 1800,COMEX,SI,2017,9,U17,,,2017-09-27,2017-08-28 1802 | 1801,COMEX,SI,2017,10,V17,,,2017-10-27,2017-09-26 1803 | 1802,COMEX,SI,2017,11,X17,,,2017-11-28,2017-10-26 1804 | 1803,COMEX,SI,2017,12,Z17,,,2017-12-27,2017-11-27 1805 | 1804,COMEX,SI,2018,1,F18,,,2018-01-29,2017-12-26 1806 | 1805,COMEX,SI,2018,2,G18,,,2018-02-26,2018-01-25 1807 | 1806,COMEX,SI,2018,3,H18,,,2018-03-28,2018-02-22 1808 | 1807,COMEX,SI,2018,4,J18,,,2018-04-26,2018-03-27 1809 | 1808,COMEX,SI,2018,5,K18,,,2018-05-29,2018-04-25 1810 | 1809,COMEX,SI,2018,6,M18,,,2018-06-27,2018-05-24 1811 | 1810,COMEX,SI,2018,7,N18,,,2018-07-27,2018-06-26 1812 | 1811,COMEX,SI,2018,8,Q18,,,2018-08-29,2018-07-26 1813 | 1812,COMEX,SI,2018,9,U18,,,2018-09-26,2018-08-28 1814 | 1813,COMEX,SI,2018,10,V18,,,2018-10-29,2018-09-25 1815 | 1814,COMEX,SI,2018,11,X18,,,2018-11-28,2018-10-25 1816 | 1815,COMEX,SI,2018,12,Z18,,,2018-12-27,2018-11-27 1817 | 1816,COMEX,SI,2019,1,F19,,,2019-01-29,2018-12-26 1818 | 1817,COMEX,SI,2019,2,G19,,,2019-02-26,2019-01-28 1819 | 1818,COMEX,SI,2019,3,H19,,,2019-03-27,2019-02-25 1820 | 1819,COMEX,SI,2019,4,J19,,,2019-04-26,2019-03-26 1821 | 1820,COMEX,SI,2019,5,K19,,,2019-05-29,2019-04-25 1822 | 1821,COMEX,SI,2019,6,M19,,,2019-06-26,2019-05-28 1823 | 1822,COMEX,SI,2019,7,N19,,,2019-07-29,2019-06-25 1824 | 1823,COMEX,SI,2019,8,Q19,,,2019-08-28,2019-07-25 1825 | 1824,COMEX,SI,2019,9,U19,,,2019-09-26,2019-08-27 1826 | 1825,COMEX,SI,2019,10,V19,,,2019-10-29,2019-09-25 1827 | 1826,COMEX,SI,2019,11,X19,,,2019-11-26,2019-10-28 1828 | 1827,COMEX,SI,2019,12,Z19,,,2019-12-27,2019-11-25 1829 | 1828,COMEX,SI,2020,1,F20,,,2020-01-29,2019-12-26 1830 | 1829,COMEX,SI,2020,2,G20,,,2020-02-26,2020-01-28 1831 | 1830,COMEX,SI,2020,3,H20,,,2020-03-27,2020-02-25 1832 | 1831,COMEX,SI,2020,4,J20,,,2020-04-28,2020-03-26 1833 | 1832,COMEX,SI,2020,5,K20,,,2020-05-27,2020-04-27 1834 | 1833,COMEX,SI,2020,6,M20,,,2020-06-26,2020-05-26 1835 | 1834,COMEX,SI,2020,7,N20,,,2020-07-29,2020-06-25 1836 | 1835,COMEX,SI,2020,8,Q20,,,2020-08-27,2020-07-28 1837 | 1836,COMEX,SI,2020,9,U20,,,2020-09-28,2020-08-26 1838 | 1837,COMEX,SI,2020,10,V20,,,2020-10-28,2020-09-24 1839 | 1838,COMEX,SI,2020,11,X20,,,2020-11-25,2020-10-27 1840 | 1839,COMEX,SI,2020,12,Z20,,,2020-12-29,2020-11-24 1841 | 1840,COMEX,SI,2021,1,F21,,,2021-01-27,2020-12-28 1842 | 1841,COMEX,SI,2021,2,G21,,,2021-02-24,2021-01-26 1843 | 1842,COMEX,SI,2021,3,H21,,,2021-03-29,2021-02-23 1844 | 1843,COMEX,SI,2021,4,J21,,,2021-04-28,2021-03-25 1845 | 1844,COMEX,SI,2021,5,K21,,,2021-05-26,2021-04-27 1846 | 1845,COMEX,SI,2021,6,M21,,,2021-06-28,2021-05-25 1847 | 1846,COMEX,SI,2021,7,N21,,,2021-07-28,2021-06-24 1848 | 1847,COMEX,SI,2021,8,Q21,,,2021-08-27,2021-07-27 1849 | 1848,COMEX,SI,2021,9,U21,,,2021-09-28,2021-08-26 1850 | 1849,COMEX,SI,2021,10,V21,,,2021-10-27,2021-09-27 1851 | 1850,COMEX,SI,2021,11,X21,,,2021-11-26,2021-10-26 1852 | 1851,COMEX,SI,2021,12,Z21,,,2021-12-29,2021-11-23 1853 | 1852,COMEX,SI,2022,1,F22,,,2022-01-27,2021-12-28 1854 | 1853,COMEX,SI,2022,2,G22,,,2022-02-24,2022-01-26 1855 | 1854,COMEX,SI,2022,3,H22,,,2022-03-29,2022-02-23 1856 | 1855,COMEX,SI,2022,4,J22,,,2022-04-27,2022-03-28 1857 | 1856,COMEX,SI,2022,5,K22,,,2022-05-26,2022-04-26 1858 | 1857,COMEX,SI,2022,6,M22,,,2022-06-28,2022-05-25 1859 | 1858,COMEX,SI,2022,7,N22,,,2022-07-27,2022-06-27 1860 | 1859,COMEX,SI,2022,8,Q22,,,2022-08-29,2022-07-26 1861 | 1860,COMEX,SI,2022,9,U22,,,2022-09-28,2022-08-25 1862 | 1861,COMEX,SI,2022,10,V22,,,2022-10-27,2022-09-27 1863 | 1862,COMEX,SI,2022,11,X22,,,2022-11-28,2022-10-26 1864 | 1863,COMEX,SI,2022,12,Z22,,,2022-12-28,2022-11-23 1865 | 1864,COMEX,SI,2023,1,F23,,,2023-01-27,2022-12-27 1866 | 1865,COMEX,SI,2023,2,G23,,,2023-02-24,2023-01-26 1867 | 1866,COMEX,SI,2023,3,H23,,,2023-03-29,2023-02-23 1868 | 1867,COMEX,SI,2023,4,J23,,,2023-04-26,2023-03-28 1869 | 1868,COMEX,SI,2023,5,K23,,,2023-05-26,2023-04-25 1870 | 1869,COMEX,SI,2023,6,M23,,,2023-06-28,2023-05-25 1871 | 1870,COMEX,SI,2023,7,N23,,,2023-07-27,2023-06-27 1872 | 1871,COMEX,SI,2023,8,Q23,,,2023-08-29,2023-07-26 1873 | 1872,COMEX,SI,2023,9,U23,,,2023-09-27,2023-08-28 1874 | 1873,COMEX,SI,2023,10,V23,,,2023-10-27,2023-09-26 1875 | 1874,COMEX,SI,2023,11,X23,,,2023-11-28,2023-10-26 1876 | 1875,COMEX,SI,2023,12,Z23,,,2023-12-27,2023-11-27 1877 | 1876,COMEX,HG,2013,8,Q13,,,2013-08-28,2013-07-25 1878 | 1877,COMEX,HG,2013,9,U13,,,2013-09-26,2013-08-27 1879 | 1878,COMEX,HG,2013,10,V13,,,2013-10-29,2013-09-25 1880 | 1879,COMEX,HG,2013,11,X13,,,2013-11-26,2013-10-28 1881 | 1880,COMEX,HG,2013,12,Z13,,,2013-12-27,2013-11-25 1882 | 1881,COMEX,HG,2014,1,F14,,,2014-01-29,2013-12-26 1883 | 1882,COMEX,HG,2014,2,G14,,,2014-02-26,2014-01-28 1884 | 1883,COMEX,HG,2014,3,H14,,,2014-03-27,2014-02-25 1885 | 1884,COMEX,HG,2014,4,J14,,,2014-04-28,2014-03-26 1886 | 1885,COMEX,HG,2014,5,K14,,,2014-05-28,2014-04-24 1887 | 1886,COMEX,HG,2014,6,M14,,,2014-06-26,2014-05-27 1888 | 1887,COMEX,HG,2014,7,N14,,,2014-07-29,2014-06-25 1889 | 1888,COMEX,HG,2014,8,Q14,,,2014-08-27,2014-07-28 1890 | 1889,COMEX,HG,2014,9,U14,,,2014-09-26,2014-08-26 1891 | 1890,COMEX,HG,2014,10,V14,,,2014-10-29,2014-09-25 1892 | 1891,COMEX,HG,2014,11,X14,,,2014-11-25,2014-10-28 1893 | 1892,COMEX,HG,2014,12,Z14,,,2014-12-29,2014-11-24 1894 | 1893,COMEX,HG,2015,1,F15,,,2015-01-28,2014-12-24 1895 | 1894,COMEX,HG,2015,2,G15,,,2015-02-25,2015-01-27 1896 | 1895,COMEX,HG,2015,3,H15,,,2015-03-27,2015-02-24 1897 | 1896,COMEX,HG,2015,4,J15,,,2015-04-28,2015-03-26 1898 | 1897,COMEX,HG,2015,5,K15,,,2015-05-27,2015-04-27 1899 | 1898,COMEX,HG,2015,6,M15,,,2015-06-26,2015-05-26 1900 | 1899,COMEX,HG,2015,7,N15,,,2015-07-29,2015-06-25 1901 | 1900,COMEX,HG,2015,8,Q15,,,2015-08-27,2015-07-28 1902 | 1901,COMEX,HG,2015,9,U15,,,2015-09-28,2015-08-26 1903 | 1902,COMEX,HG,2015,10,V15,,,2015-10-28,2015-09-24 1904 | 1903,COMEX,HG,2015,11,X15,,,2015-11-25,2015-10-27 1905 | 1904,COMEX,HG,2015,12,Z15,,,2015-12-29,2015-11-24 1906 | 1905,COMEX,HG,2016,1,F16,,,2016-01-27,2015-12-28 1907 | 1906,COMEX,HG,2016,2,G16,,,2016-02-25,2016-01-26 1908 | 1907,COMEX,HG,2016,3,H16,,,2016-03-29,2016-02-24 1909 | 1908,COMEX,HG,2016,4,J16,,,2016-04-27,2016-03-28 1910 | 1909,COMEX,HG,2016,5,K16,,,2016-05-26,2016-04-26 1911 | 1910,COMEX,HG,2016,6,M16,,,2016-06-28,2016-05-25 1912 | 1911,COMEX,HG,2016,7,N16,,,2016-07-27,2016-06-27 1913 | 1912,COMEX,HG,2016,8,Q16,,,2016-08-29,2016-07-26 1914 | 1913,COMEX,HG,2016,9,U16,,,2016-09-28,2016-08-25 1915 | 1914,COMEX,HG,2016,10,V16,,,2016-10-27,2016-09-27 1916 | 1915,COMEX,HG,2016,11,X16,,,2016-11-28,2016-10-26 1917 | 1916,COMEX,HG,2016,12,Z16,,,2016-12-28,2016-11-23 1918 | 1917,COMEX,HG,2017,1,F17,,,2017-01-27,2016-12-27 1919 | 1918,COMEX,HG,2017,2,G17,,,2017-02-24,2017-01-26 1920 | 1919,COMEX,HG,2017,3,H17,,,2017-03-29,2017-02-23 1921 | 1920,COMEX,HG,2017,4,J17,,,2017-04-26,2017-03-28 1922 | 1921,COMEX,HG,2017,5,K17,,,2017-05-26,2017-04-25 1923 | 1922,COMEX,HG,2017,6,M17,,,2017-06-28,2017-05-25 1924 | 1923,COMEX,HG,2017,7,N17,,,2017-07-27,2017-06-27 1925 | 1924,COMEX,HG,2017,8,Q17,,,2017-08-29,2017-07-26 1926 | 1925,COMEX,HG,2017,9,U17,,,2017-09-27,2017-08-28 1927 | 1926,COMEX,HG,2017,10,V17,,,2017-10-27,2017-09-26 1928 | 1927,COMEX,HG,2017,11,X17,,,2017-11-28,2017-10-26 1929 | 1928,COMEX,HG,2017,12,Z17,,,2017-12-27,2017-11-27 1930 | 1929,COMEX,HG,2018,1,F18,,,2018-01-29,2017-12-26 1931 | 1930,COMEX,HG,2018,2,G18,,,2018-02-26,2018-01-25 1932 | 1931,COMEX,HG,2018,3,H18,,,2018-03-28,2018-02-22 1933 | 1932,COMEX,HG,2018,4,J18,,,2018-04-26,2018-03-27 1934 | 1933,COMEX,HG,2018,5,K18,,,2018-05-29,2018-04-25 1935 | 1934,COMEX,HG,2018,6,M18,,,2018-06-27,2018-05-24 1936 | 1935,COMEX,HG,2018,7,N18,,,2018-07-27,2018-06-26 1937 | 1936,COMEX,HG,2018,8,Q18,,,2018-08-29,2018-07-26 1938 | 1937,COMEX,HG,2018,9,U18,,,2018-09-26,2018-08-28 1939 | 1938,COMEX,HG,2018,10,V18,,,2018-10-29,2018-09-25 1940 | 1939,COMEX,HG,2018,11,X18,,,2018-11-28,2018-10-25 1941 | 1940,COMEX,HG,2018,12,Z18,,,2018-12-27,2018-11-27 1942 | 1941,COMEX,HG,2019,1,F19,,,2019-01-29,2018-12-26 1943 | 1942,COMEX,HG,2019,2,G19,,,2019-02-26,2019-01-28 1944 | 1943,COMEX,HG,2019,3,H19,,,2019-03-27,2019-02-25 1945 | 1944,COMEX,HG,2019,4,J19,,,2019-04-26,2019-03-26 1946 | 1945,COMEX,HG,2019,5,K19,,,2019-05-29,2019-04-25 1947 | 1946,COMEX,HG,2019,6,M19,,,2019-06-26,2019-05-28 1948 | 1947,COMEX,HG,2019,7,N19,,,2019-07-29,2019-06-25 1949 | 1948,COMEX,HG,2019,8,Q19,,,2019-08-28,2019-07-25 1950 | 1949,COMEX,HG,2019,9,U19,,,2019-09-26,2019-08-27 1951 | 1950,COMEX,HG,2019,10,V19,,,2019-10-29,2019-09-25 1952 | 1951,COMEX,HG,2019,11,X19,,,2019-11-26,2019-10-28 1953 | 1952,COMEX,HG,2019,12,Z19,,,2019-12-27,2019-11-25 1954 | 1953,COMEX,HG,2020,1,F20,,,2020-01-29,2019-12-26 1955 | 1954,COMEX,HG,2020,2,G20,,,2020-02-26,2020-01-28 1956 | 1955,COMEX,HG,2020,3,H20,,,2020-03-27,2020-02-25 1957 | 1956,COMEX,HG,2020,4,J20,,,2020-04-28,2020-03-26 1958 | 1957,COMEX,HG,2020,5,K20,,,2020-05-27,2020-04-27 1959 | 1958,COMEX,HG,2020,6,M20,,,2020-06-26,2020-05-26 1960 | 1959,COMEX,HG,2020,7,N20,,,2020-07-29,2020-06-25 1961 | 1960,COMEX,HG,2020,8,Q20,,,2020-08-27,2020-07-28 1962 | 1961,COMEX,HG,2020,9,U20,,,2020-09-28,2020-08-26 1963 | 1962,COMEX,HG,2020,10,V20,,,2020-10-28,2020-09-24 1964 | 1963,COMEX,HG,2020,11,X20,,,2020-11-25,2020-10-27 1965 | 1964,COMEX,HG,2020,12,Z20,,,2020-12-29,2020-11-24 1966 | 1965,COMEX,HG,2021,1,F21,,,2021-01-27,2020-12-28 1967 | 1966,COMEX,HG,2021,2,G21,,,2021-02-24,2021-01-26 1968 | 1967,COMEX,HG,2021,3,H21,,,2021-03-29,2021-02-23 1969 | 1968,COMEX,HG,2021,4,J21,,,2021-04-28,2021-03-25 1970 | 1969,COMEX,HG,2021,5,K21,,,2021-05-26,2021-04-27 1971 | 1970,COMEX,HG,2021,6,M21,,,2021-06-28,2021-05-25 1972 | 1971,COMEX,HG,2021,7,N21,,,2021-07-28,2021-06-24 1973 | 1972,COMEX,HG,2021,8,Q21,,,2021-08-27,2021-07-27 1974 | 1973,COMEX,HG,2021,9,U21,,,2021-09-28,2021-08-26 1975 | 1974,COMEX,HG,2021,10,V21,,,2021-10-27,2021-09-27 1976 | 1975,COMEX,HG,2021,11,X21,,,2021-11-26,2021-10-26 1977 | 1976,COMEX,HG,2021,12,Z21,,,2021-12-29,2021-11-23 1978 | 1977,COMEX,HG,2022,1,F22,,,2022-01-27,2021-12-28 1979 | 1978,COMEX,HG,2022,2,G22,,,2022-02-24,2022-01-26 1980 | 1979,COMEX,HG,2022,3,H22,,,2022-03-29,2022-02-23 1981 | 1980,COMEX,HG,2022,4,J22,,,2022-04-27,2022-03-28 1982 | 1981,COMEX,HG,2022,5,K22,,,2022-05-26,2022-04-26 1983 | 1982,COMEX,HG,2022,6,M22,,,2022-06-28,2022-05-25 1984 | 1983,COMEX,HG,2022,7,N22,,,2022-07-27,2022-06-27 1985 | 1984,COMEX,HG,2022,8,Q22,,,2022-08-29,2022-07-26 1986 | 1985,COMEX,HG,2022,9,U22,,,2022-09-28,2022-08-25 1987 | 1986,COMEX,HG,2022,10,V22,,,2022-10-27,2022-09-27 1988 | 1987,COMEX,HG,2022,11,X22,,,2022-11-28,2022-10-26 1989 | 1988,COMEX,HG,2022,12,Z22,,,2022-12-28,2022-11-23 1990 | 1989,COMEX,HG,2023,1,F23,,,2023-01-27,2022-12-27 1991 | 1990,COMEX,HG,2023,2,G23,,,2023-02-24,2023-01-26 1992 | 1991,COMEX,HG,2023,3,H23,,,2023-03-29,2023-02-23 1993 | 1992,COMEX,HG,2023,4,J23,,,2023-04-26,2023-03-28 1994 | 1993,COMEX,HG,2023,5,K23,,,2023-05-26,2023-04-25 1995 | 1994,COMEX,HG,2023,6,M23,,,2023-06-28,2023-05-25 1996 | 1995,COMEX,HG,2023,7,N23,,,2023-07-27,2023-06-27 1997 | 1996,COMEX,HG,2023,8,Q23,,,2023-08-29,2023-07-26 1998 | 1997,COMEX,HG,2023,9,U23,,,2023-09-27,2023-08-28 1999 | 1998,COMEX,HG,2023,10,V23,,,2023-10-27,2023-09-26 2000 | 1999,COMEX,HG,2023,11,X23,,,2023-11-28,2023-10-26 2001 | 2000,COMEX,HG,2023,12,Z23,,,2023-12-27,2023-11-27 2002 | 2001,NYMEX,PL,2013,8,Q13,,,2013-08-28,2013-07-17 2003 | 2002,NYMEX,PL,2013,9,U13,,,2013-09-26,2013-08-21 2004 | 2003,NYMEX,PL,2013,10,V13,,,2013-10-29,2013-09-18 2005 | 2004,NYMEX,PL,2013,11,X13,,,2013-11-26,2013-10-16 2006 | 2005,NYMEX,PL,2013,12,Z13,,,2013-12-27,2013-11-20 2007 | 2006,NYMEX,PL,2014,1,F14,,,2014-01-29,2013-12-18 2008 | 2007,NYMEX,PL,2014,2,G14,,,2014-02-26,2014-01-15 2009 | 2008,NYMEX,PL,2014,3,H14,,,2014-03-27,2014-02-19 2010 | 2009,NYMEX,PL,2014,4,J14,,,2014-04-28,2014-03-19 2011 | 2010,NYMEX,PL,2014,5,K14,,,2014-05-28,2014-04-16 2012 | 2011,NYMEX,PL,2014,6,M14,,,2014-06-26,2014-05-21 2013 | 2012,NYMEX,PL,2014,7,N14,,,2014-07-29,2014-06-18 2014 | 2013,NYMEX,PL,2014,8,Q14,,,2014-08-27,2014-07-16 2015 | 2014,NYMEX,PL,2014,9,U14,,,2014-09-26,2014-08-20 2016 | 2015,NYMEX,PL,2014,10,V14,,,2014-10-29,2014-09-17 2017 | 2016,NYMEX,PL,2014,11,X14,,,2014-11-25,2014-10-15 2018 | 2017,NYMEX,PL,2014,12,Z14,,,2014-12-29,2014-11-19 2019 | 2018,NYMEX,PL,2015,1,F15,,,2015-01-28,2014-12-17 2020 | 2019,NYMEX,PL,2015,2,G15,,,2015-02-25,2015-01-21 2021 | 2020,NYMEX,PL,2015,3,H15,,,2015-03-27,2015-02-18 2022 | 2021,NYMEX,PL,2015,4,J15,,,2015-04-28,2015-03-18 2023 | 2022,NYMEX,PL,2015,5,K15,,,2015-05-27,2015-04-15 2024 | 2023,NYMEX,PL,2015,6,M15,,,2015-06-26,2015-05-20 2025 | 2024,NYMEX,PL,2015,7,N15,,,2015-07-29,2015-06-17 2026 | 2025,NYMEX,PL,2015,8,Q15,,,2015-08-27,2015-07-15 2027 | 2026,NYMEX,PL,2015,9,U15,,,2015-09-28,2015-08-19 2028 | 2027,NYMEX,PL,2015,10,V15,,,2015-10-28,2015-09-16 2029 | 2028,NYMEX,PL,2015,11,X15,,,2015-11-25,2015-10-21 2030 | 2029,NYMEX,PL,2015,12,Z15,,,2015-12-29,2015-11-18 2031 | 2030,NYMEX,PL,2016,1,F16,,,2016-01-27,2015-12-16 2032 | 2031,NYMEX,PL,2016,2,G16,,,2016-02-25,2016-01-20 2033 | 2032,NYMEX,PL,2016,3,H16,,,2016-03-29,2016-02-17 2034 | 2033,NYMEX,PL,2016,4,J16,,,2016-04-27,2016-03-16 2035 | 2034,NYMEX,PL,2016,5,K16,,,2016-05-26,2016-04-20 2036 | 2035,NYMEX,PL,2016,6,M16,,,2016-06-28,2016-05-18 2037 | 2036,NYMEX,PL,2016,7,N16,,,2016-07-27,2016-06-15 2038 | 2037,NYMEX,PL,2016,8,Q16,,,2016-08-29,2016-07-20 2039 | 2038,NYMEX,PL,2016,9,U16,,,2016-09-28,2016-08-17 2040 | 2039,NYMEX,PL,2016,10,V16,,,2016-10-27,2016-09-21 2041 | 2040,NYMEX,PL,2016,11,X16,,,2016-11-28,2016-10-19 2042 | 2041,NYMEX,PL,2016,12,Z16,,,2016-12-28,2016-11-16 2043 | 2042,NYMEX,PL,2017,1,F17,,,2017-01-27,2016-12-21 2044 | 2043,NYMEX,PL,2017,2,G17,,,2017-02-24,2017-01-18 2045 | 2044,NYMEX,PL,2017,3,H17,,,2017-03-29,2017-02-15 2046 | 2045,NYMEX,PL,2017,4,J17,,,2017-04-26,2017-03-15 2047 | 2046,NYMEX,PL,2017,5,K17,,,2017-05-26,2017-04-19 2048 | 2047,NYMEX,PL,2017,6,M17,,,2017-06-28,2017-05-17 2049 | 2048,NYMEX,PL,2017,7,N17,,,2017-07-27,2017-06-21 2050 | 2049,NYMEX,PL,2017,8,Q17,,,2017-08-29,2017-07-19 2051 | 2050,NYMEX,PL,2017,9,U17,,,2017-09-27,2017-08-16 2052 | 2051,NYMEX,PL,2017,10,V17,,,2017-10-27,2017-09-20 2053 | 2052,NYMEX,PL,2017,11,X17,,,2017-11-28,2017-10-18 2054 | 2053,NYMEX,PL,2017,12,Z17,,,2017-12-27,2017-11-15 2055 | 2054,NYMEX,PL,2018,1,F18,,,2018-01-29,2017-12-20 2056 | 2055,NYMEX,PL,2018,2,G18,,,2018-02-26,2018-01-17 2057 | 2056,NYMEX,PL,2018,3,H18,,,2018-03-28,2018-02-21 2058 | 2057,NYMEX,PL,2018,4,J18,,,2018-04-26,2018-03-21 2059 | 2058,NYMEX,PL,2018,5,K18,,,2018-05-29,2018-04-18 2060 | 2059,NYMEX,PL,2018,6,M18,,,2018-06-27,2018-05-16 2061 | 2060,NYMEX,PL,2018,7,N18,,,2018-07-27,2018-06-20 2062 | 2061,NYMEX,PL,2018,8,Q18,,,2018-08-29,2018-07-18 2063 | 2062,NYMEX,PL,2018,9,U18,,,2018-09-26,2018-08-15 2064 | 2063,NYMEX,PL,2018,10,V18,,,2018-10-29,2018-09-19 2065 | 2064,NYMEX,PL,2018,11,X18,,,2018-11-28,2018-10-17 2066 | 2065,NYMEX,PL,2018,12,Z18,,,2018-12-27,2018-11-20 2067 | 2066,NYMEX,PL,2019,1,F19,,,2019-01-29,2018-12-19 2068 | 2067,NYMEX,PL,2019,2,G19,,,2019-02-26,2019-01-16 2069 | 2068,NYMEX,PL,2019,3,H19,,,2019-03-27,2019-02-20 2070 | 2069,NYMEX,PL,2019,4,J19,,,2019-04-26,2019-03-20 2071 | 2070,NYMEX,PL,2019,5,K19,,,2019-05-29,2019-04-17 2072 | 2071,NYMEX,PL,2019,6,M19,,,2019-06-26,2019-05-15 2073 | 2072,NYMEX,PL,2019,7,N19,,,2019-07-29,2019-06-19 2074 | 2073,NYMEX,PL,2019,8,Q19,,,2019-08-28,2019-07-17 2075 | 2074,NYMEX,PL,2019,9,U19,,,2019-09-26,2019-08-21 2076 | 2075,NYMEX,PL,2019,10,V19,,,2019-10-29,2019-09-18 2077 | 2076,NYMEX,PL,2019,11,X19,,,2019-11-26,2019-10-16 2078 | 2077,NYMEX,PL,2019,12,Z19,,,2019-12-27,2019-11-20 2079 | 2078,NYMEX,PL,2020,1,F20,,,2020-01-29,2019-12-18 2080 | 2079,NYMEX,PL,2020,2,G20,,,2020-02-26,2020-01-15 2081 | 2080,NYMEX,PL,2020,3,H20,,,2020-03-27,2020-02-19 2082 | 2081,NYMEX,PL,2020,4,J20,,,2020-04-28,2020-03-18 2083 | 2082,NYMEX,PL,2020,5,K20,,,2020-05-27,2020-04-15 2084 | 2083,NYMEX,PL,2020,6,M20,,,2020-06-26,2020-05-20 2085 | 2084,NYMEX,PL,2020,7,N20,,,2020-07-29,2020-06-17 2086 | 2085,NYMEX,PL,2020,8,Q20,,,2020-08-27,2020-07-15 2087 | 2086,NYMEX,PL,2020,9,U20,,,2020-09-28,2020-08-19 2088 | 2087,NYMEX,PL,2020,10,V20,,,2020-10-28,2020-09-16 2089 | 2088,NYMEX,PL,2020,11,X20,,,2020-11-25,2020-10-21 2090 | 2089,NYMEX,PL,2020,12,Z20,,,2020-12-29,2020-11-18 2091 | 2090,NYMEX,PL,2021,1,F21,,,2021-01-27,2020-12-16 2092 | 2091,NYMEX,PL,2021,2,G21,,,2021-02-24,2021-01-20 2093 | 2092,NYMEX,PL,2021,3,H21,,,2021-03-29,2021-02-17 2094 | 2093,NYMEX,PL,2021,4,J21,,,2021-04-28,2021-03-17 2095 | 2094,NYMEX,PL,2021,5,K21,,,2021-05-26,2021-04-21 2096 | 2095,NYMEX,PL,2021,6,M21,,,2021-06-28,2021-05-19 2097 | 2096,NYMEX,PL,2021,7,N21,,,2021-07-28,2021-06-16 2098 | 2097,NYMEX,PL,2021,8,Q21,,,2021-08-27,2021-07-21 2099 | 2098,NYMEX,PL,2021,9,U21,,,2021-09-28,2021-08-18 2100 | 2099,NYMEX,PL,2021,10,V21,,,2021-10-27,2021-09-15 2101 | 2100,NYMEX,PL,2021,11,X21,,,2021-11-26,2021-10-20 2102 | 2101,NYMEX,PL,2021,12,Z21,,,2021-12-29,2021-11-17 2103 | 2102,NYMEX,PL,2022,1,F22,,,2022-01-27,2021-12-15 2104 | 2103,NYMEX,PL,2022,2,G22,,,2022-02-24,2022-01-19 2105 | 2104,NYMEX,PL,2022,3,H22,,,2022-03-29,2022-02-16 2106 | 2105,NYMEX,PL,2022,4,J22,,,2022-04-27,2022-03-16 2107 | 2106,NYMEX,PL,2022,5,K22,,,2022-05-26,2022-04-20 2108 | 2107,NYMEX,PL,2022,6,M22,,,2022-06-28,2022-05-18 2109 | 2108,NYMEX,PL,2022,7,N22,,,2022-07-27,2022-06-15 2110 | 2109,NYMEX,PL,2022,8,Q22,,,2022-08-29,2022-07-20 2111 | 2110,NYMEX,PL,2022,9,U22,,,2022-09-28,2022-08-17 2112 | 2111,NYMEX,PL,2022,10,V22,,,2022-10-27,2022-09-21 2113 | 2112,NYMEX,PL,2022,11,X22,,,2022-11-28,2022-10-19 2114 | 2113,NYMEX,PL,2022,12,Z22,,,2022-12-28,2022-11-16 2115 | 2114,NYMEX,PL,2023,1,F23,,,2023-01-27,2022-12-21 2116 | 2115,NYMEX,PL,2023,2,G23,,,2023-02-24,2023-01-18 2117 | 2116,NYMEX,PL,2023,3,H23,,,2023-03-29,2023-02-15 2118 | 2117,NYMEX,PL,2023,4,J23,,,2023-04-26,2023-03-15 2119 | 2118,NYMEX,PL,2023,5,K23,,,2023-05-26,2023-04-19 2120 | 2119,NYMEX,PL,2023,6,M23,,,2023-06-28,2023-05-17 2121 | 2120,NYMEX,PL,2023,7,N23,,,2023-07-27,2023-06-21 2122 | 2121,NYMEX,PL,2023,8,Q23,,,2023-08-29,2023-07-19 2123 | 2122,NYMEX,PL,2023,9,U23,,,2023-09-27,2023-08-16 2124 | 2123,NYMEX,PL,2023,10,V23,,,2023-10-27,2023-09-20 2125 | 2124,NYMEX,PL,2023,11,X23,,,2023-11-28,2023-10-18 2126 | 2125,NYMEX,PL,2023,12,Z23,,,2023-12-27,2023-11-15 2127 | 2126,CME,ES,2013,8,Q13,,,2013-08-16,2013-08-16 2128 | 2127,CME,ES,2013,9,U13,,,2013-09-20,2013-09-20 2129 | 2128,CME,ES,2013,10,V13,,,2013-10-18,2013-10-18 2130 | 2129,CME,ES,2013,11,X13,,,2013-11-15,2013-11-15 2131 | 2130,CME,ES,2013,12,Z13,,,2013-12-20,2013-12-20 2132 | 2131,CME,ES,2014,1,F14,,,2014-01-17,2014-01-17 2133 | 2132,CME,ES,2014,2,G14,,,2014-02-21,2014-02-21 2134 | 2133,CME,ES,2014,3,H14,,,2014-03-21,2014-03-21 2135 | 2134,CME,ES,2014,4,J14,,,2014-04-18,2014-04-18 2136 | 2135,CME,ES,2014,5,K14,,,2014-05-16,2014-05-16 2137 | 2136,CME,ES,2014,6,M14,,,2014-06-20,2014-06-20 2138 | 2137,CME,ES,2014,7,N14,,,2014-07-18,2014-07-18 2139 | 2138,CME,ES,2014,8,Q14,,,2014-08-15,2014-08-15 2140 | 2139,CME,ES,2014,9,U14,,,2014-09-19,2014-09-19 2141 | 2140,CME,ES,2014,10,V14,,,2014-10-17,2014-10-17 2142 | 2141,CME,ES,2014,11,X14,,,2014-11-21,2014-11-21 2143 | 2142,CME,ES,2014,12,Z14,,,2014-12-19,2014-12-19 2144 | 2143,CME,ES,2015,1,F15,,,2015-01-16,2015-01-16 2145 | 2144,CME,ES,2015,2,G15,,,2015-02-20,2015-02-20 2146 | 2145,CME,ES,2015,3,H15,,,2015-03-20,2015-03-20 2147 | 2146,CME,ES,2015,4,J15,,,2015-04-17,2015-04-17 2148 | 2147,CME,ES,2015,5,K15,,,2015-05-15,2015-05-15 2149 | 2148,CME,ES,2015,6,M15,,,2015-06-19,2015-06-19 2150 | 2149,CME,ES,2015,7,N15,,,2015-07-17,2015-07-17 2151 | 2150,CME,ES,2015,8,Q15,,,2015-08-21,2015-08-21 2152 | 2151,CME,ES,2015,9,U15,,,2015-09-18,2015-09-18 2153 | 2152,CME,ES,2015,10,V15,,,2015-10-16,2015-10-16 2154 | 2153,CME,ES,2015,11,X15,,,2015-11-20,2015-11-20 2155 | 2154,CME,ES,2015,12,Z15,,,2015-12-18,2015-12-18 2156 | 2155,CME,ES,2016,1,F16,,,2016-01-15,2016-01-15 2157 | 2156,CME,ES,2016,2,G16,,,2016-02-19,2016-02-19 2158 | 2157,CME,ES,2016,3,H16,,,2016-03-18,2016-03-18 2159 | 2158,CME,ES,2016,4,J16,,,2016-04-15,2016-04-15 2160 | 2159,CME,ES,2016,5,K16,,,2016-05-20,2016-05-20 2161 | 2160,CME,ES,2016,6,M16,,,2016-06-17,2016-06-17 2162 | 2161,CME,ES,2016,7,N16,,,2016-07-15,2016-07-15 2163 | 2162,CME,ES,2016,8,Q16,,,2016-08-19,2016-08-19 2164 | 2163,CME,ES,2016,9,U16,,,2016-09-16,2016-09-16 2165 | 2164,CME,ES,2016,10,V16,,,2016-10-21,2016-10-21 2166 | 2165,CME,ES,2016,11,X16,,,2016-11-18,2016-11-18 2167 | 2166,CME,ES,2016,12,Z16,,,2016-12-16,2016-12-16 2168 | 2167,CME,ES,2017,1,F17,,,2017-01-20,2017-01-20 2169 | 2168,CME,ES,2017,2,G17,,,2017-02-17,2017-02-17 2170 | 2169,CME,ES,2017,3,H17,,,2017-03-17,2017-03-17 2171 | 2170,CME,ES,2017,4,J17,,,2017-04-21,2017-04-21 2172 | 2171,CME,ES,2017,5,K17,,,2017-05-19,2017-05-19 2173 | 2172,CME,ES,2017,6,M17,,,2017-06-16,2017-06-16 2174 | 2173,CME,ES,2017,7,N17,,,2017-07-21,2017-07-21 2175 | 2174,CME,ES,2017,8,Q17,,,2017-08-18,2017-08-18 2176 | 2175,CME,ES,2017,9,U17,,,2017-09-15,2017-09-15 2177 | 2176,CME,ES,2017,10,V17,,,2017-10-20,2017-10-20 2178 | 2177,CME,ES,2017,11,X17,,,2017-11-17,2017-11-17 2179 | 2178,CME,ES,2017,12,Z17,,,2017-12-15,2017-12-15 2180 | 2179,CME,ES,2018,1,F18,,,2018-01-19,2018-01-19 2181 | 2180,CME,ES,2018,2,G18,,,2018-02-16,2018-02-16 2182 | 2181,CME,ES,2018,3,H18,,,2018-03-16,2018-03-16 2183 | 2182,CME,ES,2018,4,J18,,,2018-04-20,2018-04-20 2184 | 2183,CME,ES,2018,5,K18,,,2018-05-18,2018-05-18 2185 | 2184,CME,ES,2018,6,M18,,,2018-06-15,2018-06-15 2186 | 2185,CME,ES,2018,7,N18,,,2018-07-20,2018-07-20 2187 | 2186,CME,ES,2018,8,Q18,,,2018-08-17,2018-08-17 2188 | 2187,CME,ES,2018,9,U18,,,2018-09-21,2018-09-21 2189 | 2188,CME,ES,2018,10,V18,,,2018-10-19,2018-10-19 2190 | 2189,CME,ES,2018,11,X18,,,2018-11-16,2018-11-16 2191 | 2190,CME,ES,2018,12,Z18,,,2018-12-21,2018-12-21 2192 | 2191,CME,ES,2019,1,F19,,,2019-01-18,2019-01-18 2193 | 2192,CME,ES,2019,2,G19,,,2019-02-15,2019-02-15 2194 | 2193,CME,ES,2019,3,H19,,,2019-03-15,2019-03-15 2195 | 2194,CME,ES,2019,4,J19,,,2019-04-19,2019-04-19 2196 | 2195,CME,ES,2019,5,K19,,,2019-05-17,2019-05-17 2197 | 2196,CME,ES,2019,6,M19,,,2019-06-21,2019-06-21 2198 | 2197,CME,ES,2019,7,N19,,,2019-07-19,2019-07-19 2199 | 2198,CME,ES,2019,8,Q19,,,2019-08-16,2019-08-16 2200 | 2199,CME,ES,2019,9,U19,,,2019-09-20,2019-09-20 2201 | 2200,CME,ES,2019,10,V19,,,2019-10-18,2019-10-18 2202 | 2201,CME,ES,2019,11,X19,,,2019-11-15,2019-11-15 2203 | 2202,CME,ES,2019,12,Z19,,,2019-12-20,2019-12-20 2204 | 2203,CME,ES,2020,1,F20,,,2020-01-17,2020-01-17 2205 | 2204,CME,ES,2020,2,G20,,,2020-02-21,2020-02-21 2206 | 2205,CME,ES,2020,3,H20,,,2020-03-20,2020-03-20 2207 | 2206,CME,ES,2020,4,J20,,,2020-04-17,2020-04-17 2208 | 2207,CME,ES,2020,5,K20,,,2020-05-15,2020-05-15 2209 | 2208,CME,ES,2020,6,M20,,,2020-06-19,2020-06-19 2210 | 2209,CME,ES,2020,7,N20,,,2020-07-17,2020-07-17 2211 | 2210,CME,ES,2020,8,Q20,,,2020-08-21,2020-08-21 2212 | 2211,CME,ES,2020,9,U20,,,2020-09-18,2020-09-18 2213 | 2212,CME,ES,2020,10,V20,,,2020-10-16,2020-10-16 2214 | 2213,CME,ES,2020,11,X20,,,2020-11-20,2020-11-20 2215 | 2214,CME,ES,2020,12,Z20,,,2020-12-18,2020-12-18 2216 | 2215,CME,ES,2021,1,F21,,,2021-01-15,2021-01-15 2217 | 2216,CME,ES,2021,2,G21,,,2021-02-19,2021-02-19 2218 | 2217,CME,ES,2021,3,H21,,,2021-03-19,2021-03-19 2219 | 2218,CME,ES,2021,4,J21,,,2021-04-16,2021-04-16 2220 | 2219,CME,ES,2021,5,K21,,,2021-05-21,2021-05-21 2221 | 2220,CME,ES,2021,6,M21,,,2021-06-18,2021-06-18 2222 | 2221,CME,ES,2021,7,N21,,,2021-07-16,2021-07-16 2223 | 2222,CME,ES,2021,8,Q21,,,2021-08-20,2021-08-20 2224 | 2223,CME,ES,2021,9,U21,,,2021-09-17,2021-09-17 2225 | 2224,CME,ES,2021,10,V21,,,2021-10-15,2021-10-15 2226 | 2225,CME,ES,2021,11,X21,,,2021-11-19,2021-11-19 2227 | 2226,CME,ES,2021,12,Z21,,,2021-12-17,2021-12-17 2228 | 2227,CME,ES,2022,1,F22,,,2022-01-21,2022-01-21 2229 | 2228,CME,ES,2022,2,G22,,,2022-02-18,2022-02-18 2230 | 2229,CME,ES,2022,3,H22,,,2022-03-18,2022-03-18 2231 | 2230,CME,ES,2022,4,J22,,,2022-04-15,2022-04-15 2232 | 2231,CME,ES,2022,5,K22,,,2022-05-20,2022-05-20 2233 | 2232,CME,ES,2022,6,M22,,,2022-06-17,2022-06-17 2234 | 2233,CME,ES,2022,7,N22,,,2022-07-15,2022-07-15 2235 | 2234,CME,ES,2022,8,Q22,,,2022-08-19,2022-08-19 2236 | 2235,CME,ES,2022,9,U22,,,2022-09-16,2022-09-16 2237 | 2236,CME,ES,2022,10,V22,,,2022-10-21,2022-10-21 2238 | 2237,CME,ES,2022,11,X22,,,2022-11-18,2022-11-18 2239 | 2238,CME,ES,2022,12,Z22,,,2022-12-16,2022-12-16 2240 | 2239,CME,ES,2023,1,F23,,,2023-01-20,2023-01-20 2241 | 2240,CME,ES,2023,2,G23,,,2023-02-17,2023-02-17 2242 | 2241,CME,ES,2023,3,H23,,,2023-03-17,2023-03-17 2243 | 2242,CME,ES,2023,4,J23,,,2023-04-21,2023-04-21 2244 | 2243,CME,ES,2023,5,K23,,,2023-05-19,2023-05-19 2245 | 2244,CME,ES,2023,6,M23,,,2023-06-16,2023-06-16 2246 | 2245,CME,ES,2023,7,N23,,,2023-07-21,2023-07-21 2247 | 2246,CME,ES,2023,8,Q23,,,2023-08-18,2023-08-18 2248 | 2247,CME,ES,2023,9,U23,,,2023-09-15,2023-09-15 2249 | 2248,CME,ES,2023,10,V23,,,2023-10-20,2023-10-20 2250 | 2249,CME,ES,2023,11,X23,,,2023-11-17,2023-11-17 2251 | 2250,CME,ES,2023,12,Z23,,,2023-12-15,2023-12-15 --------------------------------------------------------------------------------