mirror of
https://github.com/wassname/catalyst.git
synced 2026-07-10 19:06:14 +08:00
0ab136f1c8
Hopefully, this helps ease ramp up time for developing against market data, without us distributing the data. We do a check for the data when attempting to read the msgpack files, if they don't exist the loader makes a web request and retrieves and serializes the data for the user. Provides a loader for: - curves from data.treasury.gov - benchmarks from Yahoo! Finance Adds dependency of requests library in dev requirements.
75 lines
2.0 KiB
Python
75 lines
2.0 KiB
Python
import requests
|
|
|
|
from StringIO import StringIO
|
|
from xml.dom.minidom import parse
|
|
|
|
from loader_utils import (
|
|
guarded_conversion,
|
|
safe_int,
|
|
Mapping,
|
|
date_conversion,
|
|
source_to_records
|
|
)
|
|
|
|
|
|
def get_treasury_date(dstring):
|
|
return date_conversion(dstring.split("T")[0], date_pattern='%Y-%m-%d',
|
|
to_utc=False)
|
|
|
|
|
|
def get_treasury_rate(string_val):
|
|
val = guarded_conversion(float, string_val)
|
|
if val is not None:
|
|
val = round(val / 100.0, 4)
|
|
return val
|
|
|
|
_CURVE_MAPPINGS = {
|
|
'tid': (safe_int, "Id"),
|
|
'date': (get_treasury_date, "NEW_DATE"),
|
|
'1month': (get_treasury_rate, "BC_1MONTH"),
|
|
'3month': (get_treasury_rate, "BC_3MONTH"),
|
|
'6month': (get_treasury_rate, "BC_6MONTH"),
|
|
'1year': (get_treasury_rate, "BC_1YEAR"),
|
|
'2year': (get_treasury_rate, "BC_2YEAR"),
|
|
'3year': (get_treasury_rate, "BC_3YEAR"),
|
|
'5year': (get_treasury_rate, "BC_5YEAR"),
|
|
'7year': (get_treasury_rate, "BC_7YEAR"),
|
|
'10year': (get_treasury_rate, "BC_10YEAR"),
|
|
'20year': (get_treasury_rate, "BC_20YEAR"),
|
|
'30year': (get_treasury_rate, "BC_30YEAR"),
|
|
}
|
|
|
|
|
|
def treasury_mappings():
|
|
return {key: Mapping(*value)
|
|
for key, value
|
|
in _CURVE_MAPPINGS.iteritems()}
|
|
|
|
|
|
def get_treasury_source():
|
|
url = """\
|
|
http://data.treasury.gov/feed.svc/DailyTreasuryYieldCurveRateData\
|
|
"""
|
|
res = requests.get(url)
|
|
|
|
content = StringIO(res.content)
|
|
dom = parse(content)
|
|
|
|
entries = dom.getElementsByTagName("entry")
|
|
|
|
for entry in entries:
|
|
properties = entry.getElementsByTagName("m:properties")
|
|
datum = {node.nodeName.replace('d:', ''):
|
|
node.childNodes[0].nodeValue
|
|
if len(node.childNodes)
|
|
else None
|
|
for node in properties[0].childNodes
|
|
if node.nodeType == dom.ELEMENT_NODE}
|
|
yield datum
|
|
|
|
|
|
def get_treasury_data():
|
|
mappings = treasury_mappings()
|
|
source = get_treasury_source()
|
|
return source_to_records(mappings, source)
|