FpML 5.2 Validation Rules - Rules for Equity Derivatives (EQD)

This is the Equity Derivatives part of the validation rule set accompanying the FpML 5.2 Reccomendation #1. The introductory section in the draft contains background information and documentation for this page.

The rules contained on this page contain links to cut down versions of valid and invalid test cases. These test cases have been analysed using Systemwire's xlinkit rule engine to highlight relevant document portions accessed by a rule. The cut down test cases are non-normative and are provided for the purpose of documentation only.

Content

Namespace

default element namespace = http://www.fpml.org/spec/fpml-5-2-6-rec-2

namespace xs = http://www.w3.org/2001/XMLSchema

Functions

The following shared functions are used in the rules.

Rules

Unique contexts:

eqd-2 (Mandatory)
English Description:
Context: Trade (complex type)
If equityOption/equityExercise/equityAmericanExercise exists, then equityOption/equityExercise/equityAmericanExercise/expirationDate/adjustableDate/unadjustedDate must be after or equal to tradeHeader/tradeDate
XPath Description:
Context: //element(*, Trade)
[exists(equityOption/equityExercise/equityAmericanExercise)]
equityOption/equityExercise/equityAmericanExercise/expirationDate/adjustableDate/unadjustedDate ge tradeHeader/tradeDate
Test cases: [Invalid]
eqd-3 (Mandatory)
English Description:
Context: EquityAmericanExercise (complex type)
If latestExerciseTimeType is equal to "SpecificTime", then latestExerciseTime exists
XPath Description:
Context: EquityAmericanExercise
[latestExerciseTimeType eq "SpecificTime"]
exists(latestExerciseTime)
Comment: When the latest time an option can be exercised is a value, that value must be provided. This rule is equivalent to eqd-6, except for American Exercise. When equity options are refactored this rule can be merged with eqd-6.
Test cases: [Invalid]
eqd-4 (Mandatory)
English Description:
Context: Trade (complex type)
If equityOption/equityExercise/equityBermudaExercise exists, then equityOption/equityExercise/equityBermudaExercise/commencementDate/adjustableDate/unadjustedDate must be after or equal to tradeHeader/tradeDate
XPath Description:
Context: Trade
[exists(equityOption/equityExercise/equityBermudaExercise)]
equityOption/equityExercise/equityBermudaExercise/commencementDate/adjustableDate/unadjustedDate ge tradeHeader/tradeDate
Comment: When traded, a contractual option expiry date must be after the trade date. This rule is the equivalent of eqd-2 and eqd-12, but for Bermuda Exercise. When the equity options are refactored this rule should merge with eqd-2, eqd-12.
Test cases: [Invalid]
eqd-6 (Mandatory)
English Description:
Context: EquityBermudaExercise (complex type)
If latestExerciseTimeType is equal to "SpecificTime", then latestExerciseTime exists
XPath Description:
Context: EquityBermudaExercise
[latestExerciseTimeType eq "SpecificTime"]
exists(latestExerciseTime)
Test cases: [Invalid]
eqd-8 (Mandatory)
English Description:
Context: EquityBermudaExercise (complex type)
All dates in bermudaExerciseDates/date must be after commencementDate/adjustableDate/unadjustedDate
XPath Description:
Context: EquityBermudaExercise
every $date in .//bermudaExerciseDates/date satisfies $date gt commencementDate/adjustableDate/unadjustedDate
Comment: Every Bermuda Exercise date must be after the commencementDate.
Test cases: [Invalid] [Invalid] [Invalid]
eqd-9 (Mandatory)
English Description:
Context: EquityBermudaExercise (complex type)
All dates in bermudaExerciseDates/date must be before or equal to expirationDate/adjustableDate/unadjustedDate
XPath Description:
Context: EquityBermudaExercise
every $date in .//bermudaExerciseDates/date satisfies $date le expirationDate/adjustableDate/unadjustedDate
Comment: Every exercise date must be before option expiry date.
Test cases: [Invalid]
eqd-10 (Mandatory)
English Description:
Context: EquityBermudaExercise (complex type)
The dates in bermudaExerciseDates/date must be unique
XPath Description:
Context: EquityBermudaExercise
count(distinct-values(bermudaExerciseDates/date)) eq count(bermudaExerciseDates/date)
Comment: Each exercise date must be listed only once.
Test cases: [Invalid]
eqd-12 (Mandatory)
English Description:
Context: Trade (complex type)
If equityOption/equityExercise/equityEuropeanExercise exists, then equityOption/equityExercise/equityEuropeanExercise/expirationDate/adjustableDate/unadjustedDate must be after or equal to tradeHeader/tradeDate
XPath Description:
Context: Trade
[exists(equityOption/equityExercise/equityEuropeanExercise)]
equityOption/equityExercise/equityEuropeanExercise/expirationDate/adjustableDate/unadjustedDate ge tradeHeader/tradeDate
Comment: When traded, a contractual option expiry date must be after the trade date. This rule is the equivalent of eqd-2 and eqd-4, but for European Exercise. When the equity options are refactored this rule should merge with eqd-2, eqd-4.
Test cases: [Invalid]
eqd-13 (Mandatory)
English Description:
Context: Trade (complex type)
If equityOption/equityPremium/paymentDate/unadjustedDate exists, then equityOption/equityPremium/paymentDate/unadjustedDate must be after or equal to tradeHeader/tradeDate
XPath Description:
Context: Trade
[exists(equityOption/equityPremium/paymentDate/unadjustedDate)]
equityOption/equityPremium/paymentDate/unadjustedDate ge tradeHeader/tradeDate
Comment: When traded, a contractual option premium payment date must be after the trade date.
Test cases: [Invalid]
eqd-14 (Mandatory)
English Description:
Context: Trade (complex type)
If brokerEquityOption/equityPremium/paymentDate/unadjustedDate exists, then brokerEquityOption/equityPremium/paymentDate/unadjustedDate must be after or equal to tradeHeader/tradeDate
XPath Description:
Context: Trade
[exists(brokerEquityOption/equityPremium/paymentDate/unadjustedDate)]
brokerEquityOption/equityPremium/paymentDate/unadjustedDate ge tradeHeader/tradeDate
Comment: When traded, a contractual option premium payment date must be after the trade date. This is the equivalent of eqd-13 for brokerEquityOption.
Test cases: [Invalid]
eqd-15 (Mandatory)
English Description:
Context: EquityExerciseValuationSettlement (complex type)
If equityValuation/valuationDate/adjustableDate exists, and if equityEuropeanExercise exists, then equityValuation/valuationDate/adjustableDate/unadjustedDate must be equal to equityEuropeanExercise/expirationDate/adjustableDate/unadjustedDate
XPath Description:
Context: EquityExerciseValuationSettlement
[exists(equityValuation/valuationDate/adjustableDate)] [exists(equityEuropeanExercise)]
equityValuation/valuationDate/adjustableDate/unadjustedDate eq equityEuropeanExercise/expirationDate/adjustableDate/unadjustedDate
Comment: For European exercise, the valuation date and expiration date are the same date.
Test cases: [Invalid]
eqd-19 (Mandatory)
English Description:
Context: EquityOption (complex type)
EquityDerivativeShortFormBase (complex type)
If notional, equityPremium/percentageOfNotional and equityPremium/paymentAmount exist, and if equityPremium/paymentAmount and notional have the same-currency, then equityPremium/paymentAmount/amount is equal to notional/amount multiplied by equityPremium/percentageOfNotional
XPath Description:
Context: EquityOption
EquityDerivativeShortFormBase
[exists(notional)] [exists(equityPremium/percentageOfNotional)] [exists(equityPremium/paymentAmount)] [same-currency((equityPremium/paymentAmount,notional))]
equityPremium/paymentAmount/amount eq notional/amount * equityPremium/percentageOfNotional
Test cases: [Invalid]
eqd-20 (Mandatory)
English Description:
Context: EquityOption (complex type)
EquityOptionTransactionSupplement (complex type)
If numberOfOptions exists, and if optionEntitlement exists, and if equityPremium/paymentAmount exists, and if equityPremium/pricePerOption exists, and if equityPremium/paymentAmount and equityPremium/pricePerOption have the same-currency, then equityPremium/pricePerOption/amount multiplied by numberOfOptions multiplied by optionEntitlement is equal to equityPremium/paymentAmount/amount
XPath Description:
Context: EquityOption
EquityOptionTransactionSupplement
[exists(numberOfOptions)] [exists(optionEntitlement)] [exists(equityPremium/paymentAmount)] [exists(equityPremium/pricePerOption)] [same-currency((equityPremium/paymentAmount,equityPremium/pricePerOption))]
equityPremium/pricePerOption/amount * numberOfOptions * optionEntitlement eq equityPremium/paymentAmount/amount
Test cases: [Invalid] [Invalid]
eqd-22 (Mandatory)
English Description:
Context: EquityDerivativeBase (complex type)
buyerPartyReference/@href and sellerPartyReference/@href must be different
XPath Description:
Context: EquityDerivativeBase
buyerPartyReference/@href ne sellerPartyReference/@href
Test cases: [Invalid]
eqd-24 (Mandatory)
English Description:
Context: AveragingSchedule (complex type)
startDate must be before or equal to endDate
XPath Description:
Context: AveragingSchedule
startDate le endDate
Test cases: [Invalid]
eqd-25 (Mandatory)
English Description:
Context: BrokerEquityOption (complex type)
If numberOfOptions exists, and if equityPremium/paymentAmount exists, and if equityPremium/pricePerOption exists, and if equityPremium/paymentAmount and equityPremium/pricePerOption have the same-currency, then equityPremium/pricePerOption/amount multiplied by numberOfOptions is equal to equityPremium/paymentAmount/amount
XPath Description:
Context: BrokerEquityOption
[exists(numberOfOptions)] [exists(equityPremium/paymentAmount)] [exists(equityPremium/pricePerOption)] [same-currency((equityPremium/paymentAmount,equityPremium/pricePerOption))]
equityPremium/pricePerOption/amount * numberOfOptions eq equityPremium/paymentAmount/amount
Comment: This is equivalent to eqd-20, but for brokerEquityOption, where there is no optionEntitlement. (Reference: http://www.fpml.org/documents/groupdocs/MultipleExerciseAmountExplanatoryNotes_v1.0.doc)
Test cases: [Invalid]
eqd-26 (Mandatory)
English Description:
Context: EquityOption (complex type)
EquityDerivativeShortFormBase (complex type)
You cannot exercise more than the number of options you have. If numberOfOptions exists, and if equityExercise/equityAmericanExercise/equityMultipleExercise/maximumNumberOfOptions exists, then equityExercise/equityAmericanExercise/equityMultipleExercise/maximumNumberOfOptions must be less than or equal to numberOfOptions
XPath Description:
Context: element(*, EquityOption)
element(*, EquityDerivativeShortFormBase)
[exists(numberOfOptions)] [exists(equityExercise/equityAmericanExercise/equityMultipleExercise/maximumNumberOfOptions)]
equityExercise/equityAmericanExercise/equityMultipleExercise/maximumNumberOfOptions le numberOfOptions
Comment: Reference: http://www.fpml.org/documents/groupdocs/MultipleExerciseAmountExplanatoryNotes_v1.0.doc
Test cases: [Invalid]
eqd-26b (Mandatory)
English Description:
Context: EquityOption (complex type)
EquityDerivativeShortFormBase (complex type)
You cannot exercise more than the number of options you have. If numberOfOptions exists, and if equityExercise/equityBermudaExercise/equityMultipleExercise/maximumNumberOfOptions exists, then equityExercise/equityBermudaExercise/equityMultipleExercise/maximumNumberOfOptions must be less than or equal to numberOfOptions
XPath Description:
Context: EquityOption
EquityDerivativeShortFormBase
[exists(numberOfOptions)] [exists(equityExercise/equityBermudaExercise/equityMultipleExercise/maximumNumberOfOptions)]
equityExercise/equityBermudaExercise/equityMultipleExercise/maximumNumberOfOptions le numberOfOptions
Comment: Reference: http://www.fpml.org/documents/groupdocs/MultipleExerciseAmountExplanatoryNotes_v1.0.doc
Test cases: [Invalid]
eqd-27 (Mandatory)
English Description:
Context: EquityMultipleExercise (complex type)
Maximum number of options to exercise must be greater than or equal to minimum number of options to exercise
XPath Description:
Context: EquityMultipleExercise
minimumNumberOfOptions le maximumNumberOfOptions
Comment: Reference: http://www.fpml.org/documents/groupdocs/MultipleExerciseAmountExplanatoryNotes_v1.0.doc
Test cases: [Invalid]
eqd-28 (Mandatory)
English Description:
Context: EquityMultipleExercise (complex type)
When integral multiple exercise exists, the minimum number of options (minimumNumberOfOptions) exercised must be a positive integer multiple of integral multiple exercise (integralMultipleExercise)
XPath Description:
Context: EquityMultipleExercise
[exists(integralMultipleExercise)]
minimumNumberOfOptions mod integralMultipleExercise eq 0
Comment: Reference: http://www.fpml.org/documents/technote/MultipleExerciseAmountExplanatoryNotes_v1.0.doc
Test cases: [Invalid]
eqd-29 (Mandatory)
English Description:
Context: EquityMultipleExercise (complex type)
When integral multiple exercise exists, the maximum number of options (maximumNumberOfOptions) exercised must be a positive integer multiple of integral multiple exercise (integralMultipleExercise).
XPath Description:
Context: EquityMultipleExercise
[exists(integralMultipleExercise)]
maximumNumberOfOptions mod integralMultipleExercise eq 0
Comment: Reference: http://www.fpml.org/documents/technote/MultipleExerciseAmountExplanatoryNotes_v1.0.doc
Test cases: [Invalid]
eqd-31 (Mandatory)
English Description:
Context: Trade (complex type)
If equityEffectiveDate exists, then the equityEffectiveDate of an equity option must be strictly after the tradeDate.
XPath Description:
Context: Trade
[//element(*, EquityDerivativeBase)/equityEffectiveDate)]
every $equityDerivativeBase in //element(*, EquityDerivativeBase)[exists(equityEffectiveDate)] satisfies $equityDerivativeBase/equityEffectiveDate gt tradeHeader/tradeDate
Comment: The equityEffectiveDate exists only in the case of a forward starting option.
Test cases: [Invalid]

Deprecated rules

Removed rules

eqd-1 (Mandatory)
REMOVED: Context: Trade, Contract; Description: //americanExercise/commencementDate/adjustableDate/unadjustedDate must be equal to tradeHeader/tradeDate. Rationale for removal: incorrect from business perspective.
eqd-2b (Mandatory)
REMOVED: Context: Contract; Description: If equityOption/equityExercise/equityAmericanExercise exists, then equityOption/equityExercise/equityAmericanExercise/expirationDate/adjustableDate/unadjustedDate must be after or equal to header/contractDate. Rationale for removal: Use rule eqd-2.
eqd-4b (Mandatory)
REMOVED: Context: Contract; Description: If equityOption/bermudaExercise exists, then equityOption/bermudaExercise/commencementDate/adjustableDate/unadjustedDate must be after or equal to header/contractDate. Rationale for removal: Use rule eqd-4.
eqd-5 (Mandatory)
REMOVED: Context: Trade, Contract; Description: //equityExercise/equityBermudaExercise/expirationDate/adjustableDate/unadjustedDate must be greater than or equal to tradeHeader/tradeDate. Rationale for removal: eqd-5 is redundant. The effect of eqd-5 is available by entailment on eqd-4, eqd-8, eqd-9.
eqd-7 (Mandatory)
REMOVED: Context: equityBermudaExercise; Description: The elements in bermudaExerciseDates/date should be in order, earliest date first. Rationale for removal: Enforcing that data should be in specific order is not permitted.
eqd-11 (Mandatory)
REMOVED: Context: EquityBermudanExercise; Description: latestExerciseTime/hourMinuteTime must be before or equal to equityExpirationTime/hourMinuteTime.
eqd-12b (Mandatory)
REMOVED: Context: Contract; Description: If equityOption/europeanExercise exists, then equityOption/europeanExercise/expirationDate/adjustableDate/unadjustedDate must be after or equal to header/contractDate. Rationale for removal: Use rule eqd-12.
eqd-13b (Mandatory)
REMOVED: Context: Contract; Description: If equityOption/premium/paymentDate/adjustableDate/unadjustedDate exists, then equityOption/premium/paymentDate/adjustableDate/unadjustedDate must be after or equal to header/contractDate. Rationale for removal: Use rule eqd-12.
eqd-14b (Mandatory)
REMOVED: Context: Contract; Description: If brokerEquityOption/equityPremium/paymentDate/unadjustedDate exists, then brokerEquityOption/equityPremium/paymentDate/unadjustedDate must be after or equal to header/contractDate. Rationale for removal: Use rule eqd-14.
eqd-16 (Mandatory)
REMOVED: Context: EquityMultipleExercise; Description: minimumNumberOfOptions lt maximumNumberOfOptions. Rationale for removal: inconsistent with rule eqd-27
eqd-17 (Mandatory)
REMOVED: Context: EquityOption, EquityDerivativeShortFormBase; Description: If numberOfOptions exists, and if equityExercise/equityAmericanExercise/equityMultipleExercise/maximumNumberOfOptions exists, and if equityExercise/equityAmericanExercise/equityMultipleExercise/integralMultipleExerciseexists, then equityExercise/equityAmericanExercise/equityMultipleExercise/maximumNumberOfOptions multiplied by equityExercise/equityAmericanExercise/equityMultipleExercise/integralMultipleExercise must be less than or equal to the numberOfOptions. Rationale for removal: rule eqd-17 is incorrect. The usage of the integralMultipleExercise is covered under the rule eqd-28. (Reference:http://www.fpml.org/documents/groupdocs/MultipleExerciseAmountExplanatoryNotes_v1.0.doc)
eqd-18 (Mandatory)
REMOVED: Context: EquityOption, EquityDerivativeShortFormBase; Description: If numberOfOptions exists, and if equityExercise/equityBermudaExercise/equityMultipleExercise/maximumNumberOfOptions exists, and if equityExercise/equityBermudaExercise/equityMultipleExercise/integralMultipleExercise exists, then equityExercise/equityBermudaExercise/equityMultipleExercise/maximumNumberOfOptions multiplied by equityExercise/equityBermudaExercise/equityMultipleExercise/integralMultipleExercise must be less than or equal to the numberOfOptions. Rationale for removal: rule eqd-18 is incorrect. The usage of the integralMultipleExercise is covered under the rule eqd-28. (Reference:http://www.fpml.org/documents/groupdocs/MultipleExerciseAmountExplanatoryNotes_v1.0.doc)
eqd-21 (Mandatory)
REMOVED: Context: CalculationAgent; Description: calculationAgentPartyReference must exist. Rationale for removal: EQDWG 2007-11-30; agreed that this rule doesn't make any business sense since the calculation agent may be specified in the master confirmation or the master agreement.
eqd-23 (Mandatory)
REMOVED: Context: Trade; Description: If equityOption/equityEffectiveDate exists, then equityOption/equityEffectiveDate must be after or equal to tradeHeader/tradeDate. Rationale for removal: eqd-23 is redundant. The effect of eqd-23 is available by entailment of a more generic rule eqd-31.
eqd-30 (Mandatory)
REMOVED: Context: Contract; Description: If equityOption/equityEffectiveDate exists, then equityOption/equityEffectiveDate must be after or equal to header/contractDate. Rationale for removal: eqd-30 is redundant. The effect of eqd-30 is available by entailment of a more generic rule eqd-32.
eqd-32 (Mandatory)
REMOVED: Context: Contract; Description: The starting date of an equity option must be after the contract date. Rationale for removal: Use rule eqd-31.