aboutsummaryrefslogtreecommitdiffstats
path: root/python
diff options
context:
space:
mode:
Diffstat (limited to 'python')
-rw-r--r--python/book_bbg.py34
-rw-r--r--python/trade_dataclasses.py15
2 files changed, 24 insertions, 25 deletions
diff --git a/python/book_bbg.py b/python/book_bbg.py
index e12646cb..a0c6d9a8 100644
--- a/python/book_bbg.py
+++ b/python/book_bbg.py
@@ -1,32 +1,24 @@
from serenitas.utils.remote import SftpClient
from trade_dataclasses import Deal, DealType, BbgDeal
-import csv
from stat import S_ISREG
+import re
+import time
-def trade_booking_process(file_handle, index, asset_class):
- deal = Deal[DealType(asset_class)]
- for row in csv.DictReader(file_handle):
- line = {"bbg_ticket_id": index, **row}
- trade = deal.from_bbg_line(line)
- trade.stage()
- deal.commit()
-
-
-def get_bbg_id(name):
- return name.split("_", 1)[1]
-
-
-if __name__ == "__main__":
- import time
-
+def run():
sftp = SftpClient.from_creds("bbg")
while True:
for f in sftp.client.listdir_iter("/"):
if S_ISREG(f.st_mode):
- if (bbg_id := get_bbg_id(f.filename)) not in BbgDeal._cache:
- with sftp.client.open(f.filename) as fh:
- trade_booking_process(fh, bbg_id, f.filename.split("-", 1)[0])
- BbgDeal._cache[bbg_id] = None
+ if m := re.match("(CDX|BOND)-[^_]*_([^$]*)", f.filename):
+ deal_type, bbg_id = m.groups()
+ if bbg_id not in BbgDeal._cache:
+ with sftp.client.open(f.filename) as fh:
+ Deal[DealType(deal_type)].process(fh, bbg_id)
+ BbgDeal._cache[bbg_id] = None
time.sleep(60)
+
+
+if __name__ == "__main__":
+ run()
diff --git a/python/trade_dataclasses.py b/python/trade_dataclasses.py
index 6310dc40..a33bfd52 100644
--- a/python/trade_dataclasses.py
+++ b/python/trade_dataclasses.py
@@ -2,6 +2,7 @@ from dataclasses import dataclass, field, fields
from typing import ClassVar
from decimal import Decimal
from typing import Literal
+import csv
import datetime
from enum import Enum
from psycopg2.extensions import register_adapter, AsIs
@@ -238,6 +239,14 @@ class BbgDeal:
cls._bbg_insert_queue.clear()
cls._insert_queue.clear()
+ @classmethod
+ def process(cls, file_handle, index):
+ for row in csv.DictReader(file_handle):
+ line = {"bbg_ticket_id": index, **row}
+ trade = cls.from_bbg_line(line)
+ trade.stage()
+ cls.commit()
+
@dataclass
class CDSDeal(
@@ -315,8 +324,7 @@ class CDSDeal(
@classmethod
def from_bbg_line(cls, line: dict):
- values = list(line.values())
- cls._bbg_insert_queue.append(values)
+ cls._bbg_insert_queue.append(list(line.values()))
return cls(
fund=_funds[line["Account"]],
folder="*",
@@ -358,8 +366,7 @@ class BondDeal(BbgDeal, Deal, deal_type=DealType.Bond, table_name="bonds"):
@classmethod
def from_bbg_line(cls, line: dict):
- values = list(line.values())
- cls._bbg_insert_queue.append(values)
+ cls._bbg_insert_queue.append(list(line(values)))
return cls(
faceamount=Decimal(line["Quantity"]),
price=Decimal(line["Price (Dec)"]),