diff options
Diffstat (limited to 'python/quote_parsing')
| -rw-r--r-- | python/quote_parsing/parse_emails.py | 62 |
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( |
