diff --git a/metrik/batch.py b/metrik/batch.py index 33c799b..048bda2 100644 --- a/metrik/batch.py +++ b/metrik/batch.py @@ -8,12 +8,10 @@ from subprocess import check_output from os import path from metrik.conf import get_config -from metrik.flows.rates_flow import LiborFlow from metrik.flows.equities_flow import EquitiesFlow from metrik import __version__ flows = { - 'LiborFlow': LiborFlow, 'EquitiesFlow': EquitiesFlow } diff --git a/metrik/flows/rates_flow.py b/metrik/flows/rates_flow.py deleted file mode 100644 index 8bbde71..0000000 --- a/metrik/flows/rates_flow.py +++ /dev/null @@ -1,14 +0,0 @@ -from metrik.flows.base import Flow, WeekdayMidnight -from metrik.tasks.ice import LiborRateTask - - -class LiborFlow(Flow): - - @staticmethod - def get_schedule(): - return WeekdayMidnight() - - def _requires(self): - currencies = ['USD'] - return [LiborRateTask(self.present, currency) - for currency in currencies] diff --git a/metrik/tasks/ice.py b/metrik/tasks/ice.py deleted file mode 100644 index f2fef0e..0000000 --- a/metrik/tasks/ice.py +++ /dev/null @@ -1,92 +0,0 @@ -from __future__ import print_function - -import csv -import requests -from collections import namedtuple -from dateutil.parser import parse -from io import StringIO -from pytz import timezone - -from luigi.parameter import DateParameter, Parameter -from six.moves.urllib.parse import quote_plus - -from metrik.tasks.base import MongoCreateTask -from metrik.trading_days import TradingDay - -LiborRate = namedtuple('LiborRate', [ - 'publication', 'overnight', 'one_week', 'one_month', 'two_month', - 'three_month', 'six_month', 'one_year', 'currency' -]) - - -class LiborRateTask(MongoCreateTask): - - date = DateParameter() - currency = Parameter() - - def get_collection_name(self): - return 'libor' - - @staticmethod - def retrieve_historical_libor(date, currency): - url = ('https://www.theice.com/marketdata/reports/icebenchmarkadmin/' - 'ICELiborHistoricalRates.shtml?excelExport=' - '&criteria.reportDate={}&criteria.currencyCode={}').format( - quote_plus(date.strftime('%m/%d/%y')), - currency - ) - - fields = ['tenor', 'publication', 'usd_ice_libor'] - text = requests.get(url).text - f = StringIO(text) - next(f) # Skip the header - - # TODO: Messing with globals() is probably a terrible idea, is there - # a better way to write the below code? - for row in csv.DictReader(f, fieldnames=fields): - mapping = { - 'Overnight': 'overnight', - '1 Week': 'one_week', - '1 Month': 'one_month', - '2 Month': 'two_month', - '3 Month': 'three_month', - '6 Month': 'six_month', - '1 Year': 'one_year' - } - if row['usd_ice_libor']: - globals()[mapping[row['tenor']]] = float(row['usd_ice_libor']) - - if row['publication']: - # Weird things happen with the publication field. For whatever reason, - # the *time* is correct, but very often the date gets screwed up. - # When I download the CSV with Firefox I only see the times - when I - # download with `requests`, I see both date (often incorrect) and time. - dt = parse(row['publication']) - dt = dt.replace(year=date.year, month=date.month, day=date.day) - if dt.tzinfo is None: - dt = timezone('America/New_York').localize(dt) - globals()['publication'] = dt - - # Because of the shenanigans I did earlier with globals(), ignore - # unresolved references. Probably a better way to do this. - # noinspection PyUnresolvedReferences - return { - 'currency': currency, - 'publication': publication, - 'overnight': overnight, - 'one_week': one_week, - 'one_month': one_month, - 'two_month': two_month, - 'three_month': three_month, - 'six_month': six_month, - 'one_year': one_year - } - - @staticmethod - def retrieve_data(date, currency): - # ICE publish data a day late, so we actually need to retrieve data - # for the trading day prior to this. - return LiborRateTask.retrieve_historical_libor( - date - TradingDay(1), - currency - ) diff --git a/test/tasks/test_ice.py b/test/tasks/test_ice.py deleted file mode 100644 index c9f9e5b..0000000 --- a/test/tasks/test_ice.py +++ /dev/null @@ -1,65 +0,0 @@ -from unittest import TestCase -from datetime import datetime -import pytz -import logging - -from metrik.tasks.ice import LiborRateTask - - -# noinspection PyUnresolvedReferences -class TestICE(TestCase): - def test_correct_libor_Aug8_2016(self): - # Validate with: - # https://www.theice.com/marketdata/reports/icebenchmarkadmin/ICELiborHistoricalRates.shtml?excelExport=&criteria.reportDate=8%2F8%2F16&criteria.currencyCode=USD - aug8_libor = LiborRateTask.retrieve_historical_libor( - datetime(2016, 8, 8), 'USD') - - assert aug8_libor['overnight'] == .4189 - assert aug8_libor['one_week'] == .4431 - assert aug8_libor['one_month'] == .5119 - assert aug8_libor['two_month'] == .6268 - assert aug8_libor['three_month'] == .8065 - assert aug8_libor['six_month'] == 1.1852 - assert aug8_libor['one_year'] == 1.5081 - - london_tz = pytz.timezone('Europe/London') - actual = london_tz.localize(datetime(2016, 8, 8, 11, 45, 6)) - logging.info('Publication date in London time: {}'.format( - aug8_libor['publication'].astimezone(london_tz))) - assert aug8_libor['publication'] == actual - - def test_correct_libor_Aug9_2010(self): - # Validate with: - # https://www.theice.com/marketdata/reports/icebenchmarkadmin/ICELiborHistoricalRates.shtml?excelExport=&criteria.reportDate=8%2F9%2F10&criteria.currencyCode=USD - aug9_libor = LiborRateTask.retrieve_historical_libor( - datetime(2010, 8, 9), 'USD') - - assert aug9_libor['overnight'] == .23656 - assert aug9_libor['one_week'] == .27725 - assert aug9_libor['one_month'] == .29 - assert aug9_libor['two_month'] == .3375 - assert aug9_libor['three_month'] == .40438 - assert aug9_libor['six_month'] == .6275 - assert aug9_libor['one_year'] == .995 - - london_tz = pytz.timezone('Europe/London') - actual = london_tz.localize(datetime(2010, 8, 9, 15, 49, 12)) - logging.info('Publication date in London time: {}'.format( - aug9_libor['publication'].astimezone(london_tz))) - assert aug9_libor['publication'] == actual - - def test_correct_date_reasoning(self): - # Make sure I document how to handle datetime issues in the future - london_tz = pytz.timezone('Europe/London') - ny_tz = pytz.timezone('America/New_York') - - # DON'T YOU DARE SET TZINFO, SHENANIGANS HAPPEN - assert (datetime(2016, 8, 8, 15, 0, 0, tzinfo=london_tz) < - datetime(2016, 8, 8, 15, 0, 0, tzinfo=ny_tz)) - - assert (datetime(2016, 8, 8, 15, 0, 0, tzinfo=london_tz) > - datetime(2016, 8, 8, 10, 0, 0, tzinfo=ny_tz)) - - # ALWAYS USE timezone.localize() - assert (london_tz.localize(datetime(2016, 8, 8, 15)) == - ny_tz.localize(datetime(2016, 8, 8, 10)))