aboutsummaryrefslogtreecommitdiffstats
path: root/python/quote_parsing/parse_emails.py
diff options
context:
space:
mode:
Diffstat (limited to 'python/quote_parsing/parse_emails.py')
-rw-r--r--python/quote_parsing/parse_emails.py62
1 files changed, 45 insertions, 17 deletions
diff --git a/python/quote_parsing/parse_emails.py b/python/quote_parsing/parse_emails.py
index 1ef65850..d6704750 100644
--- a/python/quote_parsing/parse_emails.py
+++ b/python/quote_parsing/parse_emails.py
@@ -475,7 +475,7 @@ def parse_jpm_block(fh, indextype):
return makedf(df, indextype, "JPM"), line
-def parse_ms(fh, index_desc, *args):
+def parse_ms_us(fh, index_desc, *args):
option_stack = {}
fwd_index = []
for line in fh:
@@ -492,7 +492,7 @@ def parse_ms(fh, index_desc, *args):
return option_stack, fwd_index
-def parse_nom(fh, index_desc, *args):
+def parse_nom_us(fh, index_desc, *args):
option_stack = {}
fwd_index = []
@@ -515,7 +515,7 @@ def parse_nom(fh, index_desc, *args):
return option_stack, fwd_index
-def parse_sg(fh, index_desc):
+def parse_sg_us(fh, index_desc):
option_stack = {}
fwd_index = []
@@ -529,7 +529,7 @@ def parse_sg(fh, index_desc):
return option_stack, fwd_index
-def parse_gs(fh, index_desc):
+def parse_gs_us(fh, index_desc):
option_stack = {}
fwd_index = []
pat = re.compile(r"Expiry (\d{2}\w{3}\d{2}) \((?:([\S]+) )?([\S]+)\)")
@@ -569,7 +569,21 @@ def parse_gs(fh, index_desc):
return option_stack, fwd_index
-def parse_citi(fh, index_desc):
+def parse_gs_eu(fh, index_desc):
+ option_stack = {}
+ fwd_index = []
+
+ pat = re.compile(r"(\w{3}\d{2})")
+ line = next(fh).strip()
+ while True:
+ if ("|" in line) and ("STK" not in line):
+ line = next(fh).strip()
+ if m := pat.match(line):
+ expiry = m.groups()
+ expiry = pd.to_datetime(expiry, format="%b%y")
+
+
+def parse_citi_us(fh, index_desc):
option_stack = {}
fwd_index = []
pat = re.compile(r"Exp: (\d{2}-\w{3}-\d{2})[^R]*Ref:[^\d]*([\d.]+)")
@@ -586,7 +600,7 @@ def parse_citi(fh, index_desc):
return option_stack, fwd_index
-def parse_cs(fh, index_desc):
+def parse_cs_us(fh, index_desc):
option_stack = {}
fwd_index = []
regex = {
@@ -608,7 +622,7 @@ def parse_cs(fh, index_desc):
return option_stack, fwd_index
-def parse_bnp(fh, index_desc):
+def parse_bnp_us(fh, index_desc):
option_stack = {}
fwd_index = []
regex = r"Ref\s+(?P<ref>[\d.]+)\s+-\s+(?P<expiry>\w{3}\d{2})\s+-\s+Fwd\s+(?P<fwdspread>[\d.]+)"
@@ -637,10 +651,11 @@ def parse_bnp(fh, index_desc):
return option_stack, fwd_index
-def parse_jpm(fh, index_desc):
+def parse_jpm_useu(fh, index_desc):
option_stack = {}
fwd_index = []
- regex = r"JPM CDX Options: (HY|IG|MAIN|XOVER) \(([\w\d]*)\) (?P<expiry>[\d]+-[\w]+-[\d]+) \*\* Fwd @(?P<fwdref>[\d.]+)"
+ versions = set()
+ regex = r"JPM (CDX|iTrx) Options: (HY|IG|MAIN|XOVER) \(\w\d+V(?P<version>\d+)\) (?P<expiry>[\d]+-[\w]+-[\d]+) \*\* Fwd @(?P<fwdref>[\d.]+)"
pat = re.compile(regex)
line = next(fh).strip()
while True:
@@ -651,12 +666,16 @@ def parse_jpm(fh, index_desc):
"fwdref"
)
d["expiry"] = pd.to_datetime(d["expiry"], format="%d-%b-%y")
+ index_desc["version"] = d["version"]
+ versions.add(d["version"])
fwd_index.append({**index_desc, **d})
try:
- option_stack[d["expiry"]], line = parse_jpm_block(
- fh, index_desc["index"]
- )
+ option_stack[index_desc["version"]] = {}
+ (
+ option_stack[index_desc["version"]][d["expiry"]],
+ line,
+ ) = parse_jpm_block(fh, index_desc["index"])
except IndexError as e:
logger.debug(traceback.format_exc())
logger.error(f"Something is wrong with file {Path(fh.name).stem}")
@@ -670,7 +689,7 @@ def parse_jpm(fh, index_desc):
line = next(fh).strip()
except StopIteration:
break
- return option_stack, fwd_index
+ return option_stack, fwd_index, versions
# subject_baml = re.compile(r"(?:Fwd:){0,2}(?:BAML )?(\D{2})(\d{1,2})\s")
@@ -746,24 +765,33 @@ def parse_email(email: Path, date_received: datetime.date, conn):
fh.seek(cur_pos)
if version is None:
version = get_version(indextype, series, quotedate)
- parse_fun = globals()[f"parse_{source.lower()}"]
- key = (quotedate, indextype, series, source)
+ parse_fun = globals()[f"parse_{source.lower()}_{region.lower()}"]
+ # key = (quotedate, indextype, series, source)
index_desc = {
"quotedate": quotedate,
"index": indextype,
"series": series,
"version": version,
}
- if source in ["GS", "MS", "NOM", "SG", "JPM", "JPM_EUR"]:
+ if source in ["GS", "MS", "NOM", "SG", "JPM"]:
index_desc["ref"] = ref
if source in ["BNP", "SG"]:
index_desc["expiration_dates"] = list_imm_dates(quotedate)
- option_stack, fwd_index = parse_fun(fh, index_desc)
+ # Returning different versions and creating a list of keys
+ if source == "JPM":
+ key = []
+ option_stack, fwd_index, versions = parse_fun(fh, index_desc)
+ for version in versions:
+ key.append((quotedate, indextype, series, source, version))
+ else:
+ option_stack, fwd_index = parse_fun(fh, index_desc)
+ key = (quotedate, indextype, series, source)
if fwd_index:
fwd_index = pd.DataFrame.from_records(fwd_index, index="quotedate")
fwd_index["quote_source"] = source
else:
raise RuntimeError("empty email " + fh.name)
+
return (key, (option_stack, fwd_index))
else:
raise RuntimeError(