Migration notes 5.4

This page explains the changes required to migrate to the stated version of Atoti Market Risk.

Migrate to 5.4.1

Upgrading from version 5.4.0 - see Atoti Market Risk 5.4.1 Release Notes.

Headline announcement

  • Upgrade to Atoti 6.0.17-sb3 : This picks up the latest bug fixes and optimizations from Atoti.
  • Fix Swagger UI : Swagger UI is now accessible and documents the REST endpoints in Atoti Market Risk.
  • Fix Logback file configuration : The mr-application/src/main/resources/logback-spring-file.xml configuration has been fixed and writes logs to a local file.
  • Configurable parent child depth: You can now configure the maximum depth of parent-child hierarchies.
  • Market Data chain changes: Market data chain has been changed: it is now required to add the sensitivity name and risk class levels in the views to display market data.
  • Updated dashboards : A number of dashboards have been updated due to market data measure and context value changes. For details, see Updated dashboards.
  • Compatibility with Atoti Sign-off 5.3: This version of Atoti Market Risk is compatible with Atoti Sign-off 5.3.
  • Adjustment fixes: Cube level adjustments for the Sensitivity and VaR modules can now be executed and the adjusted values can be found in the UI by using the corresponding <measure>_adjusted measures. Deleting adjustments no longer fails when cubes are disabled.

Configurable parent child depth

You can now configure the maximum depth of the parent-child hierarchies (books, legal entities, counterparties) with new properties.

To achieve this, the stores BookHierarchy, CounterpartyHierarchy, LegalEntityHierarchy now also have a variable number of fields to store the corresponding level entries. In addition, the summary flat stores (PnLBaseStore, SensiBaseStore, BaseStore) have a variable number of fields to be in line with the variable depth.

Market Data chain changes

xxx Current MD / xxx Previous MD

The following measures do not handle FX conversion anymore. They return the same value as the underlying xxx xxx MD Native metric.

  • Correlation Current MD
  • Correlation Previous MD
  • CrossGamma Current MD
  • CrossGamma Current MD 2
  • CrossGamma Previous MD
  • CrossGamma Previous MD 2
  • Delta Current MD
  • Delta Previous MD
  • Dividend Current
  • Dividend Previous
  • Gamma Current MD
  • Gamma Previous MD
  • Vanna Current MD
  • Vanna Current MD 2
  • Vanna Previous MD
  • Vanna Previous MD 2
  • Vega Current MD
  • Vega Previous MD
  • Volga Current MD
  • Volga Previous MD

In addition, the axes needed to fetch the underlying market data are now required: sensitivity name ([Sensitivities].[Sensitivity].[SensitivityName]), risk class ([Risk].[Risk Classes].[RiskClass]), risk factor, and other dimensional axes such as tenor/maturity/moneyness (for curve/surface/cubes market data). Even if two pieces of market data are the same, they can’t be merged for display anymore.

Hidden measures

The following measures are now hidden, since the notion of native currency is not applicable to market data. The value of a measure xxx MD Native value is now equal to the value of the corresponding xxx MD measure. In addition, the axes needed to fetch the underlying market data are now required: sensitivity name ([Sensitivities].[Sensitivity].[SensitivityName]), risk class ([Risk].[Risk Classes].[RiskClass]), risk factor, and other dimensional axes such as tenor/maturity/moneyness (for curve/surface/cubes market data). Even if two pieces of market data are the same, they can’t be merged for display anymore.

  • Correlation Current MD Native
  • Correlation Previous MD Native
  • CrossGamma Current MD 2 Native
  • CrossGamma Current MD Native
  • CrossGamma Previous MD 2 Native
  • CrossGamma Previous MD Native
  • Delta Current MD Native
  • Delta Previous MD Native
  • Dividend Previous Native
  • Dividend Current Native
  • Gamma Current MD Native
  • Gamma Previous MD Native
  • Vanna Current MD 2 Native
  • Vanna Current MD Native
  • Vanna Previous MD 2 Native
  • Vanna Previous MD Native
  • Vega Current MD Native
  • Vega Previous MD Native
  • Volga Current MD Native
  • Volga Previous MD Native

Updated dashboards

The following dashboards have have been updated with the levels [Sensitivities].[Sensitivity].[SensitivityName] and [Risk].[Risk Classes].[RiskClass] added to their MDX queries so that market data can be displayed:

  • Atoti MR & PL/Story-Telling Target Views/Delta and Gamma P&L Explain
  • Atoti MR & PL/Story-Telling Target Views/Vega P&L Explain
  • MR/03 - PnL Explain/02 - Example for one trade
  • MR/03 - PnL Explain/03 - Vega Market data

MR/01 - VaR-ES/03 - VaR Explain Dashboard has been fixed: a context value that was removed in a previous version was incorrectly used in the dashboard.

Configuration

Configuration properties
Properties added

mr-common-config module:

Property Default value Description
mr.parent-child.book-depth 15 Maximum level of BookHierarchy.
mr.parent-child.counterparty-depth 10 Maximum level of LegalEntityHierarchy.
mr.parent-child.counterparty-depth 5 Maximum level of CounterpartyHierarchy.
Properties changed

mr-common-config module:

Property Previous default New default Description
mr.sign-off.common.hierarchy.level2.approved APPROVED EXPORT_SUCCEEDED This is for compatibility with Sign-off 5.3, ensuring the Official sign-off feed status is updated after export.

mr-sensi-config module:

Property Previous default New default Description
mr.sign-off.sensi.sensi-cube-adjustments.hierarchies-to-exclude Date@Dates,MarketDataSets@MarketData,Quantiles@Quantiles,RoundingMethods@Rounding,Scenario Sets@Risk,Sign-off Status@Sign-off,DynamicMaturities@DynamicBucketing,DynamicMoneyness@DynamicBucketing,DynamicTenors@DynamicBucketing,DayToDay@Dates Date@Dates,MarketDataSets@MarketData,Quantiles@Quantiles,RoundingMethods@Rounding,Scenario Sets@Risk,Sign-off Status@Sign-off,DynamicMaturities@DynamicBucketing,DynamicMoneyness@DynamicBucketing,DynamicTenors@DynamicBucketing,MarketShiftDate@Dates,displayCurrency@Currencies,DayToDay@Dates Added MarketShiftDate and DisplayCurrencies hierarchies to the list of excluded hierarchies as these are slicing hierarchies.

mr-var-config module:

Property Previous default New default Description
mr.sign-off.var.var-cube-adjustments.hierarchies-to-exclude Date@Dates,MarketDataSets@MarketData,Quantiles@Quantiles,RoundingMethods@Rounding,Scenario Sets@Risk,Sign-off Status@Sign-off,CalculationIds@Risk,DayToDay@Dates Date@Dates,MarketDataSets@MarketData,Quantiles@Quantiles,RoundingMethods@Rounding,Scenario Sets@Risk,Sign-off Status@Sign-off,CalculationIds@Risk,MarketShiftDate@Dates,displayCurrency@Currencies,DayToDay@Dates Added MarketShiftDate and DisplayCurrencies hierarchies to the list of excluded hierarchies as these are slicing hierarchies.

Other changes

Sign-off 5.3 compatibility

In order to achieve compatibility with Atoti Sign-off 5.3 the following REST endpoint was added to SignOffRestService: @PostMapping("/update-state").

Sign-off uses this endpoint to update the sign-off status in Atoti Market Risk.

note

If you have a custom implementation of ISignOffRestService you will need to add this endpoint to be compatible with Sign-off 5.3.

Migrate to 5.4.0

Upgrading from version 5.3.0 - see Atoti Market Risk 5.4 Release Notes.

Headline announcement

  • Market Data API: The new Market Data API has been significantly updated with new features. It has also been moved to dedicated modules, the market-data-api library module and the market-data-api-spring-boot-starter module for easy auto-configuration. The changes include:

    • Improved design: The design of the Market Data API has been refined to better reflect real-life usage and remove unintended complexity. For details about the design and implementation suggestions, see Market Data API.
    • MarketDataDateShift enum: Changed the MarketDataDateShift enum value TODAY to CURRENT_DAY to clarify its meaning.
    • Interpolators: New interpolators are now accessible from the IInterpolationService:
      • InterpolationMode.LINEAR on two axes lets you perform linear interpolation on a 2D surface of values.
      • InterpolationMode.VOL_TO_VARIANCE on two axes lets you perform linear interpolation on a 2D surface of values, with a volatility-to-variance transformation applied to the input data and a variance-to-volatility transformation applied to the results of interpolation.
      • InterpolationMode.LINEAR on three axes lets you perform linear interpolation on a 3D cube of values.
    • Changed new Market Data API data model: The MarketDataSet and ID fields in the new Market Data API data model have been swapped around.
    • Migrated scalar measures: The scalar sensitivities market data measures have been migrated to the new Market Data API.
    • Support for Corporate Actions: Corporate actions (splits and dividends) are now supported using the new Market Data API.

      warning

      Important note for Taylor VaR: The Taylor VaR measure chains still use the deprecated market data API. Only the PnL Explain measure and market data chains have been updated to use the new market data API.

  • Atoti Server: Upgraded to Atoti Server 6.0.14-sb3.

  • Spring Boot 3: Upgraded to Spring Boot 3.2.0, which uses Spring Framework 6.

  • Hibernate: The application has been upgraded to Hibernate 6.3.1.Final.

  • H2: The application has been upgraded to H2 2.2.224.

  • Security configuration: Some classes related to security configuration have been moved from the mr-common-config project to the mr-application project.

  • Spring Profiles: Profile-based configuration has been replaced with properties (backwards compatible). For details, see Profile-based configuration.

  • Fluent post-processors: Post-processor metrics are now set up in a Fluent style. The levels and hierarchies use strong types. For more details, see Fluent post-processor setup.

  • Specific alias classes for lambda generics: Lambda generics have been replaced with specific alias classes (e.g. MeasurePublisher for Consumer intended for publishing measures).

  • Topic Aliases: The topic aliases used by the Data Load Controller (DLC) are now defined for each topic rather than in a single place during DLC initialization.

  • New moneyness default value: The default value of the moneyness field in the sensitivities and market data has been changed from ATM to N/A.

  • Catalog name: The catalog has been changed from MarketRiskAccelerator to MR.

  • Combined cube metrics: The metrics of the combined cube are now defined in the class MRCombinedCubeMeasuresConfig, their definition in pure Copper is also provided but should not be used. For details, see The MRCombinedCube metrics.

  • Property cleanup: The unused property SENSITIVITY_TYPE has been removed in the DynamicTenorsAndMaturitiesPostProcessor class.

  • Added a new abstract tuple publisher: Introduced new abstract tuple publisher (ATableFormatTuplePublisher) for publishers where the file format does not match the table data model. For details, see New abstract tuple publisher.

  • Admin UI: The Admin UI has been upgraded to version 5.1.5. For details, see Upgrade to Admin UI 5.1.5.

  • PnL Explain with DirectQuery: PnL Explain is now working across the transition between DirectQuery and in-memory sensitivity cubes. For details, see PnL Explain with DirectQuery.

  • UI Activation: An import of react-query is required when using mr-sdk. See UI activation for more details.

  • Databricks: Added support for DirectQuery with Databricks.

  • Removed Debug measures: The debug market data measures and subsequent classes have been removed from the product.

  • Scalar sensitivities default: The default data model for sensitivities changed from vector model to scalar model.

  • Vector sensitivities deprecated: The vector sensitivities data model is deprecated and planned for removal. If you need to switch from vectorized to scalar sensitivities, see Customizing Atoti Market Risk to use store-backed maturity conversion with scalar sensitivities.

  • Market Data bookmark removed: The Risk Factor History bookmark under Atoti MR & PL/Story-Telling Target Views has been removed.

  • Content server reset on start: The default behavior driven by the in-memory database properties in application.yaml has been changed to reset the content server on start with the bookmarks folder (mr-application/src/main/resources/mr-bookmarks).

  • Added topic alias AllMarketData: All the market data tables are regrouped under the new topic alias AllMarketData, used for loading the input files.

Breaking changes

  • A number of classes named ...Helper(s) have been renamed to ...Utils for naming consistency with similar classes.
  • All Utils and Constants classes, as well as other classes containing only static variables and/or methods, now have a private constructor.
  • com.activeviam.mr.common.calculations.adjustments.constants.AdjustmentsConstants has been removed and the two constants from this class added to com.activeviam.mr.common.constants.AdjustmentsConstants.
  • ASecurityConfig.PIVOT_USER_ROLES has changed from String[] to List<String>.
  • The METRIC variable on a number of measure chain classes is now a static constant in place of a final instance variable.
  • Fields on two What-If classes are now final, with corresponding getter/setter methods available.
  • The lambda generic classes have been replaced by specific classes.
  • Some classes related to security configuration have been moved from the mr-common-config project to the mr-application project.
  • In the mr-common-config project, the class UnsecuredDatabaseServiceConfig has been renamed to WhatIfAwareUnsecuredDatabaseServiceConfig.
  • The issue described in the ticket MR-1626 (trying to log in with a user that does not have admin rights throws a 403 HTTP error) has been fixed in the class MRSecurityFilterChainsConfig.
  • The NoOpPostProcessor is defined in the Common Library, the package is now com.activeviam.accelerator.common.postprocessor.impl.
  • The tuple publishers that target multiple stores, or stores with a data model distinct from the input file format now extend ATableFormatTuplePublisher.
  • The unused property SENSITIVITY_TYPE has been removed in the DynamicTenorsAndMaturitiesPostProcessor class.
  • The topic aliases used by the Data Load Controller (DLC) are now defined for each topic rather than in a single place during DLC initialization. The ChannelParametersHolder::addTopic now has a 4th parameter that holds the list of all topic aliases to which the topic belongs. The function DataLoadControllerConfig::registerTopicAliases computes the aliases based on this extension and shouldn’t be modified anymore. For details, see Step 3 in Data loading and unloading.
  • Replaced the Atoti Market Risk ReferenceLevelLocationShift post-processor with the Common Library ReferenceLevelLocationShiftLight. Any usage of the post-processor will have to be replaced, as will any usage of the mr.metrics.rlshift.post-processor property referring to the old plugin key. The default value of the property has been changed to ReferenceLevelLocationShiftLight.
  • The application has been upgraded to Hibernate 6.3.1.Final and H2 2.2.224. As a consequence, the content of the content server database has changed. See Migration of the content server database.
  • The catalog name has been renamed from “MarketRiskAccelerator” to “MR”.
  • The new configuration class ApplicationJwtConfig has been added to handle the configuration used for JWT authentication.
  • The constant VALUE_CCY in StoreFieldConstants has been removed and replaced by the constant CCY.
  • The MRCombinedCube metrics are now configured by beans with the qualifier SP_QUALIFIER__COMMON_MEASURE_BUILDERS and SP_QUALIFIER__COMMON_MEASURES.
  • The interface IAsyncTask has been replaced by IRefreshTaskthat is more specific and used to perform refresh action upon DirectQuery refresh request.
  • Vectorized sensitivities have been deprecated: scalar sensitivities should be used instead of vectorized sensitivities.
  • The default data model for sensitivities changed from vector model to scalar model.
  • The CorporateAction store has been removed for scalar sensitivities, and deprecated for vectorized sensitivities: it is still used to handle dividends for vectorized sensitivities, but is not used anymore for scalar sensitivities.
  • Stock splits are handled in a new store: the SplitRatioMarketData store is used for the handling of stock split ratios both for vectorized and scalar sensitivities.
  • New input files for Dividends and stock Split Ratios have been created.
  • New Market Data input files: spot, curve, surface, cube, and correlation market data files have been created to replace the previous market data input file.
  • The Market Data Cube has been deleted : Market data measures in the Sensitivities Cube need to be used to display market data instead of the Market Data Cube.
  • The debug market data measures have been removed.
  • The modules mr-market-data-lib and mr-market-data-config have been removed. They were used for the configuration of the Market Data Cube.
  • In the ThetaCopper class, some methods have been renamed. The marketDataPostProcessor and scalarMarketDataPostProcessor methods have been renamed.
  • The com.activeviam.accelerator.common.dates.IMaturityConverter interface has been removed from the module mr-common-lib and has been replaced by the interface com.activeviam.accelerator.common.dates.IMaturityConverter.
  • Some methods have been added to the ISensitivityMarketDataMeasures interface and the following methods have been changed:
    • scalarNativeIntermediateInterpolatedDividend
    • scalarNativeIntermediateInterpolatedTheta
    • vectorNativeIntermediateInterpolatedTheta
  • For the market data measure chains configuration: the class names *CurrentDateMarketDataChain, *NextDateMarketDataChain and *PreviousDateMarketDataChain have been changed to use the new Market Data API.
  • The SQL scripts to create and load data for DirectQuery with Microsoft SQL Server and Snowflake have been modified to match the schema of the new Market Data API.
  • Default content server startup settings changed to reset its content to the content in mr-application/src/main/resources/mr-bookmarks. No persistence upon restart with new default properties.
  • The MaturityDate & TradeDate fields of the TradeAttributes store, and the MaturityDates and TenorDates fields of the TradeSensitivities store are now typed as Date instead of String. Code that requires these to be Strings will need updating.
  • The constructor of the MraSimpleTenorConverter class in the mr-common-lib module has changed. In addition to a String-typed default for tenors and maturities, this class now also requires a Date-typed default. This change is due to the type change of the fields mentioned above.
  • The properties beginning mr.sensi.rules.<sensitivity-type>... have been renamed mr.sensi.rules.<sensitivity-type>.pnl-explain. This is to accommodate the new mr.sensi.rules.<sensitivity-type>.taylor-var properties that allow Taylor VaR and PnL Explain calculations to be configured independently.
  • The ISensiRuleConfigurationService interface has been replaced by the IPnlExplainRuleConfigurationService and ITaylorVarRuleConfigurationService interfaces.
  • The ISensiRuleConfigurationServicAware interface has been removed.
  • The method getVaRExplainFormula in IPnLExplainFormulaProvider has been renamed to getPnlExplainFormulaForShift as this method is now only used for PnL Explain calculations.
  • The constructor for the PnLExplainFormulaProvider class now requires an IPnlExplainRuleConfigurationService instead of an ISensiRuleConfigurationService.
  • The InputSelector class has been renamed to PnlExplainInputSelector. There is a corresponding TaylorVarInputSelector and they both implement IInputSelector. To autowire these beans you must now use the new qualifiers: SP_QUALIFIER__PNL_EXPLAIN_INPUT_SELECTOR and SP_QUALIFIER__TAYLOR_VAR_INPUT_SELECTOR.
  • The IInputSelectorAware interface has been replaced by the IPnlExplainInputSelectorAware and ITaylorVarInputSelectorAware interfaces.
  • The APnlVectorFromRiskSensiPostProcessor post-processor now implements the ITaylorVarFormulaProviderAware interface instead of the IPnLExplainFormulaProviderAware interface.
  • Tenor Converter / Maturity Converter: When a parsing error occurs, a null value (for object based return functions) or a NaN value (for double return functions) is returned.

Tenor Converter / Maturity Converter

When a parsing error occurs, a null value (for object based return functions) or a NaN value (for double return functions) is returned. The caller should take action to handle the error case correctly, for instance, by calling the error handler.

Profile-based configuration

The code in Atoti Market Risk will no longer change behavior based directly on Spring profiles. Instead, the behavior will be determined by properties. The properties can be set by profile-selected configuration files. Default property files are included to preserve backwards compatibility with the use of profiles.

In particular, instead of the profiles dist-data-node, dist-query-node, and forceNetty (and the property directquery.enabled), we have the following properties:

Property Description Values
starter.deployment.type Specifies the nature of the database used for the cube. It can take three values:
  • in-memory (default): The in-memory datastore is used.
  • direct-query: An external database is used. This replaces the directquery.enabled property.

    note

    An in-memory datastore is still used for configuration data and caching.

  • query-node: No database is used.
starter.deployment.transport Specifies the messenger to use for communication between cubes. It can take two values:
  • local (default): For communication only within a single machine. It cannot be used for distribution, but is faster if distribution isn’t needed.
  • netty: For jgroups communication between machines in a distributed deployment.
  • none: For no communication bus, when no query cube is used.
mr.enable.cubes.common=false An existing flag, which turns the MRCombinedCube polymorphic cube on or off.

The following configuration files have been added to match the behavior of the profiles:

Spring profile Configuration file starter.deployment.type starter.deployment.transport combined.disable
default in-memory local unset (false)
dist-data-node application-dist-data-node.yaml in-memory netty true
dist-query-node application-dist-query-node.yaml query-node netty unset (false)
forceNetty application-forceNetty.yaml unset (in-memory) netty unset (false)

See the Externalized Configuration section of the Spring Boot documentation for more information on profiles and property management.

The MRCombinedCube metrics

The polymorphic metrics of the combined cube (using metrics from several underlying data cubes) are now defined by beans.

The configuration is located in MRCombinedCubeMeasuresConfig configuration class.

The metrics could be defined in the legacy way under the qualifier @Qualifier(SP_QUALIFIER__COMMON_MEASURE_BUILDERS) that will be aggregated by the cube configuration.

They can also be defined in Copper style with the qualifier @Qualifier(SP_QUALIFIER__COMMON_MEASURES). The Copper for polymorphic metrics is an alpha feature and is only present for demonstration.

The Copper for polymorphic metrics is activated by the environment variable activeviam.feature.experimental.copper_in_distributed_cube.enabled=true. The Spring condition @ConditionalOnExperimentalCopperInDistributedCube checks that the environment variable is set. The Spring condition @ConditionalOnNotExperimentalCopperInDistributedCube checks that the environment variable is not set.

PnL Explain with DirectQuery

By setting up Atoti Market Risk using in-memory node and DirectQuery nodes, the transition between the two nodes is now correctly handled for the PnL Explain computation. As before, the dates defined in the property mr.data-load.initial-business-dates are loaded on the in-memory node and NOT loaded in the DirectQuery node. However, on the DirectQuery node, the FXRates and MarketData stores are now loaded from both DirectQuery for the non-defined dates and from the files for the defined dates in the property. By doing this, the Day PnL Explain computation can fetch the market data for Day-1 and Day on the DirectQuery node of Day-1.

This is done by adding in-memory sources on DirectQuery setup:

Condition changes

Storage source Previously used condition Common condition (DQ & in-memory) In-memory only condition DirectQuery only condition
Local @ConditionalOnLocalData @ConditionalOnLocalSource @ConditionalOnLocalData @ConditionalOnDirectQueryWithLocalSource
Azure @ConditionalOnAzureData @ConditionalOnAzureSource @ConditionalOnAzureData @ConfigurationDirectQueryWithAzureSource

New Sources

A new source configuration dedicated to DirectQuery has been added by the configuration classes SensiPnLAzureCsvSourceConfig, SensiPnLLocalCsvSourceConfig, and DirectQuerySensiCsvSourceParametersProviderConfig. It loads the FX and market data on in-memory based for the dates defined by the property mr.data-load.initial-business-dates. It uses the same topics and aliases as the in-memory setup (Attributes/AllAttributes/FXRates for FX, DailySensiConfig/SensiConfig/AllSensi/AllAttributes/AllFacts/MarketData for Market Data). A refresh issued to DirectQuery will also reload the initial data.

New qualifiers

To handle this source, several qualifiers have been added:

Constant Qualifier Type Source
SP_QUALIFIER__DQ_SENSI_TOPIC_PUBLISHERS “dq-sensi-topic-publishers” Publisher generator Function Sensi for DirectQuery
SP_QUALIFIER__DQ_SENSI_TOPIC_COLUMNS “dq-sensi-topic-columns” Columns generator Function Sensi for DirectQuery
SP_QUALIFIER__DQ_SENSI_TOPIC_TO_STORE_AND_FILE_MAP “dq-sensi-topic-to-store-and-file-map” Definition of the topics Sensi for DirectQuery

Configuration classes

Files Modified

Application configuration

Three classes have been renamed from ...Helper(s) to ...Utils for consistency with similar classes. In MR, a Utils class is one that contains only static methods. These three classes are:

Old class name New class name
DatastoreDescriptionHelper DatastoreDescriptionUtils
MeasureChainHelpers MeasureChainUtils
SchemaHelpers SchemaUtils

We have also consolidated two Utils classes: com.activeviam.mr.common.calculations.adjustments.constants.AdjustmentsConstants has been removed and the two constants in this class have been moved to com.activeviam.mr.common.constants.AdjustmentsConstants. These constants are unchanged, you simply need to update the import statements.

Utils classes and others, such as Constants classes, that contain only static variables and/or methods are not intended to be instantiated. Therefore, for clarity, we have added private constructors to these classes. They are as follows:

  • ComponentVaRCalc
  • CookieUtil
  • DatastoreConstants
  • DatastoreDescriptionUtils
  • DimensionConstantsConfig
  • DimensionUtils
  • MeasureChainHelpers
  • MeasureConstants
  • SchemaConstants
  • SignOffConstants
  • StoreUtils
  • WhatIfConstants
  • WhatIfUtils

The type of the constant ASecurityConfig.PIVOT_USER_ROLES has changed from String[] to List<String>, where the list is an unmodifiable list. This is to ensure the immutability of this constant.

Measures configuration

A number of abstract measure chains have a METRIC field, representing the metric that the chain creates measures for. On all these classes, this is now a static constant in place of a final instance variable. These chains are:

  • AESChain
  • AETGChain
  • AHDChain
  • ASummaryESChain
  • ASummaryETGChain
  • ASummaryVaEChain
  • ASummaryVaRChain
  • ASummaryWESChain
  • ASummaryWETGChain
  • ASummaryWVaEChain
  • ASummaryWVaRChain
  • AVaEChain
  • AVaRChain
  • AWESChain
  • AWETGChain
  • AWVaEChain
  • AWVaRChain
What-If configuration

A number of instance variables have been made private on What-If configuration classes. In all cases there is a corresponding getter and setter that was already available and is now required to be used in all cases. These fields are:

Class name Field name
FileUploadPayload filePathSeparator
FileUploadPayload topics
FileUploadTopic name
FileUploadTopic files
Security configuration

The following files have been moved from the mr-common-config project to the mr-application project:

File name Old package New package
IUserLogoutSuccessHandler com.activeviam.mr.common.config.security.filter com.activeviam.mr.application.config.security
CookieUtil com.activeviam.mr.common.config.security com.activeviam.mr.application.config.security
CorsConfig com.activeviam.mr.common.config.security com.activeviam.mr.application.config.security
JwtAuthenticationConfigurer com.activeviam.mr.common.config.security com.activeviam.mr.application.config.security
SameSiteConfig com.activeviam.mr.common.config.security com.activeviam.mr.application.config.security
SecurityJwtProperties com.activeviam.mr.common.config.security com.activeviam.mr.application.config.security
UserDetailsServiceConfig com.activeviam.mr.common.config.security com.activeviam.mr.application.config.security

In the mr-common-config project, the class UnsecuredDatabaseServiceConfig has been renamed to WhatIfAwareUnsecuredDatabaseServiceConfig.

The following files, which were not used in the code, have been removed from the mr-common-config project:

  • CommonWebSecurityFiltersConfig
  • ApplicationJwtConfig
  • GlobalSecurityConfig
  • InMemoryAuthenticationSecurityConfig
  • InMemoryUserDetailsManagerBuilder
  • PasswordEncoderConfig

The class MRSecurityFilterChainsConfig has been changed to fix known issue MR-1626 (trying to log in with a user that does not have admin rights throws a 403 HTTP error).

The class DispatcherServletConfig has been added in com.activeviam.mr.application.config.security to contain cookie configuration taken from the MarketRiskApplication class.

Preview Market Data property removal

The mr.enable.preview.market-data property has been removed, together with the following Spring @Conditional classes based on it:

Class Condition Replacement
@ConfigurationEnabledPreviewMarketData mr.enable.preview.market-data is true market-data-api-spring-boot-starter is a dependency of the current project.
@ConfigurationDisabledPreviewMarketData mr.enable.preview.market-data is false
@BeanEnabledPreviewMarketData mr.enable.preview.market-data is true market-data-api-spring-boot-starter is a dependency of the current project.
@BeanDisabledPreviewMarketData mr.enable.preview.market-data is false
@ConditionalOnPreviewMarketDataEnabled mr.enable.preview.market-data is true market-data-api-spring-boot-starter is a dependency of the current project.
@ConditionalOnPreviewMarketDataDisabled mr.enable.preview.market-data is false
DirectQuery configuration

The following configuration classes have been added to enable DirectQuery with Databricks:

Class Details
DatabricksSessionConfig Configures the connection to Databricks
MRDirectQueryConfig Imports required Databricks configuration classes

Migration of market data measures to new Market Data API for scalar sensitivities

The market data measures for sensitivities chains have been migrated to the new Market Data API.

Several modifications were required, falling into the following categories:

  • Introduced distinct measures for the previous date market data, rather than location-shifting the current date market data measures.
  • Changed the native intermediate interpolated market data beans to generate market data retrieval measures based on the MarketDataProperties configuration properties, with a switching post-processor using the generated measures as underliers.
  • Added a specific market data type (SensitivityMarketDataType.EQ_SPOT) for market data that requires multiplication by a split ratio for the next date market data measure.

The following classes have been modified in the mr-sensi-config module:

Modified class Changes
DeltaCurrentDateMarketDataChain Configuration change for bean with Qualifier SENSI + CURRENT_MD_NATIVE_INTERMEDIATE_INT
DeltaNextDateMarketDataChain Configuration change for bean with Qualifier SENSI + NEXT_MD_NATIVE_INTERMEDIATE_INT
DeltaPreviousDateMarketDataChain New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_FILTERED_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_EXPAND_INTERMEDIATE_INT
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD_NATIVE
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD
GammaCurrentDateMarketDataChain Configuration change for bean with Qualifier SENSI + CURRENT_MD_NATIVE_INTERMEDIATE_INT
GammaNextDateMarketDataChain Configuration change for bean with Qualifier SENSI + NEXT_MD_NATIVE_INTERMEDIATE_INT
GammaPreviousDateMarketDataChain New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_FILTERED_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_EXPAND_INTERMEDIATE_INT
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD_NATIVE
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD
VegaCurrentDateMarketDataChain Configuration change for bean with Qualifier SENSI + CURRENT_MD_NATIVE_INTERMEDIATE_INT
VegaNextDateMarketDataChain Configuration change for bean with Qualifier SENSI + NEXT_MD_NATIVE_INTERMEDIATE_INT
VegaPreviousDateMarketDataChain New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_FILTERED_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_EXPAND_INTERMEDIATE_INT
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD_NATIVE
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD
VolgaCurrentDateMarketDataChain Configuration change for bean with Qualifier SENSI + CURRENT_MD_NATIVE_INTERMEDIATE_INT
VolgaCurrentDateMarketDataChain Configuration change for bean with Qualifier SENSI + NEXT_MD_NATIVE_INTERMEDIATE_INT
VolgaPreviousDateMarketDataChain New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_FILTERED_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_EXPAND_INTERMEDIATE_INT
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD_NATIVE
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD
CrossGammaCurrentDateMarketDataChain New bean with Qualifier SPLIT_RATIO_2_CURRENT
Configuration change for bean with Qualifier SENSI + CURRENT_MD_NATIVE_INTERMEDIATE_INT
Configuration change for bean with Qualifier SENSI + CURRENT_MD_2_NATIVE_INTERMEDIATE_INT
CrossGammaNextDateMarketDataChain New bean with Qualifier SPLIT_RATIO_2_NEXT
Configuration change for bean with Qualifier SENSI + NEXT_MD_NATIVE_INTERMEDIATE_INT
Configuration change for bean with Qualifier SENSI + NEXT_MD_2_NATIVE_INTERMEDIATE_INT
CrossGammaPreviousDateMarketDataChain New bean with Qualifier SPLIT_RATIO_2_PREVIOUS
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_INT
New bean with Qualifier SENSI + PREVIOUS_MD_2_NATIVE_INTERMEDIATE_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_FILTERED_INT
New bean with Qualifier SENSI + PREVIOUS_MD_2_NATIVE_INTERMEDIATE_FILTERED_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_EXPAND_INTERMEDIATE_INT
New bean with Qualifier SENSI + PREVIOUS_MD_2_NATIVE_EXPAND_INTERMEDIATE_INT
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD_NATIVE
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD_2_NATIVE
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD_2
VannaCurrentDateMarketDataChain Configuration change for bean with Qualifier SENSI + CURRENT_MD_NATIVE_INTERMEDIATE_INT
Configuration change for bean with Qualifier SENSI + CURRENT_MD_NATIVE_INTERMEDIATE_INT
Configuration change for bean with Qualifier SENSI + CURRENT_MD_2_NATIVE_INTERMEDIATE_INT
VannaNextDateMarketDataChain Configuration change for bean with Qualifier SENSI + NEXT_MD_NATIVE_INTERMEDIATE_INT
Configuration change for bean with Qualifier SENSI + NEXT_MD_NATIVE_INTERMEDIATE_INT
Configuration change for bean with Qualifier SENSI + NEXT_MD_2_NATIVE_INTERMEDIATE_INT
VannaPreviousDateMarketDataChain New bean with Qualifier SPLIT_RATIO_2_PREVIOUS
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_INT
New bean with Qualifier SENSI + PREVIOUS_MD_2_NATIVE_INTERMEDIATE_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_FILTERED_INT
New bean with Qualifier SENSI + PREVIOUS_MD_2_NATIVE_INTERMEDIATE_FILTERED_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_EXPAND_INTERMEDIATE_INT
New bean with Qualifier SENSI + PREVIOUS_MD_2_NATIVE_EXPAND_INTERMEDIATE_INT
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD_NATIVE
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD_2_NATIVE
CorrelationCurrentDateMarketDataChain Configuration change for bean with Qualifier SENSI + CURRENT_MD_NATIVE_INTERMEDIATE_INT
CorrelationNextDateMarketDataChain Configuration change for bean with Qualifier SENSI + NEXT_MD_NATIVE_INTERMEDIATE_INT
CorrelationPreviousDateMarketDataChain New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_FILTERED_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_EXPAND_INTERMEDIATE_INT
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD_NATIVE
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD
DividendCurrentDateMarketDataChain Configuration change for bean with Qualifier SENSI + NEXT_MD_2_NATIVE_INTERMEDIATE
DividendNextDateMarketDataChain Configuration change for bean with Qualifier SENSI + NEXT_MD_NATIVE_INTERMEDIATE_INT
DividendPreviousDateMarketDataChain New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_INTERMEDIATE_FILTERED_INT
New bean with Qualifier SENSI + PREVIOUS_MD_NATIVE_EXPAND_INTERMEDIATE_INT
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD_NATIVE
Configuration change for bean with Qualifier SENSI + PREVIOUS_MD

For further details on retrieval in the market data API, see Market data retrieval in the market data API data model

Input file formats

warning

New files

File Purpose
Correlation_Market_Data.csv Stores the correlation market data.
FX_Rate_Market_Data.csv Stores the FX rate market data.
Dividend.csv Stores the dividend market data.
SplitRatio.csv Stores the stock split ratio market data.

Modified

The file Instrument_Market_Data.csv has been renamed to Spot_Market_Data.csv

Modification File Field Optional Description
Changed default MarketData.csv MoneynessLabels Y List of moneyness labels, if applicable. The default value is now N/A.
Changed default VannaSensitivities.csv, CrossGammaSensitivities.csv, CorrelationSensitivities.csv MoneynessLabels Y List of moneyness labels, if applicable. The default value is now N/A.
Changed default DeltaSensitivities.csv, GammaSensitivities.csv, VegaSensitivities.csv, VolgaSensitivities.csv, CashSensitivities.csv, ThetaSensitivities.csv MoneynessLabels Y List of moneyness labels, if applicable. The default value is now N/A.
Changed header VannaSensitivities.csv, CrossGammaSensitivities.csv, CorrelationSensitivities.csv None N/A The header ValueCCy has been replaced by Ccy.
Changed header DeltaSensitivities.csv, GammaSensitivities.csv, VegaSensitivities.csv, VolgaSensitivities.csv, CashSensitivities.csv, ThetaSensitivities.csv None N/A The header ValueCCy has been replaced by Ccy.
Changed default Spot_Market_Data.csv MoneynessLabels Y List of moneyness labels, if applicable. The default value is now N/A.
Changed fields Spot_Market_Data.csv InstrumentId, MarketDataSet - Changed order to MarketDataSet, InstrumentId.
Changed default Curve_Market_Data.csv MoneynessLabels Y List of moneyness labels, if applicable. The default value is now N/A.
Changed fields Curve_Market_Data.csv CurveId, MarketDataSet - Changed order to MarketDataSet, CurveId.
Changed default Surface_Market_Data.csv MoneynessLabels Y List of moneyness labels, if applicable. The default value is now N/A.
Changed fields Surface_Market_Data.csv SurfaceId, MarketDataSet - Changed order to MarketDataSet, SurfaceId.
Changed default Cube_Market_Data.csv MoneynessLabels Y List of moneyness labels, if applicable. The default value is now N/A.
Changed fields Cube_Market_Data.csv CubeId, MarketDataSet - Changed order to MarketDataSet, CubeId.

Removed

File Details
FXRates.csv Use FX_Rate_Market_Data.csv instead.

Configuration

Configuration properties

Properties added

market-data-api-spring-boot-starter module:

Property Default value Description
market-data-api.defaults.tenor “N/A” Default value for tenor coordinates. This is equivalent to the mr.tenors-and-maturities.default-value property of the old market data API.
market-data-api.defaults.moneyness “N/A” Default value for moneyness coordinates. This is equivalent to the mr.moneyness.default-value property of the old market data API.
market-data-api.defaults.maturity “N/A” Default value for maturity coordinates. This is equivalent to the mr.tenors-and-maturities.default-value property of the old market data API.
market-data-api.fx.pivot-currency “EUR” Where no FX rate exists between two currencies, a third (pivot) currency provides rates against both and is used to derive a rate between them. This is equivalent to the mr.fx.common-currency property of the old market data API.

mr-sensi-config

Property Default value Description
mr.sensi.file-patterns.split-ratio “*SplitRatio.csv” Pattern for the Split Ratio input file.
mr.sensi.file-patterns.dividends “*Dividends.csv” Pattern for the Dividend input file.
mr.sensi.file-patterns.correlation-market-data “*Correlation_Market_Data.csv” Pattern for the Correlation market data input file.

mr-common-config

  • The properties prefixed with mr.sensi.rules allow users to configure the PnL Explain and Taylor VaR formulas. With this release, each sensitivity now has a set of default properties for each of the main risk classes, as well as any properties that will apply to custom risk classes if they are not explicitly configured.
    As before, you can still add properties for custom sensitivities and custom risk classes.

  • Additionally, there is a new set of properties beginning mr.sensi.rules.<sensitivity-type>.taylor-var.
    These properties mirror the previous mr.sensi.rules properties (which have moved to mr.sensi.rules.<senitivity-type>.pnl-explain), allowing Taylor VaR and PnL Explain calculations to be configured independently.

As there are a significant number of these properties they are not all listed here but full details can be seen in the mr-common-config properties documentation.

The following properties have been added to configure sensitivity calculations with the new Market Data API:

Property Default value Description
mr.sensi.market-data.correlation.any.any.interpolate Whether to perform interpolation of market data. false
mr.sensi.market-data.correlation.any.any.interpolation-mode The type of interpolator to use: linear, cubic, spline, etc. linear
mr.sensi.market-data.correlation.any.any.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. correlation
mr.sensi.market-data.correlation.any.custom Custom market data properties for specific risk classes. The key is the risk class name, and the values are the properties for that risk class.
mr.sensi.market-data.correlation.custom Custom market data properties for specific sensitivity names and risk classes. The first key is the sensitivity name, the second is the risk class name, and the values are the properties for that sensitivity name and risk class.
mr.sensi.market-data.cross-gamma1.any.any.interpolate Whether to perform interpolation of market data. false
mr.sensi.market-data.cross-gamma1.any.any.interpolation-mode The type of interpolator to use: linear, cubic, spline, etc. linear
mr.sensi.market-data.cross-gamma1.any.any.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. spot
mr.sensi.market-data.cross-gamma1.any.custom Custom market data properties for specific risk classes. The key is the risk class name, and the values are the properties for that risk class.
mr.sensi.market-data.cross-gamma1.any.equity.interpolate Whether to perform interpolation of market data. false
mr.sensi.market-data.cross-gamma1.any.equity.interpolation-mode The type of interpolator to use: linear, cubic, spline, etc. linear
mr.sensi.market-data.cross-gamma1.any.equity.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. eq spot
mr.sensi.market-data.cross-gamma1.custom Custom market data properties for specific sensitivity names and risk classes. The first key is the sensitivity name, the second is the risk class name, and the values are the properties for that sensitivity name and risk class.
mr.sensi.market-data.cross-gamma2.any.any.interpolate Whether to perform interpolation of market data. false
mr.sensi.market-data.cross-gamma2.any.any.interpolation-mode The type of interpolator to use: linear, cubic, spline, etc. linear
mr.sensi.market-data.cross-gamma2.any.any.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. spot
mr.sensi.market-data.cross-gamma2.any.custom Custom market data properties for specific risk classes. The key is the risk class name and the values are the properties for that risk class.
mr.sensi.market-data.cross-gamma2.any.equity.interpolate Whether to perform interpolation of market data. false
mr.sensi.market-data.cross-gamma2.any.equity.interpolation-mode The type of interpolator to use: linear, cubic, spline, etc. linear
mr.sensi.market-data.cross-gamma2.any.equity.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. eq spot
mr.sensi.market-data.cross-gamma2.custom Custom market data properties for specific sensitivity names and risk classes. The first key is the sensitivity name, the second is the risk class name, and the values are the properties for that sensitivity name and risk class.
mr.sensi.market-data.custom Custom market data properties for specific sensitivity types, names and risk classes. The first key is the sensitivity type, the second is the sensitivity name, and the second is the risk class name, and the values are the properties for that sensitivity name and risk class.
mr.sensi.market-data.delta.any.any.interpolate Whether to perform interpolation of market data. true
mr.sensi.market-data.delta.any.any.interpolation-mode The type of interpolator to use: linear, cubic, spline, etc. linear
mr.sensi.market-data.delta.any.any.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. curve
mr.sensi.market-data.delta.any.custom Custom market data properties for specific risk classes. The key is the risk class name and the values are the properties for that risk class.
mr.sensi.market-data.delta.any.equity.interpolate Whether to perform interpolation of market data. false
mr.sensi.market-data.delta.any.equity.interpolation-mode The type of interpolator to use: linear, cubic, spline, etc. linear
mr.sensi.market-data.delta.any.equity.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. eq spot
mr.sensi.market-data.delta.any.fx.interpolate Whether to perform interpolation of market data. false
mr.sensi.market-data.delta.any.fx.interpolation-mode The type of interpolator to use: linear, cubic, spline, etc. linear
mr.sensi.market-data.delta.any.fx.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. fx spot
mr.sensi.market-data.delta.custom Custom market data properties for specific sensitivity names and risk classes. The first key is the sensitivity name, the second is the risk class name, and the values are the properties for that sensitivity name and risk class.
mr.sensi.market-data.dividend.any.any.interpolate Whether to perform interpolation of market data. false
mr.sensi.market-data.dividend.any.any.interpolation-mode The type of interpolator to use: linear, cubic, spline, etc. linear
mr.sensi.market-data.dividend.any.any.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. dividend
mr.sensi.market-data.dividend.any.custom Custom market data properties for specific risk classes. The key is the risk class name and the values are the properties for that risk class.
mr.sensi.market-data.dividend.custom Custom market data properties for specific sensitivity names and risk classes. The first key is the sensitivity name, the second is the risk class name, and the values are the properties for that sensitivity name and risk class.
mr.sensi.market-data.gamma.any.any.interpolate Whether to perform interpolation of market data. true
mr.sensi.market-data.gamma.any.any.interpolation-mode The type of interpolator to use: linear, cubic, spline, etc. linear
mr.sensi.market-data.gamma.any.any.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. curve
mr.sensi.market-data.gamma.any.custom Custom market data properties for specific risk classes. The key is the risk class name and the values are the properties for that risk class.
mr.sensi.market-data.gamma.any.equity.interpolate Whether to perform interpolation of market data. false
mr.sensi.market-data.gamma.any.equity.interpolation-mode The type of interpolator to use: linear, cubic, spline. linear
mr.sensi.market-data.gamma.any.equity.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. eq spot
mr.sensi.market-data.gamma.any.fx.interpolate Whether to perform interpolation of market data. false
mr.sensi.market-data.gamma.any.fx.interpolation-mode The type of interpolator to use: linear, cubic, spline etc. linear
mr.sensi.market-data.gamma.any.fx.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. fx spot
mr.sensi.market-data.gamma.custom Custom market data properties for specific sensitivity names and risk classes. The first key is the sensitivity name, the second is the risk class name, and the values are the properties for that sensitivity name and risk class.
mr.sensi.market-data.vanna1.any.any.interpolate Whether to perform interpolation of market data. true
mr.sensi.market-data.vanna1.any.any.interpolation-mode The type of interpolator to use: linear, cubic, spline etc. linear
mr.sensi.market-data.vanna1.any.any.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. surface
mr.sensi.market-data.vanna1.any.custom Custom market data properties for specific risk classes. The key is the risk class name and the values are the properties for that risk class.
mr.sensi.market-data.vanna1.any.girr.interpolate Whether to perform interpolation of market data. true
mr.sensi.market-data.vanna1.any.girr.interpolation-mode The type of interpolator to use: linear, cubic, spline etc. linear
mr.sensi.market-data.vanna1.any.girr.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. cube
mr.sensi.market-data.vanna1.custom Custom market data properties for specific sensitivity names and risk classes. The first key is the sensitivity name, the second is the risk class name, and the values are the properties for that sensitivity name and risk class.
mr.sensi.market-data.vanna2.any.any.interpolate Whether to perform interpolation of market data. true
mr.sensi.market-data.vanna2.any.any.interpolation-mode The type of interpolator to use: linear, cubic, spline etc. linear
mr.sensi.market-data.vanna2.any.any.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. curve
mr.sensi.market-data.vanna2.any.custom Custom market data properties for specific risk classes. The key is the risk class name and the values are the properties for that risk class.
mr.sensi.market-data.vanna2.any.equity.interpolate Whether to perform interpolation of market data. false
mr.sensi.market-data.vanna2.any.equity.interpolation-mode The type of interpolator to use: linear, cubic, spline etc. linear
mr.sensi.market-data.vanna2.any.equity.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. eq spot
mr.sensi.market-data.vanna2.any.fx.interpolate Whether to perform interpolation of market data. false
mr.sensi.market-data.vanna2.any.fx.interpolation-mode The type of interpolator to use: linear, cubic, spline etc. linear
mr.sensi.market-data.vanna2.any.fx.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. fx spot
mr.sensi.market-data.vanna2.custom Custom market data properties for specific sensitivity names and risk classes. The first key is the sensitivity name, the second is the risk class name, and the values are the properties for that sensitivity name and risk class.
mr.sensi.market-data.vega.any.any.interpolate Whether to perform interpolation of market data. true
mr.sensi.market-data.vega.any.any.interpolation-mode The type of interpolator to use: linear, cubic, spline etc. linear
mr.sensi.market-data.vega.any.any.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. surface
mr.sensi.market-data.vega.any.custom Custom market data properties for specific risk classes. The key is the risk class name and the values are the properties for that risk class.
mr.sensi.market-data.vega.any.girr.interpolate Whether to perform interpolation of market data. true
mr.sensi.market-data.vega.any.girr.interpolation-mode The type of interpolator to use: linear, cubic, spline etc. linear
mr.sensi.market-data.vega.any.girr.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. cube
mr.sensi.market-data.vega.custom Custom market data properties for specific sensitivity names and risk classes. The first key is the sensitivity name, the second is the risk class name, and the values are the properties for that sensitivity name and risk class.
mr.sensi.market-data.volga.any.any.interpolate Whether to perform interpolation of market data. true
mr.sensi.market-data.volga.any.any.interpolation-mode The type of interpolator to use: linear, cubic, spline etc. linear
mr.sensi.market-data.volga.any.any.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. surface
mr.sensi.market-data.volga.any.custom Custom market data properties for specific risk classes. The key is the risk class name, and the values are the properties for that risk class.
mr.sensi.market-data.volga.any.girr.interpolate Whether to perform interpolation of market data. true
mr.sensi.market-data.volga.any.girr.interpolation-mode The type of interpolator to use: linear, cubic, spline etc. linear
mr.sensi.market-data.volga.any.girr.market-data-type The type of market data. This is used to decide which market data store to retrieve the data from. For example, spot, curve, cube. cube
mr.sensi.market-data.volga.custom Custom market data properties for specific sensitivity names and risk classes. The first key is the sensitivity name, the second is the risk class name, and the values are the properties for that sensitivity name and risk class.
Properties modified
Property Name Comment Value
mr.moneyness.default-value The default value has changed to N/A from ATM. N/A
mr.enable.data-model.scalar-sensitivities The default value has changed to true from false. true
mr.sign-off.extractionTemplates.defaultMapping The default value has changed to true from false. true
mr.sign-off.extractionTemplatesScalar.defaultMapping The default value has changed to CubeAdjustmentExport, FXRateExport, FxRateMarketDataExport, "BookParentChildExport from CubeAdjustmentExport, FXRateExport, BookParentChildExport. CubeAdjustmentExport, FXRateExport, FxRateMarketDataExport, "BookParentChildExport
mr.application.content-server.reset The default value has changed to folder to enable resetting the content server by default. folder

mr-common-config

  • Properties in the mr-common-config module beginning mr.sensi.rules have been renamed to mr.sensi.rules.<sensitivity-type>.pnl-explain.
    Along with the new mr.sensi.rules.<sensitivity-type>.taylor-var properties, this allows Taylor VaR and PnL Explain calculations to be configured independently.
  • Additionally, the base properties that applied to any risk class without specified properties (e.g. mr.sensi.rules.delta.base) have been renamed to any (e.g. mr.sensi.rules.delta.pnl-explain.any).

As there are a significant number of these properties they are not all listed here but full details can be seen in the mr-common-config properties documentation.

Properties removed

The following properties have been removed as the Market Data API is no longer in preview:

Property name
mr.enable.preview.market-data
mr.enable.cubes.market-data
Properties deprecated

The sensitivity rules properties concerning interpolation have been deprecated as interpolation is now the responsibility of the new Market Data API. These properties follow the format:

  • mr.sensi.rules.<sensitivity-type>.pnl-explain/taylor-var.<risk-class>.interpolate
  • mr.sensi.rules.<sensitivity-type>.pnl-explain/taylor-var.<risk-class>.preInterpolationFunctions
  • mr.sensi.rules.<sensitivity-type>.pnl-explain/taylor-var.<risk-class>.postInterpolationFunctions

The following market data properties have been deprecated. They are only used for the Taylor VaR measure chains. For PnL explain and market data measure chains, the newly added properties need to be used instead. See Properties added.

  • mr.tenors-and-maturities.default-value
  • mr.moneyness.default-value
  • mr.tenors-and-maturities.default-value
  • mr.fx.common-currency

Property Files

Files Modified
application.yaml

The following properties have been added to address CORS issues and the removal of the distribution Spring profiles:

Key Value Description
server.servlet.session.cookie.secure true Enables/disables always marking the cookie as secure.
server.servlet.session.cookie.http-only true Enables/disables using the “HttpOnly” attribute for the cookie.
server.servlet.session.cookie.same-site none SameSite setting for the cookie.
starter.deployment.type in-memory Specifies the nature of the database used for the cube.
starter.deployment.transport local Specifies the messenger to use for communication between cubes.

The following property has been unset to comply with the change in the default behavior of the content-server (now reset on restart). This eases the start of multiple instances (e.g. distributed configuration).

Key Value Description
mr.application.content-server.db.file.name null Specifies the name of the file to which content server is persisted.
Files Deleted
tracing.properties

This property file has been deleted and replaced by configuration properties. In addition, due to swapping the Brave tracing configuration for OpenTelemetry, properties have been updated.

The new properties are:

Property Name Comment Value
mr.enable.tracing.open-telemetry Enables the OpenTelemetry Configuration. false
mr.open-telemetry.zipkin-span-exporter-url URL to use for zipkin SpanProcessor bean. http://localhost:9411/api/v2/spans
mr.open-telemetry.logging-span-exporter-enabled Enables the SpanProcessor bean with LoggingSpanExporter. false

The following properties have been replaced by OpenTelemetry properties:

  • spring.zipkin.baseUrl
  • spring.zipkin.api-path
  • spring.zipkin.service.name
  • spring.zipkin.sender.type
  • spring.zipkin.enabled
  • spring.sleuth.traceId128
  • activeviam.apm.zipkin.span.level

Datastores

Added store configurations

Store Class Details
CorrelationMarketData CorrelationMarketDataStore Contains correlation market data.
DividendMarketData DividendMarketDataStore Contains split ratio market data.
FxRateMarketData FxRateMarketDataStore A store that is part of the new Market Data API for FX Rate market data.
SplitRatioMarketData SplitRatioMarketDataStore Contains dividend market data.

For details, see New Dividend and Split Ratio stores.

Modified store configurations

Modification Store Class Field Type Description
Reordered CubeMarketData CubeMarketDataStore MarketDataSet String This now precedes CubeId.
Reordered CubeMarketData CubeMarketDataStore CubeId String This is now preceded by MarketDataSet.
Reordered CurveMarketData CurveMarketDataStore MarketDataSet String This now precedes CurveId.
Reordered CurveMarketData CurveMarketDataStore CurveId String This is now preceded by MarketDataSet.
Reordered SpotMarketData SpotMarketDataStore MarketDataSet String This now precedes InstrumentId.
Reordered SpotMarketData SpotMarketDataStore InstrumentId String This is now preceded by MarketDataSet.
Reordered SurfaceMarketData SurfaceMarketDataStore MarketDataSet String This now precedes SurfaceId.
Reordered SurfaceMarketData SurfaceMarketDataStore SurfaceId String This is now preceded by MarketDataSet.
Secondary index added CubeMarketData CubeMarketDataStore MarketDataSet String A secondary index has been added on the AsOfDate, MarketDataSet, and CubeId fields.
Secondary index added SurfaceMarketData SurfaceMarketDataStore MarketDataSet String A secondary index has been added on the AsOfDate, MarketDataSet, and SurfaceId fields.
Renamed CubeMarketData CubeMarketData The CubeMarketDataStore store has been renamed to CubeMarketData.
Renamed CurveMarketData CurveMarketData The CurveMarketDataStore store has been renamed to CurveMarketData.
Renamed SpotMarketData SpotMarketData The InstrumentMarketData store has been renamed to SpotMarketData.
Renamed SurfaceMarketData SurfaceMarketData The SurfaceMarketDataStore store has been renamed to SurfaceMarketData.

The types of the following store fields have been changed:

Store Field Old type New type Old default New default Note
TradeAttributes MaturityDate String Date N/A 1970-01-01
TradeAttributes TradeDate String Date N/A 1970-01-01
TradeSensitivities MaturityDates String Date N/A 1970-01-01 This change does not apply to the vectorized TradeSensitivities store.
TradeSensitivities TenorDates String Date N/A 1970-01-01 This change does not apply to the vectorized TradeSensitivities store.

Marked for removal

Name Type Module Affected Class
CorporateAction mr-sensi-config
Market Data Store Store configuration for vectors format mr-sensi-config VectorMarketDataStoreConfig
TradeSensitivities Store Store configuration for vectors format mr-sensi-config VectorTradeSensitivitiesStoreConfig
Sensitivities Aggregated Store Store configuration for vectors format mr-sensi-config VectorSensiAggregatedStoreConfig
Sensitivities Flat Store Store configuration for vectors format mr-sensi-config VectorSensiFlatStoreConfig

Removed

Name Type Module Affected Class
FXRates Store Store configuration for FX rates that is not used anymore mr-common-config FxRateStoreConfig

The FxRateMarketData store needs to be used instead of the FXRates store. On top of that, the FX rate service uses the Market Data API: the FXRateWrapper, implementation of IFxRates, uses the Market Data API to get the FX rates, see Exchange Rate and Market Data API.

Database

Added tables

Table Details
CORRELATION_MARKET_DATA Market data related to the correlation between risk factors
CUBE_MARKET_DATA Market data defined along three axes (tenors, moneyness and underlying maturities).
CURVE_MARKET_DATA Market data defined along a tenor axis.
DIVIDEND_MARKET_DATA Market data related to dividends.
FX_RATE_MARKET_DATA FX rates.
SPLIT_RATIO_MARKET_DATA Market data related to stock splits.
SPOT_MARKET_DATA Spot price market data.
SURFACE_MARKET_DATA Market data defined along two axes (tenors and moneyness).

Modified tables

The types of the following database table fields have been changed:

Table Field Old type New type Old default New default Note
TRADE_ATTRIBUTES MATURITY_DATE String Date N/A 1970-01-01
TRADE_ATTRIBUTES TRADE_DATE String Date N/A 1970-01-01
TRADE_SENSITIVITIES MATURITY_DATES String Date N/A 1970-01-01
TRADE_SENSITIVITIES TENOR_DATES String Date N/A 1970-01-01
TRADE_SENSITIVITIES_VECTOR MATURITY_DATES String Date N/A 1970-01-01
TRADE_SENSITIVITIES_VECTOR TENOR_DATES String Date N/A 1970-01-01

Deleted tables

FXRATES has been removed and replaced by the new Market Data API store FxRateMarketData.

Cube schema

The Market Data Cube has been deleted.

Measures

Added

Cube Measure Details
Sensitivity Cube Split Ratio 2 Current Split of the secondary underlying instrument as of current date
Sensitivity Cube Split Ratio 2 Previous Split of the secondary underlying instrument as of previous date

Removed

The following debug market data measures found in the mr-sensi-config module were removed.

Measure removed File location
Current Market Data Native Intermediate Int Debug CorrelationCurrentDateMarketDataChain.java, DeltaCurrentDateMarketDataChain.java, GammaCurrentDateMarketDataChain.java, VannaCurrentDateMarketDataChain.java, VegaCurrentDateMarketDataChain.java, VolgaCurrentDateMarketDataChain.java
Current Market Data 2 Native Intermediate Int Debug CorrelationCurrentDateMarketDataChain.java, VannaCurrentDateMarketDataChain.java
Current Market Data Native Intermediate Filtered Int Debug CorrelationCurrentDateMarketDataChain.java, DeltaCurrentDateMarketDataChain.java, GammaCurrentDateMarketDataChain.java, VannaCurrentDateMarketDataChain.java, VegaCurrentDateMarketDataChain.java, VolgaCurrentDateMarketDataChain.java
Current Market Data 2 Native Intermediate Filtered Int Debug CorrelationCurrentDateMarketDataChain.java, VannaCurrentDateMarketDataChain.java
Current Market Data Native Expand Intermediate Int Debug CorrelationCurrentDateMarketDataChain.java, DeltaCurrentDateMarketDataChain.java, GammaCurrentDateMarketDataChain.java, VannaCurrentDateMarketDataChain.java, VegaCurrentDateMarketDataChain.java, VolgaCurrentDateMarketDataChain.java
Current Market Data 2 Native Expand Intermediate Int Debug CorrelationCurrentDateMarketDataChain.java, VannaCurrentDateMarketDataChain.java
Current Market Native Debug CorrelationCurrentDateMarketDataChain.java, DeltaCurrentDateMarketDataChain.java, GammaCurrentDateMarketDataChain.java, VannaCurrentDateMarketDataChain.java, VegaCurrentDateMarketDataChain.java, VolgaCurrentDateMarketDataChain.java
Current Market Native 2 Debug CorrelationCurrentDateMarketDataChain.java, VannaCurrentDateMarketDataChain.java
Previous Market Native Debug CorrelationPreviousDateMarketDataChain.java, DeltaPreviousDateMarketDataChain.java, GammaPreviousDateMarketDataChain.java, VannaPreviousDateMarketDataChain.java, VegaPreviousDateMarketDataChain.java, VolgaPreviousDateMarketDataChain.java
Previous Market Native 2 Debug CorrelationPreviousDateMarketDataChain.java, VannaPreviousDateMarketDataChain.java

info

For additional changes, see Removal of debug market data measures.

Deprecation of Sensitivities vector measures
Name Type Module Affected Class
Current MD Native Intermediate Int. Vector Measure mr-sensi-config *CurrentDateMarketDataChain
Current MD Native Intermediate Filtered Int. Vector Measure mr-sensi-config *CurrentDateMarketDataChain
Current MD Native Expand Intermediate Int. Vector Measure mr-sensi-config *CurrentDateMarketDataChain
Next MD Native Intermediate Int. Vector Measure mr-sensi-config *NextDateMarketDataChain
Next MD Native Intermediate Int.filtered Vector Measure mr-sensi-config *NextDateMarketDataChain
PnL Explain Native Intermediate Next Date Vector Measure mr-sensi-config *PnLExplainChain
PnL Explain Native Expand Next Date Vector Measure mr-sensi-config *PnLExplainChain
.Ladder.Pillars.Vector.Expand Vector Measure mr-sensi-config *LadderExpansionChain
.Native.SUM.Technical.Filtered Vector Measure mr-sensi-config *NativeCurrencyChain
.Native.Vector.Expand Vector Measure mr-sensi-config *NativeCurrencyChain
Previous Vector Native Expand Vector Measure mr-sensi-config *NativeCurrencyChain
Shift Vector Vector Measure mr-sensi-config *ShiftViewerChain
Shift Vector Expanded Vector Measure mr-sensi-config *ShiftViewerChain
Shift Vector Max Level Vector Measure mr-sensi-config *ShiftViewerChain
Shift Vector Interpolated Vector Measure mr-sensi-config *ShiftViewerChain
Shift Vector Interpolated Expanded Vector Measure mr-sensi-config *ShiftViewerChain
Shift Vector Interpolated Max Level Vector Measure mr-sensi-config *ShiftViewerChain
Shift Vector Normalized Vector Measure mr-sensi-config *ShiftViewerChain
Shift Vector Normalized Expanded Vector Measure mr-sensi-config *ShiftViewerChain
Shift Vector Normalized Max Level Vector Measure mr-sensi-config *ShiftViewerChain
Shift Vector Interpolated Normalized Vector Measure mr-sensi-config *ShiftViewerChain
Shift Vector Interpolated Normalized Expanded Vector Measure mr-sensi-config *ShiftViewerChain
Shift Vector Interpolated Normalized Max Level Vector Measure mr-sensi-config *ShiftViewerChain
.Native.SUM.Technical.Filtered.Retrieval Vector Measure mr-sensi-config *TaylorChain
.Native.SUM.Technical.Filtered Summary Vector Measure mr-sensi-config Summary*NativeCurrencyChain
Native Summary Vector Measure mr-sensi-config Summary*NativeCurrencyChain
Vector Measure mr-sensi-config

* {Cash, Correlation, Crossgamma, Delta, Dividend, Gamma, Theta, Vanna, Vega}

Context values

Removed

Name Details
EnableMDStringDebug The context value was removed as part of removing the Debug measures.

DirectQuery scripts

Added

Script Details
mr-directquery/src/test/resources/databases/databricks/createMR.sql Creates the current MR schema in a Databricks database.
mr-directquery/src/test/resources/databases/databricks/loadMR.sql Loads MR reference data into a Databricks database.

Changed

Script Details
mr-directquery/src/test/resources/databases/mssql/createMR.sql Removed creation of MarketData store. Added creation of new Market Data stores (spot, curve, surface, cube, dividend, split-ratio). Modified creation of FXRate store.
mr-directquery/src/test/resources/databases/mssql/loadMR.sql Removed SQL to write to MarketData store. Added SQL to write to new Market Data stores (spot, curve, surface, cube, dividend, split-ratio).
mr-directquery/src/test/resources/databases/snowflake/createMR.sql Removed creation of MarketData store. Added creation of new Market Data stores (spot, curve, surface, cube, dividend, split-ratio). Modified creation of FXRate store.
mr-directquery/src/test/resources/databases/snowflake/loadMR.sql Removed SQL to write to MarketData store. Added SQL to write to new Market Data stores (spot, curve, surface, cube, dividend, split-ratio).

Modules removed

The modules mr-market-data-lib and mr-market-data-config have been removed. They were used for the configuration of the Market Data Cube.

PnL Explain and Taylor VaR Formula Split

PnL Explain and Taylor VaR calculations can now be configured independently of one another. The following changes enable this.

Properties

The mr.sensi.rules properties have been split into mr.sensi.rules.<sensitivity-type>.pnl-explain and mr.sensi.rules.<sensitivity-type>.taylor-var properties. If the Taylor VaR properties are not set, Taylor VaR calculations will continue to use the corresponding PnL Explain properties, but these new properties allow you to specify different values specifically for Taylor VaR.

The values of these properties were previously accessed at runtime using the ISensiRuleConfigurationService interface. This has been replaced by IPnlExplainRuleConfigurationService and ITaylorVarRuleConfigurationService interfaces.

The ISensiRuleConfigurationServiceAware interface has been removed as this was no longer used.

Formula Providers

In addition to the existing IPnLExplainFormulaProvider, there is now an ITaylorVarFormulaProvider class. This is available as a Spring bean, created by the TaylorVarFormulaProviderConfig class.

The method getVaRExplainFormula in IPnLExplainFormulaProvider has been renamed to getPnlExplainFormulaForShift as this method is now only used for PnL Explain calculations. The constructor for the PnLExplainFormulaProvider class now requires an IPnlExplainRuleConfigurationService instead of an ISensiRuleConfigurationService.

Input Selector

The Input Selector classes that are used to perform ladder calculations have also been split. The IInputSelector interface remains unchanged but the InputSelector implementation is now renamed to PnlExplainInputSelector and there is a corresponding TaylorVarInputSelector.

The InputSelectorConfig configuration class now publishes two beans of type IInputSelector, one for PnL Explain and the other for Taylor VaR. These can be autowired by using the new qualifiers: SP_QUALIFIER__PNL_EXPLAIN_INPUT_SELECTOR and SP_QUALIFIER__TAYLOR_VAR_INPUT_SELECTOR.

The IInputSelectorAware interface has been replaced by the IPnlExplainInputSelectorAware and ITaylorVarInputSelectorAware interfaces.

Post-processor

The APnlVectorFromRiskSensiPostProcessor post-processor now implements the ITaylorVarFormulaProviderAware interface instead of the IPnLExplainFormulaProviderAware interface, and the ITaylorVarInputSelectorAware interface instead of the IInputSelectorAware interface.

The following post-processors now implement the IPnlExplainInputSelectorAware interface instead of the IInputSelectorAware interface:

  • AScalarPnLExplainPostProcessor
  • PnLExplainCrossPostProcessor
  • PnLExplainPostProcessor

Other changes

Code changes in mr-application

A number of code-level changes have been made to classes in the mr-application module to improve clarity and consistency. These are:

  • LocalContentService.createHibernateConfiguration now throws an ActiveViamRuntimeException instead of a RuntimeException.
  • StaticResourcesHandler.CLASSPATH is a new private constant with the value "classpath:".
  • Nested if conditions have been removed from AdjustedCellPropertiesHandler.getForeColor\getBackColor.
  • The static variable MarketRiskApplication.context, of type ConfigurableApplicationContext, has been removed.
  • The JMXEnabler bean named JMXDatastoreEnabler, defined in MarketRiskConfig has been renamed to jmxDatastoreEnabler.
  • The JMXEnabler bean named JMXDirectMemoryMonitoringEnabler, defined in MonitorConfig has been renamed to jmxDirectMemoryMonitoringEnabler.
  • The private method performTransaction has been added to the AdjustmentExecutionConfig class to avoid the nesting of try-catch statements.
  • In a number of places, where a local variable is created and assigned just to be returned by a method, the local variable is no longer created. For instance, this has been changed for the getConfiguredStageTopics method of the FileUploadWhatIfRestfulService class.
  • The main method of the InvokeBranchRelease class now uses the Map.of method to store the JMX credentials, instead of instantiating a HashTable.
  • The new configuration class ApplicationJwtConfig has been added to handle the configuration of the properties used to define JWT authentication.
  • Deprecated description IStoreFormat is replaced by IDataTable.

Market Data API changes

The new Market Data API that was introduced as a preview in Atoti Market Risk 5.3.0 has undergone significant changes to add functionality and improve flexibility.

To reflect the independence of the API, it has been moved to a new Maven module: market-data-api. This module is not dependent on any Atoti Market Risk modules, although it has a dependency on the Datastore Helper (DASH) and DASH is required to use the store configurations. This module is a dependency of the mr-common-lib module and so its classes are available throughout the Atoti Market Risk project.

In addition to the base module, which provides interfaces and implementation classes, there is a market-data-api-spring-boot module. This contains Spring bean definitions for market data stores and retrievers, and interpolation services. As a Spring Boot starter, when you add this module as a dependency to a Spring Boot application, the beans within it are automatically configured by Spring and made available to the application context. The following classes are automatically imported from the starter module:

  • com.activeviam.marketdata.api.configuration.retrievers.CubeMarketDataRetrievalConfig
  • com.activeviam.marketdata.api.configuration.retrievers.CurveMarketDataRetrievalConfig
  • com.activeviam.marketdata.api.configuration.retrievers.FxRateMarketDataRetrievalConfig
  • com.activeviam.marketdata.api.configuration.retrievers.SpotMarketDataRetrievalConfig
  • com.activeviam.marketdata.api.configuration.retrievers.SurfaceMarketDataRetrievalConfig
  • com.activeviam.marketdata.api.configuration.interpolation.AllMarketDataInterpolatorsConfig
  • com.activeviam.marketdata.api.configuration.interpolation.AllInterpolationTransformationsConfig

In addition to supporting cube, curve, instrument, and surface market data, FX rates are now supported and a corresponding FxRateMarketDataStore now exists.

The structure of the new Market Data API has also changed significantly from the previous release. The interfaces for retrieving market data from stores are different. Previously, a common IMarketDataRetriever interface allowed you to retrieve single values from market data stores and specific retrievers, e.g. ICubeMarketDataRetriever interfaces supported retrieval of market data collections (cubes, curves, etc.). Instead, each market data type now has a specific, corresponding retriever interface that supports retrieval from that store using the semantics relevant to it. For instance, the ICurveMarketDataRetriever store now retrieves a single value from a curve or a whole curve, and the method parameters reflect the properties of a curve.

In addition to the base retriever interfaces, each market data type also now has a “contextual” variant, e.g. IContextualCurveMarketDataRetriever. This retriever accepts a MarketDataRetrieverContext that may modify the retrieval. Out-of-the-box implementations apply the date shift from the context before retrieving the market data.

Beyond retrievers, the IMarketDataService interface has been renamed to IMarketDataRetrievalService. A retrieval service contains the business rules to retrieve market data for a specific purpose. It may use multiple underlying retrievers or interpolation services to do this. We provide an abstract implementation of this interface, which handles caching within a query cache.

Finally, an AMarketDataPostProcessor is now provided that should serve as the basis for market data retrieval within a measure chain.

Lambda interface changes

Old interface New interface Usage
BiFunction<ICanStartBuildingSchema, IDatastoreSchemaDescription, BuildableActivePivotSchemaDescriptionBuilder> CubeBuilderFunction All the beans with @Qualifier("Cube").
DoubleBinaryOperator ShiftScalingFunction IInterpolationConfiguration::normalizationShiftOperator
BinaryOperator PrePostFunction IInterpolationConfiguration::getPreMarketDataInterpolationFunction
BinaryOperator PrePostFunction IInterpolationConfiguration::getPostMarketDataInterpolationFunction
BinaryOperator PrePostFunction IInterpolationConfiguration::getPreShiftDataInterpolationFunction
BinaryOperator PrePostFunction IInterpolationConfiguration::getPostShiftDataInterpolationFunction
DoubleBinaryOperator AbsoluteToRelativeFunction IInterpolationConfiguration::absoluteToRelativeMarketDataOperator
DoubleBinaryOperator RelativeToAbsoluteFunction IInterpolationConfiguration::relativeToAbsoluteMarketDataOperator
DoubleBinaryOperator ShiftScalingFunction IInterpolationConfiguration::normalizationShiftOperator
BiFunction<Double, ICorporateAction, Double> CorporateActionOperator IInterpolationConfiguration::corporateActionOperator
UnaryOperator<ICanBuildCommonCubeDescription> QueryCubeAggregateProviderConfig Bean with @Qualifier("MRCombinedCubeConfiguration").
UnaryOperator<ICanBuildCubeDescription> AggregateProviderConfig All beans with the corresponding return signature.
ICustomParameters.ILocationFunction LocationFunction ICustomParameters::getLeafCoordinatesFunction
BiConsumer<String, Collection<Object[]» DatastorePublisher A function with the behavior of ITransactionalWriter::addAll.
Supplier Constructor Every time a constructor without arguments needs to be provided.
Supplier NotNullCacheSupplier Supplier of function PostProcessorUtils::getInCacheOrComputeNeverNull.
Supplier NullableCacheSupplier Supplier of function PostProcessorUtils::getInCacheOrCompute.
BiFunction<ILocation, IQueryCache, List> LeafFunction Return type of ICustomLeaf::apply.
Function<Double, Pair<T, String» DataRetrieverFunction Parameter of IInterpolation::interpolation used to get the underlying data.
UnaryOperator SimpleNameConverter Simple naming convention change, used for DirectQuery.
BiPredicate<IPillar, IPillar> EqualsFunction ModifiedPillarSetOfPillar equals function.
BiFunction<LocalDate, Boolean, LocalDate> DateSearchStepper Used in PostProcessorUtils::dateSearch to go to the next date.
Function<LocalDate, T> DateSearchRetriever Used in PostProcessorUtils::dateSearch to get the value for a given date.
UnaryOperator AdjustmentConverterOperator Used to define basic operation for the adjustment.
BiFunction<Map<String, Object>, List, U> AdjustmentInputConverter Converts the user request into a pre-processed input request for the adjustment.
BiFunction<AdjustmentRequestDTO, SupportedAdjustmentDTO, Map<String, Object» AdjustmentInputParser Transforms a user request into adjustment values.
TriFunction<Object[], IStoreFormat, List, T> AdjustmentInputRetriever Pre-processing of a line before adjustment.
TriFunction<String, String, String, Map<String, Object» AdjustmentSourceTagger Fills the adjustment columns with the type of adjustment.
BiFunction<T, U, List> AdjustmentStep<T, U, V> One step of adjustment to modify a store line.
BiFunction<Map<String, Object>, List, Double> DoubleAdjustmentInputConverter Converts the user request into a pre-processed input request for the adjustment.
TriFunction<Object[], IStoreFormat, List, Double> DoubleAdjustmentInputRetriever Pre-processing of a line before adjustment.
BiFunction<Double, Double, List> DoubleAdjustmentStep One step of adjustment to modify a store line.
Consumer DatastoreConfiguratorConsumer Used for applying customizations to the IDatastoreConfigurator object.
Function<String, Set> BookRetriever Helper function for adjustment executions that retrieves a set of books belonging to a desk.
BiFunction<String, String, Set> TradeRetriever Helper function for adjustment executions that retrieves a set of trades belonging to a specific desk and book.
Supplier FileUploadAddressSupplier Used by the file upload What-If implementation to get the addresses for file upload services present in a distributed cluster.
BiFunction<IDatastoreSchemaDescription, String, T> BaseSelectionCreator Used to configure schema selection based on a datastore schema and the name of the base store.
UnaryOperator ExtraSelectionApplier Used to apply extra schema selections.
Function<IDatastoreSchemaDescription, ISelectionDescription> SelectionDescriptionCreator Used to create a selection description based on a datastore schema description.
Function<IActivePivotManagerDescriptionBuilder, IActivePivotManagerDescriptionBuilder> CatalogCreator Used to add catalogs to the IActivePivotManagerDescriptionBuilder.
Consumer CopperCubePublisher Used to add Copper cube components to the Copper context.
Consumer MeasurePublisher Used to publish measures to the Copper context.
Function<ICanStartBuildingMeasures, IHasAtLeastOneMeasure> MeasureAdder Adds a measure through the Fluent API.
Function<T, String> NameRetriever Selects a measure name from the names object (e.g. SensiMeasureNames).
Function<T, String> ParameterRetriever Selects a parameter from the parameters object (e.g. SensiMeasureParameters).
Consumer DatastorePostprocessorConfigurator Used to add datastore post-processors to the datastore.
Consumer DataLoadControllerConfigurator Used for customizing the Data Load Controller.
BiFunction<String, Map<String, Object>, ICondition> StoreAndScopeToConditionConverter Converts a store name and a DLC scope to an ICondition.
Function<String, IFilesScopedTopic.IScopeToFileScanParametersConverter> TopicToScopeToLoadConverter Matches a topic name to a DLC scope-to-file-scan converter.
Function<String, IDataLoadController.IScopeToRemoveWhereConditionConverter> TopicToScopeToRemoveWhereConditionConverter Matches a topic name to a DLC scope-to-remove-where-condition converter.
Function<IStoreMessageChannelFactory<I, ?>, IMessageChannel<I, ?» MessageChannelCreator Creates a message channel from the given factory.
BiConsumer<AdjustmentRequestDTO, String> AdjustmentExecutor Object that contains the execution steps of the adjustments.
BiConsumer<AdjustmentDeletionRequestDTO, String> AdjustmentDeleter Object that contains the execution steps of the adjustments deletion.

Wherever the changes above have resulted in a removal of ambiguity, the associated Spring @Qualifier has been removed:

Qualifier Replacement interface alias
@Qualifier(SP_QUALIFIER__CUSTOMISATIONS) DatastoreConfiguratorConsumer
@Qualifier(“Catalog”) CatalogCreator
@Qualifier(“Cube”) CubeBuilderFunction
@Qualifier(“DLC-registration”) DataLoadControllerConfigurator
@Qualifier(“DLC-source”) Removed as ICsvSource is generic

Other interface changes

Old interface New interface Usage
Pair<U, String> Result Return type of IInterpolation::interpolation

New API to define dimension and hierarchies

You can now define a new hierarchy belonging to an existing dimension by registering an extra bean. Previously this was only possible at dimension level. To be able to define a new hierarchy in a cube inside an existing dimension, the signature of the dimension beans has changed. It now returns HierarchyBuilderConsumer, replacing DimensionsAdder. This return type lets you define a hierarchy by itself.

Here’s how it works:

    // The return object will be consumed at cube creation
    @Bean
    @Qualifier("commonDimension")
    public HierarchyBuilderConsumer bookingDimension() {
        return BookingDimensionConfig::getBookingDimension;
    }

    // We can group the declaration inside the bean
    public static void getBookingDimension(@NonNull HierarchyBuilder hierarchyBuilder) {
        getDesksHierarchy(hierarchyBuilder);
        getSrcCurrencyHierarchy(hierarchyBuilder);
        getDateHierarchy(hierarchyBuilder);
    }

    // This is a vanilla hierarchy
    public static void getDesksHierarchy(@NonNull HierarchyBuilder hierarchyBuilder) {
        hierarchyBuilder.toDimension(BOOKING_DIMENSION, builder -> builder.withHierarchy(DESKS_HIERARCHY).withLevel(DESK_LEVEL));
    }

    // This is an analysis hierarchy with a shorthand compared to the previous syntax
    public static void getSrcCurrencyHierarchy(@NonNull HierarchyBuilder hierarchyBuilder) {
        hierarchyBuilder.toDimension(CURRENCY_DIMENSION, FxHierarchy.hierarchy(SRC_FX_HIERARCHY).withLevel(SRC_FX_LEVEL));
    }

    // Here you can see the setting of an extra property at dimension level
    public static void getDateHierarchy(@NonNull HierarchyBuilder hierarchyBuilder) {
        hierarchyBuilder.withType(DATES_DIMENSION, TIME);
        hierarchyBuilder.toDimension(DATES_DIMENSION, b -> b.withHierarchy(DATE_HIERARCHY).withLevel(AS_OF_DATE_LEVEL).withType(ILevelInfo.LevelType.TIME));
    }

New abstract tuple publisher

We have introduced the ATableFormatTuplePublisher for sources where the input file format does not match the table data model.

Publishers extending this abstract class can define a mapping between the table fields and the input file fields. The tuples will be generated according to matching field names and this custom mapping.

Upgrade to Admin UI 5.1.5

The Admin UI has been upgraded to version 5.1.5 from version 5.1.1. A new property has been added to the market-risk POM file for the Admin UI version:

  <admin-ui.version>5.1.5</admin-ui.version>

and the admin-ui artifact has been added in the dependency management section of that POM file:

<dependency>
        <groupId>com.activeviam.tech</groupId>
        <artifactId>admin-ui</artifactId>
        <version>${admin-ui.version}</version>
</dependency>

and the hard-coded version number has been removed in the mr-application POM file for that artifact:

<dependency>
    <groupId>com.activeviam.tech</groupId>
    <artifactId>admin-ui</artifactId>
</dependency>

Unused property removed in AsOfDateNeighbourValuePostProcessor

The unused property IS_PARTITIONED_ON_RANGE_LEVELS_PROPERTY has been removed from the class AsOfDateNeighbourValuePostProcessor.

MarketDataDateShift enum

The MarketDataDateShift enum value TODAY has been renamed to CURRENT_DAY to clarify its meaning.

Deprecated unused column calculator

The unused SensiValueCalculator is now deprecated.

Unused property removed in DynamicTenorsAndMaturitiesPostProcessor

The unused property SENSITIVITY_TYPE has been removed from the DynamicTenorsAndMaturitiesPostProcessor class.

The signatures of the methods that used to have the sensitivityType parameter as an argument have been changed to remove that argument. As a consequence, the default implementation of the method rebucketing in the INativeCurrencyMeasures interface has been changed.

New configuration class ApplicationJwtConfig

The new configuration class ApplicationJwtConfig has been added to handle the configuration used for JWT authentication. This class can also handle the activeviam.jwt.failOnDifferentAuthorities property that was not taken into account previously. It is imported in the class MarketRiskConfig instead of the previously used JwtConfig class.

Tomcat server version bumped to 10.1.19

In the mr-application module, this version override of the spring-boot-starter-web dependency is required to customize the use of cookies to allow websocket connections.

Migration of the content server database

The application has been upgraded to Hibernate 6.3.1.Final and H2 2.2.224. As a consequence, the content of the content server database has changed. To export your existing bookmarks from Atoti Market Risk 5.3.0 and import them into 5.4.0, follow these steps:

  1. Launch your Atoti Market Risk 5.3.0 application.
  2. Export the bookmarks by executing the main method of the class ExportReferenceContentServer in the mr-application-tests module. You may need to change the values of the properties used for bookmark export - see mr.bookmark.properties. The bookmarks are exported into the folder specified in the value of the contentServer.bookmarks.export-folder-name property.
  3. Launch the Atoti Market Risk 5.4.0 application with the following properties:

    warning

    Please note that this will create a new content server database from scratch and erase your existing database.

 mr.application.content-server.db.hibernate.hbm2ddl.auto=create
 mr.application.content-server.reset=folder
 mr.application.content-server.factory-reset.folder-name=file:full_path_to_the folder_where_bookmarks_were_exported

Check in Atoti UI that the imported bookmarks are present.

  1. Stop the Atoti Market Risk 5.4.0 application and copy the mr_ref_impl_content_service.mv.db file from the target folder of the mr-application module to the src/main/resources folder of the mr-application module.
  2. Launch the MR 5.4.0 application without the following properties being set:
    mr.application.content-server.db.hibernate.hbm2ddl.auto
    mr.application.content-server.reset
    mr.application.content-server.factory-reset.folder-name

You should now see your imported bookmarks in Atoti UI.

Fluent post-processor setup

The measure creation function returning a CopperMeasure is now deprecated, for instance the old definition:

    default MeasureCreator pnlDistribution() {
        return underlier -> PnLDistributionPostProcessor.measure(
                        underlier[0],
                        getMeasureParameters().getPercentileLevel(),
                        getMeasureParameters().getPnlDistributionConfigurationService(),
                        false)
                .withFormatter(getMeasureParameters().getFormatters().getPercentFormat())
                .withinFolder(getMetricParameters().getValueAtRiskFolder() + "\\" + getMetricParameters().getVarFolder())
                .as(getMetricParameters().getPnlDistribution());
    }

is now replaced by a Fluent way of defining a custom measure:

    default MeasureCreator pnlDistribution() {
        return underlier -> PnLDistributionPostProcessor.measure()
                .withUnderlyingMeasure(underlier[0])
                .withAnalysisLevels(getMeasureParameters().getPercentileLevelId())
                .withNumberOfBuckets(getMeasureParameters().getPnlDistributionConfigurationService().getNumberOfBuckets())
                .withIsAccumulate(false)
                .withFormatter(getMeasureParameters().getFormatters().getPercentFormat())
                .withinFolder(getMetricParameters().getValueAtRiskFolder() + "\\" + getMetricParameters().getVarFolder())
                .as(getMetricParameters().getPnlDistribution());
    }

The functions providing levels as strings are also deprecated and replaced by a function that returns a LevelIdentifier. Those functions are suffixed with “…Id”. The Property partitionedOnRangeLevels=false has been removed from all post-processor setups.

Constant VALUE_CCY in StoreFieldConstants removed and replaced by constant CCY.

In the mr-common-lib module, the VALUE_CCY constant in StoreFieldConstants has been removed, and the constant CCY is used instead, because those two constants had the same value: Ccy.

In the mr-pnl-config module, the following classes now use the CCY constant instead of the VALUE_CCY constant:

  • SupportedAdjustmentsPnLConfig
  • PnLStoreConfig
  • PnLAggregatedStoreConfig
  • PnLFlatStoreConfig
  • SignoffSummaryPnlPublisher
  • SummaryPnlPublisher

Catalog name change

The catalog has been renamed to MR from MarketRiskAccelerator. If you are using Atoti Limits with Atoti Market Risk, you need to change your UI settings. See the Atoti Limits documentation.

Removal of debug market data measures

In addition to the removed debug measures, the following changes have been made.

With the post-processor property debug string no longer relevant, the following post-processors were modified:

Post Processor Module Status
APnlVectorFromRiskSensiPostProcessor.java mr-sensi-lib Modified
MarketDataDebugStringPostProcessor.java mr-sensi-lib Removed
MarketDataPostProcessor.java mr-sensi-lib Modified
PnlVectorFromCrossRiskSensiPostProcessor.java mr-sensi-lib Modified
PnlVectorFromRiskSensiPostProcessor.java mr-sensi-lib Modified
ScalarPnlVectorFromCrossRiskSensiPostProcessor.java mr-sensi-lib Modified
ScalarPnlVectorFromRiskSensiPostProcessor.java mr-sensi-lib Modified
ShiftVectorPostProcessor.java mr-sensi-lib Modified
TenorMaturityAndMoneynessStringDebugExpand.java mr-sensi-lib Removed
PriceMarketDataPostProcessor.java mr-market-data-lib Modified
PriceShiftVectorPostProcessor.java mr-market-data-lib Modified
AMarketDataPostProcessor.java mr-common-lib Modified
AShiftVectorPostProcessor.java mr-common-lib Modified
AsOfDateNeighbourValuePostProcessor.java mr-common-lib Modified
ScalarMarketDataPostProcessor.java mr-common-lib Modified
ScalarShiftVectorPostProcessor.java mr-common-lib Modified

Measure factories have been modified in consequence.

Other files affected:

File Module Status
EnableMDStringDebug.java mr-common-lib Removed
EnableMDStringDebugTranslator.java mr-common-lib Removed
IEnableMDStringDebug.java mr-common-lib Removed

Deprecation of Sensitivities vector data model

The vectorized sensitivities are marked as deprecated and for removal in the next version. The sensitivities measure chains and sensitivities store are primarily affected, the following are removed:

tip

Customers needing to switch from vectorized to scalar sensitivities may want to keep the store-backed maturity conversion instead of the maturity conversion used by default for scalar sensitivities. See Customizing the Market Risk Solution to use store-backed maturity conversion with scalar sensitivities

This deprecation includes the removal of the following classes:

Class Module
MarketDataPostProcessor mr-sensi-lib
PnLExplainCrossPostProcessor mr-sensi-lib
PnLExplainPostProcessor mr-sensi-lib
PnlVectorFromCrossRiskSensiPostProcessor mr-sensi-lib
PnlVectorFromRiskSensiPostProcessor mr-sensi-lib
SensiTradeStoreTuplePublisher.java mr-sensi-config
VectorMarketDataStoreConfig mr-sensi-config
VectorTradeSensitivitiesStoreConfig mr-sensi-config
VectorRiskDimensionConfig mr-sensi-config
BeanScalar mr-common-config
BeanVectorised mr-common-config
ConditionalOnVectorizedSensitivity mr-common-config
ConditionalOnScalarSensitivity mr-common-config

Customizing the Market Risk Solution to use store-backed maturity conversion with scalar sensitivities

Customers needing to switch from vectorized to scalar sensitivities may want to keep the store-backed maturity conversion instead of the maturity conversion used by default for scalar sensitivities.

To allow the maturity conversion to use stores for the definition of tenors, maturities, and moneynesses when running Atoti Market Risk with scalar sensitivities, a number of @Beans should be provided in a custom @Configuration class:

  • A @Bean for adding the tenors, maturities, and moneyness stores.
  • A @Bean for adding the Data Load Controller topics for loading data into the stores.
  • A @Bean for the maturity converter using the stores.
The store configuration @Bean

This can be either an AConfigurableSchema or a DatastoreConfiguratorConsumer @Bean creating the three stores.

As we already provide an AConfigurableSchema for the stores, we can use it directly:

    @Bean
public AConfigurableSchema bucketStores() {
        return new TenorsStoreConfig();
        }

Alternatively, the stores can be created explicitly:

    @Bean
public DatastoreConfiguratorConsumer bucketStores() {
        return configurator -> {
        configurator.addStore(
        configurator.storeBuilder()
        .withStoreName(StoreConstants.TENOR_STORE_NAME)
        .withField(StoreFieldConstants.SENSITIVITY_TENORS).asKeyField()
        .withField(StoreFieldConstants.TENOR_SENSITIVITY_NAME).asKeyField()
        .withField(StoreFieldConstants.TENOR_NUMBER_OF_DAYS, DOUBLE)
        .withField(StoreFieldConstants.TENOR_INDICES, INT)
        .withDuplicateKeyHandler(DuplicateKeyHandlers.LOG_WITHIN_TRANSACTION)
        .updateOnlyIfDifferent()
        .build()
        );
        //...
        };
        }
The data loading @Bean

This is a copy of the configuration done for the vectorized sensitivities.

    @Qualifier(SP_QUALIFIER__SENSI_TOPIC_TO_STORE_AND_FILE_MAP)
@Bean
@Order(10)
public ChannelParametersHolderOperator bucketFilePatterns(SensiFilePatternProperties filePatterns) {
        var TOPIC_ALIASES = List.of(STATIC_SENSI_PILLARS, SENSI_PILLARS, SENSI_CONFIG, ALL_CONFIGURATION);
        return patterns -> {
        patterns.addTopic(StoreConstants.TENOR_STORE_NAME, StoreConstants.TENOR_STORE_NAME, filePatterns.getTenors(), TOPIC_ALIASES);
        patterns.addTopic(StoreConstants.MATURITY_STORE_NAME, StoreConstants.MATURITY_STORE_NAME, filePatterns.getMaturities(), TOPIC_ALIASES);
        patterns.addTopic(StoreConstants.MONEYNESS_STORE_NAME, StoreConstants.MONEYNESS_STORE_NAME, filePatterns.getMoneyness(), TOPIC_ALIASES);
        };
        }
The maturity converter @Bean

We can copy the maturity converter from the vectorized sensitivities configuration. To ensure the converter is used by the Solution, mark the @Bean as @Primary.

    /**
 * This will instantiate the duration service based on the bucket stores.
 *
 * @param smileConverter The smile converter to use in the maturity converter.
 * @return maturity converter
 */
@Bean
@Qualifier(SP_QUALIFIER__MATURITY_CONVERTER)
@Primary
public IMaturityConverter storeBackedMaturityConverter(
@Qualifier(SP_QUALIFIER__DAY_COUNT_CONVENTION) IDayCountConvention dayCountConvention,
@Qualifier(SP_QUALIFIER__TENOR_CONVERTER) ITenorConverter tenorConverter,
@Qualifier(SP_QUALIFIER__SMILE_CONVERTER) ISmileConverter smileConverter) {
        Map<BucketType, StoreQueryMaturityConverter.StoreDescription> storeDescriptionMap = ImmutableMap
        .<BucketType, StoreQueryMaturityConverter.StoreDescription>builder()
        .put(TENOR_INPUT, new StoreQueryMaturityConverter.StoreDescription(
        StoreConstants.TENOR_STORE_NAME,
        StoreFieldConstants.TENOR_NUMBER_OF_DAYS,
        BaseConditions.equal(FieldPath.of(StoreFieldConstants.TENOR_LABELS)).as(StoreFieldConstants.TENOR_LABELS)))
        .put(MATURITY_INPUT, new StoreQueryMaturityConverter.StoreDescription(
        StoreConstants.MATURITY_STORE_NAME,
        StoreFieldConstants.TENOR_NUMBER_OF_DAYS,
        BaseConditions.equal(FieldPath.of(StoreFieldConstants.TENOR_LABELS)).as(StoreFieldConstants.TENOR_LABELS)))
        .put(MONEYNESS_INPUT, new StoreQueryMaturityConverter.StoreDescription(
        StoreConstants.MONEYNESS_STORE_NAME,
        StoreFieldConstants.TENOR_NUMBER_OF_DAYS,
        BaseConditions.equal(FieldPath.of(StoreFieldConstants.TENOR_LABELS)).as(StoreFieldConstants.TENOR_LABELS)))
        .put(TENOR_DYNAMIC, new StoreQueryMaturityConverter.StoreDescription(
        StoreConstants.DYNAMIC_TENOR_STORE_NAME,
        StoreFieldConstants.TENOR_NUMBER_OF_DAYS,
        BaseConditions.and(BaseConditions.equal(FieldPath.of(StoreFieldConstants.TENOR_LABELS)).as(StoreFieldConstants.TENOR_LABELS),
        BaseConditions.equal(FieldPath.of(StoreFieldConstants.TENOR_SET)).as(StoreFieldConstants.TENOR_SET))))
        .put(MATURITY_DYNAMIC, new StoreQueryMaturityConverter.StoreDescription(
        StoreConstants.DYNAMIC_MATURITY_STORE_NAME,
        StoreFieldConstants.TENOR_NUMBER_OF_DAYS,
        BaseConditions.and(BaseConditions.equal(FieldPath.of(StoreFieldConstants.TENOR_LABELS)).as(StoreFieldConstants.TENOR_LABELS),
        BaseConditions.equal(FieldPath.of(StoreFieldConstants.TENOR_SET)).as(StoreFieldConstants.TENOR_SET))))
        .put(MONEYNESS_DYNAMIC, new StoreQueryMaturityConverter.StoreDescription(
        StoreConstants.DYNAMIC_MONEYNESS_STORE_NAME,
        StoreFieldConstants.TENOR_NUMBER_OF_DAYS,
        BaseConditions.and(BaseConditions.equal(FieldPath.of(StoreFieldConstants.TENOR_LABELS)).as(StoreFieldConstants.TENOR_LABELS),
        BaseConditions.equal(FieldPath.of(StoreFieldConstants.TENOR_SET)).as(StoreFieldConstants.TENOR_SET))))
        .build();
        return new StoreQueryMaturityConverter(storeDescriptionMap,
        new MraSimpleMaturityConverter(dayCountConvention,
        Map.of(TENOR_INPUT, tenorConverter,
        MATURITY_INPUT, tenorConverter,
        MONEYNESS_INPUT, smileConverter,
        TENOR_DYNAMIC, tenorConverter,
        MATURITY_DYNAMIC, tenorConverter,
        MONEYNESS_DYNAMIC, smileConverter)
        )
        );
        }

New Dividend and Split Ratio stores

In the mr-application module:

  • The following attributes have been added to the RiskPostProcessorInjector class:
   protected final IContextualCorporateActionMarketDataRetriever contextualCorporateActionMarketDataRetriever;
   protected final IContextualDividendMarketDataRetriever contextualDividendMarketDataRetriever;
  • In the same class, the following injections are performed in post-processors in the method:
   injectAll(IContextualCorporateActionMarketDataRetrieverAware.class, contextualCorporateActionMarketDataRetriever);
   injectAll(IContextuaDividendMarketDataRetrieverAware.class, contextualDividendMarketDataRetriever);
  • In the DataLoadControllerFileConfig class, the following constants are used in the topicToScopeToLoadConverter and topicToScopeToRemoveWhereConditionConverter:

    • SPLIT_RATIO_STORE_NAME
    • DIVIDEND_MARKET_DATA_STORE_NAME
  • In the MarketRiskConfig class, the following configuration imports have been added:

        CorporateActionMarketDataRetrievalConfig.class,
        DividendMarketDataRetrievalConfig.class,

In the mr-common-lib module:

  • In the file StoreConstants, these two constants have been added:
    • SPLIT_RATIO_STORE_NAME
    • DIVIDEND_MARKET_DATA_STORE_NAME

In the mr-sensi-config module:

  • The store CorporateAction has been deprecated. It is still used to handle dividends for vectorized sensitivities, but is not used anymore for scalar sensitivities. The stores DividendMarketData and SplitRatioMarketData need to be used instead of the CorporateAction store.
  • The SplitRatioMarketData store is used for handling stock split ratios both for vectorized and scalar sensitivities.
  • The SensiFilePatternProperties class has been updated to take into account the file patterns for Dividends and Split Ratios.
  • In the AllSensiStoresConfig class, the DividendMarketDataStoreConfig and SplitRatioStoreConfig configuration classes are imported.
  • The DividendCurrentDateMarketDataChain uses the constant MarketDataDateShift.CURRENT_DAY instead of the constant DateShift.CURRENT_DATE. and the DividendNextDateMarketDataChain uses the constant MarketDataDateShift.NEXT_DAY instead of the constant DateShift.NEXT_DATE.
  • In the DividendPnLExplainMeasuresConfig class, the DividendMarketDataRetrievalConfig configuration class is imported.
  • In the SensiCsvSourceParametersProviderConfig class, the following lines have been added:
    patterns.addTopic(StoreConstants.SPLIT_RATIO_STORE_NAME, StoreConstants.SPLIT_RATIO_STORE_NAME, sensiFilePatterns.getSplitRatio(), DAILY_SENSI_ALIASES);
    patterns.addTopic(StoreConstants.DIVIDEND_MARKET_DATA_STORE_NAME, StoreConstants.DIVIDEND_MARKET_DATA_STORE_NAME, sensiFilePatterns.getDividends(), DAILY_SENSI_ALIASES);

In the mr-sensi-lib module:

  • The following constants have been added to the MeasureConstants class:
   public static final String DIVIDEND_RETRIEVER_NAME = "DIVIDEND_MARKET_DATA_RETRIEVER";
   public static final String SPLIT_RATIO_RETRIEVER_NAME = "SPLIT_RATIO_MARKET_DATA_RETRIEVER";
  • In the class SensiFactory, the attribute dividendCopper and the method getDividendCopper() have been removed.
  • The signature of the method scalarNativeIntermediateInterpolatedDividend changed from: LevelParameterRetriever<SensiMeasureParameters> riskFactorLevelRetriever, IDateShift dateShift) to LevelParameterRetriever<SensiMeasureParameters> riskFactorLevelRetriever, MarketDataDateShift marketDataDateShift) and its default implementation has been changed.
  • The default implementation of the method ISplitMeasures.corporateSplit has been changed.
  • In the DividendSensiMeasureNames class, the constants SPLIT_RATIO_CURRENT and SPLIT_RATIO_PREVIOUS and the methods getSplitNameCurrent() and getSplitNamePrevious() have been removed.

In the mr-directquery module:

  • The snowflake database scripts have been updated:
    • createMR.sql now creates DIVIDEND_MARKET_DATA and SPLIT_RATIO_MARKET_DATA stores
    • loadMR.sql now loads data in the stores DIVIDEND_MARKET_DATA and SPLIT_RATIO_MARKET_DATA
  • The mssql database scripts have been update:
    • createMR.sql now creates DIVIDEND_MARKET_DATA and SPLIT_RATIO_MARKET_DATA stores
    • loadMR.sql now loads data in the stores DIVIDEND_MARKET_DATA and SPLIT_RATIO_MARKET_DATA

Deletion of Market Data Cube

The Market Data Cube has been deleted. The modules mr-market-data-lib and mr-market-data-config have been removed. They were used for the configuration of the market data cube.

In the mr-application POM file, the following dependency has been removed:

     <dependency>
        <groupId>com.activeviam.apps</groupId>
        <artifactId>mr-market-data-config</artifactId>
        <version>${project.version}</version>
     </dependency>

The MRCombinedCube class has been updated to take into account the removal of the Market Data Cube.

In the mr-common-config module, the following classes were deleted:

  • BeanEnabledMarketDataCube
  • ConfigurationEnabledMarketDataCube The BeanEnabledAnyCube class has been updated to take into account the removal of the Market Data Cube.

Maven dependencies

The following test dependency has been added to the mr-sensi-lib module:

    <dependency>
        <groupId>com.activeviam.apps</groupId>
        <artifactId>market-data-api</artifactId>
        <version>${project.version}</version>
        <type>test-jar</type>
        <scope>test</scope>
    </dependency>

IMaturityConverterAware class

The com.activeviam.accelerator.common.dates.IMaturityConverter interface has been removed from the module mr-common-lib and has been replaced by the interface com.activeviam.accelerator.common.dates.IMaturityConverter.

Theta: methods renamed

In the class ThetaCopper, the following methods have been renamed:

New method name Old method name
vectorTimeToMaturity marketDataPostProcessor
scalarTimeToMaturity scalarMarketDataPostProcessor

Logback Fix

We provide a logback configuration (mr-application/src/main/resources/logback-spring-file.xml) that outputs to a local log file. This configuration references classes that are no longer present, causing the application startup to fail.

You can fix this configuration by making the following changes:

  1. In
<conversionRule conversionWord="thread" converterClass="com.activeviam.apm.logging.impl.APMThreadConverter"/>
<conversionRule conversionWord="user" converterClass="com.activeviam.apm.logging.impl.APMUserConverter"/>
<conversionRule conversionWord="instance" converterClass="com.activeviam.apm.logging.impl.APMInstanceConverter"/>

with:

<conversionRule conversionWord="thread" converterClass="com.activeviam.apm.logging.impl.LogThreadConverter" />
<conversionRule conversionWord="user" converterClass="com.activeviam.apm.logging.impl.LogUserConverter" />
<conversionRule conversionWord="instance" converterClass="com.activeviam.apm.logging.impl.LogInstanceConverter" />
  1. Delete <file>${custom.json.log.dir}/activepivot.log</file> on line 51.

Swagger UI Fix

Swagger UI is used to document REST endpoints in Atoti Market Risk. It should be available at .../swagger-ui/index.html but this endpoint results in a not found exception. This is a known issue in Atoti Market Risk 5.4 and is due to an outdated dependency. You can resolve this issue with the following steps:

  1. In the project root pom.xml file replace:
<springdoc.version>1.6.0</springdoc.version>

with:

<springdoc.version>2.2.0</springdoc.version>

and replace:

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
    <version>${springdoc.version}</version>
</dependency>

with:

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-ui</artifactId>
    <version>${springdoc.version}</version>
</dependency>
  1. In the pom.xml file of the mr-application module replace:
<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
</dependency>

with:

<dependency>
    <groupId>org.springdoc</groupId>
    <artifactId>springdoc-openapi-ui</artifactId>
</dependency>