Skip to content

Commit

Permalink
Chore: Make release 1.0.59
Browse files Browse the repository at this point in the history
  • Loading branch information
martinroberson authored and Vanden Bon, David V [GBM Public] committed Feb 15, 2024
1 parent 8daf86a commit 5db1deb
Show file tree
Hide file tree
Showing 3 changed files with 361 additions and 34 deletions.
165 changes: 142 additions & 23 deletions gs_quant/api/gs/data.py
Original file line number Diff line number Diff line change
Expand Up @@ -507,47 +507,166 @@ def _resolve_default_csa_for_builder(cls, builder):
return "USD-1"

@classmethod
def get_mxapi_backtest_data(cls, builder, start_time=None, end_time=None, num_samples=60,
csa=None, request_id=None) -> pd.DataFrame:
def get_mxapi_curve_measure(cls, curve_type=None, curve_asset=None, curve_point=None, curve_tags=None,
measure=None, start_time=None, end_time=None, request_id=None,
close_location=None, real_time=None) -> pd.DataFrame:
real_time = real_time or isinstance(start_time, dt.datetime)

if not start_time:
start_time = DataContext.current.start_time
if real_time:
start_time = DataContext.current.start_time
else:
start_time = DataContext.current.start_date

if not end_time:
end_time = DataContext.current.end_time
if real_time:
end_time = DataContext.current.end_time
else:
end_time = DataContext.current.end_date

if not real_time and not close_location:
close_location = 'NYC'

if real_time and not isinstance(end_time, dt.date):
raise ValueError("Start and end need to be either both date or both time")

if real_time:
request_dict = {
'type': 'MxAPI Measure Request',
'modelType': curve_type,
'modelAsset': curve_asset,
'point': curve_point,
'tags': curve_tags,
'startTime': cls._to_zulu(start_time),
'endTime': cls._to_zulu(end_time),
'measureName': measure
}
else:
request_dict = {
'type': 'MxAPI Measure Request EOD',
'modelType': curve_type,
'modelAsset': curve_asset,
'point': curve_point,
'tags': curve_tags,
'startDate': start_time.isoformat(),
'endDate': end_time.isoformat(),
'close': close_location,
'measureName': measure
}

url = '/mxapi/mq/measure' if real_time else '/mxapi/mq/measure/eod'

start = time.perf_counter()
try:
body = cls._post_with_cache_check(url, payload=request_dict)
except Exception as e:
log_warning(request_id, _logger, f'Mxapi measure query {request_dict} failed due to {e}')
raise e
log_debug(request_id, _logger, 'MxAPI measure query (%s) with payload (%s) ran in %.3f ms',
body.get('requestId'), request_dict, (time.perf_counter() - start) * 1000)

if real_time:
values = body['measures']
valuation_times = body['measureTimes']
timestamps = [parser.parse(s) for s in valuation_times]
column_name = body['measureName']

d = {column_name: values, 'timeStamp': timestamps}
df = MarketDataResponseFrame(pd.DataFrame(data=d))
df = df.set_index('timeStamp')
return df
else:
values = body['measures']
valuation_date_strings = body['measureDates']
valuation_dates = [dt.date.fromisoformat(s) for s in valuation_date_strings]
column_name = body['measureName']

d = {column_name: values, 'date': valuation_dates}
df = MarketDataResponseFrame(pd.DataFrame(data=d))
df = df.set_index('date')
return df

@classmethod
def get_mxapi_backtest_data(cls, builder, start_time=None, end_time=None, num_samples=120,
csa=None, request_id=None, close_location=None, real_time=None) -> pd.DataFrame:
real_time = real_time or isinstance(start_time, dt.datetime)

if not start_time:
if real_time:
start_time = DataContext.current.start_time
else:
start_time = DataContext.current.start_date

if not end_time:
if real_time:
end_time = DataContext.current.end_time
else:
end_time = DataContext.current.end_date

if not csa:
csa = cls._resolve_default_csa_for_builder(builder)

if not real_time and not close_location:
close_location = 'NYC'

if real_time and not isinstance(end_time, dt.date):
raise ValueError("Start and end need to be either both date or both time")

leg = builder.resolve(in_place=False)
leg_dict_string = json.dumps(leg, cls=JSONEncoder)
leg_dict = json.loads(leg_dict_string)

request_dict = {
'type': 'MxAPI Backtest Request MQ',
'builder': leg_dict,
'startTime': cls._to_zulu(start_time),
'endTime': cls._to_zulu(end_time),
'sampleSize': num_samples,
'csa': csa
}
if real_time:
request_dict = {
'type': 'MxAPI Backtest Request MQ',
'builder': leg_dict,
'startTime': cls._to_zulu(start_time),
'endTime': cls._to_zulu(end_time),
'sampleSize': num_samples,
'csa': csa
}
else:
request_dict = {
'type': 'MxAPI Backtest Request MQEOD',
'builder': leg_dict,
'startDate': start_time.isoformat(),
'endDate': end_time.isoformat(),
'sampleSize': num_samples,
'csa': csa,
'close': close_location
}

url = '/mxapi/mq/backtest' if real_time else '/mxapi/mq/backtest/eod'

start = time.perf_counter()
try:
body = cls._post_with_cache_check('/mxapi/mq/backtest', payload=request_dict)
body = cls._post_with_cache_check(url, payload=request_dict)
except Exception as e:
log_warning(request_id, _logger, f'Mxapi backtest query {request_dict} failed due to {e}')
raise e
log_debug(request_id, _logger, 'MxAPI backtest query (%s) with payload (%s) ran in %.3f ms',
body.get('requestId'), request_dict, (time.perf_counter() - start) * 1000)

values = body['valuations']
valuation_times = body['valuationTimes']
timestamps = [parser.parse(s) for s in valuation_times]
column_name = body['valuationName']

d = {column_name: values, 'timeStamp': timestamps}
df = MarketDataResponseFrame(pd.DataFrame(data=d))
df = df.set_index('timeStamp')

return df
if real_time:
values = body['valuations']
valuation_times = body['valuationTimes']
timestamps = [parser.parse(s) for s in valuation_times]
column_name = body['valuationName']

d = {column_name: values, 'timeStamp': timestamps}
df = MarketDataResponseFrame(pd.DataFrame(data=d))
df = df.set_index('timeStamp')
return df
else:
values = body['valuations']
valuation_date_strings = body['valuationDates']
valuation_dates = [dt.date.fromisoformat(s) for s in valuation_date_strings]
column_name = body['valuationName']

d = {column_name: values, 'date': valuation_dates}
df = MarketDataResponseFrame(pd.DataFrame(data=d))
df = df.set_index('date')
return df

@staticmethod
def _get_market_data_filters(asset_ids: List[str],
Expand Down
66 changes: 63 additions & 3 deletions gs_quant/test/timeseries/test_measures.py
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,7 @@ def test_currency_to_tdapi_swap_rate_asset_for_intraday(mocker):


def my_mocked_mxapi_backtest(cls=None, builder=None, start_time=None, end_time=None, num_samples=60,
csa=None, request_id=None):
csa=None, request_id=None, close_location=None, real_time=None):
d = {'column_name': [], 'timeStamp': []}
df = MarketDataResponseFrame(pd.DataFrame(data=d))
df = df.set_index('timeStamp')
Expand All @@ -401,9 +401,9 @@ def test_swap_rate_calc(mocker):

try:
val = tm_rates.swap_rate_calc(asset, swap_tenor='10y', benchmark_type='SOFR', real_time=False)
assert False
except NotImplementedError:
assert True
except NotImplementedError:
assert False

try:
val = tm_rates.swap_rate_calc(asset, swap_tenor='10x', benchmark_type='SOFR', real_time=True)
Expand All @@ -422,6 +422,66 @@ def test_swap_rate_calc(mocker):
replace.restore()


def my_mocked_mxapi_measure(cls, curve_type=None, curve_asset=None, curve_point=None, curve_tags=None,
measure=None, start_time=None, end_time=None, request_id=None,
close_location=None, real_time=None):
d = {'column_name': [], 'timeStamp': []}
df = MarketDataResponseFrame(pd.DataFrame(data=d))
df = df.set_index('timeStamp')
return df


def test_curve_measures(mocker):
replace = Replacer()

mocker.patch.object(GsDataApi, 'get_mxapi_curve_measure')
bbid_mock = replace('gs_quant.timeseries.measures.Asset.get_identifier', Mock())

mocker.patch.object(GsDataApi, 'get_mxapi_curve_measure', side_effect=my_mocked_mxapi_measure)

asset = Currency('MAZ7RWC904JYHYPS', 'USD')
bbid_mock.return_value = 'USD'
val = tm_rates.forward_rate(asset, forward_term='1m')
assert len(val.keys()) == 0
val = tm_rates.discount_factor(asset, tenor='1m')
assert len(val.keys()) == 0
val = tm_rates.instantaneous_forward_rate(asset, tenor='1m')
assert len(val.keys()) == 0
val = tm_rates.index_forward_rate(asset, forward_start_tenor='1m', benchmark_type='LIBOR')
assert len(val.keys()) == 0

try:
val = tm_rates.forward_rate(asset)
assert False
except MqValueError:
assert True

try:
val = tm_rates.discount_factor(asset)
assert False
except MqValueError:
assert True

try:
val = tm_rates.index_forward_rate(asset)
assert False
except MqValueError:
assert True

try:
val = tm_rates.instantaneous_forward_rate(asset)
assert False
except MqValueError:
assert True

asset = Currency('MA890', 'EGP')
bbid_mock.return_value = 'EGP'
val = tm_rates.forward_rate(asset, forward_term='1m')
assert len(val.keys()) == 0

replace.restore()


def test_check_clearing_house():
assert tm_rates._ClearingHouse.LCH == tm_rates._check_clearing_house('lch')
assert tm_rates._ClearingHouse.CME == tm_rates._check_clearing_house(tm_rates._ClearingHouse.CME)
Expand Down

0 comments on commit 5db1deb

Please sign in to comment.