FpML 4.5 Validation Rules - Rules for Equity Derivatives (EQD)
This is the Equity Derivatives part of the validation rule set accompanying the FpML 4.5 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/2008/FpML-4-5
namespace xs = http://www.w3.org/2001/XMLSchema
Functions
The following shared functions are used in the rules.
Rules
Unique contexts:
eqd-2 (Mandatory)
Context:
Trade (complex type)
[exists(equityOption/equityExercise/equityAmericanExercise)]
equityOption/equityExercise/equityAmericanExercise/expirationDate/adjustableDate/unadjustedDate >= tradeHeader/tradeDate.
eqd-2b (Mandatory)
Context:
Contract (complex type)
[exists(equityOption/equityExercise/equityAmericanExercise)]
equityOption/equityExercise/equityAmericanExercise/expirationDate/adjustableDate/unadjustedDate >= header/contractDate.
eqd-3 (Mandatory)
Context:
EquityAmericanExercise (complex type)
[latestExerciseTimeType = "SpecificTime"]
exists(latestExerciseTime).
eqd-4 (Mandatory)
Context:
Trade (complex type)
[exists(equityOption/equityExercise/equityBermudaExercise)]
equityOption/equityExercise/equityBermudaExercise/commencementDate/adjustableDate/unadjustedDate >= tradeHeader/tradeDate.
eqd-4b (Mandatory)
Context:
Contract (complex type)
[exists(equityOption/equityExercise/equityBermudaExercise)]
equityOption/equityExercise/equityBermudaExercise/commencementDate/adjustableDate/unadjustedDate >= header/contractDate.
eqd-6 (Mandatory)
Context:
EquityBermudaExercise (complex type)
[latestExerciseTimeType = "SpecificTime"]
exists(latestExerciseTime).
eqd-8 (Mandatory)
Context:
EquityBermudaExercise (complex type)
All dates in bermudaExerciseDates/date > commencementDate/adjustableDate/unadjustedDate.
eqd-9 (Mandatory)
Context:
EquityBermudaExercise (complex type)
All dates in bermudaExerciseDates/date <= expirationDate/adjustableDate/unadjustedDate.
eqd-10 (Mandatory)
Context:
EquityBermudaExercise (complex type)
The dates in bermudaExerciseDates/date must be unique.
eqd-12 (Mandatory)
Context:
Trade (complex type)
[exists(equityOption/equityExercise/equityEuropeanExercise)]
equityOption/equityExercise/equityEuropeanExercise/expirationDate/adjustableDate/unadjustedDate >= tradeHeader/tradeDate.
eqd-12b (Mandatory)
Context:
Contract (complex type)
[exists(equityOption/equityExercise/equityEuropeanExercise)]
equityOption/equityExercise/equityEuropeanExercise/expirationDate/adjustableDate/unadjustedDate >= header/contractDate.
eqd-13 (Mandatory)
Context:
Trade (complex type)
[exists(equityOption/equityPremium/paymentDate/unadjustedDate)]
equityOption/equityPremium/paymentDate/unadjustedDate >= tradeHeader/tradeDate.
eqd-13b (Mandatory)
Context:
Contract (complex type)
[exists(equityOption/equityPremium/paymentDate/unadjustedDate)]
equityOption/equityPremium/paymentDate/unadjustedDate >= header/contractDate.
eqd-14 (Mandatory)
Context:
Trade (complex type)
[exists(brokerEquityOption/equityPremium/paymentDate/unadjustedDate)]
brokerEquityOption/equityPremium/paymentDate/unadjustedDate >= tradeHeader/tradeDate.
eqd-14b (Mandatory)
Context:
Contract (complex type)
[exists(brokerEquityOption/equityPremium/paymentDate/unadjustedDate)]
brokerEquityOption/equityPremium/paymentDate/unadjustedDate >= header/contractDate.
eqd-15 (Mandatory)
Context:
EquityExerciseValuationSettlement (complex type)
[exists(equityValuation/valuationDate/adjustableDate)] [exists(equityEuropeanExercise)]
equityValuation/valuationDate/adjustableDate/unadjustedDate = equityEuropeanExercise/expirationDate/adjustableDate/unadjustedDate.
eqd-17 (Mandatory)
Context:
EquityOption (complex type)
EquityDerivativeShortFormBase (complex type)
[numberOfOptions > 0]
equityExercise/equityAmericanExercise/equityMultipleExercise/maximumNumberOfOptions * equityExercise/equityAmericanExercise/equityMultipleExercise/integralMultipleExercise >= numberOfOptions.
eqd-18 (Mandatory)
Context:
EquityOption (complex type)
EquityDerivativeShortFormBase (complex type)
[exists(equityExercise/equityBermudaExercise/equityMultipleExercise)] [exists(numberOfOptions)] [numberOfOptions > 0]
maximumNumberOfOptions * integralMultipleExercise (in equityExercise/equityBermudaExercise/equityMultipleExercise) <= numberOfOptions.
eqd-19 (Mandatory)
Context:
EquityOption (complex type)
EquityDerivativeShortFormBase (complex type)
[exists(
notional)] [exists(
equityPremium/percentageOfNotional)] [exists(
equityPremium/paymentAmount)] [
same-currency((
equityPremium/paymentAmount,
notional))]
equityPremium/paymentAmount/amount = notional/amount * equityPremium/percentageOfNotional.
eqd-20 (Mandatory)
Context:
EquityOption (complex type)
EquityOptionTransactionSupplement (complex type)
[exists(
numberOfOptions)] [
numberOfOptions >
0] [exists(
optionEntitlement)] [exists(
equityPremium/paymentAmount)] [exists(
equityPremium/pricePerOption)] [
same-currency((
equityPremium/paymentAmount,
equityPremium/pricePerOption))]
equityPremium/pricePerOption/amount * $equityOption/numberOfOptions * $equityOption/optionEntitlement = $equityOption/equityPremium/paymentAmount/amount.
eqd-22 (Mandatory)
Context:
EquityDerivativeBase (complex type)
buyerPartyReference/@href != sellerPartyReference/@href.
eqd-23 (Mandatory)
Context:
Trade (complex type)
[exists(equityOption/equityEffectiveDate)]
equityOption/equityEffectiveDate >= tradeHeader/tradeDate.
eqd-24 (Mandatory)
Context:
AveragingSchedule (complex type)
startDate <= endDate.
eqd-25 (Mandatory)
Context:
BrokerEquityOption (complex type)
[exists(
numberOfOptions)] [
numberOfOptions >
0] [exists(
equityPremium/paymentAmount)] [exists(
equityPremium/pricePerOption)] [
same-currency((
equityPremium/paymentAmount,
equityPremium/pricePerOption))]
equityPremium/pricePerOption/amount * numberOfOptions = equityPremium/paymentAmount/amount.
eqd-26 (Mandatory)
Context:
EquityMultipleExercise (complex type)
[numberOfOptions > 0]
maximumNumberOfOptions <= numberOfOptions.
eqd-27 (Mandatory)
Context:
EquityMultipleExercise (complex type)
minimumNumberOfOptions <= maximumNumberOfOptions.
eqd-28 (Mandatory)
Context:
EquityMultipleExercise (complex type)
[exists(integralMultipleExercise)]
minimumNumberOfOptions must be a positive integer multiple of integralMultipleExercise.
eqd-29 (Mandatory)
Context:
EquityMultipleExercise (complex type)
[exists(integralMultipleExercise)]
maximumNumberOfOptions must be a positive integer multiple of integralMultipleExercise.
eqd-30 (Mandatory)
Context:
Contract (complex type)
[exists(equityOption/equityEffectiveDate)]
equityOption/equityEffectiveDate >= header/contractDate.
eqd-31 (Mandatory)
Context:
Trade (complex type)
[//element(*, EquityDerivativeBase)/equityEffectiveDate]
Every $equityDerivativeBase in //element(*, EquityDerivativeBase)[exists(equityEffectiveDate)] $equityDerivativeBase >= tradeHeader/tradeDate.
eqd-32 (Mandatory)
Context:
Contract (complex type)
[//element(*, EquityDerivativeBase)/equityEffectiveDate]
Every $equityDerivativeBase in //element(*, EquityDerivativeBase)[exists(equityEffectiveDate)] $equityDerivativeBase >= 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 < maximumNumberOfOptions.
Rationale for removal: inconsistent with rule eqd-27