import json import datetime import requests from common import root import sys import os import pytz #from quantlib.time.date import Date #from quantlib.time import imm ticker = "GE" monthcodes = ["F", "G", "H", "J", "K", "M", "N", "Q", "U", "V", "X", "Z"] def nextIMMDates(startdate, length = 8): y = startdate.year r = [] for y in range(startdate.year, startdate.year + 10): for m in [3, 6, 9, 12]: wednesdays = [datetime.date(y, m, i) for i in range(15, 22) \ if datetime.date(y, m, i).weekday()==0] immdate = wednesdays[0] if immdate > startdate: r.append(immdate) if len(r) == 8: return r if len(sys.argv)>1: workdate = datetime.datetime.strptime(sys.argv[1], "%Y-%m-%d") else: workdate = datetime.datetime.today() # get next 8 futures maturities # code = imm.next_code(Date.from_datetime(workdate)) # contracts = ["GE" + code] # for _ in range(7): # code = imm.next_code(code) # contracts.append("GE" + code) contracts = ["GE" + monthcodes[d.month-1] + str(d.year)[-1:] for d in nextIMMDates(workdate.date())] #putting a historic date doesn't work if sys.version_info >= (3,3): ts = int(datetime.datetime.timestamp(workdate) * 1000) else: ts = datetime.datetime.strftime(workdate, '%s') + '000' uri = "http://www.cmegroup.com/CmeWS/md/MDServer/V1/Venue/G/Exchange/XCME/FOI/FUT/Product/GE?currentTime={0}&contractCDs={1}".format(ts, ",".join(contracts)) r = requests.get(uri) quotes = json.loads(r.text) central = pytz.timezone('US/Central') with open(os.path.join(root, "data", "Yield Curves", "futures-{0}.csv".format(workdate.date())), "w") as fh: for q in quotes[u'marketDataInfoAsStringList'][u'message']: q['tradeDate'] = q['tradeDate'].strip(' ').strip() tradedate = datetime.datetime.strptime(q['tradeDate'], "%I:%M:%S %p CT
%m/%d/%Y") tradedate = central.localize(tradedate) fh.write("{0},{1},{2}\n".format(q['ticker'], q['tradePrice'], tradedate))