Source code for macrosynergy.download.transaction_costs
import datetime
import pandas as pd
import warnings
import requests
from typing import List
from macrosynergy.management.types import QuantamentalDataFrame
from macrosynergy.management.utils import get_cid, get_xcat
from io import StringIO
MAX_RETRIES = 3
CSV_URL = None
def _request_wrapper(url: str, verbose: bool = True, **kwargs) -> str:
"""
Wrapper around `requests.get` to handle errors and retries.
Any additional keyword arguments are passed to `requests.get`. Purpose is to allow
users to pass additional headers, proxy settings, cert verification, etc.
"""
if verbose:
print(f"Requesting data from {url}")
for _ in range(MAX_RETRIES):
try:
r = requests.get(url, **kwargs)
r.raise_for_status()
return r.text
except requests.exceptions.RequestException as e:
if verbose:
print(f"Error downloading {url}: {e}")
continue
raise requests.exceptions.RequestException(f"Failed to download {url}")
AVAILABLE_CTYPES: List[str] = ["FX", "IRS", "CDS"]
AVAIALBLE_COSTS: List[str] = ["BIDOFFER", "ROLLCOST", "SIZE"]
AVAILABLE_STATS: List[str] = ["MEDIAN", "90PCTL"]
AVAILABLE_CATS: List[str] = [
f"{c}{t}_{s}"
for c in AVAILABLE_CTYPES
for t in AVAIALBLE_COSTS
for s in AVAILABLE_STATS
]
[docs]def download_transaction_costs(
csv_url: str = CSV_URL,
verbose: bool = False,
categorical: bool = False,
**kwargs,
) -> QuantamentalDataFrame:
"""
Download trading costs data from the S3 bucket.
Parameters
----------
csv_url : str
URL of the CSV file to download.
verbose : bool
Print progress information.
**kwargs : args
Additional keyword arguments to pass to `requests.get`. This can be used to pass
additional headers, proxy settings, cert verification, etc.
"""
if csv_url is None or not isinstance(csv_url, str):
raise ValueError(f"Invalid CSV URL provided: {csv_url}")
if verbose:
print(f"Timestamp (UTC): {datetime.datetime.now(datetime.timezone.utc)}")
print(f"Downloading trading costs data from {csv_url}")
dfd: pd.DataFrame = pd.read_csv(
StringIO(_request_wrapper(csv_url, **kwargs)),
parse_dates=["real_date"],
)
dfd["cid"], dfd["xcat"] = get_cid(dfd["ticker"]), get_xcat(dfd["ticker"])
dfd = dfd[QuantamentalDataFrame.IndexCols + ["value"]]
if not isinstance(dfd, pd.DataFrame) or dfd.empty:
raise ValueError("Failed to download trading costs data")
if not isinstance(dfd, QuantamentalDataFrame):
if verbose:
warnings.warn(
"Downloaded data could not be converted to QuantamentalDataFrame",
UserWarning,
)
else:
if verbose:
print("Downloaded data and transformed data successfully")
dfd = QuantamentalDataFrame(dfd, categorical=categorical)
return dfd
if __name__ == "__main__":
print(download_transaction_costs(verbose=True).head())