FpML 4.5 Validation Rules - Rules for Interest Rate Derivatives (IRD)

This is the Interest Rate Derivatives part of the validation rule set accompanying the FpML 4.5 Last Call 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.

Content

Namespace

default element namespace = http://www.fpml.org/2008/FpML-4-5

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

Definitions

Term: frequency equivalence
A frequency is specified as a tuple of period, which is an integer, and periodMultiplier, which is one of "D", "M", "Y", "W" or "T", standing for day, month, year, week and term. Between any pair of frequencies, the following is the complete list of equivalences where the period multipliers differ: iff(period elements are equal, If the period multipliers of a pair of frequencies are equivalent then they are equal). For the purpose of calculating multiples of periods, the following additional rule holds:
Term: unadjusted calculation period dates
This applies in the context of an InterestRateStream. For the purpose of validation, the unadjusted calculation period dates are determined as follows:
Term: the schedule implied by
The schedule defined by the effective- and termination-Date, together with the "RegularPeriod" dates which may appear optionally in the presence of stubs, and the calculation period frequency.

Conditions

The Validation Conditions only apply when specific rules reference them. The following conditions are always to be executed relative to the root of the FpML document being validated. The context of the rule is NOT carried through to the condition.

Condition: isFloating
(context: InterestRateStream) resetDates exists.
Condition: hasInitialStub
(context: InterestRateStream) paymentDates/firstPaymentDate exists.

Functions

The following shared functions are used in the rules.

Rules

Unique contexts:

ird-1 (Mandatory)
Context: InterestRateStream (complex type)
English Description:
resetDates must exist if and only if a floatingRateCalculation or inflationRateCalculation exists in the calculationPeriodAmount/calculation element.
Formal Description:
iff(exists(resetDates), exists(calculationPeriodAmount/calculation/floatingRateCalculation) or exists(calculationPeriodAmount/calculation/inflationRateCalculation))
Test cases: [Valid] [Valid] [Invalid] [Invalid] [Invalid] [Invalid]
ird-2 (Mandatory)
Context: InterestRateStream (complex type)
English Description:
paymentDates/paymentFrequency is equal to an integer multiple (could be 1) of calculationPeriodDates/calculationPeriodFrequency. See also: frequency equivalence
Test cases: [Valid] [Valid] [Valid] [Invalid] [Invalid]
ird-3 (Mandatory)
Context: InterestRateStream (complex type)
English Description:
paymentDates/firstPaymentDate is equal to one of the unadjusted calculation period dates
Test cases: [Valid] [Valid] [Valid] [Invalid] [Invalid] [Invalid]
ird-4 (Mandatory)
Context: InterestRateStream (complex type)
English Description:
paymentDates/lastRegularPaymentDate is equal to one of the unadjusted calculation period dates
Test cases: [Valid] [Valid] [Valid] [Invalid] [Invalid] [Invalid] [Invalid]
ird-5 (Mandatory)
Context: InterestRateStream (complex type)
Formal Description:
[(cashflows/cashflowsMatchParameters eq true) or (not(exists(cashflows)))] [exists(resetDates)]
The frequency in calculationPeriodDates/calculationPeriodFrequency must be an integer multiple of the frequency in resetDates/resetFrequency. See also: frequency equivalence
Test cases: [Valid] [Valid] [Invalid] [Invalid]
ird-6 (Mandatory)
Context: InterestRateStream (complex type)
Formal Description:
[exists(paymentDates/firstPaymentDate)] [exists(calculationPeriodDates/effectiveDate)]
paymentDates/firstPaymentDate gt calculationPeriodDates/effectiveDate/unadjustedDate
Test cases: [Valid] [Invalid]
ird-7 (Mandatory)
Context: InterestRateStream (complex type)
English Description:
calculationPeriodAmount/calculation/compoundingMethod exists if and only if the frequencies in paymentDates/paymentFrequency and calculationPeriodDates/calculationPeriodFrequency are different.
Formal Description:
iff(exists(calculationPeriodAmount/calculation/compoundingMethod), different-frequencies((paymentDates/paymentFrequency, calculationPeriodDates/calculationPeriodFrequency))) See also: frequency equivalence
Test cases: [Valid] [Valid] [Invalid] [Invalid]
ird-8 (Mandatory)
Context: InterestRateStream
Formal Description:
payerPartyReference/@href neq receiverPartyReference/@href
Test cases: [Valid] [Invalid]
ird-9 (Mandatory)
Context: InterestRateStream (complex type)
Formal Description:
[exists(calculationPeriodAmount/calculation/compoundingMethod)]
exists(resetDates)
Comment: resetDates must exist.
Test cases: [Valid] [Invalid]
ird-10 (Mandatory)
Context: CalculationPeriodDates (complex type)
Formal Description:
[calculationPeriodFrequency/rollConvention is a number]
If firstRegularPeriodStartDate exists, then the start date is firstRegularPeriodStartDate, else the start date is effectiveDate/unadjustedDate. If calculationPeriodFrequency/rollConvention is less than or equal to the last day of the month in the start date, then the day of the start date must match it, else the day of the start date must be the last day of the month of that date
Test cases: [Valid] [Valid] [Valid] [Valid] [Valid] [Invalid] [Invalid] [Invalid] [Invalid]
ird-11 (Mandatory)
Context: CalculationPeriodDates (complex type)
Formal Description:
[calculationPeriodFrequency/rollConvention is a number]
If lastRegularPeriodEndDate exists, then the end date is lastRegularPeriodEndDate, else the end date is terminationDate/unadjustedDate. If calculationPeriodFrequency/rollConvention is less than or equal to the last day of the month in the end date, then the day of the end date must match it, else the day of the end date must be the last day of the month of that date
Test cases: [Valid] [Valid] [Valid] [Valid] [Valid] [Invalid] [Invalid] [Invalid] [Invalid] [Invalid]
ird-12 (Mandatory)
Context: CalculationPeriodDates (complex type)
English Description:
The frequency specified in calculationPeriodFrequency must divide the precisely. This means that by stepping through the period from the start date at the specified frequency, it must be possible to reach the end date.
Test cases: [Valid] [Valid] [Valid] [Valid] [Invalid] [Invalid] [Invalid] [Invalid] [Invalid] [Invalid]
ird-14 (Mandatory)
Context: CalculationPeriodDates (complex type)
Formal Description:
terminationDate/unadjustedDate gt effectiveDate/unadjustedDate
Test cases: [Valid] [Invalid] [Invalid]
ird-15 (Mandatory)
Context: CalculationPeriodDates (complex type)
Formal Description:
[exists(firstPeriodStartDate)]
terminationDate/unadjustedDate gt firstPeriodStartDate/unadjustedDate
Test cases: [Valid] [Invalid] [Invalid]
ird-16 (Mandatory)
Context: CalculationPeriodDates (complex type)
Formal Description:
[exists(//element(*, CalculationPeriodDates)/firstRegularPeriodStartDate)]
terminationDate/unadjustedDate gt firstRegularPeriodStartDate
Test cases: [Valid] [Invalid] [Invalid]
ird-17 (Mandatory)
Context: CalculationPeriodDates (complex type)
Formal Description:
terminationDate/unadjustedDate gt lastRegularPeriodEndDate
Test cases: [Valid] [Invalid]
ird-18 (Mandatory)
Context: CalculationPeriodDates (complex type)
Formal Description:
lastRegularPeriodEndDate gt firstRegularPeriodStartDate
Test cases: [Valid] [Invalid] [Invalid]
ird-19 (Mandatory)
Context: CalculationPeriodDates (complex type)
Formal Description:
lastRegularPeriodEndDate gt firstPeriodStartDate/unadjustedDate
Test cases: [Valid] [Invalid] [Invalid]
ird-20 (Mandatory)
Context: CalculationPeriodDates (complex type)
Formal Description:
lastRegularPeriodEndDate gt effectiveDate/unadjustedDate
Test cases: [Valid] [Invalid]
ird-21 (Mandatory)
Context: CalculationPeriodDates (complex type)
Formal Description:
firstPeriodStartDate/unadjustedDate lt effectiveDate/unadjustedDate
Test cases: [Valid] [Invalid] [Invalid]
ird-22 (Mandatory)
Context: CalculationPeriodDates (complex type)
Formal Description:
firstPeriodStartDate/unadjustedDate lt firstRegularPeriodStartDate
Test cases: [Valid] [Invalid] [Invalid]
ird-23 (Mandatory)
Context: StubCalculationPeriodAmount (complex type)
English Description:
initialStub exists if and only if the calculationPeriodDates element referenced by calculationPeriodDates/@href contains at least one of: firstPeriodStartDate, firstRegularPeriodStartDate
Formal Description:
iff(exists(initialStub), exists(id(calculationPeriodDates/@href)/(firstPeriodStartDate | firstRegularPeriodStartDate))
Test cases: [Valid] [Valid] [Invalid]
ird-24 (Mandatory)
Context: StubCalculationPeriodAmount (complex type)
English Description:
finalStub exists if and only if the calculationPeriodDates element referenced by calculationPeriodDates/@href contains a lastRegularPeriodEndDate element.
Formal Description:
iff(exists(finalStub), exists(id(calculationPeriodDates/@href)/lastRegularPeriodEndDate)
Test cases: [Valid] [Invalid]
ird-25 (Mandatory)
Context: Schedule (complex type)
English Description:
initialValue not equal to zero.
Formal Description:
[not(exists(step))]
initialValue neq 0
Test cases: [Valid] [Valid] [Invalid]
ird-27 (Mandatory)
Context: MandatoryEarlyTermination (complex type)
English Description:
cashSettlement/cashSettlementPaymentDate must not exist.
Formal Description:
not(exists(cashSettlement/cashSettlementPaymentDate))
Test cases: [Valid] [Invalid]
ird-29 (Mandatory)
Context: Calculation (complex type)
English Description:
fixedRateSchedule must not exist.
Formal Description:
[exists(compoundingMethod)]
not(exists(fixedRateSchedule))
Test cases: [Valid] [Invalid]
ird-30 (Mandatory)
Context: CalculationPeriod (complex type)
English Description:
unadjustedStartDate exists or adjustedStartDate exists.
Formal Description:
exists(unadjustedStartDate) or exists(adjustedStartDate)
Test cases: [Valid] [Valid] [Invalid]
ird-31 (Mandatory)
Context: CalculationPeriod (complex type)
English Description:
unadjustedEndDate exists or adjustedEndDate exists.
Formal Description:
exists(unadjustedEndDate) or exists(adjustedEndDate)
Test cases: [Valid] [Valid] [Invalid]
ird-33 (Mandatory)
Context: Fra (complex type)
Formal Description:
adjustedTerminationDate gt adjustedEffectiveDate
Test cases: [Valid] [Invalid]
ird-34 (Mandatory)
Context: PaymentCalculationPeriod (complex type)
English Description:
Either unadjustedPaymentDate or adjustedPaymentDate must exist.
Formal Description:
exists(unadjustedPaymentDate) or exists(adjustedPaymentDate)
Test cases: [Valid] [Valid] [Invalid]
ird-35 (Mandatory)
Context: PaymentDates (complex type)
Formal Description:
[exists(firstPaymentDate)] [exists(lastRegularPaymentDate)]
firstPaymentDate lt lastRegularPaymentDate
Test cases: [Valid] [Invalid] [Invalid]
ird-36 (Mandatory)
Context: PaymentDates (complex type)
Formal Description:
[exists(firstPaymentDate)] [exists(lastRegularPaymentDate)]
The period defined by the dates firstPaymentDate and lastRegularPaymentDate must be an integer multiple of paymentFrequency
Test cases: [Valid] [Invalid]
ird-39 (Mandatory)
Context: EarlyTerminationEvent (complex type)
Formal Description:
adjustedExerciseDate le adjustedEarlyTerminationDate
Test cases: [Valid] [Valid] [Invalid]
ird-40 (Mandatory)
Context: EarlyTerminationEvent (complex type)
Formal Description:
adjustedExerciseDate le adjustedCashSettlementValuationDate
Test cases: [Valid] [Valid] [Invalid]
ird-41 (Mandatory)
Context: EarlyTerminationEvent (complex type)
Formal Description:
adjustedCashSettlementValuationDate le adjustedCashSettlementPaymentDate
Test cases: [Valid] [Valid] [Invalid]
ird-42 (Mandatory)
Context: ExtensionEvent (complex type)
Formal Description:
adjustedExerciseDate lt adjustedExtendedTerminationDate
Test cases: [Valid] [Invalid] [Invalid]
ird-43 (Mandatory)
Context: FxLinkedNotionalAmount (complex type)
English Description:
At least one element must exist.
Formal Description:
count(//*) ge 1
Test cases: [Valid] [Invalid]
ird-44 (Mandatory)
Context: MandatoryEarlyTerminationAdjustedDates (complex type)
Formal Description:
adjustedEarlyTerminationDate le adjustedCashSettlementValuationDate le adjustedCashSettlementPaymentDate
Test cases: [Valid] [Invalid] [Invalid] [Invalid] [Invalid] [Invalid]
ird-46 (Mandatory)
Context: OptionalEarlyTermination (complex type)
Formal Description:
[exists(cashSettlement/cashSettlementValuationDate)]
The cashSettlement/cashSettlementValuationDate/dateRelativeTo/@href attribute is equal to the cashSettlement/cashSettlementPaymentDate/@id attribute
Test cases: [Valid] [Invalid]
ird-47 (Mandatory)
Context: OptionalEarlyTermination (complex type)
Formal Description:
[exists(cashSettlement/cashSettlementPaymentDate)]
The cashSettlement/cashSettlementPaymentDate/relativeDate/dateRelativeTo/@href attribute is equal to the americanExercise/@id, bermudaExercise/@id or europeanExercise/@id, whichever one exists
Test cases: [Valid] [Invalid]
ird-48 (Mandatory)
Context: Swaption (complex type)
Formal Description:
[exists(cashSettlement/cashSettlementPaymentDate)]
The cashSettlement/cashSettlementPaymentDate/relativeDate/dateRelativeTo/@href attribute is equal to the @id attribute of americanExercise, bermudaExercise or europeanExercise, whichever one exists
Test cases: [Valid] [Invalid]
ird-49 (Mandatory)
Context: ResetFrequency (complex type)
English Description:
weeklyRollConvention should exist if and only if the period is "W".
Formal Description:
iff(exist weeklyRollConvention, period = "W")
Test cases: [Valid] [Valid] [Invalid] [Invalid]
ird-50 (Mandatory)
Context: InterestRateStream (complex type)
English Description:
The dates in calculationPeriodAmount/calculation/notionalSchedule/notionalStepSchedule/step/stepDate must be unadjusted calculation period dates in the schedule implied by calculationPeriodDates.
Comment: The rule states that stepDates must be unadjusted period dates in calculationPeriodDates - but the only explicit dates in calculationPeriodDates are the effective- and termination-Date, together with the "RegularPeriod" dates which may appear optionally in the presence of stubs. These dates, in conjunction with the calculation period frequency, imply a schedule of unadjusted period dates; it is this implied schedule which the values of notionalStepSchedule//stepDate must match.
Test cases: [Valid] [Valid] [Invalid] [Invalid] [Invalid]
ird-51 (Mandatory)
Context: InterestRateStream (complex type)
English Description:
The dates in calculationPeriodAmount/calculation/notionalSchedule/fixedRateSchedule/step/stepDate must be unadjusted calculation period dates in the schedule implied by calculationPeriodDates.
Comment: The rule states that stepDates must be unadjusted period dates in calculationPeriodDates - but the only explicit dates in calculationPeriodDates are the effective- and termination-Date, together with the "RegularPeriod" dates which may appear optionally in the presence of stubs. These dates, in conjunction with the calculation period frequency, imply a schedule of unadjusted period dates; it is this implied schedule which the values of fixedRateSchedule//stepDate must match.
Test cases: [Valid] [Valid] [Invalid] [Invalid] [Invalid] [Invalid]
ird-52 (Mandatory)
Context: InterestRateStream (complex type)
English Description:
The dates in calculationPeriodAmount/calculation/floatingRateCalculation/capRateSchedule/step/stepDate must be unadjusted calculation period dates in the schedule implied by calculationPeriodDates.
Comment: The rule states that stepDates must be unadjusted period dates in calculationPeriodDates - but the only explicit dates in calculationPeriodDates are the effective- and termination-Date, together with the "RegularPeriod" dates which may appear optionally in the presence of stubs. These dates, in conjunction with the calculation period frequency, imply a schedule of unadjusted period dates; it is this implied schedule which the values of capRateSchedule//stepDate must match.
Test cases: [Valid] [Valid] [Invalid] [Invalid] [Invalid] [Invalid]
ird-53 (Mandatory)
Context: InterestRateStream (complex type)
English Description:
The dates in calculationPeriodAmount/calculation/floatingRateCalculation/floorRateSchedule/step/stepDate must be unadjusted calculation period dates in the schedule implied by calculationPeriodDates.
Comment: The rule states that stepDates must be unadjusted period dates in calculationPeriodDates - but the only explicit dates in calculationPeriodDates are the effective- and termination-Date, together with the "RegularPeriod" dates which may appear optionally in the presence of stubs. These dates, in conjunction with the calculation period frequency, imply a schedule of unadjusted period dates; it is this implied schedule which the values of floorRateSchedule//stepDate must match.
Test cases: [Valid] [Valid] [Invalid] [Invalid] [Invalid] [Invalid]
ird-54 (Mandatory)
Context: InterestRateStream (complex type)
English Description:
The dates in calculationPeriodAmount/knownAmountSchedule/step/stepDate must be unadjusted calculation period dates in the schedule implied by calculationPeriodDates
Comment: The rule states that stepDates must be unadjusted period dates in calculationPeriodDates - but the only explicit dates in calculationPeriodDates are the effective- and termination-Date, together with the "RegularPeriod" dates which may appear optionally in the presence of stubs. These dates, in conjunction with the calculation period frequency, imply a schedule of unadjusted period dates; it is this implied schedule which the values of knownAmountSchedule//stepDate must match.
Test cases: [Valid] [Valid] [Invalid] [Invalid] [Invalid] [Invalid]
ird-57 (Mandatory)
Context: CalculationPeriodFrequency (complex type)
English Description:
When the period is "M" or "Y" the rollConvention cannot be a week day, "NONE" or "SFE".
Formal Description:
[period = ("M", "Y")]
rollConvention neq ("NONE", "SFE", "MON", "TUE", "WED", "THU", "FRI", "SAT","SUN")
Test cases: [Valid] [Valid] [Valid] [Valid] [Invalid]
ird-58 (Mandatory)
Context: CalculationPeriodFrequency (complex type)
English Description:
When the period is "W" the rollConvention must be a week day, "SFE" or "NONE".
Formal Description:
[ period ="W"]
rollConvention eq ("NONE", "SFE", "MON", "TUE", "WED", "THU", "FRI", "SAT","SUN")
ird-59 (Mandatory)
Context: ResetDates (complex type)
Formal Description:
In calculationPeriodDatesReference, the @href attribute is equal to the @id attribute of calculationPeriodDates in the same swapStream
ird-60 (Mandatory)
Context: CalculationPeriodFrequency (complex type)
English Description:
When the period is "T" the rollConvention must be "NONE".
Formal Description:
[ period ="T"]
rollConvention eq "NONE"

Deprecated rules

ird-26 (Mandatory)
DEPRECATED: Context: BusinessCentersReference; Description: The @href attribute must match the @id attribute of a businessCenters element somewhere within the document. Rationale for deprecation: the rule has been replaced by the reference rule number 39 (ref-39)
ird-28 (Mandatory)
DEPRECATED: Context: MandatoryEarlyTermination; Description: If cashSettlement/cashSettlementValuationDate exists, the cashSettlement/cashSettlementValuationDate/dateRelativeTo/@href attribute is equal to the mandatoryEarlyTerminationDate/@id attribute. Rationale for deprecation: the rule has been replaced by the reference rule number 38 (ref-38)
ird-32 (Mandatory)
DEPRECATED: Context: Discounting; Description: If discountRate is absent then discountRateDayCountFraction must also be absent. Rationale for deprecation: the rule has been replaced by a schema constraint.
ird-38 (Mandatory)
DEPRECATED: Context: StubCalculationPeriodAmount; Description: Either initialStub or finalStub must exist. Rationale for deprecation: the rule has been replaced by a schema constraint.
ird-55 (Mandatory)
DEPRECATED: Context: InterestRateStream Description: The paymentDates/calculationPeriodDatesReference/@href attribute is equal to the calculationPeriodDates/@id attribute. Rationale for deprecation: the rule is an uneeded subset of reference rule number 8 (ref-8)
Test cases: [Valid] [Invalid]
ird-56 (Mandatory)
DEPRECATED: Context: InterestRateStream; Condition: [exists(paymentDates/resetDatesReference)] [exists(resetDates)]; Description: The paymentDates/resetDatesReference/@href attribute is equal to the resetDates/@id. Rationale for deprecation: the rule is an uneeded subset of reference rule number 12 (ref-12)
Test cases: [Valid] [Invalid]

Removed rules