From 2c28f545d7e89648df69e5125e30b392880cb5e8 Mon Sep 17 00:00:00 2001 From: Vineet Kumar Date: Thu, 31 Oct 2024 22:36:08 +0000 Subject: [PATCH 1/3] EquityProductModifications (CDM 6) --- .../main/rosetta/product-asset-type.rosetta | 4 +-- .../product-qualification-func.rosetta | 35 ++++++++++++++++--- .../rosetta/product-template-type.rosetta | 8 ++++- 3 files changed, 39 insertions(+), 8 deletions(-) diff --git a/rosetta-source/src/main/rosetta/product-asset-type.rosetta b/rosetta-source/src/main/rosetta/product-asset-type.rosetta index 80d3c10fad..ee1827e779 100644 --- a/rosetta-source/src/main/rosetta/product-asset-type.rosetta +++ b/rosetta-source/src/main/rosetta/product-asset-type.rosetta @@ -209,10 +209,10 @@ type InterestRatePayout extends PayoutBase: <" A class to specify all of the ter then compoundingMethod exists condition FpML_ird_9: <"FpML validation rule ird-9 - If calculationPeriodAmount/calculation/compoundingMethod exists, then resetDates must exist."> - if compoundingMethod exists then resetDates exists + if compoundingMethod exists and compoundingMethod <> CompoundingMethodEnum -> None then resetDates exists condition FpML_ird_29: <"FpML validation rule ird-29 - If compoundingMethod exists, then fixedRateSchedule must not exist."> - if compoundingMethod exists + if compoundingMethod exists and compoundingMethod <> CompoundingMethodEnum -> None then rateSpecification -> FixedRateSpecification is absent condition CalculationPeriodDatesFirstCompoundingPeriodEndDate: <"FpML specifies that the firstCompoundingPeriodEndDate must only be specified when the compounding method is specified and not equal to a value of None."> diff --git a/rosetta-source/src/main/rosetta/product-qualification-func.rosetta b/rosetta-source/src/main/rosetta/product-qualification-func.rosetta index e0bfc2ed92..dcdea48cb1 100644 --- a/rosetta-source/src/main/rosetta/product-qualification-func.rosetta +++ b/rosetta-source/src/main/rosetta/product-qualification-func.rosetta @@ -195,7 +195,8 @@ func Qualify_AssetClass_Commodity: <"Qualifies a product as having the Asset Cla )) // Commodity Spot or Forward or (((economicTerms -> payout -> settlementPayout, economicTerms -> payout -> fixedPricePayout) only exists - or (economicTerms -> payout -> settlementPayout, economicTerms -> payout -> commodityPayout) only exists) + or (economicTerms -> payout -> settlementPayout, economicTerms -> payout -> commodityPayout) only exists + or economicTerms -> payout -> settlementPayout only exists) and (economicTerms -> payout -> settlementPayout -> underlier -> Observable -> Asset -> Commodity exists or settlementUnderlier -> Product -> TransferableProduct -> Commodity exists or if settlementUnderlier -> Product ->> economicTerms exists @@ -720,7 +721,10 @@ func Qualify_EquityOption_PriceReturnBasicPerformance_SingleName: <"Qualifies a and optionUnderlier -> Observable -> Asset -> Instrument -> Security only exists // qualifies that no feature other than averaging exists and (economicTerms -> payout -> optionPayout -> feature is absent - or economicTerms -> payout -> optionPayout -> feature -> averagingFeature only exists) + or economicTerms -> payout -> optionPayout -> feature -> averagingFeature only exists + or economicTerms -> payout -> optionPayout -> feature -> fxFeature only-element -> quanto exists + or economicTerms -> payout -> optionPayout -> feature -> fxFeature only-element -> composite exists) + and (if economicTerms -> nonStandardisedTerms exists then economicTerms -> nonStandardisedTerms = False else True) func Qualify_EquityOption_PriceReturnBasicPerformance_Index: <"Qualifies a product as an Equity Option with an index as underlier. The determination of the qualification is based on the economic terms and the following criteria: 1) An option product for which the underlier is an index and 2) No special option feature exists other than option averaging."> [qualification Product] @@ -738,7 +742,10 @@ func Qualify_EquityOption_PriceReturnBasicPerformance_Index: <"Qualifies a produ and economicTerms -> payout -> optionPayout only-element -> underlier -> Observable -> Index -> EquityIndex exists // qualifies that no feature other than averaging exists and (economicTerms -> payout -> optionPayout -> feature is absent - or economicTerms -> payout -> optionPayout -> feature -> averagingFeature only exists) + or economicTerms -> payout -> optionPayout -> feature -> averagingFeature only exists + or economicTerms -> payout -> optionPayout -> feature -> fxFeature only-element -> quanto exists + or economicTerms -> payout -> optionPayout -> feature -> fxFeature only-element -> composite exists) + and (if economicTerms -> nonStandardisedTerms exists then economicTerms -> nonStandardisedTerms = False else True) func Qualify_EquityOption_PriceReturnBasicPerformance_Basket: <"Qualifies a product as an Equity Option with a basket underlier. The determination of the qualification is based on the economic terms and the following criteria: 1) An option product for which the underlier is a basket and 2) No special option feature exists other than option averaging."> [qualification Product] @@ -756,7 +763,10 @@ func Qualify_EquityOption_PriceReturnBasicPerformance_Basket: <"Qualifies a prod and economicTerms -> payout -> optionPayout only-element -> underlier -> Observable -> Basket exists // qualifies that no feature other than averaging exists and (economicTerms -> payout -> optionPayout -> feature is absent - or economicTerms -> payout -> optionPayout -> feature -> averagingFeature only exists) + or economicTerms -> payout -> optionPayout -> feature -> averagingFeature only exists + or economicTerms -> payout -> optionPayout -> feature -> fxFeature only-element -> quanto exists + or economicTerms -> payout -> optionPayout -> feature -> fxFeature only-element -> composite exists) + and (if economicTerms -> nonStandardisedTerms exists then economicTerms -> nonStandardisedTerms = False else True) func Qualify_EquityOption_ParameterReturnVariance_SingleName: <"Qualifies a product as an Equity Variance Single Name Option. The determination of the qualification is based on the economic terms and the following criteria: 1) The product contains a single option payout and 2) the underlying product is a Single Name Equity Variance Swap"> [qualification Product] @@ -933,6 +943,19 @@ func Qualify_EquityOption_ParameterReturnDividend_Basket: <"Qualifies a product // qualifies that the underlier is a single name dividend swap and Qualify_EquitySwap_ParameterReturnDividend_Basket(underlierEconomicTerms) = True +func Qualify_Equity_OtherOption: <"Qualifies a product with properties of an Exotic Option as Equity Option (Other)"> + [qualification Product] + inputs: + economicTerms EconomicTerms (1..1) + output: + is_product boolean (1..1) + [synonym ISDA_Taxonomy_v1 value "Qualify_EquityOther"] + [synonym ISDA_Taxonomy_v2 value "Qualify_EquityOther"] + set is_product: + Qualify_AssetClass_Equity(economicTerms) = True + and economicTerms -> payout -> optionPayout only exists + and economicTerms -> nonStandardisedTerms = True + func Qualify_BaseProduct_IRSwap: <"Qualifies a product as having the Base Product classification Interest Rate Swap."> inputs: economicTerms EconomicTerms (1..1) @@ -1678,4 +1701,6 @@ func Qualify_Commodity_Forward: <"Qualifies a product as a Forward that will be Qualify_AssetClass_Commodity(economicTerms) = True and ((economicTerms -> payout -> settlementPayout, economicTerms -> payout -> fixedPricePayout) only exists or // Fixed Price Forward - (economicTerms -> payout -> settlementPayout, economicTerms -> payout -> commodityPayout) only exists) // Floating Price Forward + (economicTerms -> payout -> settlementPayout, economicTerms -> payout -> commodityPayout) only exists // Floating Price Forward + or // Price Return Vanilla Forward + (economicTerms -> payout -> settlementPayout only exists)) diff --git a/rosetta-source/src/main/rosetta/product-template-type.rosetta b/rosetta-source/src/main/rosetta/product-template-type.rosetta index 0c1494425f..f5b3ea2ab0 100644 --- a/rosetta-source/src/main/rosetta/product-template-type.rosetta +++ b/rosetta-source/src/main/rosetta/product-template-type.rosetta @@ -260,6 +260,7 @@ type Payout: <"Represents the set of future cashflow methodologies in the form o if optionPayout exists then optionPayout -> priceQuantity exists or optionPayout -> underlier -> Product ->> economicTerms -> payout -> interestRatePayout count = 2 + or optionPayout -> underlier -> Observable -> Asset -> Cash exists condition DayCountFraction: <"FpML specifies a required dayCountFraction element as part of the swapStream/calculationPeriodAmount/calculation. As standardized CDS don't have such specified day count fraction, the cardinality has been relaxed as part of the CDM. This data rule specifies that if the product has two interest rate streams, this provision must exist."> if interestRatePayout count = 2 @@ -721,7 +722,7 @@ type ExerciseTerms: <"A class defining the exercise period for an option togethe relevantUnderlyingDate AdjustableOrRelativeDates (0..1) <"The effective date on the underlying product if the option is exercised. For example, for a swaption it is the swap effective date, for an option on an FX spot or forward it is the value date for settlement, and in an extendible/cancelable provision it is the swap termination date, which is the date on which the termination is effective.'"> earliestExerciseTime BusinessCenterTime (0..1) <"The earliest time at which notice of exercise can be given by the buyer to the seller (or seller's agent) to, and including, the expiration date."> latestExerciseTime BusinessCenterTime (0..1) <"For a Bermuda or American style option, the latest time on an exercise business day (excluding the expiration date) within the exercise period that notice can be given by the buyer to the seller or seller's agent. Notice of exercise given after this time will be deemed to have been given on the next exercise business day."> - expirationTime BusinessCenterTime (1..1) <"The latest time for exercise on expirationDate. It is made mandatory given that for all option styles, this field is required."> + expirationTime BusinessCenterTime (0..1) <"The latest time for exercise on expirationDate. It is made mandatory given that for all option styles, this field is required."> expirationTimeType ExpirationTimeTypeEnum (0..1) <"The time of day at which the equity option expires, for example the official closing time of the exchange."> multipleExercise MultipleExercise (0..1) <"As defined in the 2000 ISDA Definitions, Section 12.4. Multiple Exercise, the buyer of the option has the right to exercise all or less than all the unexercised notional amount of the underlying swap on one or more days in the exercise period, but on any such day may not exercise less than the minimum notional amount or more that the maximum notional amount, and if an integral multiple amount is specified, the notional amount exercised must be equal to, or be an integral multiple of, the integral multiple amount."> exerciseFeeSchedule ExerciseFeeSchedule (0..1) <"The fees associated with an exercise date. The fees are conditional on the exercise occurring. The fees can be specified as actual currency amounts or as percentages of the notional amount being exercised."> @@ -756,6 +757,11 @@ type ExerciseTerms: <"A class defining the exercise period for an option togethe and earliestExerciseTime exists and partialExercise is absent and exerciseFee is absent + + condition ExpirationTimeChoice: <"Condition to validate the existence of correlation between expirationTime and expirationTimeType"> + (if expirationTime exists and expirationTimeType exists then expirationTimeType = ExpirationTimeTypeEnum -> SpecificTime) + and + (if expirationTimeType exists and expirationTimeType = ExpirationTimeTypeEnum -> SpecificTime then expirationTime exists) type AutomaticExercise: <"A type to define automatic exercise of a swaption. With automatic exercise the option is deemed to have exercised if it is in the money by more than the threshold amount on the exercise date."> From c2789954b9942bece20c8504db49d24250c1e75f Mon Sep 17 00:00:00 2001 From: Vineet Kumar Date: Fri, 15 Nov 2024 12:17:26 +0000 Subject: [PATCH 2/3] EquityProductModifications --- .../src/main/rosetta/product-template-type.rosetta | 11 +++-------- 1 file changed, 3 insertions(+), 8 deletions(-) diff --git a/rosetta-source/src/main/rosetta/product-template-type.rosetta b/rosetta-source/src/main/rosetta/product-template-type.rosetta index f5b3ea2ab0..df38a92f24 100644 --- a/rosetta-source/src/main/rosetta/product-template-type.rosetta +++ b/rosetta-source/src/main/rosetta/product-template-type.rosetta @@ -722,8 +722,8 @@ type ExerciseTerms: <"A class defining the exercise period for an option togethe relevantUnderlyingDate AdjustableOrRelativeDates (0..1) <"The effective date on the underlying product if the option is exercised. For example, for a swaption it is the swap effective date, for an option on an FX spot or forward it is the value date for settlement, and in an extendible/cancelable provision it is the swap termination date, which is the date on which the termination is effective.'"> earliestExerciseTime BusinessCenterTime (0..1) <"The earliest time at which notice of exercise can be given by the buyer to the seller (or seller's agent) to, and including, the expiration date."> latestExerciseTime BusinessCenterTime (0..1) <"For a Bermuda or American style option, the latest time on an exercise business day (excluding the expiration date) within the exercise period that notice can be given by the buyer to the seller or seller's agent. Notice of exercise given after this time will be deemed to have been given on the next exercise business day."> - expirationTime BusinessCenterTime (0..1) <"The latest time for exercise on expirationDate. It is made mandatory given that for all option styles, this field is required."> - expirationTimeType ExpirationTimeTypeEnum (0..1) <"The time of day at which the equity option expires, for example the official closing time of the exchange."> + expirationTime BusinessCenterTime (1..1) <"The latest time for exercise on expirationDate. It is made mandatory given that for all option styles, this field is required."> + expirationTimeType ExpirationTimeTypeEnum (1..1) <"The time of day at which the equity option expires, for example the official closing time of the exchange."> multipleExercise MultipleExercise (0..1) <"As defined in the 2000 ISDA Definitions, Section 12.4. Multiple Exercise, the buyer of the option has the right to exercise all or less than all the unexercised notional amount of the underlying swap on one or more days in the exercise period, but on any such day may not exercise less than the minimum notional amount or more that the maximum notional amount, and if an integral multiple amount is specified, the notional amount exercised must be equal to, or be an integral multiple of, the integral multiple amount."> exerciseFeeSchedule ExerciseFeeSchedule (0..1) <"The fees associated with an exercise date. The fees are conditional on the exercise occurring. The fees can be specified as actual currency amounts or as percentages of the notional amount being exercised."> exerciseProcedure ExerciseProcedure (0..1) <"The set of parameters defining the procedure associated with the exercise, e.g. manual exercise."> @@ -757,14 +757,9 @@ type ExerciseTerms: <"A class defining the exercise period for an option togethe and earliestExerciseTime exists and partialExercise is absent and exerciseFee is absent - - condition ExpirationTimeChoice: <"Condition to validate the existence of correlation between expirationTime and expirationTimeType"> - (if expirationTime exists and expirationTimeType exists then expirationTimeType = ExpirationTimeTypeEnum -> SpecificTime) - and - (if expirationTimeType exists and expirationTimeType = ExpirationTimeTypeEnum -> SpecificTime then expirationTime exists) type AutomaticExercise: <"A type to define automatic exercise of a swaption. With automatic exercise the option is deemed to have exercised if it is in the money by more than the threshold amount on the exercise date."> - + thresholdRate number (0..1) <"A threshold rate. The threshold of 0.10% would be represented as 0.001"> isApplicable boolean (0..1) <"Boolean that indicates if it has an automaticExercise"> From cd833a85155260b3dab21e5fb71391d027d9829b Mon Sep 17 00:00:00 2001 From: Vineet Kumar Date: Fri, 22 Nov 2024 16:38:48 +0000 Subject: [PATCH 3/3] EquityProductModifications --- .../src/main/rosetta/product-template-type.rosetta | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rosetta-source/src/main/rosetta/product-template-type.rosetta b/rosetta-source/src/main/rosetta/product-template-type.rosetta index df38a92f24..c14c3ebcea 100644 --- a/rosetta-source/src/main/rosetta/product-template-type.rosetta +++ b/rosetta-source/src/main/rosetta/product-template-type.rosetta @@ -722,7 +722,7 @@ type ExerciseTerms: <"A class defining the exercise period for an option togethe relevantUnderlyingDate AdjustableOrRelativeDates (0..1) <"The effective date on the underlying product if the option is exercised. For example, for a swaption it is the swap effective date, for an option on an FX spot or forward it is the value date for settlement, and in an extendible/cancelable provision it is the swap termination date, which is the date on which the termination is effective.'"> earliestExerciseTime BusinessCenterTime (0..1) <"The earliest time at which notice of exercise can be given by the buyer to the seller (or seller's agent) to, and including, the expiration date."> latestExerciseTime BusinessCenterTime (0..1) <"For a Bermuda or American style option, the latest time on an exercise business day (excluding the expiration date) within the exercise period that notice can be given by the buyer to the seller or seller's agent. Notice of exercise given after this time will be deemed to have been given on the next exercise business day."> - expirationTime BusinessCenterTime (1..1) <"The latest time for exercise on expirationDate. It is made mandatory given that for all option styles, this field is required."> + expirationTime BusinessCenterTime (0..1) <"The latest time for exercise on expirationDate. It is made mandatory given that for all option styles, this field is required."> expirationTimeType ExpirationTimeTypeEnum (1..1) <"The time of day at which the equity option expires, for example the official closing time of the exchange."> multipleExercise MultipleExercise (0..1) <"As defined in the 2000 ISDA Definitions, Section 12.4. Multiple Exercise, the buyer of the option has the right to exercise all or less than all the unexercised notional amount of the underlying swap on one or more days in the exercise period, but on any such day may not exercise less than the minimum notional amount or more that the maximum notional amount, and if an integral multiple amount is specified, the notional amount exercised must be equal to, or be an integral multiple of, the integral multiple amount."> exerciseFeeSchedule ExerciseFeeSchedule (0..1) <"The fees associated with an exercise date. The fees are conditional on the exercise occurring. The fees can be specified as actual currency amounts or as percentages of the notional amount being exercised."> @@ -757,6 +757,10 @@ type ExerciseTerms: <"A class defining the exercise period for an option togethe and earliestExerciseTime exists and partialExercise is absent and exerciseFee is absent + + condition ExpirationTimeChoice: <"Condition to validate the existence of correlation between expirationTime and expirationTimeType"> + (if expirationTime exists then expirationTimeType = ExpirationTimeTypeEnum -> SpecificTime or + if expirationTimeType = ExpirationTimeTypeEnum -> SpecificTime then expirationTime exists) type AutomaticExercise: <"A type to define automatic exercise of a swaption. With automatic exercise the option is deemed to have exercised if it is in the money by more than the threshold amount on the exercise date.">