FpML 4.6 Validation Rules - Rules for Equity Derivatives (EQD)
This is the Equity Derivatives part of the validation rule set accompanying the FpML 4.6 Working Draft. 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.
Additionally, an XQuery implementation of the validation rules is also provided. See the Reference Implementations section for details.
Content
Namespace
default element namespace = http://www.fpml.org/2009/FpML-4-6
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) (complex type)
[exists(equityOption/equityExercise/equityAmericanExercise)]
equityOption/equityExercise/equityAmericanExercise/expirationDate/adjustableDate/unadjustedDate ge tradeHeader/tradeDate
eqd-2b (Mandatory)
English Description:
Context: Contract (complex type)
If equityOption/equityExercise/equityAmericanExercise exists, then equityOption/equityExercise/equityAmericanExercise/expirationDate/adjustableDate/unadjustedDate must be after or equal to header/contractDate
XPath Description:
Context: Contract (complex type)
[exists(equityOption/equityExercise/equityAmericanExercise)]
equityOption/equityExercise/equityAmericanExercise/expirationDate/adjustableDate/unadjustedDate ge header/contractDate
eqd-3 (Mandatory)
English Description:
Context: EquityAmericanExercise (complex type)
If latestExerciseTimeType is equal to "SpecificTime", then latestExerciseTime exists
XPath Description:
Context: EquityAmericanExercise (complex type)
[latestExerciseTimeType eq "SpecificTime"]
exists(latestExerciseTime)
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 (complex type)
[exists(equityOption/equityExercise/equityBermudaExercise)]
equityOption/equityExercise/equityBermudaExercise/commencementDate/adjustableDate/unadjustedDate ge tradeHeader/tradeDate
eqd-4b (Mandatory)
English Description:
Context: Contract (complex type)
If equityOption/equityExercise/equityBermudaExercise exists, then
equityOption/equityExercise/equityBermudaExercise/commencementDate/adjustableDate/unadjustedDate must be after or equal to header/contractDate
XPath Description:
Context: Contract (complex type)
[exists(equityOption/equityExercise/equityBermudaExercise)]
equityOption/equityExercise/equityBermudaExercise/commencementDate/adjustableDate/unadjustedDate ge header/contractDate
eqd-6 (Mandatory)
English Description:
Context: EquityBermudaExercise (complex type)
If latestExerciseTimeType is equal to "SpecificTime", then latestExerciseTime exists
XPath Description:
Context: EquityBermudaExercise (complex type)
[latestExerciseTimeType eq "SpecificTime"]
exists(latestExerciseTime)
eqd-8 (Mandatory)
English Description:
Context: EquityBermudaExercise (complex type)
All dates in bermudaExerciseDates/date must be after commencementDate/adjustableDate/unadjustedDate
XPath Description:
Context: EquityBermudaExercise (complex type)
//bermudaExerciseDates/date gt commencementDate/adjustableDate/unadjustedDate
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 (complex type)
//bermudaExerciseDates/date le expirationDate/adjustableDate/unadjustedDate
eqd-10 (Mandatory)
English Description:
Context: EquityBermudaExercise (complex type)
The dates in bermudaExerciseDates/date must be unique
XPath Description:
Context: EquityBermudaExercise (complex type)
count(distinct-values(bermudaExerciseDates/date)) eq count(bermudaExerciseDates/date)
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 (complex type)
[exists(equityOption/equityExercise/equityEuropeanExercise)]
equityOption/equityExercise/equityEuropeanExercise/expirationDate/adjustableDate/unadjustedDate ge tradeHeader/tradeDate
eqd-12b (Mandatory)
English Description:
Context: Contract (complex type)
If equityOption/equityExercise/equityEuropeanExercise exists, then equityOption/equityExercise/equityEuropeanExercise/expirationDate/adjustableDate/unadjustedDate must be after or equal to header/contractDate
XPath Description:
Context: Contract (complex type)
[exists(equityOption/equityExercise/equityEuropeanExercise)]
equityOption/equityExercise/equityEuropeanExercise/expirationDate/adjustableDate/unadjustedDate ge header/contractDate
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 (complex type)
[exists(equityOption/equityPremium/paymentDate/unadjustedDate)]
equityOption/equityPremium/paymentDate/unadjustedDate ge tradeHeader/tradeDate
eqd-13b (Mandatory)
English Description:
Context: Contract (complex type)
If equityOption/equityPremium/paymentDate/unadjustedDate exists, then equityOption/equityPremium/paymentDate/unadjustedDate must be after or equal to header/contractDate
XPath Description:
Context: Contract (complex type)
[exists(equityOption/equityPremium/paymentDate/unadjustedDate)]
equityOption/equityPremium/paymentDate/unadjustedDate ge header/contractDate
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 (complex type)
[exists(brokerEquityOption/equityPremium/paymentDate/unadjustedDate)]
brokerEquityOption/equityPremium/paymentDate/unadjustedDate ge tradeHeader/tradeDate
eqd-14b (Mandatory)
English Description:
Context: Contract (complex type)
If brokerEquityOption/equityPremium/paymentDate/unadjustedDate exists, then brokerEquityOption/equityPremium/paymentDate/unadjustedDate must be after or equal to header/contractDate
XPath Description:
Context: Contract (complex type)
[exists(brokerEquityOption/equityPremium/paymentDate/unadjustedDate)]
brokerEquityOption/equityPremium/paymentDate/unadjustedDate ge header/contractDate
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 (complex type)
[exists(equityValuation/valuationDate/adjustableDate)] [exists(equityEuropeanExercise)]
equityValuation/valuationDate/adjustableDate/unadjustedDate eq equityEuropeanExercise/expirationDate/adjustableDate/unadjustedDate
eqd-17 (Mandatory)
English Description:
Context: EquityOption (complex type)
EquityDerivativeShortFormBase (complex type)
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
XPath Description:
Context: EquityOption (complex type)
EquityDerivativeShortFormBase (complex type)
[exists(numberOfOptions)] [exists(equityExercise/equityAmericanExercise/equityMultipleExercise/maximumNumberOfOptions)] [exists(equityExercise/equityAmericanExercise/equityMultipleExercise/integralMultipleExercise)]
equityExercise/equityAmericanExercise/equityMultipleExercise/maximumNumberOfOptions * equityExercise/equityAmericanExercise/equityMultipleExercise/integralMultipleExercise le numberOfOptions
eqd-18 (Mandatory)
English Description:
Context: EquityOption (complex type)
EquityDerivativeShortFormBase (complex type)
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
XPath Description:
Context: EquityOption (complex type)
EquityDerivativeShortFormBase (complex type)
[exists(numberOfOptions)] [exists(equityExercise/equityBermudaExercise/equityMultipleExercise/maximumNumberOfOptions)] [exists(equityExercise/equityBermudaExercise/equityMultipleExercise/integralMultipleExercise)]
equityExercise/equityBermudaExercise/equityMultipleExercise/maximumNumberOfOptions * equityExercise/equityBermudaExercise/equityMultipleExercise/integralMultipleExercise le numberOfOptions
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 (complex type)
EquityDerivativeShortFormBase (complex type)
[exists(
notional)] [exists(
equityPremium/percentageOfNotional)] [exists(
equityPremium/paymentAmount)] [
same-currency((
equityPremium/paymentAmount,
notional))]
equityPremium/paymentAmount/amount eq notional/amount * equityPremium/percentageOfNotional
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 (complex type)
EquityOptionTransactionSupplement (complex type)
[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
eqd-22 (Mandatory)
English Description:
Context: EquityDerivativeBase (complex type)
buyerPartyReference/@href and sellerPartyReference/@href must be different
XPath Description:
Context: EquityDerivativeBase (complex type)
buyerPartyReference/@href ne sellerPartyReference/@href
eqd-24 (Mandatory)
English Description:
Context: AveragingSchedule (complex type)
startDate must be before or equal to endDate
XPath Description:
Context: AveragingSchedule (complex type)
startDate le endDate
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 (complex type)
[exists(
numberOfOptions)] [exists(
equityPremium/paymentAmount)] [exists(
equityPremium/pricePerOption)] [
same-currency((
equityPremium/paymentAmount,
equityPremium/pricePerOption))]
equityPremium/pricePerOption/amount * numberOfOptions eq equityPremium/paymentAmount/amount
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) (complex type)
element(*, EquityDerivativeShortFormBase) (complex type)
[exists(numberOfOptions)] [exists(equityExercise/equityAmericanExercise/equityMultipleExercise/maximumNumberOfOptions)]
equityExercise/equityAmericanExercise/equityMultipleExercise/maximumNumberOfOptions le numberOfOptions
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 (complex type)
EquityDerivativeShortFormBase (complex type)
[exists(numberOfOptions)] [exists(equityExercise/equityBermudaExercise/equityMultipleExercise/maximumNumberOfOptions)]
equityExercise/equityBermudaExercise/equityMultipleExercise/maximumNumberOfOptions le numberOfOptions
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 (complex type)
minimumNumberOfOptions le maximumNumberOfOptions
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 (complex type)
[exists(integralMultipleExercise)]
minimumNumberOfOptions mod integralMultipleExercise eq 0
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 (complex type)
[exists(integralMultipleExercise)]
maximumNumberOfOptions mod integralMultipleExercise eq 0
eqd-31 (Mandatory)
English Description:
Context: Trade (complex type)
The starting date of an equity option must be after the trade date
XPath Description:
Context: Trade (complex type)
[//element(*, EquityDerivativeBase)/equityEffectiveDate]
Every $equityDerivativeBase in //element(*, EquityDerivativeBase)[exists(equityEffectiveDate)] $equityDerivativeBase/equityEffectiveDate ge tradeHeader/tradeDate
eqd-32 (Mandatory)
English Description:
Context: Contract (complex type)
The starting date of an equity option must be after the contract date
XPath Description:
Context: Contract (complex type)
[//element(*, EquityDerivativeBase)/equityEffectiveDate]
Every $equityDerivativeBase in //element(*, EquityDerivativeBase)[exists(equityEffectiveDate)] $equityDerivativeBase/equityEffectiveDate ge header/contractDate
Deprecated rules
eqd-7 (Mandatory)
DEPRECATED:
Context: equityBermudaExercise; Description: The elements in bermudaExerciseDates/date should be in order, earliest date first.
Rationale for deprecation: Enforcing that data should be in specific order is not permitted.
eqd-21 (Mandatory)
DEPRECATED:
Context: CalculationAgent; Description: calculationAgentPartyReference must exist.
Rationale for deprecation: 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.
Removed rules
eqd-1 (Mandatory)
REMOVED:
Context: Trade, Contract; Description: //equityExercise/equityAmericanExercise/commencementDate/adjustableDate/unadjustedDate must be equal to tradeHeader/tradeDate.
Rationale for removal: incorrect from business perspective.
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-11 (Mandatory)
REMOVED:
Context: EquityBermudanExercise; Description: latestExerciseTime/hourMinuteTime must be before or equal to equityExpirationTime/hourMinuteTime.
eqd-16 (Mandatory)
REMOVED:
Context: EquityMultipleExercise; Description: minimumNumberOfOptions lt maximumNumberOfOptions.
Rationale for removal: inconsistent with rule eqd-27
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.