From 37e11ef690e5fee9392ffe493cb8a88accf88df2 Mon Sep 17 00:00:00 2001 From: "Roberson, Martin [GBM Public]" Date: Mon, 26 Feb 2024 10:03:16 +0000 Subject: [PATCH] Chore: Make release 1.0.63 --- gs_quant/api/gs/data.py | 29 +- .../06_baskets/tutorials/Basket Create.ipynb | 4 +- .../06_baskets/tutorials/Basket Edit.ipynb | 7 +- .../tutorials/Basket Rebalance.ipynb | 5 +- gs_quant/markets/baskets.py | 171 ++++++-- gs_quant/risk/result_handlers.py | 10 +- gs_quant/session.py | 13 + gs_quant/target/common.py | 338 ++++++++-------- gs_quant/target/content.py | 12 + gs_quant/target/indices.py | 302 +++++++++------ gs_quant/target/reports.py | 1 + gs_quant/target/risk_models.py | 365 ------------------ gs_quant/target/secmaster.py | 6 +- gs_quant/test/data/test_query.py | 21 +- gs_quant/test/markets/test_baskets.py | 9 +- gs_quant/test/timeseries/test_measures.py | 6 +- gs_quant/timeseries/measures.py | 16 +- 17 files changed, 606 insertions(+), 709 deletions(-) diff --git a/gs_quant/api/gs/data.py b/gs_quant/api/gs/data.py index b171b3e1..df466864 100644 --- a/gs_quant/api/gs/data.py +++ b/gs_quant/api/gs/data.py @@ -693,15 +693,16 @@ def build_interval_chunked_market_data_queries(asset_ids: List[str], where: Union[FieldFilterMap, Dict] = None, source: Union[str] = None, real_time: bool = False, - measure='Curve', - parallel_pool_size: int = 1) -> List[dict]: - def chunk_time(start, end, pool_size) -> tuple: - chunk_duration = (end - start) / pool_size - current = start - for _ in range(pool_size): - next_end = current + chunk_duration - yield current, next_end - current = next_end + measure='Curve') -> List[dict]: + parallel_interval = 365 # chunk over a year + + def chunk_time(start, end) -> tuple: + # chunk the time interval into 1 year chunks + s = start + while s < end: + e = min(s + dt.timedelta(days=parallel_interval), end) + yield s, e + s = e queries = [] if real_time: @@ -711,14 +712,14 @@ def chunk_time(start, end, pool_size) -> tuple: start, end = DataContext.current.start_date, DataContext.current.end_date start_key, end_key = 'startDate', 'endDate' - for s, e in chunk_time(start, end, parallel_pool_size): + for s, e in chunk_time(start, end): inner = copy(GsDataApi._get_market_data_filters(asset_ids, query_type, where, source, real_time, measure)) inner[start_key], inner[end_key] = s, e queries.append({ 'queries': [inner] }) - log_debug("", _logger, f"Created {len(queries)} market data queries. Pool size = {parallel_pool_size}") + log_debug("", _logger, f"Created {len(queries)} market data queries") return queries @@ -729,10 +730,10 @@ def build_market_data_query(asset_ids: List[str], source: Union[str] = None, real_time: bool = False, measure='Curve', - parallel_pool_size: int = 1) -> Union[dict, List[dict]]: - if parallel_pool_size > 1: + parallelize_queries: bool = False) -> Union[dict, List[dict]]: + if parallelize_queries: return GsDataApi.build_interval_chunked_market_data_queries(asset_ids, query_type, where, source, real_time, - measure, parallel_pool_size) + measure) inner = GsDataApi._get_market_data_filters(asset_ids, query_type, where, source, real_time, measure) if DataContext.current.interval is not None: diff --git a/gs_quant/documentation/06_baskets/tutorials/Basket Create.ipynb b/gs_quant/documentation/06_baskets/tutorials/Basket Create.ipynb index 6550502e..3dcb9ac1 100644 --- a/gs_quant/documentation/06_baskets/tutorials/Basket Create.ipynb +++ b/gs_quant/documentation/06_baskets/tutorials/Basket Create.ipynb @@ -55,6 +55,7 @@ "|currency |**Required**|-- |Denomination you want your basket to tick in. This can not be changed once your basket has been created|\n", "|return_type |**Required**|-- |Determines the index calculation methodology with respect to dividend reinvestment. One of Price Return, Gross Return, Total Return|\n", "|position_set |**Required**|-- |Information of constituents associated with the basket. You may provide the weight or quantity for each position. If neither is provided we will distribute the total weight evenly among each position. Please also note that any fractional shares will be rounded up to whole numbers.|\n", + "|cash_reinvestment_treatment|Optional|Reinvest At Open|How to treat cash acquisitions, regular dividends, and special dividends for basket underliers.|\n", "|description |Optional |-- |Free text description of basket. Description provided will be indexed in the search service for free text relevance match.|\n", "|divisor |Optional |-- |Divisor to be applied to the overall position set. You need not set this unless you want to change the divisor to a specific number, which will in turn change the basket price (current notional/divisor). This might impact price continuity.|\n", "|initial_price |Optional |100 |Initial price the basket should start ticking at|\n", @@ -62,7 +63,8 @@ "|publish_to_bloomberg|Optional |True |If you'd like us to publish your basket to Bloomberg|\n", "|publish_to_reuters |Optional |False |If you'd like us to publish your basket to Reuters |\n", "|publish_to_factset |Optional |False |If you'd like us to publish your basket to Factset |\n", - "|default_backcast |Optional |True |If you'd like us to backcast up to 5 years of pricing history and compositions, assuming constituents remained constant. Set to false if you'd like to upload your own custom history. If any IPOs are present in this composition, we will stop the backcast period accordingly.|\n", + "|historical_methodology|Optional |Backcast |Preferred methodology to be applied when publishing basket history.|\n", + "|backtest_parameters |Optional |-- |Rules applied when performing a historical backtest.|\n", "|reweight |Optional |False |If you'd like us to reweight positions if input weights don't add up to 1 upon submission|\n", "|weighting_strategy |Optional |-- |Strategy used to price the position set (will be inferred if not indicated). One of Equal, Market Capitalization, Quantity, Weight|\n", "|allow_ca_restricted_assets|Optional|False |Allow your basket to have constituents that will not be corporate action adjusted in the future (You will recieve a message indicating if this action is needed when attempting to create your basket)|\n", diff --git a/gs_quant/documentation/06_baskets/tutorials/Basket Edit.ipynb b/gs_quant/documentation/06_baskets/tutorials/Basket Edit.ipynb index 9bdd5611..b6769405 100644 --- a/gs_quant/documentation/06_baskets/tutorials/Basket Edit.ipynb +++ b/gs_quant/documentation/06_baskets/tutorials/Basket Edit.ipynb @@ -48,7 +48,10 @@ "|publish_to_bloomberg |If you'd like us to publish your basket to Bloomberg|\n", "|publish_to_reuters |If you'd like us to publish your basket to Reuters |\n", "|publish_to_factset |If you'd like us to publish your basket to Factset |\n", - "|include_price_history|Republish price history based on current composition when publishing to Bloomberg|" + "|include_price_history|Republish price history based on current composition|\n", + "|cash_reinvestment_treatment|How to treat cash acquisitions, regular dividends, and special dividends for basket underliers.|\n", + "|historical_methodology|Preferred methodology to be applied when publishing basket history.|\n", + "|backtest_parameters |Rules applied when performing a historical backtest.|" ] }, { @@ -135,4 +138,4 @@ }, "nbformat": 4, "nbformat_minor": 4 -} +} \ No newline at end of file diff --git a/gs_quant/documentation/06_baskets/tutorials/Basket Rebalance.ipynb b/gs_quant/documentation/06_baskets/tutorials/Basket Rebalance.ipynb index e154f711..e64f0997 100644 --- a/gs_quant/documentation/06_baskets/tutorials/Basket Rebalance.ipynb +++ b/gs_quant/documentation/06_baskets/tutorials/Basket Rebalance.ipynb @@ -54,7 +54,10 @@ "|reweight |Optional |If you'd like us to reweight positions if input weights don't add up to 1 upon submission|\n", "|weighting_strategy |Optional |Strategy used to price the position set (will be inferred if not indicated). One of Equal, Market Capitalization, Quantity, Weight|\n", "|allow_ca_restricted_assets|Optional|Allow your basket to have constituents that will not be corporate action adjusted in the future (You will recieve a message indicating if this action is needed when attempting to rebalance your basket)|\n", - "|allow_limited_access_assets|Optional|Allow basket to have constituents that GS has limited access to (You will recieve a message indicating if this action is needed when attempting to rebalance your basket)|" + "|allow_limited_access_assets|Optional|Allow basket to have constituents that GS has limited access to (You will recieve a message indicating if this action is needed when attempting to rebalance your basket)|\n", + "|cash_reinvestment_treatment|How to treat cash acquisitions, regular dividends, and special dividends for basket underliers.|\n", + "|historical_methodology|Preferred methodology to be applied when publishing basket history.|\n", + "|backtest_parameters |Rules applied when performing a historical backtest.|" ] }, { diff --git a/gs_quant/markets/baskets.py b/gs_quant/markets/baskets.py index 74ee34b2..a09ae3f8 100644 --- a/gs_quant/markets/baskets.py +++ b/gs_quant/markets/baskets.py @@ -609,6 +609,63 @@ def allow_limited_access_assets(self) -> Optional[bool]: def allow_limited_access_assets(self, value: bool): self.__allow_limited_access_assets = value + @property + def asset_class(self) -> Optional[AssetClass]: + """ Asset class of the basket """ + return self.__asset_class + + @asset_class.setter + @_validate(ErrorMessage.UNMODIFIABLE) + def asset_class(self, value: AssetClass): + self.__asset_class = value + + @property + def benchmark(self) -> Optional[str]: + """ Benchmark for a basket """ + return self.__benchmark + + @benchmark.setter + @_validate(ErrorMessage.NON_ADMIN, ErrorMessage.NON_INTERNAL) + def benchmark(self, value: str): + self.__benchmark = value + + @property + def backtest_parameters(self) -> Optional[EqBasketBacktestParameters]: + """ Backtest parameters for a basket """ + return self.__backtest_parameters + + @backtest_parameters.setter + @_validate(ErrorMessage.NON_ADMIN) + def backtest_parameters(self, value: EqBasketBacktestParameters): + if value is not None: + self.__historical_methodology = EqBasketHistoryMethodology.Backtest + self.__backtest_parameters = value + + @property + def bloomberg_publish_parameters(self) -> Optional[BloombergPublishParameters]: + """ Bloomberg publish overrides for a basket """ + return self.__bloomberg_publish_parameters + + @bloomberg_publish_parameters.setter + @_validate(ErrorMessage.NON_ADMIN, ErrorMessage.NON_INTERNAL) + def bloomberg_publish_parameters(self, value: BloombergPublishParameters): + self.__bloomberg_publish_parameters = value + + @property + def cash_reinvestment_treatment(self) -> Optional[CashReinvestmentTreatment]: + """ Cash reinvestment treatment options for a basket """ + return self.__cash_reinvestment_treatment + + @cash_reinvestment_treatment.setter + @_validate(ErrorMessage.NON_ADMIN) + def cash_reinvestment_treatment(self, value: Union[CashReinvestmentTreatment, CashReinvestmentTreatmentType]): + if isinstance(value, CashReinvestmentTreatmentType): + self.__cash_reinvestment_treatment = CashReinvestmentTreatment(cash_acquisition_treatment=value, + regular_dividend_treatment=value, + special_dividend_treatment=value) + else: + self.__cash_reinvestment_treatment = value + @property def clone_parent_id(self) -> Optional[str]: """ Marquee Id of the source basket, in case basket composition is sourced from another marquee basket """ @@ -632,6 +689,8 @@ def default_backcast(self) -> Optional[bool]: @default_backcast.setter @_validate(ErrorMessage.UNMODIFIABLE) def default_backcast(self, value: bool): + if not value: + self.__historical_methodology = EqBasketHistoryMethodology.Custom self.__default_backcast = value @property @@ -682,6 +741,17 @@ def hedge_id(self) -> Optional[str]: """ Marquee Id of the source hedge, in case current basket composition is sourced from marquee hedge """ return self.__hedge_id + @property + def historical_methodology(self) -> Optional[EqBasketHistoryMethodology]: + """ Historical methodology for a basket """ + return self.__historical_methodology + + @historical_methodology.setter + @_validate(ErrorMessage.NON_ADMIN) + def historical_methodology(self, value: EqBasketHistoryMethodology): + self.__default_backcast = value != EqBasketHistoryMethodology.Custom + self.__historical_methodology = value + @property def include_price_history(self) -> Optional[bool]: """ Include full price history when publishing to Bloomberg """ @@ -726,7 +796,7 @@ def parent_basket(self) -> Optional[str]: @parent_basket.setter @_validate(ErrorMessage.UNMODIFIABLE) def parent_basket(self, value: str): - self.__clone_parent_id = get(__get_gs_asset(value), 'id') + self.__clone_parent_id = get(self.__get_gs_asset(value), 'id') self.__parent_basket = value @property @@ -741,6 +811,16 @@ def position_set(self, value: PositionSet): self.__validate_position_set(value) self.__position_set = value + @property + def preferred_risk_model(self) -> Optional[str]: + """ Preferred risk model for a basket """ + return self.__preferred_risk_model + + @preferred_risk_model.setter + @_validate(ErrorMessage.NON_ADMIN, ErrorMessage.NON_INTERNAL) + def preferred_risk_model(self, value: str): + self.__preferred_risk_model = value + @property @_validate() def publish_to_bloomberg(self) -> Optional[bool]: @@ -773,6 +853,16 @@ def publish_to_reuters(self) -> Optional[bool]: def publish_to_reuters(self, value: bool): self.__publish_to_reuters = value + @property + def rebalance_calendar(self) -> Optional[EqBasketRebalanceCalendar]: + """ Expected rebalance calender/frequency a basket """ + return self.__rebalance_calendar + + @rebalance_calendar.setter + @_validate(ErrorMessage.NON_ADMIN, ErrorMessage.NON_INTERNAL) + def rebalance_calendar(self, value: EqBasketRebalanceCalendar): + self.__rebalance_calendar = value + @property def return_type(self) -> Optional[ReturnType]: """ Determines the index calculation methodology with respect to dividend reinvestment """ @@ -831,12 +921,12 @@ def __edit_and_rebalance(self, edit_inputs: CustomBasketsEditInputs, once the edit report has completed. Submitting basket edits now...') response = GsIndexApi.edit(self.id, edit_inputs) report_id = response.report_id - self.__latest_create_report = GsReportApi.get_report(response.report_id) + self.__latest_create_report = GsReportApi.get_report(report_id) report_status = self.poll_report(report_id, timeout=600, step=15) if report_status != ReportStatus.done: raise MqError(f'The basket edit report\'s status is {report_status}. The current rebalance request will \ not be submitted in the meantime.') - _logger.info('Your basket edits have completed successfuly. Submitting rebalance request now...') + _logger.info('Your basket edits have completed successfully. Submitting rebalance request now...') response = GsIndexApi.rebalance(self.id, rebal_inputs) return response @@ -856,13 +946,17 @@ def __finish_initialization(self): self.__initial_price = get(initial_price, 'price') set_(self.__initial_state, 'initial_price', self.__initial_price) if not has(self.__initial_state, 'publish_to_bloomberg'): - report = get(self, '__latest_create_report', self.__get_latest_create_report()) - self.__publish_to_bloomberg = get(report, 'parameters.publish_to_bloomberg') - self.__publish_to_factset = get(report, 'parameters.publish_to_factset') - self.__publish_to_reuters = get(report, 'parameters.publish_to_reuters') + report_params = self.__get_latest_create_report().parameters + self.__publish_to_bloomberg = report_params.publish_to_bloomberg + self.__publish_to_factset = report_params.publish_to_factset + self.__publish_to_reuters = report_params.publish_to_reuters + self.__backtest_parameters = report_params.backtest_parameters + self.__bloomberg_publish_parameters = report_params.bloomberg_publish_parameters set_(self.__initial_state, 'publish_to_bloomberg', self.__publish_to_bloomberg) set_(self.__initial_state, 'publish_to_factset', self.__publish_to_factset) set_(self.__initial_state, 'publish_to_reuters', self.__publish_to_reuters) + set_(self.__initial_state, 'bloomberg_publish_parameters', self.__bloomberg_publish_parameters) + set_(self.__initial_state, 'backtest_parameters', self.__backtest_parameters) if not has(self, '__entitlements'): self.__entitlements = BasketEntitlements.from_target(self.__initial_entitlements) self.__set_error_messages() @@ -876,57 +970,72 @@ def __get_gs_asset(identifier: str) -> GsAsset: return GsAssetApi.get_asset(get(response, '0.id')) def __get_latest_create_report(self) -> Report: - """ Used to find baskets's most recent price/publish info """ + """ Used to find basket's most recent price/publish info """ report = GsReportApi.get_reports(limit=1, position_source_id=self.id, report_type='Basket Create', order_by='>latestExecutionTime') return get(report, '0') def __get_updates(self) -> Tuple[Optional[CustomBasketsEditInputs], Optional[CustomBasketsRebalanceInputs]]: """ Compares initial and current basket state to determine if updates require edit/rebalance """ - edit_inputs, rebal_inputs, pricing, publish = {}, {}, {}, {} - update_publish_params = False + edit_inputs, eligible_for_edit = {}, False + rebal_inputs, eligible_for_rebal = {}, False + pricing, pricing_updated = {}, False + publish, publish_updated = {}, False + + positions = set(self.position_set.positions) + positions_updated = self.__initial_positions != positions for prop in CustomBasketsEditInputs.properties(): if get(self.__initial_state, prop) != get(self, prop): - set_(edit_inputs, prop, get(self, prop)) + eligible_for_edit = True + set_(edit_inputs, prop, get(self, prop)) for prop in CustomBasketsRebalanceInputs.properties(): - if prop != 'position_set' and get(self.__initial_state, prop) != get(self, prop): + if prop != 'position_set': + if get(self.__initial_state, prop) != get(self, prop): + eligible_for_rebal = True set_(rebal_inputs, prop, get(self, prop)) for prop in CustomBasketsPricingParameters.properties(): if get(self.__initial_state, prop) != get(self, prop): - set_(pricing, prop, get(self, prop)) + pricing_updated = True + set_(pricing, prop, get(self, prop)) for prop in PublishParameters.properties(): if get(self.__initial_state, prop) != get(self, prop): - update_publish_params = True + publish_updated = True set_(publish, prop, get(self, prop)) - curr_positions = set(self.position_set.positions) - position_set_changed = False if self.__initial_positions == curr_positions else True + # Since edit and rebalance have some shared inputs, we need to decide which action(s) to perform + # 1. rebalance if pricing/positions have changed or if rebalance specific metadata has been updated + # 2. edit if edit metadata has changed, or if only publishing options have changed (rebal not required) + should_rebal = pricing_updated or positions_updated or (eligible_for_rebal and not eligible_for_edit) + should_edit = (publish_updated and not should_rebal) or eligible_for_edit # handle nested objects and make sure required/default values are input correctly - if len(rebal_inputs) or len(pricing) or position_set_changed: + if should_rebal: set_(rebal_inputs, 'position_set', self.position_set.to_target(common=False)) set_(rebal_inputs, 'pricing_parameters', CustomBasketsPricingParameters(**pricing)) + set_(rebal_inputs, 'publish_parameters', PublishParameters(**publish)) + if should_edit: + set_(edit_inputs, 'publish_parameters', PublishParameters(**publish)) - # publish params can be sent during edit or rebal, so we choose depending on current payload states - if update_publish_params: - publish = PublishParameters(**publish) - set_(rebal_inputs if len(rebal_inputs) else edit_inputs, 'publish_parameters', publish) - - edit_inputs = None if not len(edit_inputs) else CustomBasketsEditInputs(**edit_inputs) - rebal_inputs = None if not len(rebal_inputs) else CustomBasketsRebalanceInputs(**rebal_inputs) + edit_inputs = CustomBasketsEditInputs(**edit_inputs) if should_edit else None + rebal_inputs = CustomBasketsRebalanceInputs(**rebal_inputs) if should_rebal else None return edit_inputs, rebal_inputs def __populate_current_attributes_for_existing_basket(self, gs_asset: GsAsset): """ Current basket settings for existing basket """ + self.__benchmark = get(gs_asset, 'parameters.benchmark') + self.__cash_reinvestment_treatment = get(gs_asset, 'parameters.cashReinvestmentTreatment') self.__clone_parent_id = get(gs_asset, 'parameters.cloneParentId') self.__default_backcast = get(gs_asset, 'parameters.defaultBackcast') self.__description = get(gs_asset, 'description') self.__flagship = get(gs_asset, 'parameters.flagship') self.__gs_asset_type = get(gs_asset, 'type') self.__hedge_id = get(gs_asset, 'parameters.hedgeId') + self.__historical_methodology = get(gs_asset, 'parameters.historicalMethodology') self.__include_price_history = False self.__live_date = get(gs_asset, 'liveDate') + self.__preferred_risk_model = get(gs_asset, 'parameters.preferredRiskModel') + self.__rebalance_calendar = get(gs_asset, 'parameters.rebalanceFrequency') self.__return_type = get(gs_asset, 'parameters.indexCalculationType') self.__ticker = get(gs_asset, 'xref.ticker') @@ -940,22 +1049,31 @@ def __populate_default_attributes_for_new_basket(self, **kwargs): """ Default basket settings prior to creation """ self.__allow_ca_restricted_assets = get(kwargs, 'allow_ca_restricted_assets') self.__allow_limited_access_assets = get(kwargs, 'allow_limited_access_assets') + self.__backtest_parameters = get(kwargs, 'backtest_parameters') + self.__benchmark = get(kwargs, 'benchmark') + self.__cash_reinvestment_treatment = get(kwargs, 'cash_reinvestment_treatment', CashReinvestmentTreatment( + cash_acquisition_treatment=CashReinvestmentTreatmentType.Reinvest_At_Open, + regular_dividend_treatment=CashReinvestmentTreatmentType.Reinvest_At_Open, + special_dividend_treatment=CashReinvestmentTreatmentType.Reinvest_At_Open)) self.__clone_parent_id = get(kwargs, 'clone_parent_id') self.__currency = get(kwargs, 'currency') self.__default_backcast = get(kwargs, 'default_backcast', True) self.__description = get(kwargs, 'description') self.__divisor = get(kwargs, 'divisor') self.__hedge_id = get(kwargs, 'hedge_id') + self.__historical_methodology = get(kwargs, 'historical_methodology', EqBasketHistoryMethodology.Backcast) self.__include_price_history = get(kwargs, 'include_price_history', False) self.__initial_price = get(kwargs, 'initial_price', 100) if self.__divisor is None else None self.__name = get(kwargs, 'name') self.__parent_basket = get(kwargs, 'parent_basket') if self.__parent_basket is not None and self.__clone_parent_id is None: - self.__clone_parent_id = get(__get_gs_asset(self.__parent_basket), 'id') + self.__clone_parent_id = get(self.__get_gs_asset(self.__parent_basket), 'id') self.__position_set = get(kwargs, 'position_set') + self.__preferred_risk_model = get(kwargs, 'preferred_risk_model') self.__publish_to_bloomberg = get(kwargs, 'publish_to_bloomberg', True) self.__publish_to_factset = get(kwargs, 'publish_to_factset', False) self.__publish_to_reuters = get(kwargs, 'publish_to_reuters', False) + self.__rebalance_calendar = get(kwargs, 'rebalance_calendar') self.__return_type = get(kwargs, 'return_type') self.__target_notional = get(kwargs, 'target_notional', 10000000) self.__ticker = get(kwargs, 'ticker') @@ -988,7 +1106,8 @@ def __validate_position_set(position_set: PositionSet): raise MqValueError(f'Error in resolving the following identifiers for date {position_set.date}: \ {[p.identifier for p in position_set.unresolved_positions]}') - def __validate_ticker(self, ticker: str): + @staticmethod + def __validate_ticker(ticker: str): """ Blocks ticker setter if entry is invalid """ if not len(ticker) == 8: raise MqValueError('Invalid ticker: must be 8 characters') diff --git a/gs_quant/risk/result_handlers.py b/gs_quant/risk/result_handlers.py index bf11af9b..7aabbb57 100644 --- a/gs_quant/risk/result_handlers.py +++ b/gs_quant/risk/result_handlers.py @@ -22,6 +22,7 @@ from .core import DataFrameWithInfo, ErrorValue, UnsupportedValue, FloatWithInfo, SeriesWithInfo, StringWithInfo, \ sort_values, MQVSValidatorDefnsWithInfo, MQVSValidatorDefn +from gs_quant.common import RiskMeasure, AssetClass, RiskMeasureType _logger = logging.getLogger(__name__) @@ -271,9 +272,16 @@ def map_coordinate_to_column(coordinate_struct, tag): return updated_struct +def __is_single_row_2nd_order_risk(risk_key: RiskKey): + return risk_key is not None and isinstance(risk_key.risk_measure, + RiskMeasure) and \ + risk_key.risk_measure.asset_class == AssetClass.Rates and \ + risk_key.risk_measure.measur_type in (RiskMeasureType.ParallelGamma, RiskMeasureType.ParallelGammaLocalCcy) + + def mdapi_second_order_table_handler(result: dict, risk_key: RiskKey, _instrument: InstrumentBase, request_id: Optional[str] = None) -> Union[DataFrameWithInfo, FloatWithInfo]: - if len(result['values']) == 1: + if len(result['values']) == 1 and __is_single_row_2nd_order_risk(risk_key): return risk_float_handler(result, risk_key, _instrument, request_id) coordinate_pairs = [] diff --git a/gs_quant/session.py b/gs_quant/session.py index e3e9ef32..94570852 100644 --- a/gs_quant/session.py +++ b/gs_quant/session.py @@ -20,6 +20,7 @@ import logging import os import ssl +import sys from abc import abstractmethod from configparser import ConfigParser from enum import Enum, auto, unique @@ -189,6 +190,7 @@ def init(self): self._session.headers.update({'X-Application': self.application}) self._session.headers.update({'X-Version': self.application_version}) self._authenticate() + self.post_to_activity_service() def close(self): self._session: requests.Session @@ -521,6 +523,17 @@ def use( session.init() cls.current = session + def post_to_activity_service(self): + params = {'featureApplication': self.application, + 'gsQuantVersion': self.application_version, + 'pythonVersion': f'{sys.version_info.major}.{sys.version_info.minor}'} + self._session.post(f'{self.domain}/{self.api_version}/activities', + verify=self.verify, + headers={'Content-Type': 'application/json; charset=utf-8'}, + data=json.dumps({'action': 'Initiated', 'kpis': [{'id': 'gsqInitiated', 'value': 1}], + 'resource': 'GSQuant', + 'parameters': params})) + @classmethod def get( cls, diff --git a/gs_quant/target/common.py b/gs_quant/target/common.py index f918e79a..ea0bc7b7 100644 --- a/gs_quant/target/common.py +++ b/gs_quant/target/common.py @@ -703,6 +703,7 @@ class Currency(EnumBase, Enum): DEM = 'DEM' DIJ = 'DIJ' DJF = 'DJF' + DJE = 'DJE' DKK = 'DKK' DOP = 'DOP' DZD = 'DZD' @@ -1009,6 +1010,28 @@ class EqBasketHistoryMethodology(EnumBase, Enum): Custom = 'Custom' +class EqBasketHolidayCalendar(EnumBase, Enum): + + """Holiday calendar by exchange.""" + + NYSE = 'NYSE' + LNSE = 'LNSE' + HKGE = 'HKGE' + + +class EqBasketRebalanceFrequencyRule(EnumBase, Enum): + + """Expected rebalance frequency for a basket.""" + + First_Biz_Day_of_Month = 'First Biz Day of Month' + Last_Biz_Day_of_Month = 'Last Biz Day of Month' + First_Biz_Day_of_Quarter = 'First Biz Day of Quarter' + Last_Biz_Day_of_Quarter = 'Last Biz Day of Quarter' + Last_Biz_Day_of_Quarter_first_Month = 'Last Biz Day of Quarter first Month' + Biweekly_Based_on_Last_Rebal = 'Biweekly Based on Last Rebal' + Custom = 'Custom' + + class FallbackType(EnumBase, Enum): """Different Rules for Libor Fallback""" @@ -4430,14 +4453,6 @@ class StrikeMethodType(EnumBase, Enum): Fixed = 'Fixed' -class StrikeType(EnumBase, Enum): - - """Style type, either spread of price""" - - Spread = 'Spread' - Price = 'Price' - - class SwapClearingHouse(EnumBase, Enum): """Swap Clearing House""" @@ -4538,7 +4553,7 @@ class ValuationTime(EnumBase, Enum): SQ = 'SQ' MktPreOpen = 'MktPreOpen' MktPrevClose = 'MktPrevClose' - HedgeUnwind = 'HedgeUnwind' + Hedge_Unwind = 'Hedge Unwind' class VarianceConvention(EnumBase, Enum): @@ -5306,11 +5321,10 @@ class EqBasketBacktestParameters(Base): @handle_camel_case_args @dataclass_json(letter_case=LetterCase.CAMEL) @dataclass(unsafe_hash=True, repr=False) -class EqBasketRebalanceFrequency(Base): +class EqBasketRebalanceCustomFrequencyRule(Base): frequency_interval: FrequencyInterval = field(default=None, metadata=field_metadata) every: float = field(default=1, metadata=field_metadata) on: Union[float, str] = field(default=None, metadata=field_metadata) - holiday_calendar: Optional[str] = field(default=None, metadata=field_metadata) name: Optional[str] = field(default=None, metadata=name_metadata) @@ -5658,132 +5672,6 @@ class TimestampedMarket(BaseMarket): name: Optional[str] = field(default=None, metadata=name_metadata) -@handle_camel_case_args -@dataclass_json(letter_case=LetterCase.CAMEL) -@dataclass(unsafe_hash=True, repr=False) -class AssetParameters(Base): - basket_type: Optional[str] = field(default=None, metadata=field_metadata) - style: Optional[str] = field(default=None, metadata=field_metadata) - index_calculation_type: Optional[str] = field(default=None, metadata=field_metadata) - index_return_type: Optional[str] = field(default=None, metadata=field_metadata) - index_divisor: Optional[float] = field(default=None, metadata=field_metadata) - currency: Optional[Currency] = field(default=None, metadata=field_metadata) - quote_currency: Optional[Currency] = field(default=None, metadata=field_metadata) - index_initial_price: Optional[float] = field(default=None, metadata=field_metadata) - initial_pricing_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) - expiration_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) - expiration_location: Optional[str] = field(default=None, metadata=field_metadata) - number_of_shares: Optional[float] = field(default=None, metadata=field_metadata) - option_style: Optional[str] = field(default=None, metadata=field_metadata) - option_type: Optional[OptionType] = field(default=None, metadata=field_metadata) - settlement_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) - settlement_type: Optional[str] = field(default=None, metadata=field_metadata) - strike_price: Optional[Union[float, str]] = field(default=None, metadata=field_metadata) - put_currency: Optional[Currency] = field(default=None, metadata=field_metadata) - put_amount: Optional[float] = field(default=None, metadata=field_metadata) - automatic_exercise: Optional[bool] = field(default=None, metadata=field_metadata) - call_amount: Optional[float] = field(default=None, metadata=field_metadata) - call_currency: Optional[Currency] = field(default=None, metadata=field_metadata) - exercise_time: Optional[str] = field(default=None, metadata=field_metadata) - multiplier: Optional[float] = field(default=None, metadata=field_metadata) - premium_payment_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) - premium: Optional[float] = field(default=None, metadata=field_metadata) - premium_currency: Optional[Currency] = field(default=None, metadata=field_metadata) - callable_: Optional[bool] = field(default=None, metadata=config(field_name='callable', exclude=exclude_none)) - puttable: Optional[bool] = field(default=None, metadata=field_metadata) - perpetual: Optional[bool] = field(default=None, metadata=field_metadata) - seniority: Optional[str] = field(default=None, metadata=field_metadata) - coupon_type: Optional[str] = field(default=None, metadata=field_metadata) - index: Optional[str] = field(default=None, metadata=field_metadata) - index_term: Optional[str] = field(default=None, metadata=field_metadata) - index_margin: Optional[float] = field(default=None, metadata=field_metadata) - coupon: Optional[float] = field(default=None, metadata=field_metadata) - issue_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) - issuer: Optional[str] = field(default=None, metadata=field_metadata) - issuer_country_code: Optional[str] = field(default=None, metadata=field_metadata) - issuer_type: Optional[str] = field(default=None, metadata=field_metadata) - issue_size: Optional[float] = field(default=None, metadata=field_metadata) - commodity_sector: Optional[CommoditySector] = field(default=None, metadata=field_metadata) - pricing_location: Optional[PricingLocation] = field(default=None, metadata=field_metadata) - contract_months: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - g10_currency: Optional[bool] = field(default=None, metadata=field_metadata) - portfolio_id: Optional[str] = field(default=None, metadata=field_metadata) - hedge_id: Optional[str] = field(default=None, metadata=field_metadata) - ultimate_ticker: Optional[str] = field(default=None, metadata=field_metadata) - strategy: Optional[Strategy] = field(default=None, metadata=field_metadata) - exchange_currency: Optional[Currency] = field(default=None, metadata=field_metadata) - region: Optional[str] = field(default=None, metadata=field_metadata) - delivery_point: Optional[str] = field(default=None, metadata=field_metadata) - pricing_index: Optional[str] = field(default=None, metadata=field_metadata) - common_code: Optional[str] = field(default=None, metadata=field_metadata) - issuer_id: Optional[str] = field(default=None, metadata=field_metadata) - contract_month: Optional[str] = field(default=None, metadata=field_metadata) - bloomberg_collateral_classification: Optional[str] = field(default=None, metadata=field_metadata) - load_type: Optional[str] = field(default=None, metadata=field_metadata) - contract_unit: Optional[str] = field(default=None, metadata=field_metadata) - index_approval_ids: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - is_pair_basket: Optional[bool] = field(default=None, metadata=field_metadata) - is_legacy_pair_basket: Optional[bool] = field(default=None, metadata=field_metadata) - fixed_rate_day_count_fraction: Optional[DayCountFraction] = field(default=None, metadata=field_metadata) - floating_rate_day_count_fraction: Optional[DayCountFraction] = field(default=None, metadata=field_metadata) - forward_price: Optional[float] = field(default=None, metadata=field_metadata) - pair_calculation: Optional[str] = field(default=None, metadata=field_metadata) - pay_day_count_fraction: Optional[DayCountFraction] = field(default=None, metadata=field_metadata) - receive_day_count_fraction: Optional[DayCountFraction] = field(default=None, metadata=field_metadata) - pay_frequency: Optional[str] = field(default=None, metadata=field_metadata) - receive_frequency: Optional[str] = field(default=None, metadata=field_metadata) - resettable_leg: Optional[PayReceive] = field(default=None, metadata=field_metadata) - inflation_lag: Optional[str] = field(default=None, metadata=field_metadata) - fx_index: Optional[str] = field(default=None, metadata=field_metadata) - index_notes: Optional[str] = field(default=None, metadata=field_metadata) - index_not_trading_reasons: Optional[IndexNotTradingReasons] = field(default=None, metadata=field_metadata) - trade_as: Optional[str] = field(default=None, metadata=field_metadata) - clone_parent_id: Optional[str] = field(default=None, metadata=field_metadata) - on_behalf_of: Optional[str] = field(default=None, metadata=field_metadata) - index_calculation_agent: Optional[str] = field(default=None, metadata=field_metadata) - product_type: Optional[ProductType] = field(default=None, metadata=field_metadata) - vendor: Optional[str] = field(default=None, metadata=field_metadata) - call_first_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) - call_last_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) - amount_outstanding: Optional[float] = field(default=None, metadata=field_metadata) - covered_bond: Optional[bool] = field(default=None, metadata=field_metadata) - issue_status: Optional[str] = field(default=None, metadata=field_metadata) - issue_status_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) - issue_price: Optional[float] = field(default=None, metadata=field_metadata) - sinkable: Optional[bool] = field(default=None, metadata=field_metadata) - sink_factor: Optional[float] = field(default=None, metadata=field_metadata) - accrued_interest_standard: Optional[float] = field(default=None, metadata=field_metadata) - redemption_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) - redemption_price: Optional[float] = field(default=None, metadata=field_metadata) - redemption_amount: Optional[float] = field(default=None, metadata=field_metadata) - redemption_percent: Optional[float] = field(default=None, metadata=field_metadata) - private_placement_type: Optional[str] = field(default=None, metadata=field_metadata) - minimum_piece: Optional[float] = field(default=None, metadata=field_metadata) - minimum_increment: Optional[float] = field(default=None, metadata=field_metadata) - next_coupon_payment: Optional[datetime.date] = field(default=None, metadata=field_metadata) - minimum_denomination: Optional[float] = field(default=None, metadata=field_metadata) - default_backcast: Optional[bool] = field(default=None, metadata=field_metadata) - index_precision: Optional[float] = field(default=None, metadata=field_metadata) - official_side: Optional[Side] = field(default=None, metadata=field_metadata) - valuation_source: Optional[BasketValuationSource] = field(default=None, metadata=field_metadata) - close_time: Optional[datetime.datetime] = field(default=None, metadata=field_metadata) - credit_index_series: Optional[str] = field(default=None, metadata=field_metadata) - reference_entity: Optional[str] = field(default=None, metadata=field_metadata) - restructuring_type: Optional[str] = field(default=None, metadata=field_metadata) - underlying_type: Optional[str] = field(default=None, metadata=field_metadata) - underlier: Optional[str] = field(default=None, metadata=field_metadata) - next_rebalance_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) - last_rebalance_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) - last_rebalance_approval_id: Optional[str] = field(default=None, metadata=field_metadata) - target_notional: Optional[float] = field(default=None, metadata=field_metadata) - rebalance_frequency: Optional[EqBasketRebalanceFrequency] = field(default=None, metadata=field_metadata) - historical_methodology: Optional[EqBasketHistoryMethodology] = field(default=None, metadata=field_metadata) - cash_reinvestment_treatment: Optional[CashReinvestmentTreatment] = field(default=None, metadata=field_metadata) - benchmark: Optional[str] = field(default=None, metadata=field_metadata) - attribution_dataset_id: Optional[str] = field(init=False, default='STSATTR', metadata=field_metadata) - name: Optional[str] = field(default=None, metadata=name_metadata) - - @handle_camel_case_args @dataclass_json(letter_case=LetterCase.CAMEL) @dataclass(unsafe_hash=True, repr=False) @@ -5842,14 +5730,14 @@ class CurveScenario(Scenario): @handle_camel_case_args @dataclass_json(letter_case=LetterCase.CAMEL) @dataclass(unsafe_hash=True, repr=False) -class EqBasketRebalanceCalendar(Base): - frequency_rule: Optional[EqBasketRebalanceFrequency] = field(default=None, metadata=field_metadata) - date_override: Optional[EqBasketRebalanceDateOverride] = field(default=None, metadata=field_metadata) +class EqBasketRebalanceFrequency(Base): + frequency_rule: DictBase = field(default=None, metadata=field_metadata) + holiday_calendar: Optional[EqBasketHolidayCalendar] = field(default=None, metadata=field_metadata) name: Optional[str] = field(default=None, metadata=name_metadata) class FieldFilterMap(DictBase): - _PROPERTIES = {'internal_index_calc_region', 'issue_status_date', 'pl_id', 'last_returns_start_date', 'amount_outstanding', 'asset_classifications_gics_sub_industry', 'mdapi_class', 'data_set_ids', 'call_first_date', 'pb_client_id', 'asset_parameters_start', 'owner_id', 'economic_terms_hash', 'sec_db', 'objective', 'simon_intl_asset_tags', 'private_placement_type', 'hedge_notional', 'rank', 'data_set_category', 'pair_calculation', 'asset_parameters_index_family', 'created_by_id', 'vehicle_type', 'market_data_type', 'asset_parameters_payer_day_count_fraction', 'point_class', 'asset_parameters_underlier_type', 'asset_parameters_cap_floor', 'minimum_increment', 'asset_parameters_payer_currency', 'settlement_date', 'hedge_volatility', 'version', 'tags', 'asset_classifications_gics_industry_group', 'market_data_asset', 'asset_classifications_is_primary', 'styles', 'asset_parameters_total_quantity', 'short_name', 'asset_classifications_underliers_asset_class', 'calculation_region', 'eid', 'jsn', 'mkt_quoting_style', 'hurdle_type', 'mic', 'ps_id', 'issue_status', 'region_code', 'dollar_cross', 'portfolio_type', 'vendor', 'popularity', 'term', 'currency', 'real_time_restriction_status', 'asset_parameters_clearing_house', 'rating_fitch', 'non_symbol_dimensions', 'asset_parameters_option_style', 'share_class_type', 'asset_parameters_put_amount', 'asset_parameters_underlier', 'next_rebalance_date', 'asset_parameters_floating_rate_designated_maturity', 'target_notional', 'asset_parameters_tenor', 'mkt_class', 'delisted', 'asset_classifications_digital_asset_class', 'last_updated_since', 'regional_focus', 'asset_parameters_payer_designated_maturity', 'tsdb_shortname', 'seasonal_adjustment_short', 'asset_parameters_exchange_currency', 'asset_classifications_country_name', 'management_fee', 'asset_parameters_settlement_date', 'rating_moodys', 'simon_id', 'development_status', 'cusip', 'notes', 'tags_to_exclude', 'asset_parameters_floating_rate_option', 'internal_index_calc_agent', 'last_rebalance_date', 'rating_second_highest', 'asset_classifications_country_code', 'frequency', 'option_type', 'data_set_sub_category', 'is_live', 'is_legacy_pair_basket', 'issuer_type', 'asset_parameters_pricing_location', 'plot_id', 'asset_parameters_coupon', 'asset_parameters_identifier', 'asset_parameters_last_fixing_date', 'data_product', 'mq_symbol', 'asset_parameters_method_of_settlement', 'sectors', 'redemption_notice_period', 'multiplier', 'asset_parameters_payer_rate_option', 'market_data_point', 'external', 'wpk', 'sts_fx_currency', 'hedge_annualized_volatility', 'fix_order_routing_region', 'name', 'asset_parameters_expiration_date', 'aum', 'exchange', 'folder_name', 'region', 'cid', 'onboarded', 'live_date', 'issue_price', 'sink_factor', 'underlying_data_set_id', 'asset_parameters_notional_amount_in_other_currency', 'asset_parameters_payer_frequency', 'prime_id', 'asset_classifications_gics_sector', 'asset_parameters_pair', 'sts_asset_name', 'description', 'asset_classifications_is_country_primary', 'title', 'net_exposure_classification', 'asset_parameters_strike_price', 'coupon_type', 'last_updated_by_id', 'asset_parameters_forward_price', 'clone_parent_id', 'company', 'gate_type', 'issue_date', 'expiration_date', 'coverage', 'ticker', 'asset_parameters_receiver_rate_option', 'coin_metrics_id', 'call_last_date', 'asset_parameters_payer_spread', 'sts_rates_country', 'asset_parameters_premium_payment_date', 'latest_execution_time', 'asset_parameters_forward_rate', 'asset_parameters_receiver_designated_maturity', 'asset_classifications_digital_asset_industry', 'gate', 'multi_tags', 'gsn', 'gss', 'rating_linear', 'asset_class', 'asset_parameters_index', 'cm_id', 'asset_classifications_vendor', 'type', 'gsideid', 'mdapi', 'ric', 'issuer', 'position_source_id', 'measures', 'asset_parameters_floating_rate_day_count_fraction', 'asset_parameters_notional_amount', 'strategy_aum', 'action', 'id', 'asset_parameters_call_amount', 'asset_parameters_seniority', 'redemption_date', 'identifier', 'index_create_source', 'sec_name', 'sub_region', 'asset_parameters_receiver_day_count_fraction', 'asset_parameters_index2_tenor', 'asset_parameters_notional_currency', 'sedol', 'mkt_asset', 'rating_standard_and_poors', 'asset_types', 'bcid', 'asset_parameters_credit_index_series', 'gsid', 'tdapi', 'asset_classifications_digital_asset_subsector', 'last_updated_message', 'rcic', 'trading_restriction', 'name_raw', 'status', 'asset_parameters_pay_or_receive', 'domains_data', 'client_name', 'asset_parameters_index_series', 'asset_classifications_gics_industry', 'on_behalf_of', 'increment', 'accrued_interest_standard', 'enabled', 'sts_commodity', 'sectors_raw', 'sts_commodity_sector', 'asset_parameters_receiver_frequency', 'position_source_name', 'gsid_equivalent', 'categories', 'symbol_dimensions', 'ext_mkt_asset', 'asset_parameters_fixed_rate_frequency', 'coupon', 'side_pocket', 'compliance_restricted_status', 'quoting_style', 'is_entity', 'scenario_group_id', 'asset_parameters_trade_as', 'redemption_period', 'asset_parameters_issuer_type', 'sts_credit_market', 'bbid', 'asset_classifications_risk_country_code', 'asset_parameters_receiver_currency', 'sts_em_dm', 'asset_classifications_digital_asset_sector', 'issue_size', 'returns_enabled', 'seniority', 'asset_parameters_settlement', 'asset_parameters_expiration_time', 'primary_country_ric', 'is_pair_basket', 'asset_parameters_index_version', 'asset_parameters_commodity_reference_price', 'asset_classifications_digital_asset_market', 'default_backcast', 'asset_parameters_number_of_shares', 'use_machine_learning', 'performance_fee', 'report_type', 'lockup_type', 'lockup', 'underlying_asset_ids', 'asset_parameters_fee_currency', 'encoded_stats', 'pnode_id', 'backtest_type', 'asset_parameters_issuer', 'exchange_code', 'asset_parameters_strike', 'oe_id', 'asset_parameters_termination_date', 'resource', 'asset_parameters_receiver_spread', 'bbid_equivalent', 'hurdle', 'asset_parameters_effective_date', 'valoren', 'asset_parameters_number_of_options', 'asset_parameters_fixed_rate_day_count_fraction', 'auto_tags', 'short_description', 'ext_mkt_class', 'mkt_point1', 'portfolio_managers', 'asset_parameters_commodity_sector', 'hedge_tracking_error', 'asset_parameters_put_currency', 'asset_parameters_coupon_type', 'supra_strategy', 'term_status', 'wi_id', 'market_cap_category', 'asset_parameters_call_currency', 'mkt_point3', 'display_id', 'mkt_point2', 'strike_price', 'mkt_point4', 'risk_packages', 'units', 'em_id', 'sts_credit_region', 'country_id', 'ext_mkt_point3', 'asset_classifications_risk_country_name', 'asset_parameters_vendor', 'asset_parameters_index1_tenor', 'mkt_type', 'is_public', 'alias', 'ext_mkt_point1', 'product_type', 'sub_region_code', 'ext_mkt_point2', 'asset_parameters_option_type', 'asset_parameters_fixed_rate', 'last_returns_end_date', 'tsdb_synced_symbol', 'position_source_type', 'asset_parameters_multiplier', 'minimum_denomination', 'flagship', 'lms_id', 'cross', 'in_code', 'asset_parameters_strike_price_relative', 'sts_rates_maturity', 'sts_include_sstk_analytics', 'position_source', 'listed', 'non_owner_id', 'latest_end_date', 'shock_style', 'g10_currency', 'strategy', 'methodology', 'isin', 'asset_parameters_strike_type'} + _PROPERTIES = {'internal_index_calc_region', 'issue_status_date', 'pl_id', 'last_returns_start_date', 'amount_outstanding', 'asset_classifications_gics_sub_industry', 'mdapi_class', 'data_set_ids', 'call_first_date', 'pb_client_id', 'asset_parameters_start', 'owner_id', 'economic_terms_hash', 'sec_db', 'objective', 'simon_intl_asset_tags', 'private_placement_type', 'hedge_notional', 'rank', 'data_set_category', 'pair_calculation', 'asset_parameters_index_family', 'created_by_id', 'vehicle_type', 'market_data_type', 'asset_parameters_payer_day_count_fraction', 'point_class', 'asset_parameters_underlier_type', 'asset_parameters_cap_floor', 'minimum_increment', 'asset_parameters_payer_currency', 'settlement_date', 'hedge_volatility', 'version', 'tags', 'asset_classifications_gics_industry_group', 'market_data_asset', 'asset_classifications_is_primary', 'styles', 'asset_parameters_total_quantity', 'short_name', 'asset_classifications_underliers_asset_class', 'calculation_region', 'eid', 'jsn', 'mkt_quoting_style', 'hurdle_type', 'mic', 'ps_id', 'issue_status', 'region_code', 'dollar_cross', 'portfolio_type', 'vendor', 'popularity', 'term', 'currency', 'real_time_restriction_status', 'asset_parameters_clearing_house', 'rating_fitch', 'non_symbol_dimensions', 'asset_parameters_option_style', 'share_class_type', 'asset_parameters_put_amount', 'asset_parameters_underlier', 'next_rebalance_date', 'asset_parameters_floating_rate_designated_maturity', 'target_notional', 'asset_parameters_tenor', 'mkt_class', 'delisted', 'asset_classifications_digital_asset_class', 'last_updated_since', 'regional_focus', 'asset_parameters_payer_designated_maturity', 'tsdb_shortname', 'seasonal_adjustment_short', 'asset_parameters_exchange_currency', 'asset_classifications_country_name', 'management_fee', 'asset_parameters_settlement_date', 'rating_moodys', 'simon_id', 'development_status', 'cusip', 'notes', 'tags_to_exclude', 'asset_parameters_floating_rate_option', 'internal_index_calc_agent', 'last_rebalance_date', 'rating_second_highest', 'asset_classifications_country_code', 'frequency', 'option_type', 'data_set_sub_category', 'is_live', 'is_legacy_pair_basket', 'issuer_type', 'asset_parameters_pricing_location', 'plot_id', 'asset_parameters_coupon', 'asset_parameters_identifier', 'asset_parameters_last_fixing_date', 'data_product', 'mq_symbol', 'asset_parameters_method_of_settlement', 'sectors', 'redemption_notice_period', 'multiplier', 'asset_parameters_payer_rate_option', 'market_data_point', 'external', 'wpk', 'sts_fx_currency', 'hedge_annualized_volatility', 'fix_order_routing_region', 'name', 'asset_parameters_expiration_date', 'aum', 'exchange', 'folder_name', 'region', 'cid', 'onboarded', 'live_date', 'issue_price', 'sink_factor', 'underlying_data_set_id', 'asset_parameters_notional_amount_in_other_currency', 'asset_parameters_payer_frequency', 'prime_id', 'asset_classifications_gics_sector', 'asset_parameters_pair', 'sts_asset_name', 'description', 'asset_classifications_is_country_primary', 'title', 'net_exposure_classification', 'asset_parameters_strike_price', 'coupon_type', 'last_updated_by_id', 'asset_parameters_forward_price', 'clone_parent_id', 'company', 'gate_type', 'issue_date', 'expiration_date', 'coverage', 'ticker', 'asset_parameters_receiver_rate_option', 'coin_metrics_id', 'call_last_date', 'asset_parameters_payer_spread', 'sts_rates_country', 'asset_parameters_premium_payment_date', 'latest_execution_time', 'asset_parameters_forward_rate', 'asset_parameters_receiver_designated_maturity', 'asset_classifications_digital_asset_industry', 'gate', 'multi_tags', 'gsn', 'gss', 'rating_linear', 'asset_class', 'asset_parameters_index', 'cm_id', 'asset_classifications_vendor', 'type', 'gsideid', 'mdapi', 'ric', 'issuer', 'position_source_id', 'measures', 'asset_parameters_floating_rate_day_count_fraction', 'asset_parameters_notional_amount', 'strategy_aum', 'action', 'id', 'asset_parameters_call_amount', 'asset_parameters_seniority', 'redemption_date', 'identifier', 'index_create_source', 'sec_name', 'sub_region', 'asset_parameters_receiver_day_count_fraction', 'asset_parameters_index2_tenor', 'asset_parameters_notional_currency', 'sedol', 'mkt_asset', 'rating_standard_and_poors', 'asset_types', 'bcid', 'asset_parameters_credit_index_series', 'gsid', 'tdapi', 'asset_classifications_digital_asset_subsector', 'last_updated_message', 'rcic', 'trading_restriction', 'status', 'name_raw', 'asset_parameters_pay_or_receive', 'domains_data', 'client_name', 'asset_parameters_index_series', 'asset_classifications_gics_industry', 'on_behalf_of', 'increment', 'accrued_interest_standard', 'enabled', 'sts_commodity', 'sectors_raw', 'sts_commodity_sector', 'asset_parameters_receiver_frequency', 'position_source_name', 'gsid_equivalent', 'categories', 'symbol_dimensions', 'ext_mkt_asset', 'asset_parameters_fixed_rate_frequency', 'coupon', 'side_pocket', 'compliance_restricted_status', 'quoting_style', 'is_entity', 'scenario_group_id', 'asset_parameters_trade_as', 'redemption_period', 'asset_parameters_issuer_type', 'sts_credit_market', 'bbid', 'asset_classifications_risk_country_code', 'asset_parameters_receiver_currency', 'sts_em_dm', 'asset_classifications_digital_asset_sector', 'issue_size', 'returns_enabled', 'seniority', 'asset_parameters_settlement', 'asset_parameters_expiration_time', 'primary_country_ric', 'is_pair_basket', 'asset_parameters_index_version', 'asset_parameters_commodity_reference_price', 'asset_classifications_digital_asset_market', 'default_backcast', 'asset_parameters_number_of_shares', 'use_machine_learning', 'performance_fee', 'report_type', 'lockup_type', 'lockup', 'underlying_asset_ids', 'asset_parameters_fee_currency', 'encoded_stats', 'pnode_id', 'backtest_type', 'asset_parameters_issuer', 'exchange_code', 'asset_parameters_strike', 'oe_id', 'asset_parameters_termination_date', 'resource', 'asset_parameters_receiver_spread', 'bbid_equivalent', 'hurdle', 'asset_parameters_effective_date', 'valoren', 'asset_parameters_number_of_options', 'asset_parameters_fixed_rate_day_count_fraction', 'auto_tags', 'short_description', 'ext_mkt_class', 'mkt_point1', 'portfolio_managers', 'asset_parameters_commodity_sector', 'hedge_tracking_error', 'asset_parameters_put_currency', 'asset_parameters_coupon_type', 'supra_strategy', 'term_status', 'wi_id', 'market_cap_category', 'asset_parameters_call_currency', 'mkt_point3', 'display_id', 'mkt_point2', 'strike_price', 'mkt_point4', 'risk_packages', 'units', 'em_id', 'sts_credit_region', 'country_id', 'ext_mkt_point3', 'asset_classifications_risk_country_name', 'asset_parameters_vendor', 'asset_parameters_index1_tenor', 'mkt_type', 'is_public', 'alias', 'ext_mkt_point1', 'product_type', 'ext_mkt_point2', 'sub_region_code', 'asset_parameters_option_type', 'asset_parameters_fixed_rate', 'last_returns_end_date', 'tsdb_synced_symbol', 'position_source_type', 'asset_parameters_multiplier', 'minimum_denomination', 'flagship', 'lms_id', 'cross', 'in_code', 'asset_parameters_strike_price_relative', 'sts_rates_maturity', 'sts_include_sstk_analytics', 'position_source', 'listed', 'non_owner_id', 'latest_end_date', 'shock_style', 'g10_currency', 'strategy', 'methodology', 'isin', 'asset_parameters_strike_type'} @handle_camel_case_args @@ -5945,6 +5833,7 @@ class User(Base): eaa_company: Optional[str] = field(default=None, metadata=field_metadata) root_oe_id: Optional[str] = field(default=None, metadata=config(field_name='rootOEId', exclude=exclude_none)) oe_id: Optional[str] = field(default=None, metadata=field_metadata) + drg_id: Optional[str] = field(default=None, metadata=field_metadata) root_oe_name: Optional[str] = field(default=None, metadata=config(field_name='rootOEName', exclude=exclude_none)) oe_name: Optional[str] = field(default=None, metadata=field_metadata) oe_alias: Optional[int] = field(default=None, metadata=field_metadata) @@ -5973,6 +5862,132 @@ class User(Base): app_managers: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) +@handle_camel_case_args +@dataclass_json(letter_case=LetterCase.CAMEL) +@dataclass(unsafe_hash=True, repr=False) +class AssetParameters(Base): + basket_type: Optional[str] = field(default=None, metadata=field_metadata) + style: Optional[str] = field(default=None, metadata=field_metadata) + index_calculation_type: Optional[str] = field(default=None, metadata=field_metadata) + index_return_type: Optional[str] = field(default=None, metadata=field_metadata) + index_divisor: Optional[float] = field(default=None, metadata=field_metadata) + currency: Optional[Currency] = field(default=None, metadata=field_metadata) + quote_currency: Optional[Currency] = field(default=None, metadata=field_metadata) + index_initial_price: Optional[float] = field(default=None, metadata=field_metadata) + initial_pricing_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) + expiration_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) + expiration_location: Optional[str] = field(default=None, metadata=field_metadata) + number_of_shares: Optional[float] = field(default=None, metadata=field_metadata) + option_style: Optional[str] = field(default=None, metadata=field_metadata) + option_type: Optional[OptionType] = field(default=None, metadata=field_metadata) + settlement_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) + settlement_type: Optional[str] = field(default=None, metadata=field_metadata) + strike_price: Optional[Union[float, str]] = field(default=None, metadata=field_metadata) + put_currency: Optional[Currency] = field(default=None, metadata=field_metadata) + put_amount: Optional[float] = field(default=None, metadata=field_metadata) + automatic_exercise: Optional[bool] = field(default=None, metadata=field_metadata) + call_amount: Optional[float] = field(default=None, metadata=field_metadata) + call_currency: Optional[Currency] = field(default=None, metadata=field_metadata) + exercise_time: Optional[str] = field(default=None, metadata=field_metadata) + multiplier: Optional[float] = field(default=None, metadata=field_metadata) + premium_payment_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) + premium: Optional[float] = field(default=None, metadata=field_metadata) + premium_currency: Optional[Currency] = field(default=None, metadata=field_metadata) + callable_: Optional[bool] = field(default=None, metadata=config(field_name='callable', exclude=exclude_none)) + puttable: Optional[bool] = field(default=None, metadata=field_metadata) + perpetual: Optional[bool] = field(default=None, metadata=field_metadata) + seniority: Optional[str] = field(default=None, metadata=field_metadata) + coupon_type: Optional[str] = field(default=None, metadata=field_metadata) + index: Optional[str] = field(default=None, metadata=field_metadata) + index_term: Optional[str] = field(default=None, metadata=field_metadata) + index_margin: Optional[float] = field(default=None, metadata=field_metadata) + coupon: Optional[float] = field(default=None, metadata=field_metadata) + issue_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) + issuer: Optional[str] = field(default=None, metadata=field_metadata) + issuer_country_code: Optional[str] = field(default=None, metadata=field_metadata) + issuer_type: Optional[str] = field(default=None, metadata=field_metadata) + issue_size: Optional[float] = field(default=None, metadata=field_metadata) + commodity_sector: Optional[CommoditySector] = field(default=None, metadata=field_metadata) + pricing_location: Optional[PricingLocation] = field(default=None, metadata=field_metadata) + contract_months: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) + g10_currency: Optional[bool] = field(default=None, metadata=field_metadata) + portfolio_id: Optional[str] = field(default=None, metadata=field_metadata) + hedge_id: Optional[str] = field(default=None, metadata=field_metadata) + ultimate_ticker: Optional[str] = field(default=None, metadata=field_metadata) + strategy: Optional[Strategy] = field(default=None, metadata=field_metadata) + exchange_currency: Optional[Currency] = field(default=None, metadata=field_metadata) + region: Optional[str] = field(default=None, metadata=field_metadata) + delivery_point: Optional[str] = field(default=None, metadata=field_metadata) + pricing_index: Optional[str] = field(default=None, metadata=field_metadata) + common_code: Optional[str] = field(default=None, metadata=field_metadata) + issuer_id: Optional[str] = field(default=None, metadata=field_metadata) + contract_month: Optional[str] = field(default=None, metadata=field_metadata) + bloomberg_collateral_classification: Optional[str] = field(default=None, metadata=field_metadata) + load_type: Optional[str] = field(default=None, metadata=field_metadata) + contract_unit: Optional[str] = field(default=None, metadata=field_metadata) + index_approval_ids: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) + is_pair_basket: Optional[bool] = field(default=None, metadata=field_metadata) + is_legacy_pair_basket: Optional[bool] = field(default=None, metadata=field_metadata) + fixed_rate_day_count_fraction: Optional[DayCountFraction] = field(default=None, metadata=field_metadata) + floating_rate_day_count_fraction: Optional[DayCountFraction] = field(default=None, metadata=field_metadata) + forward_price: Optional[float] = field(default=None, metadata=field_metadata) + pair_calculation: Optional[str] = field(default=None, metadata=field_metadata) + pay_day_count_fraction: Optional[DayCountFraction] = field(default=None, metadata=field_metadata) + receive_day_count_fraction: Optional[DayCountFraction] = field(default=None, metadata=field_metadata) + pay_frequency: Optional[str] = field(default=None, metadata=field_metadata) + receive_frequency: Optional[str] = field(default=None, metadata=field_metadata) + resettable_leg: Optional[PayReceive] = field(default=None, metadata=field_metadata) + inflation_lag: Optional[str] = field(default=None, metadata=field_metadata) + fx_index: Optional[str] = field(default=None, metadata=field_metadata) + index_notes: Optional[str] = field(default=None, metadata=field_metadata) + index_not_trading_reasons: Optional[IndexNotTradingReasons] = field(default=None, metadata=field_metadata) + trade_as: Optional[str] = field(default=None, metadata=field_metadata) + clone_parent_id: Optional[str] = field(default=None, metadata=field_metadata) + on_behalf_of: Optional[str] = field(default=None, metadata=field_metadata) + index_calculation_agent: Optional[str] = field(default=None, metadata=field_metadata) + product_type: Optional[ProductType] = field(default=None, metadata=field_metadata) + vendor: Optional[str] = field(default=None, metadata=field_metadata) + call_first_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) + call_last_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) + amount_outstanding: Optional[float] = field(default=None, metadata=field_metadata) + covered_bond: Optional[bool] = field(default=None, metadata=field_metadata) + issue_status: Optional[str] = field(default=None, metadata=field_metadata) + issue_status_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) + issue_price: Optional[float] = field(default=None, metadata=field_metadata) + sinkable: Optional[bool] = field(default=None, metadata=field_metadata) + sink_factor: Optional[float] = field(default=None, metadata=field_metadata) + accrued_interest_standard: Optional[float] = field(default=None, metadata=field_metadata) + redemption_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) + redemption_price: Optional[float] = field(default=None, metadata=field_metadata) + redemption_amount: Optional[float] = field(default=None, metadata=field_metadata) + redemption_percent: Optional[float] = field(default=None, metadata=field_metadata) + private_placement_type: Optional[str] = field(default=None, metadata=field_metadata) + minimum_piece: Optional[float] = field(default=None, metadata=field_metadata) + minimum_increment: Optional[float] = field(default=None, metadata=field_metadata) + next_coupon_payment: Optional[datetime.date] = field(default=None, metadata=field_metadata) + minimum_denomination: Optional[float] = field(default=None, metadata=field_metadata) + default_backcast: Optional[bool] = field(default=None, metadata=field_metadata) + index_precision: Optional[float] = field(default=None, metadata=field_metadata) + official_side: Optional[Side] = field(default=None, metadata=field_metadata) + valuation_source: Optional[BasketValuationSource] = field(default=None, metadata=field_metadata) + close_time: Optional[datetime.datetime] = field(default=None, metadata=field_metadata) + credit_index_series: Optional[str] = field(default=None, metadata=field_metadata) + reference_entity: Optional[str] = field(default=None, metadata=field_metadata) + restructuring_type: Optional[str] = field(default=None, metadata=field_metadata) + underlying_type: Optional[str] = field(default=None, metadata=field_metadata) + underlier: Optional[str] = field(default=None, metadata=field_metadata) + next_rebalance_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) + last_rebalance_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) + last_rebalance_approval_id: Optional[str] = field(default=None, metadata=field_metadata) + target_notional: Optional[float] = field(default=None, metadata=field_metadata) + rebalance_frequency: Optional[EqBasketRebalanceFrequency] = field(default=None, metadata=field_metadata) + historical_methodology: Optional[EqBasketHistoryMethodology] = field(default=None, metadata=field_metadata) + cash_reinvestment_treatment: Optional[CashReinvestmentTreatment] = field(default=None, metadata=field_metadata) + benchmark: Optional[str] = field(default=None, metadata=field_metadata) + attribution_dataset_id: Optional[str] = field(init=False, default='STSATTR', metadata=field_metadata) + name: Optional[str] = field(default=None, metadata=name_metadata) + + @handle_camel_case_args @dataclass_json(letter_case=LetterCase.CAMEL) @dataclass(unsafe_hash=True, repr=False) @@ -5984,21 +5999,9 @@ class CSLScheduleArray(Base): @handle_camel_case_args @dataclass_json(letter_case=LetterCase.CAMEL) @dataclass(unsafe_hash=True, repr=False) -class EntityQuery(Base): - format_: Optional[Format] = field(default=None, metadata=config(field_name='format', exclude=exclude_none)) - where: Optional[FieldFilterMap] = field(default=None, metadata=field_metadata) - as_of_time: Optional[datetime.datetime] = field(default=None, metadata=field_metadata) - last_updated_since: Optional[datetime.datetime] = field(default=None, metadata=field_metadata) - date: Optional[datetime.date] = field(default=None, metadata=field_metadata) - time: Optional[datetime.datetime] = field(default=None, metadata=field_metadata) - delay: Optional[int] = field(default=None, metadata=field_metadata) - order_by: Optional[Tuple[Union[DictBase, str], ...]] = field(default=None, metadata=field_metadata) - scroll: Optional[str] = field(default=None, metadata=field_metadata) - scroll_id: Optional[str] = field(default=None, metadata=field_metadata) - fields: Optional[Tuple[Union[DictBase, str], ...]] = field(default=None, metadata=field_metadata) - limit: Optional[int] = field(default=None, metadata=field_metadata) - offset: Optional[int] = field(default=None, metadata=field_metadata) - vendor: Optional[str] = field(default=None, metadata=field_metadata) +class EqBasketRebalanceCalendar(Base): + frequency_rule: Optional[EqBasketRebalanceFrequency] = field(default=None, metadata=field_metadata) + date_override: Optional[EqBasketRebalanceDateOverride] = field(default=None, metadata=field_metadata) name: Optional[str] = field(default=None, metadata=name_metadata) @@ -6075,6 +6078,27 @@ class DataSetFieldMap(Base): name: Optional[str] = field(default=None, metadata=name_metadata) +@handle_camel_case_args +@dataclass_json(letter_case=LetterCase.CAMEL) +@dataclass(unsafe_hash=True, repr=False) +class EntityQuery(Base): + format_: Optional[Format] = field(default=None, metadata=config(field_name='format', exclude=exclude_none)) + where: Optional[FieldFilterMap] = field(default=None, metadata=field_metadata) + as_of_time: Optional[datetime.datetime] = field(default=None, metadata=field_metadata) + last_updated_since: Optional[datetime.datetime] = field(default=None, metadata=field_metadata) + date: Optional[datetime.date] = field(default=None, metadata=field_metadata) + time: Optional[datetime.datetime] = field(default=None, metadata=field_metadata) + delay: Optional[int] = field(default=None, metadata=field_metadata) + order_by: Optional[Tuple[Union[DictBase, str], ...]] = field(default=None, metadata=field_metadata) + scroll: Optional[str] = field(default=None, metadata=field_metadata) + scroll_id: Optional[str] = field(default=None, metadata=field_metadata) + fields: Optional[Tuple[Union[DictBase, str], ...]] = field(default=None, metadata=field_metadata) + limit: Optional[int] = field(default=None, metadata=field_metadata) + offset: Optional[int] = field(default=None, metadata=field_metadata) + vendor: Optional[str] = field(default=None, metadata=field_metadata) + name: Optional[str] = field(default=None, metadata=name_metadata) + + @handle_camel_case_args @dataclass_json(letter_case=LetterCase.CAMEL) @dataclass(unsafe_hash=True, repr=False) @@ -6226,7 +6250,7 @@ class ReportParameters(Base): aggregate_by_tag_name: Optional[str] = field(default=None, metadata=field_metadata) fx_hedged: Optional[bool] = field(default=None, metadata=field_metadata) rebalance_calendar: Optional[EqBasketRebalanceCalendar] = field(default=None, metadata=field_metadata) - cash_reinvestment_treatment: Optional[Tuple[CashReinvestmentTreatment, ...]] = field(default=None, metadata=field_metadata) + cash_reinvestment_treatment: Optional[CashReinvestmentTreatment] = field(default=None, metadata=field_metadata) historical_methodology: Optional[EqBasketHistoryMethodology] = field(default=None, metadata=field_metadata) backtest_parameters: Optional[EqBasketBacktestParameters] = field(default=None, metadata=field_metadata) bloomberg_publish_parameters: Optional[BloombergPublishParameters] = field(default=None, metadata=field_metadata) diff --git a/gs_quant/target/content.py b/gs_quant/target/content.py index 4a0098a5..62c7ca6e 100644 --- a/gs_quant/target/content.py +++ b/gs_quant/target/content.py @@ -245,6 +245,16 @@ class QueryableStatus(EnumBase, Enum): Replaced = 'Replaced' +@handle_camel_case_args +@dataclass_json(letter_case=LetterCase.CAMEL) +@dataclass(unsafe_hash=True, repr=False) +class ChannelMetadata(Base): + name: Optional[str] = field(default=None, metadata=field_metadata) + channel_visibility: Optional[object] = field(default=None, metadata=field_metadata) + restricted: Optional[bool] = field(default=None, metadata=field_metadata) + streaming: Optional[bool] = field(default=None, metadata=field_metadata) + + @handle_camel_case_args @dataclass_json(letter_case=LetterCase.CAMEL) @dataclass(unsafe_hash=True, repr=False) @@ -407,6 +417,8 @@ class ContentParameters(Base): is_flow: Optional[bool] = field(default=None, metadata=field_metadata) is_research_summary: Optional[bool] = field(default=None, metadata=field_metadata) is_restricted: Optional[bool] = field(default=None, metadata=field_metadata) + post_sharing_type: Optional[object] = field(default=None, metadata=field_metadata) + channels_metadata: Optional[Tuple[ChannelMetadata, ...]] = field(default=None, metadata=field_metadata) name: Optional[str] = field(default=None, metadata=name_metadata) diff --git a/gs_quant/target/indices.py b/gs_quant/target/indices.py index b40adeac..0dda86b0 100644 --- a/gs_quant/target/indices.py +++ b/gs_quant/target/indices.py @@ -37,6 +37,31 @@ class ApprovalStatus(EnumBase, Enum): Error = 'Error' +class ISelectActionType(EnumBase, Enum): + + """Workflow actions that exist in ISelect""" + + GetStatus = 'GetStatus' + ValidateRebalance = 'ValidateRebalance' + ToggleConstraints = 'ToggleConstraints' + GenerateSubmissionConfirm = 'GenerateSubmissionConfirm' + GenerateSubmissionConfirmWithWaiver = 'GenerateSubmissionConfirmWithWaiver' + SubmitRebalance = 'SubmitRebalance' + CancelRebalance = 'CancelRebalance' + SubmitDraft = 'SubmitDraft' + CancelDraft = 'CancelDraft' + AgeDraft = 'AgeDraft' + RerunChecks = 'RerunChecks' + TraderApproves = 'TraderApproves' + TraderRejects = 'TraderRejects' + ClientVerifierApproves = 'ClientVerifierApproves' + ClientVerifierRejects = 'ClientVerifierRejects' + ClearException = 'ClearException' + ClientAcknowledges = 'ClientAcknowledges' + AllowWaiver = 'AllowWaiver' + DisableWaiver = 'DisableWaiver' + + class IndicesCurrency(EnumBase, Enum): """Currencies supported for Indices""" @@ -209,17 +234,6 @@ class Link(Base): name: Optional[str] = field(default=None, metadata=name_metadata) -@handle_camel_case_args -@dataclass_json(letter_case=LetterCase.CAMEL) -@dataclass(unsafe_hash=True, repr=False) -class PublishParameters(Base): - publish_to_bloomberg: bool = field(default=False, metadata=field_metadata) - include_price_history: bool = field(default=False, metadata=field_metadata) - publish_to_reuters: Optional[bool] = field(default=False, metadata=field_metadata) - publish_to_factset: Optional[bool] = field(default=False, metadata=field_metadata) - name: Optional[str] = field(default=None, metadata=name_metadata) - - @handle_camel_case_args @dataclass_json(letter_case=LetterCase.CAMEL) @dataclass(unsafe_hash=True, repr=False) @@ -296,42 +310,6 @@ class IndicesPositionSet(Base): name: Optional[str] = field(default=None, metadata=name_metadata) -@handle_camel_case_args -@dataclass_json(letter_case=LetterCase.CAMEL) -@dataclass(unsafe_hash=True, repr=False) -class CreditCustomBasketCreateInputs(IndicesConstructRequestTypes): - ticker: str = field(default=None, metadata=field_metadata) - name: str = field(default=None, metadata=field_metadata) - pricing_parameters: CreditCustomBasketPricingParameters = field(default=None, metadata=field_metadata) - position_set: Tuple[PositionPriceInput, ...] = field(default=None, metadata=field_metadata) - return_type: IndexCalculationType = field(default='Price Return', metadata=field_metadata) - styles: Tuple[str, ...] = field(default=None, metadata=field_metadata) - asset_class: Optional[AssetClass] = field(default='Credit', metadata=field_metadata) - description: Optional[str] = field(default=None, metadata=field_metadata) - related_content: Optional[GIRDomain] = field(default=None, metadata=field_metadata) - portfolio_id: Optional[str] = field(default=None, metadata=field_metadata) - publish_parameters: Optional[PublishParameters] = field(default=None, metadata=field_metadata) - index_notes: Optional[str] = field(default=None, metadata=field_metadata) - flagship: Optional[bool] = field(default=False, metadata=field_metadata) - on_behalf_of: Optional[str] = field(default=None, metadata=field_metadata) - clone_parent_id: Optional[str] = field(default=None, metadata=field_metadata) - hedge_id: Optional[str] = field(default=None, metadata=field_metadata) - - -@handle_camel_case_args -@dataclass_json(letter_case=LetterCase.CAMEL) -@dataclass(unsafe_hash=True, repr=False) -class CreditCustomBasketRebalanceInputs(IndicesRebalanceInputTypes): - asset_class: AssetClass = field(default='Credit', metadata=field_metadata) - position_set: Tuple[PositionPriceInput, ...] = field(default=None, metadata=field_metadata) - publish_parameters: Optional[PublishParameters] = field(default=None, metadata=field_metadata) - pricing_parameters: Optional[CreditCustomBasketPricingParameters] = field(default=None, metadata=field_metadata) - portfolio_id: Optional[str] = field(default=None, metadata=field_metadata) - hedge_id: Optional[str] = field(default=None, metadata=field_metadata) - save_as_draft: Optional[bool] = field(default=False, metadata=field_metadata) - name: Optional[str] = field(default=None, metadata=name_metadata) - - @handle_camel_case_args @dataclass_json(letter_case=LetterCase.CAMEL) @dataclass(unsafe_hash=True, repr=False) @@ -362,74 +340,6 @@ class CustomBasketsBackcastInputs(Base): name: Optional[str] = field(default=None, metadata=name_metadata) -@handle_camel_case_args -@dataclass_json(letter_case=LetterCase.CAMEL) -@dataclass(unsafe_hash=True, repr=False) -class CustomBasketsCreateInputs(IndicesConstructRequestTypes): - ticker: str = field(default=None, metadata=field_metadata) - name: str = field(default=None, metadata=field_metadata) - pricing_parameters: CustomBasketsPricingParameters = field(default=None, metadata=field_metadata) - position_set: Tuple[PositionPriceInput, ...] = field(default=None, metadata=field_metadata) - return_type: str = field(default=None, metadata=field_metadata) - description: Optional[str] = field(default=None, metadata=field_metadata) - styles: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - related_content: Optional[GIRDomain] = field(default=None, metadata=field_metadata) - portfolio_id: Optional[str] = field(default=None, metadata=field_metadata) - hedge_id: Optional[str] = field(default=None, metadata=field_metadata) - clone_parent_id: Optional[str] = field(default=None, metadata=field_metadata) - publish_parameters: Optional[PublishParameters] = field(default=None, metadata=field_metadata) - index_notes: Optional[str] = field(default=None, metadata=field_metadata) - flagship: Optional[bool] = field(default=None, metadata=field_metadata) - on_behalf_of: Optional[str] = field(default=None, metadata=field_metadata) - allow_limited_access_assets: Optional[bool] = field(default=False, metadata=field_metadata) - allow_ca_restricted_assets: Optional[bool] = field(default=False, metadata=config(field_name='allowCARestrictedAssets', exclude=exclude_none)) - vendor: Optional[str] = field(default=None, metadata=field_metadata) - default_backcast: Optional[bool] = field(default=True, metadata=field_metadata) - action_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) - preferred_risk_model: Optional[str] = field(default=None, metadata=field_metadata) - - -@handle_camel_case_args -@dataclass_json(letter_case=LetterCase.CAMEL) -@dataclass(unsafe_hash=True, repr=False) -class CustomBasketsEditInputs(Base): - name: Optional[str] = field(default=None, metadata=field_metadata) - description: Optional[str] = field(default=None, metadata=field_metadata) - styles: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - related_content: Optional[GIRDomain] = field(default=None, metadata=field_metadata) - publish_parameters: Optional[PublishParameters] = field(default=None, metadata=field_metadata) - index_notes: Optional[str] = field(default=None, metadata=field_metadata) - index_not_trading_reasons: Optional[IndexNotTradingReasons] = field(default=None, metadata=field_metadata) - flagship: Optional[bool] = field(default=None, metadata=field_metadata) - clone_parent_id: Optional[str] = field(default=None, metadata=field_metadata) - hedge_id: Optional[str] = field(default=None, metadata=field_metadata) - portfolio_id: Optional[str] = field(default=None, metadata=field_metadata) - vendor: Optional[str] = field(default=None, metadata=field_metadata) - action_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) - preferred_risk_model: Optional[str] = field(default=None, metadata=field_metadata) - - -@handle_camel_case_args -@dataclass_json(letter_case=LetterCase.CAMEL) -@dataclass(unsafe_hash=True, repr=False) -class CustomBasketsRebalanceInputs(Base): - position_set: Optional[Tuple[PositionPriceInput, ...]] = field(default=None, metadata=field_metadata) - publish_parameters: Optional[PublishParameters] = field(default=None, metadata=field_metadata) - pricing_parameters: Optional[CustomBasketsPricingParameters] = field(default=None, metadata=field_metadata) - allow_limited_access_assets: Optional[bool] = field(default=False, metadata=field_metadata) - allow_ca_restricted_assets: Optional[bool] = field(default=False, metadata=config(field_name='allowCARestrictedAssets', exclude=exclude_none)) - allow_system_approval: Optional[bool] = field(default=False, metadata=field_metadata) - clone_parent_id: Optional[str] = field(default=None, metadata=field_metadata) - hedge_id: Optional[str] = field(default=None, metadata=field_metadata) - portfolio_id: Optional[str] = field(default=None, metadata=field_metadata) - save_as_draft: Optional[bool] = field(default=False, metadata=field_metadata) - allow_in_position_rebalance: Optional[bool] = field(default=False, metadata=field_metadata) - action_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) - preferred_risk_model: Optional[str] = field(default=None, metadata=field_metadata) - on_behalf_of: Optional[str] = field(default=None, metadata=field_metadata) - name: Optional[str] = field(default=None, metadata=name_metadata) - - @handle_camel_case_args @dataclass_json(letter_case=LetterCase.CAMEL) @dataclass(unsafe_hash=True, repr=False) @@ -463,6 +373,7 @@ class ISelectRebalance(Base): index_parameters: Optional[Tuple[ISelectIndexParameters, ...]] = field(default=None, metadata=field_metadata) waiver_requested: Optional[bool] = field(default=None, metadata=field_metadata) custom_basket_import: Optional[str] = field(default=None, metadata=field_metadata) + unwind_missing_constituents: Optional[bool] = field(default=True, metadata=field_metadata) name: Optional[str] = field(default=None, metadata=name_metadata) @@ -471,7 +382,6 @@ class ISelectRebalance(Base): @dataclass(unsafe_hash=True, repr=False) class ISelectRequest(IndicesRebalanceInputTypes): rebalance_date: str = field(default=None, metadata=field_metadata) - request_counter: int = field(default=None, metadata=field_metadata) use_new_rebalance_interface: bool = field(default=None, metadata=field_metadata) new_parameters: Optional[Tuple[ISelectNewParameter, ...]] = field(default=None, metadata=field_metadata) index_parameters: Optional[Tuple[ISelectIndexParameter, ...]] = field(default=None, metadata=field_metadata) @@ -479,10 +389,13 @@ class ISelectRequest(IndicesRebalanceInputTypes): new_units: Optional[Tuple[ISelectNewUnit, ...]] = field(default=None, metadata=field_metadata) observation_date: Optional[str] = field(default=None, metadata=field_metadata) entry_type: Optional[str] = field(default=None, metadata=field_metadata) + request_counter: Optional[int] = field(default=0, metadata=field_metadata) waiver_requested: Optional[bool] = field(default=None, metadata=field_metadata) presubmit: Optional[bool] = field(default=None, metadata=field_metadata) requester_id: Optional[str] = field(default=None, metadata=field_metadata) custom_basket_import: Optional[str] = field(default=None, metadata=field_metadata) + action: Optional[str] = field(default=None, metadata=field_metadata) + unwind_missing_constituents: Optional[bool] = field(default=True, metadata=field_metadata) name: Optional[str] = field(default=None, metadata=name_metadata) @@ -490,12 +403,12 @@ class ISelectRequest(IndicesRebalanceInputTypes): @dataclass_json(letter_case=LetterCase.CAMEL) @dataclass(unsafe_hash=True, repr=False) class ISelectResponse(Base): - action: Optional[object] = field(default=None, metadata=config(field_name='Action', exclude=exclude_none)) + action: Optional[ISelectActionType] = field(default=None, metadata=config(field_name='Action', exclude=exclude_none)) action_comment: Optional[str] = field(default=None, metadata=config(field_name='ActionComment', exclude=exclude_none)) asset_name: Optional[str] = field(default=None, metadata=field_metadata) asset_short_name: Optional[str] = field(default=None, metadata=field_metadata) available_action_confirms: Optional[Tuple[Tuple[str, ...], ...]] = field(default=None, metadata=field_metadata) - available_actions: Optional[tuple] = field(default=None, metadata=field_metadata) + available_actions: Optional[Tuple[Union[DictBase, ISelectActionType], ...]] = field(default=None, metadata=field_metadata) available_rebalance_dates: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) constituent_validations: Optional[tuple] = field(default=None, metadata=field_metadata) date_validation_status: Optional[str] = field(default=None, metadata=field_metadata) @@ -534,6 +447,76 @@ class IndicesDynamicConstructInputs(IndicesConstructRequestTypes): name: Optional[str] = field(default=None, metadata=name_metadata) +@handle_camel_case_args +@dataclass_json(letter_case=LetterCase.CAMEL) +@dataclass(unsafe_hash=True, repr=False) +class PublishParameters(Base): + publish_to_bloomberg: bool = field(default=False, metadata=field_metadata) + include_price_history: bool = field(default=False, metadata=field_metadata) + publish_to_reuters: Optional[bool] = field(default=False, metadata=field_metadata) + publish_to_factset: Optional[bool] = field(default=False, metadata=field_metadata) + historical_methodology: Optional[EqBasketHistoryMethodology] = field(default=None, metadata=field_metadata) + backtest_parameters: Optional[EqBasketBacktestParameters] = field(default=None, metadata=field_metadata) + bloomberg_publish_parameters: Optional[BloombergPublishParameters] = field(default=None, metadata=field_metadata) + name: Optional[str] = field(default=None, metadata=name_metadata) + + +@handle_camel_case_args +@dataclass_json(letter_case=LetterCase.CAMEL) +@dataclass(unsafe_hash=True, repr=False) +class CreditCustomBasketCreateInputs(IndicesConstructRequestTypes): + ticker: str = field(default=None, metadata=field_metadata) + name: str = field(default=None, metadata=field_metadata) + pricing_parameters: CreditCustomBasketPricingParameters = field(default=None, metadata=field_metadata) + position_set: Tuple[PositionPriceInput, ...] = field(default=None, metadata=field_metadata) + return_type: IndexCalculationType = field(default='Price Return', metadata=field_metadata) + styles: Tuple[str, ...] = field(default=None, metadata=field_metadata) + asset_class: Optional[AssetClass] = field(default='Credit', metadata=field_metadata) + description: Optional[str] = field(default=None, metadata=field_metadata) + related_content: Optional[GIRDomain] = field(default=None, metadata=field_metadata) + portfolio_id: Optional[str] = field(default=None, metadata=field_metadata) + publish_parameters: Optional[PublishParameters] = field(default=None, metadata=field_metadata) + index_notes: Optional[str] = field(default=None, metadata=field_metadata) + flagship: Optional[bool] = field(default=False, metadata=field_metadata) + on_behalf_of: Optional[str] = field(default=None, metadata=field_metadata) + clone_parent_id: Optional[str] = field(default=None, metadata=field_metadata) + hedge_id: Optional[str] = field(default=None, metadata=field_metadata) + + +@handle_camel_case_args +@dataclass_json(letter_case=LetterCase.CAMEL) +@dataclass(unsafe_hash=True, repr=False) +class CreditCustomBasketEditInputs(Base): + name: str = field(default=None, metadata=field_metadata) + description: str = field(default=None, metadata=field_metadata) + publish_parameters: PublishParameters = field(default=None, metadata=field_metadata) + pricing_parameters: CreditCustomBasketPricingParameters = field(default=None, metadata=field_metadata) + flagship: bool = field(default=False, metadata=field_metadata) + on_behalf_of: str = field(default=None, metadata=field_metadata) + styles: Tuple[str, ...] = field(default=None, metadata=field_metadata) + asset_class: Optional[AssetClass] = field(default='Credit', metadata=field_metadata) + related_content: Optional[GIRDomain] = field(default=None, metadata=field_metadata) + portfolio_id: Optional[str] = field(default=None, metadata=field_metadata) + return_type: Optional[IndexCalculationType] = field(default='Price Return', metadata=field_metadata) + position_set: Optional[Tuple[PositionPriceInput, ...]] = field(default=None, metadata=field_metadata) + index_notes: Optional[str] = field(default=None, metadata=field_metadata) + clone_parent_id: Optional[str] = field(default=None, metadata=field_metadata) + + +@handle_camel_case_args +@dataclass_json(letter_case=LetterCase.CAMEL) +@dataclass(unsafe_hash=True, repr=False) +class CreditCustomBasketRebalanceInputs(IndicesRebalanceInputTypes): + asset_class: AssetClass = field(default='Credit', metadata=field_metadata) + position_set: Tuple[PositionPriceInput, ...] = field(default=None, metadata=field_metadata) + publish_parameters: Optional[PublishParameters] = field(default=None, metadata=field_metadata) + pricing_parameters: Optional[CreditCustomBasketPricingParameters] = field(default=None, metadata=field_metadata) + portfolio_id: Optional[str] = field(default=None, metadata=field_metadata) + hedge_id: Optional[str] = field(default=None, metadata=field_metadata) + save_as_draft: Optional[bool] = field(default=False, metadata=field_metadata) + name: Optional[str] = field(default=None, metadata=name_metadata) + + @handle_camel_case_args @dataclass_json(letter_case=LetterCase.CAMEL) @dataclass(unsafe_hash=True, repr=False) @@ -545,8 +528,87 @@ class IndicesBackcastInputs(Base): @handle_camel_case_args @dataclass_json(letter_case=LetterCase.CAMEL) @dataclass(unsafe_hash=True, repr=False) -class IndicesEditInputs(Base): - parameters: CustomBasketsEditInputs = field(default=None, metadata=field_metadata) +class CustomBasketsCreateInputs(IndicesConstructRequestTypes): + ticker: str = field(default=None, metadata=field_metadata) + name: str = field(default=None, metadata=field_metadata) + pricing_parameters: CustomBasketsPricingParameters = field(default=None, metadata=field_metadata) + position_set: Tuple[PositionPriceInput, ...] = field(default=None, metadata=field_metadata) + return_type: str = field(default=None, metadata=field_metadata) + asset_class: Optional[AssetClass] = field(default='Equity', metadata=field_metadata) + description: Optional[str] = field(default=None, metadata=field_metadata) + styles: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) + related_content: Optional[GIRDomain] = field(default=None, metadata=field_metadata) + portfolio_id: Optional[str] = field(default=None, metadata=field_metadata) + hedge_id: Optional[str] = field(default=None, metadata=field_metadata) + clone_parent_id: Optional[str] = field(default=None, metadata=field_metadata) + cash_reinvestment_treatment: Optional[CashReinvestmentTreatment] = field(default=None, metadata=field_metadata) + publish_parameters: Optional[PublishParameters] = field(default=None, metadata=field_metadata) + index_notes: Optional[str] = field(default=None, metadata=field_metadata) + flagship: Optional[bool] = field(default=None, metadata=field_metadata) + on_behalf_of: Optional[str] = field(default=None, metadata=field_metadata) + allow_limited_access_assets: Optional[bool] = field(default=False, metadata=field_metadata) + allow_ca_restricted_assets: Optional[bool] = field(default=False, metadata=config(field_name='allowCARestrictedAssets', exclude=exclude_none)) + vendor: Optional[str] = field(default=None, metadata=field_metadata) + default_backcast: Optional[bool] = field(default=True, metadata=field_metadata) + action_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) + preferred_risk_model: Optional[str] = field(default=None, metadata=field_metadata) + rebalance_calendar: Optional[EqBasketRebalanceCalendar] = field(default=None, metadata=field_metadata) + benchmark: Optional[str] = field(default=None, metadata=field_metadata) + + +@handle_camel_case_args +@dataclass_json(letter_case=LetterCase.CAMEL) +@dataclass(unsafe_hash=True, repr=False) +class CustomBasketsEditInputs(Base): + asset_class: Optional[AssetClass] = field(default='Equity', metadata=field_metadata) + name: Optional[str] = field(default=None, metadata=field_metadata) + description: Optional[str] = field(default=None, metadata=field_metadata) + styles: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) + related_content: Optional[GIRDomain] = field(default=None, metadata=field_metadata) + publish_parameters: Optional[PublishParameters] = field(default=None, metadata=field_metadata) + index_notes: Optional[str] = field(default=None, metadata=field_metadata) + index_not_trading_reasons: Optional[IndexNotTradingReasons] = field(default=None, metadata=field_metadata) + flagship: Optional[bool] = field(default=None, metadata=field_metadata) + clone_parent_id: Optional[str] = field(default=None, metadata=field_metadata) + hedge_id: Optional[str] = field(default=None, metadata=field_metadata) + portfolio_id: Optional[str] = field(default=None, metadata=field_metadata) + vendor: Optional[str] = field(default=None, metadata=field_metadata) + action_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) + preferred_risk_model: Optional[str] = field(default=None, metadata=field_metadata) + rebalance_calendar: Optional[EqBasketRebalanceCalendar] = field(default=None, metadata=field_metadata) + benchmark: Optional[str] = field(default=None, metadata=field_metadata) + on_behalf_of: Optional[str] = field(default=None, metadata=field_metadata) + + +@handle_camel_case_args +@dataclass_json(letter_case=LetterCase.CAMEL) +@dataclass(unsafe_hash=True, repr=False) +class CustomBasketsRebalanceInputs(Base): + asset_class: Optional[AssetClass] = field(default='Equity', metadata=field_metadata) + position_set: Optional[Tuple[PositionPriceInput, ...]] = field(default=None, metadata=field_metadata) + publish_parameters: Optional[PublishParameters] = field(default=None, metadata=field_metadata) + pricing_parameters: Optional[CustomBasketsPricingParameters] = field(default=None, metadata=field_metadata) + allow_limited_access_assets: Optional[bool] = field(default=False, metadata=field_metadata) + allow_ca_restricted_assets: Optional[bool] = field(default=False, metadata=config(field_name='allowCARestrictedAssets', exclude=exclude_none)) + allow_system_approval: Optional[bool] = field(default=False, metadata=field_metadata) + clone_parent_id: Optional[str] = field(default=None, metadata=field_metadata) + hedge_id: Optional[str] = field(default=None, metadata=field_metadata) + portfolio_id: Optional[str] = field(default=None, metadata=field_metadata) + save_as_draft: Optional[bool] = field(default=False, metadata=field_metadata) + allow_in_position_rebalance: Optional[bool] = field(default=False, metadata=field_metadata) + action_date: Optional[datetime.date] = field(default=None, metadata=field_metadata) + preferred_risk_model: Optional[str] = field(default=None, metadata=field_metadata) + rebalance_calendar: Optional[EqBasketRebalanceCalendar] = field(default=None, metadata=field_metadata) + benchmark: Optional[str] = field(default=None, metadata=field_metadata) + on_behalf_of: Optional[str] = field(default=None, metadata=field_metadata) + name: Optional[str] = field(default=None, metadata=name_metadata) + + +@handle_camel_case_args +@dataclass_json(letter_case=LetterCase.CAMEL) +@dataclass(unsafe_hash=True, repr=False) +class IndicesEditInputTypes(Base): + parameters: DictBase = field(default=None, metadata=field_metadata) name: Optional[str] = field(default=None, metadata=name_metadata) diff --git a/gs_quant/target/reports.py b/gs_quant/target/reports.py index 4d998984..6a0e7603 100644 --- a/gs_quant/target/reports.py +++ b/gs_quant/target/reports.py @@ -103,6 +103,7 @@ class ReportType(EnumBase, Enum): Analytics = 'Analytics' Risk_Calculation = 'Risk Calculation' Factor_Overview_Email = 'Factor Overview Email' + FactSet_Fundamentals_Analytics = 'FactSet Fundamentals Analytics' PCO = 'PCO' diff --git a/gs_quant/target/risk_models.py b/gs_quant/target/risk_models.py index 9e85e697..d7b872c4 100644 --- a/gs_quant/target/risk_models.py +++ b/gs_quant/target/risk_models.py @@ -23,344 +23,6 @@ from enum import Enum -class Currency(EnumBase, Enum): - - """Currency, ISO 4217 currency code or exchange quote modifier (e.g. GBP vs GBp)""" - - _ = '' - ACU = 'ACU' - ADP = 'ADP' - AED = 'AED' - AFA = 'AFA' - ALL = 'ALL' - AMD = 'AMD' - ANG = 'ANG' - AOA = 'AOA' - AOK = 'AOK' - AON = 'AON' - ARA = 'ARA' - ARS = 'ARS' - ARZ = 'ARZ' - ATS = 'ATS' - AUD = 'AUD' - AUZ = 'AUZ' - AZM = 'AZM' - AZN = 'AZN' - B03 = 'B03' - BAD = 'BAD' - BAK = 'BAK' - BAM = 'BAM' - BBD = 'BBD' - BDN = 'BDN' - BDT = 'BDT' - BEF = 'BEF' - BGL = 'BGL' - BGN = 'BGN' - BHD = 'BHD' - BIF = 'BIF' - BMD = 'BMD' - BND = 'BND' - BOB = 'BOB' - BR6 = 'BR6' - BRE = 'BRE' - BRF = 'BRF' - BRL = 'BRL' - BRR = 'BRR' - BSD = 'BSD' - BTC = 'BTC' - BTN = 'BTN' - BTR = 'BTR' - BWP = 'BWP' - BYR = 'BYR' - BZD = 'BZD' - C23 = 'C23' - CAC = 'CAC' - CAD = 'CAD' - CAZ = 'CAZ' - CCI = 'CCI' - CDF = 'CDF' - CFA = 'CFA' - CHF = 'CHF' - CHZ = 'CHZ' - CLF = 'CLF' - CLP = 'CLP' - CLZ = 'CLZ' - CNH = 'CNH' - CNO = 'CNO' - CNY = 'CNY' - CNZ = 'CNZ' - COP = 'COP' - COZ = 'COZ' - CPB = 'CPB' - CPI = 'CPI' - CRC = 'CRC' - CUP = 'CUP' - CVE = 'CVE' - CYP = 'CYP' - CZH = 'CZH' - CZK = 'CZK' - DAX = 'DAX' - DEM = 'DEM' - DIJ = 'DIJ' - DJF = 'DJF' - DJE = 'DJE' - DKK = 'DKK' - DOP = 'DOP' - DZD = 'DZD' - E51 = 'E51' - E52 = 'E52' - E53 = 'E53' - E54 = 'E54' - ECI = 'ECI' - ECS = 'ECS' - ECU = 'ECU' - EEK = 'EEK' - EF0 = 'EF0' - EGP = 'EGP' - ESP = 'ESP' - ETB = 'ETB' - ETH = 'ETH' - EUR = 'EUR' - EUZ = 'EUZ' - F06 = 'F06' - FED = 'FED' - FIM = 'FIM' - FJD = 'FJD' - FKP = 'FKP' - FRF = 'FRF' - FT1 = 'FT1' - GBP = 'GBP' - GBZ = 'GBZ' - GEK = 'GEK' - GEL = 'GEL' - GHC = 'GHC' - GHS = 'GHS' - GHY = 'GHY' - GIP = 'GIP' - GLD = 'GLD' - GLR = 'GLR' - GMD = 'GMD' - GNF = 'GNF' - GQE = 'GQE' - GRD = 'GRD' - GTQ = 'GTQ' - GWP = 'GWP' - GYD = 'GYD' - HKB = 'HKB' - HKD = 'HKD' - HNL = 'HNL' - HRK = 'HRK' - HSI = 'HSI' - HTG = 'HTG' - HUF = 'HUF' - IDB = 'IDB' - IDO = 'IDO' - IDR = 'IDR' - IEP = 'IEP' - IGP = 'IGP' - ILS = 'ILS' - INO = 'INO' - INP = 'INP' - INR = 'INR' - IPA = 'IPA' - IPX = 'IPX' - IQD = 'IQD' - IRR = 'IRR' - IRS = 'IRS' - ISI = 'ISI' - ISK = 'ISK' - ISO = 'ISO' - ITL = 'ITL' - J05 = 'J05' - JMD = 'JMD' - JNI = 'JNI' - JOD = 'JOD' - JPY = 'JPY' - JPZ = 'JPZ' - JZ9 = 'JZ9' - KES = 'KES' - KGS = 'KGS' - KHR = 'KHR' - KMF = 'KMF' - KOR = 'KOR' - KPW = 'KPW' - KRW = 'KRW' - KWD = 'KWD' - KYD = 'KYD' - KZT = 'KZT' - LAK = 'LAK' - LBA = 'LBA' - LBP = 'LBP' - LHY = 'LHY' - LKR = 'LKR' - LRD = 'LRD' - LSL = 'LSL' - LSM = 'LSM' - LTL = 'LTL' - LUF = 'LUF' - LVL = 'LVL' - LYD = 'LYD' - MAD = 'MAD' - MDL = 'MDL' - MGF = 'MGF' - MKD = 'MKD' - MMK = 'MMK' - MNT = 'MNT' - MOP = 'MOP' - MRO = 'MRO' - MTL = 'MTL' - MTP = 'MTP' - MUR = 'MUR' - MVR = 'MVR' - MWK = 'MWK' - MXB = 'MXB' - MXN = 'MXN' - MXP = 'MXP' - MXW = 'MXW' - MXZ = 'MXZ' - MYO = 'MYO' - MYR = 'MYR' - MZM = 'MZM' - MZN = 'MZN' - NAD = 'NAD' - ND3 = 'ND3' - NGF = 'NGF' - NGI = 'NGI' - NGN = 'NGN' - NIC = 'NIC' - NIO = 'NIO' - NLG = 'NLG' - NOK = 'NOK' - NOZ = 'NOZ' - NPR = 'NPR' - NZD = 'NZD' - NZZ = 'NZZ' - O08 = 'O08' - OMR = 'OMR' - PAB = 'PAB' - PEI = 'PEI' - PEN = 'PEN' - PEZ = 'PEZ' - PGK = 'PGK' - PHP = 'PHP' - PKR = 'PKR' - PLN = 'PLN' - PLZ = 'PLZ' - PSI = 'PSI' - PTE = 'PTE' - PYG = 'PYG' - QAR = 'QAR' - R2K = 'R2K' - ROL = 'ROL' - RON = 'RON' - RSD = 'RSD' - RUB = 'RUB' - RUF = 'RUF' - RUR = 'RUR' - RWF = 'RWF' - SAR = 'SAR' - SBD = 'SBD' - SCR = 'SCR' - SDP = 'SDP' - SDR = 'SDR' - SEK = 'SEK' - SET = 'SET' - SGD = 'SGD' - SGS = 'SGS' - SHP = 'SHP' - SIL = 'SIL' - SIT = 'SIT' - SKK = 'SKK' - SLL = 'SLL' - SRG = 'SRG' - SSI = 'SSI' - STD = 'STD' - SUR = 'SUR' - SVC = 'SVC' - SVT = 'SVT' - SYP = 'SYP' - SZL = 'SZL' - T21 = 'T21' - T51 = 'T51' - T52 = 'T52' - T53 = 'T53' - T54 = 'T54' - T55 = 'T55' - T71 = 'T71' - TE0 = 'TE0' - TED = 'TED' - TF9 = 'TF9' - THB = 'THB' - THO = 'THO' - TMM = 'TMM' - TND = 'TND' - TNT = 'TNT' - TOP = 'TOP' - TPE = 'TPE' - TPX = 'TPX' - TRB = 'TRB' - TRL = 'TRL' - TRY = 'TRY' - TRZ = 'TRZ' - TTD = 'TTD' - TWD = 'TWD' - TZS = 'TZS' - UAH = 'UAH' - UCB = 'UCB' - UDI = 'UDI' - UFC = 'UFC' - UFZ = 'UFZ' - UGS = 'UGS' - UGX = 'UGX' - USB = 'USB' - USD = 'USD' - UVR = 'UVR' - UYP = 'UYP' - UYU = 'UYU' - UZS = 'UZS' - VAC = 'VAC' - VEB = 'VEB' - VEF = 'VEF' - VES = 'VES' - VND = 'VND' - VUV = 'VUV' - WST = 'WST' - XAF = 'XAF' - XAG = 'XAG' - XAU = 'XAU' - XPD = 'XPD' - XPT = 'XPT' - XCD = 'XCD' - XDR = 'XDR' - XEU = 'XEU' - XOF = 'XOF' - XPF = 'XPF' - YDD = 'YDD' - YER = 'YER' - YUD = 'YUD' - YUN = 'YUN' - ZAL = 'ZAL' - ZAR = 'ZAR' - ZAZ = 'ZAZ' - ZMK = 'ZMK' - ZMW = 'ZMW' - ZRN = 'ZRN' - ZRZ = 'ZRZ' - ZWD = 'ZWD' - ZWL = 'ZWL' - AUd = 'AUd' - BWp = 'BWp' - EUr = 'EUr' - GBp = 'GBp' - ILs = 'ILs' - KWd = 'KWd' - MWk = 'MWk' - SGd = 'SGd' - SZl = 'SZl' - USd = 'USd' - ZAr = 'ZAr' - - class RiskModelCoverage(EnumBase, Enum): """Allowed risk model coverages""" @@ -454,15 +116,6 @@ class RiskModelTerm(EnumBase, Enum): Long = 'Long' -class RiskModelType(EnumBase, Enum): - - """Marquee risk model type""" - - Factor = 'Factor' - Macro = 'Macro' - Thematic = 'Thematic' - - class RiskModelUniverseIdentifier(EnumBase, Enum): """The identifier which the risk model is uploaded by.""" @@ -552,24 +205,6 @@ class RiskModelIssuerSpecificCovarianceData(Base): covariance: Tuple[float, ...] = field(default=None, metadata=field_metadata) name: Optional[str] = field(default=None, metadata=name_metadata) -@handle_camel_case_args -@dataclass_json(letter_case=LetterCase.CAMEL) -@dataclass(unsafe_hash=True, repr=False) -class Entitlements(Base): - view: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - edit: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - admin: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - rebalance: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - execute: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - trade: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - upload: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - query: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - performance_details: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - plot: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - delete: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - display: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - name: Optional[str] = field(default=None, metadata=name_metadata) - @handle_camel_case_args @dataclass_json(letter_case=LetterCase.CAMEL) diff --git a/gs_quant/target/secmaster.py b/gs_quant/target/secmaster.py index 7f801caf..b9373a85 100644 --- a/gs_quant/target/secmaster.py +++ b/gs_quant/target/secmaster.py @@ -273,6 +273,7 @@ class SecMasterGetCapitalStructureRequestPathSchema(Base): class SecMasterGetRequestPathSchema(Base): gsid: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) ticker: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) + bbg: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) bbid: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) ric: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) rcic: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) @@ -283,14 +284,11 @@ class SecMasterGetRequestPathSchema(Base): prime_id: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) type_: Optional[Tuple[str, ...]] = field(default=None, metadata=config(field_name='type', exclude=exclude_none)) country_code: Optional[Tuple[CountryCode, ...]] = field(default=None, metadata=field_metadata) - exchange: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - fields: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - as_of_time: Optional[Tuple[datetime.datetime, ...]] = field(default=None, metadata=field_metadata) is_primary: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) all_listings: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) effective_date: Optional[Tuple[datetime.date, ...]] = field(default=None, metadata=field_metadata) + as_of_time: Optional[Tuple[datetime.datetime, ...]] = field(default=None, metadata=field_metadata) limit: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) - offset: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) offset_key: Optional[Tuple[str, ...]] = field(default=None, metadata=field_metadata) name: Optional[str] = field(default=None, metadata=name_metadata) diff --git a/gs_quant/test/data/test_query.py b/gs_quant/test/data/test_query.py index 0092fa77..5bd7ea70 100644 --- a/gs_quant/test/data/test_query.py +++ b/gs_quant/test/data/test_query.py @@ -15,6 +15,8 @@ """ import datetime +import pytest + from gs_quant.api.gs.data import GsDataApi, QueryType from gs_quant.data import DataContext @@ -26,9 +28,9 @@ def test_build_market_data_query(): source = None real_time = False measure = "Curve" - with DataContext(start=datetime.date(2013, 1, 1), end=datetime.date(2025, 2, 1)): + with DataContext(start=datetime.date(2013, 1, 1), end=datetime.date(2020, 2, 1)): queries = GsDataApi.build_market_data_query(asset_ids, query_type, where, source, real_time, measure, - parallel_pool_size=3) + parallelize_queries=True) payload = {'entityIds': ['MA4B66MW5E27U8P3295'], 'queryType': 'Implied Volatility', 'where': {'tenor': '1y', 'strikeReference': 'delta', 'relativeStrike': 0.1}, @@ -36,9 +38,14 @@ def test_build_market_data_query(): 'frequency': 'End Of Day', 'measures': ['Curve']} - dates = [{'startDate': datetime.date(2013, 1, 1), 'endDate': datetime.date(2017, 1, 11)}, - {'startDate': datetime.date(2017, 1, 11), 'endDate': datetime.date(2021, 1, 21)}, - {'startDate': datetime.date(2021, 1, 21), 'endDate': datetime.date(2025, 1, 31)}] + dates = [{'startDate': datetime.date(2013, 1, 1), 'endDate': datetime.date(2014, 1, 1)}, + {'startDate': datetime.date(2014, 1, 1), 'endDate': datetime.date(2015, 1, 1)}, + {'startDate': datetime.date(2015, 1, 1), 'endDate': datetime.date(2016, 1, 1)}, + {'startDate': datetime.date(2016, 1, 1), 'endDate': datetime.date(2016, 12, 31)}, + {'startDate': datetime.date(2016, 12, 31), 'endDate': datetime.date(2017, 12, 31)}, + {'startDate': datetime.date(2017, 12, 31), 'endDate': datetime.date(2018, 12, 31)}, + {'startDate': datetime.date(2018, 12, 31), 'endDate': datetime.date(2019, 12, 31)}, + {'startDate': datetime.date(2019, 12, 31), 'endDate': datetime.date(2020, 2, 1)}] expected = [{'queries': [{**payload, **date_range}]} for date_range in dates] assert expected == queries @@ -56,3 +63,7 @@ def test_build_market_data_query(): expected = {'queries': [payload]} assert expected == queries + + +if __name__ == '__main__': + pytest.main(args=["test_queries.py"]) diff --git a/gs_quant/test/markets/test_baskets.py b/gs_quant/test/markets/test_baskets.py index d6cf5008..551c5ef6 100644 --- a/gs_quant/test/markets/test_baskets.py +++ b/gs_quant/test/markets/test_baskets.py @@ -38,7 +38,12 @@ asset_1 = {'name': 'asset 1', 'id': 'id1', 'bbid': 'bbid1'} asset_2 = {'name': 'asset 2', 'id': 'id2', 'bbid': 'bbid2'} assets_data = [asset_1, asset_2] -base_user = {'name': 'First Last', 'email': 'ex@email.com', 'company': 'Company A'} +base_user = {'name': 'First Last', + 'email': 'ex@email.com', + 'city': 'City A', + 'company': 'Company A', + 'country': 'Country A', + 'region': 'Region A'} cb_response = CustomBasketsResponse('done', 'R1234567890', 'MA1234567890') gs_asset = GsAsset(asset_class=AssetClass.Equity, type_=AssetType.Custom_Basket, @@ -217,7 +222,7 @@ def test_basket_edit_and_rebalance(mocker): basket = Basket.get(ticker) basket.description = 'New Basket Description' gs_asset.description = 'New Basket Description' - basket.allow_ca_restricted_assets = True + basket.initial_price = 2000000 mock_response(mocker, GsIndexApi, 'edit', cb_response) mock_response(mocker, GsReportApi, 'get_report', report) diff --git a/gs_quant/test/timeseries/test_measures.py b/gs_quant/test/timeseries/test_measures.py index 7b0dbd69..e17d5f4e 100644 --- a/gs_quant/test/timeseries/test_measures.py +++ b/gs_quant/test/timeseries/test_measures.py @@ -964,7 +964,7 @@ def mock_missing_bucket_implied_volatility(): def mock_fx_vol(_cls, asset_ids=None, query_type=None, where=None, source=None, real_time=None, request_id=None, - parallel_pool_size=1): + parallelize_queries=False): d = { 'strikeReference': ['delta', 'spot', 'forward'], 'relativeStrike': [25, 100, 100], @@ -1149,7 +1149,7 @@ def mock_eq(_cls, _q, ignore_errors=False): def mock_eq_vol(_cls, asset_ids=None, query_type=None, where=None, source=None, real_time=None, request_id=None, - parallel_pool_size=1): + parallelize_queries=False): d = { 'impliedVolatility': [5, 1, 2], } @@ -1167,7 +1167,7 @@ def mock_eq_vol(_cls, asset_ids=None, query_type=None, where=None, source=None, def mock_eq_vol_last_empty(_cls, asset_ids=None, query_type=None, where=None, source=None, real_time=None, - request_id=None, parallel_pool_size=1): + request_id=None, parallelize_queries=False): d = { 'impliedVolatility': [5, 1, 2], } diff --git a/gs_quant/timeseries/measures.py b/gs_quant/timeseries/measures.py index 4d46dded..a0969dea 100644 --- a/gs_quant/timeseries/measures.py +++ b/gs_quant/timeseries/measures.py @@ -799,7 +799,7 @@ def cds_spread(asset: Asset, spread: int, *, source: str = None, real_time: bool query_type=QueryType.IMPLIED_VOLATILITY)], asset_type_excluded=(AssetType.CommodityNaturalGasHub,)) def implied_volatility(asset: Asset, tenor: str, strike_reference: VolReference = None, - relative_strike: Real = None, parallel_pool_size: int = 1, *, source: str = None, + relative_strike: Real = None, parallelize_queries: bool = True, *, source: str = None, real_time: bool = False, request_id: Optional[str] = None) -> Series: """ Volatility of an asset implied by observations of market prices. @@ -809,8 +809,8 @@ def implied_volatility(asset: Asset, tenor: str, strike_reference: VolReference or absolute calendar strips e.g. 'Cal20', 'F20-G20' :param strike_reference: reference for strike level :param relative_strike: strike relative to reference - :param parallel_pool_size: chunk time range into 'parallel_pool_size' intervals - to execute parallel queries + :param parallelize_queries: send parallel queries to the measures API + chunked over an interval of a year based on the date context :param source: name of function caller :param real_time: whether to retrieve intraday data instead of EOD :param request_id: service request id, if any @@ -836,7 +836,7 @@ def implied_volatility(asset: Asset, tenor: str, strike_reference: VolReference # Parallel calls when fetching / appending last results df = get_historical_and_last_for_measure([asset_id], QueryType.IMPLIED_VOLATILITY, where, source=source, real_time=real_time, request_id=request_id, - parallel_pool_size=parallel_pool_size) + parallelize_queries=parallelize_queries) s = _extract_series_from_df(df, QueryType.IMPLIED_VOLATILITY) return s @@ -4569,7 +4569,7 @@ def get_market_data_tasks(asset_ids: List[str], request_id: Optional[str] = None, chunk_size: int = 5, ignore_errors: bool = False, - parallel_pool_size: int = 1) -> list: + parallelize_queries: bool = False) -> list: tasks = [] for i, chunked_assets in enumerate(chunk(asset_ids, chunk_size)): queries = GsDataApi.build_market_data_query( @@ -4578,7 +4578,7 @@ def get_market_data_tasks(asset_ids: List[str], where=where, source=source, real_time=real_time, - parallel_pool_size=parallel_pool_size) + parallelize_queries=parallelize_queries) queries = [queries] if not isinstance(queries, list) else queries tasks.extend( @@ -4595,10 +4595,10 @@ def get_historical_and_last_for_measure(asset_ids: List[str], request_id: Optional[str] = None, chunk_size: int = 5, ignore_errors: bool = False, - parallel_pool_size: int = 1): + parallelize_queries: bool = False): tasks = get_market_data_tasks(asset_ids, query_type, where, source=source, real_time=real_time, request_id=request_id, chunk_size=chunk_size, ignore_errors=ignore_errors, - parallel_pool_size=parallel_pool_size) + parallelize_queries=parallelize_queries) if not real_time and DataContext.current.end_date >= datetime.date.today(): where_list = _split_where_conditions(where)