FpML 4.0 Validation Rules

This is the validation rule set http://www.fpml.org/2003/FpML-4-0/2003-10-14 accompanying the Last Call Working Draft of FpML 4.0. The introductory section in the working 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 rules to highlight relevant document portions accessed by a rule. These cut down test cases are non-normative and are provided for the purpose of documentation only.

Disclaimer: The FpML specifications, including the FpML validation rules, provided are without warranty of any kind, either expressed or implied, including, without limitation, warranties that FpML, the FpML specifications, including the FpML validation rules, are free of defects, merchantable, fit for a particular purpose or non-infringing. The entire risk as to the quality and performance of the specifications, including the validation rules, is with you. Should any of the FpML specifications prove defective in any respect, you assume the cost of any necessary servicing or repair. Under no circumstances and under no legal theory, whether tort (including negligence), contract, or otherwise, shall ISDA, any of its members, or any distributor of documents or software containing any of the FpML specifications, or any supplier of any of such parties, be liable to you or any other person for any indirect, special, incidental, or consequential damages of any character including, without limitation, damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses, even if such party shall have been informed of the possibility of such damages.

Content

Definitions

Term: regular period
The regular period of a set of calculation period dates is the period between a start date and an end date. The start date is firstRegularPeriodStartDate, if present, or effectiveDate/unadjustedDate otherwise. The end date is lastRegularPeriodEndDate, if present, or terminationDate/unadjustedDate otherwise.
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: If the period multipliers of a pair of frequencies are equivalent, then they are equal if and only if the periodelements are equal.
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:

Preconditions

Precondition: isParametric
The ancestor element of type InterestRateStream contains no cashflows element, or cashflows/cashflowsMatchParameters contains true.

Rules for Interest Rate Derivatives

Unique contexts:

Context: InterestRateStream (data type)

ird-1 (Mandatory)
resetDates must be present if and only if a floatingRateCalculation element is present in the calculationPeriodAmount/calculation element.
Test cases: [Valid] [Valid] [Invalid] [Invalid] [Invalid] [Invalid]
ird-2 (Mandatory)
Preconditions: isParametric
paymentDates/paymentFrequency must be an integer multiple (could be 1) of calculationPeriodDates/calculationPeriodFrequency. See also: frequency equivalence.
Test cases: [Valid] [Valid] [Valid] [Invalid] [Invalid]
ird-3 (Mandatory)
Preconditions: isParametric
paymentDates/firstPaymentDate must match one of the unadjusted calculation period dates.
Test cases: [Valid] [Valid] [Valid] [Invalid] [Invalid] [Invalid]
ird-4 (Mandatory)
Preconditions: isParametric
paymentDates/lastRegularPaymentDate must match one of the unadjusted calculation period dates
Test cases: [Valid] [Valid] [Valid] [Invalid] [Invalid] [Invalid] [Invalid]
ird-5 (Mandatory)
Preconditions: isParametric
The frequency in calculationPeriodDates/calculationPeriodFrequencymust be an integer multiple of the frequency in resetDates/resetFrequency. See also: frequency equivalence
Test cases: [Valid] [Valid] [Invalid] [Invalid]
ird-6 (Mandatory)
Preconditions: isParametric
paymentDates/firstPaymentDate > calculationPeriodDates/effectiveDate/unadjustedDate.
Test cases: [Valid] [Invalid]
ird-7 (Mandatory)
Preconditions: isParametric
calculationPeriodAmount/calculation/compoundingMethod is present if and only if the frequencies in paymentDates/paymentFrequency and calculationPeriodDates/calculationPeriodFrequency are different. See also: frequency equivalence.
Test cases: [Valid] [Valid] [Invalid] [Invalid]
ird-8 (Mandatory)
payerPartyReference/@href and receiverPartyReference/@href must not be the same.
Test cases: [Valid] [Invalid]
ird-9 (Mandatory)
calculationPeriodAmount/calculation/compoundingMethod can only be present if a resetDates element is present.
Test cases: [Valid] [Invalid]

Context: calculationPeriodDates

ird-10 (Mandatory)
Preconditions: isParametric
This rule applies when calculationPeriodFrequency/rollConvention is a number. Let the start date be firstRegularPeriodStartDate if it exists, or effectiveDate/unadjustedDate otherwise: 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. Otherwise 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)
Preconditions: isParametric
This rule applies when calculationPeriodFrequency/rollConvention is a number. Let the end date be lastRegularPeriodEndDate if it exists, or terminationDate/unadjustedDate otherwise: 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. Otherwise 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)
Preconditions: isParametric
The frequency specified in calculationPeriodFrequency must divide the regular period 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-13 (Mandatory)
Preconditions: isParametric
If rollConvention is neither NONE nor SFE then the period must be M or Y.
Test cases: [Valid] [Valid] [Valid] [Valid] [Invalid]
ird-14 (Mandatory)
Preconditions: isParametric
terminationDate/unadjustedDate > effectiveDate/unadjustedDate.
Test cases: [Valid] [Invalid] [Invalid]
ird-15 (Mandatory)
Preconditions: isParametric
terminationDate/unadjustedDate > firstPeriodStartDate/unadjustedDate.
Test cases: [Valid] [Invalid] [Invalid]
ird-16 (Mandatory)
Preconditions: isParametric
terminationDate/unadjustedDate > firstRegularPeriodStartDate.
Test cases: [Valid] [Invalid] [Invalid]
ird-17 (Mandatory)
Preconditions: isParametric
terminationDate/unadjustedDate > lastRegularPeriodEndDate.
Test cases: [Valid] [Invalid]
ird-18 (Mandatory)
Preconditions: isParametric
lastRegularPeriodEndDate > firstRegularPeriodStartDate.
Test cases: [Valid] [Invalid] [Invalid]
ird-19 (Mandatory)
Preconditions: isParametric
lastRegularPeriodEndDate > firstPeriodStartDate/unadjustedDate.
Test cases: [Valid] [Invalid] [Invalid]
ird-20 (Mandatory)
Preconditions: isParametric
lastRegularPeriodEndDate > effectiveDate/unadjustedDate
Test cases: [Valid] [Invalid]
ird-21 (Mandatory)
Preconditions: isParametric
firstPeriodStartDate/unadjustedDate < effectiveDate/unadjustedDate
Test cases: [Valid] [Invalid] [Invalid]
ird-22 (Mandatory)
Preconditions: isParametric
firstPeriodStartDate/unadjustedDate < firstRegularPeriodStartDate
Test cases: [Valid] [Invalid] [Invalid]

Context: stubCalculationPeriodAmount

ird-23 (Mandatory)
initialStub should only be present if the calculationPeriodDates element referenced by calculationPeriodDates/@href contains at least one of:
Test cases: [Valid] [Valid] [Invalid]
ird-24 (Mandatory)
finalStub should only be present if the calculationPeriodDates element referenced by calculationPeriodDates/@href contains a lastRegularPeriodEndDate element.
Test cases: [Valid] [Invalid]

Context: Schedule (data type)

ird-25 (Mandatory)
If there are no step elements then initialValue must be non-zero.
Test cases: [Valid] [Valid] [Invalid]

Context: businessCentersReference

ird-26 (Mandatory)
The @href attribute must match the @id attribute of a businessCenters element somewhere within the document.
Test cases: [Valid] [Valid] [Invalid] [Invalid]

Context: MandatoryEarlyTermination (data type)

ird-27 (Mandatory)
cashSettlement/cashSettlementPaymentDate must not be present.
Test cases: [Valid] [Invalid]
ird-28 (Mandatory)
In cashSettlement/cashSettlementValuationDate/dateRelativeTo, the @href attribute must point to the @id attribute of mandatoryEarlyTerminationDate.
Test cases: [Valid] [Invalid]

Context: Calculation (data type)

ird-29 (Mandatory)
If compoundingMethod is present then floatingRateCalculation must be present.
Test cases: [Valid] [Invalid]

Context: CalculationPeriod (data type)

ird-30 (Mandatory)
Must contain either unadjustedStartDate or adjustedStartDate.
Test cases: [Valid] [Valid] [Invalid]
ird-31 (Mandatory)
Must contain either unadjustedEndDate or adjustedEndDate.
Test cases: [Valid] [Valid] [Invalid]

Context: Discounting (data type)

ird-32 (Mandatory)
If discountRate is absent then discountRateDayCountFraction must also be absent.
Test cases: [Valid] [Valid] [Invalid]

Context: Fra (data type)

ird-33 (Mandatory)
adjustedTerminationDate> adjustedEffectiveDate.
Test cases: [Valid] [Invalid]

Context: PaymentCalculationPeriod (data type)

ird-34 (Mandatory)
Either unadjustedPaymentDate or adjustedPaymentDate must be present.
Test cases: [Valid] [Valid] [Invalid]

Context: PaymentDates (data type)

ird-35 (Mandatory)
firstPaymentDate < lastRegularPaymentDate.
Test cases: [Valid] [Invalid] [Invalid]
ird-36 (Mandatory)
If both firstPaymentDate and lastRegularPaymentDate are present then the period defined by these dates must be an integer multiple of paymentFrequency.
Test cases: [Valid] [Invalid]

Context: StubCalculationPeriodAmount (data type)

ird-38 (Mandatory)
Either initialStub or finalStub must be present.
Test cases: [Valid] [Valid] [Valid] [Invalid]

Context: EarlyTerminationEvent (data type)

ird-39 (Mandatory)
adjustedExerciseDate <= adjustedEarlyTerminationDate
Test cases: [Valid] [Valid] [Invalid]
ird-40 (Mandatory)
adjustedExerciseDate <= adjustedCashSettlementValuationDate
Test cases: [Valid] [Valid] [Invalid]
ird-41 (Mandatory)
adjustedCashSettlementValuationDate <= adjustedCashSettlementPaymentDate
Test cases: [Valid] [Valid] [Invalid]

Context: ExtensionEvent (data type)

ird-42 (Mandatory)
adjustedExerciseDate < adjustedExtendedTerminationDate
Test cases: [Valid] [Invalid] [Invalid]

Context: FxLinkedNotionalAmount (data type)

ird-43 (Mandatory)
At least one element must be present
Test cases: [Valid] [Invalid]

Context: MandatoryEarlyTerminationAdjustedDates (data type)

ird-44 (Mandatory)
adjustedEarlyTerminationDate <= adjustedCashSettlementValuationDate <= adjustedCashSettlementPaymentDate
Test cases: [Valid] [Invalid] [Invalid] [Invalid] [Invalid] [Invalid]

Context: OptionalEarlyTermination (data type)

ird-46 (Mandatory)
In cashSettlement/cashSettlementValuationDate/dateRelativeTo, the @href attribute must point to the @id attribute of cashSettlement/cashSettlementPaymentDate.
Test cases: [Valid] [Invalid]
ird-47 (Mandatory)
In cashSettlement/cashSettlementPaymentDate/relativeDate/dateRelativeTo, the @href attribute must point to the @id attribute of americanExercise, bermudaExercise or europeanExercise, whichever one is present.
Test cases: [Valid] [Invalid]

Context: Swaption (data type)

ird-48 (Mandatory)
In cashSettlement/cashSettlementPaymentDate/relativeDate/dateRelativeTo, the @href attribute must point to the @id attribute of americanExercise, bermudaExercise or europeanExercise, whichever one is present.
Test cases: [Valid] [Invalid]

Context: ResetFrequency (data type)

ird-49 (Mandatory)
weeklyRollConventionshould be present if and only if the period is W
Test cases: [Valid] [Valid] [Invalid] [Invalid]

Context: notionalStepSchedule

ird-50 (Mandatory)
Preconditions: isParametric
The dates in step/stepDate must be unadjusted calculation period dates in ../../../../calculationPeriodDates.
Test cases: [Valid] [Valid] [Invalid] [Invalid] [Invalid]

Context: fixedRateSchedule

ird-51 (Mandatory)
Preconditions: isParametric
The dates in step/stepDate must be unadjusted calculation period dates in ../../../calculationPeriodDates.
Test cases: [Valid] [Valid] [Invalid] [Invalid] [Invalid] [Invalid]

Context: capRateSchedule

ird-52 (Mandatory)
Preconditions: isParametric
The dates in step/stepDate must be unadjusted calculation period dates in ../../../../calculationPeriodDates.
Test cases: [Valid] [Valid] [Invalid] [Invalid] [Invalid] [Invalid]

Context: floorRateSchedule

ird-53 (Mandatory)
Preconditions: isParametric
The dates in step/stepDate must be unadjusted calculation period dates in ../../../../calculationPeriodDates.
Test cases: [Valid] [Valid] [Invalid] [Invalid] [Invalid] [Invalid]

Context: knownAmountSchedule

ird-54 (Mandatory)
Preconditions: isParametric
The dates in step/stepDate must be unadjusted calculation period dates in ../../calculationPeriodDates.
Test cases: [Valid] [Valid] [Invalid] [Invalid] [Invalid] [Invalid]

Context: paymentDates

ird-55 (Mandatory)
If calculationPeriodDatesReference exists it shall match with calculationPeriodDates in the nearest containing element of type InterestRateStream
Test cases: [Valid] [Invalid]
ird-56 (Mandatory)
If resetDatesReference exists then it shall match with resetDates in the nearest containing element of type InterestRateStream.
Test cases: [Valid] [Invalid]

Deprecated rules