Remove the LIBOR stuff

Focus on data I can't retrieve historically - LIBOR rates I can get in the future.
master
bspeice 2016-09-06 12:07:57 -04:00
parent d8f32d8128
commit 5e6bc68a33
4 changed files with 0 additions and 173 deletions

View File

@ -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
}

View File

@ -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]

View File

@ -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
)

View File

@ -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)))