FpML 5.3 Validation Rules - Rules for Interest Rate Derivatives (IRD) (confirmation view)
This is the Interest Rate Derivatives part of the validation rule set accompanying the FpML 5.3 Recommendation. 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-3-6-rec-1
namespace xs = http://www.w3.org/2001/XMLSchema
namespace functx = http://www.functx.com
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:
- Any frequency gt 0 is a multiple of 1D
- 1T is a positive integer multiple (ge 1) of any frequency
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:
-
cashflows element not present: the unadjusted calculation period dates are calculated by stepping through the regular-period() at the frequency specified in calculationPeriodDates/calculationPeriodFrequency. The first date is the start date of the regular-period() and the last date is the end date of the regular-period().
-
cashflows element exists and cashflowsMatchParameters is true: the unadjusted calculation period dates are calculated from the regular-period() as in the previous case.
-
cashflows element exists and cashflowsMatchParameters is false: rules that relate elements to unadjusted calculation period dates do not apply. Instead, the cash flows must be validated internally.
Term: the schedule implied byThe 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
-- There are no global conditions for IRD rules. --
Functions
The following shared functions are used in the rules.
Rules
Unique contexts:
ird-1 (Mandatory)
English Description:
Context: InterestRateStream (complex type)
resetDates must exist if and only if a floatingRateCalculation or inflationRateCalculation exists in the calculationPeriodAmount/calculation element
XPath Description:
Context: InterestRateStream
iff(exists(
resetDates), exists(
calculationPeriodAmount/calculation/floatingRateCalculation) or exists(
calculationPeriodAmount/calculation/inflationRateCalculation))
ird-2 (Mandatory)
English Description:
Context: InterestRateStream (complex type)
paymentDates/paymentFrequency is equal to an integer multiple (could be 1) of
calculationPeriodDates/calculationPeriodFrequency. See also:
frequency equivalence
ird-5 (Mandatory)
English Description:
Context: InterestRateStream (complex type)
The frequency in
calculationPeriodDates/calculationPeriodFrequency must be an integer multiple of the frequency in
resetDates/resetFrequency. See also:
frequency equivalence
XPath Description:
Context: InterestRateStream
[(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
ird-6 (Mandatory)
English Description:
Context: InterestRateStream (complex type)
If paymentDates/firstPaymentDate exists, and if calculationPeriodDates/effectiveDate exists, then paymentDates/firstPaymentDate must be after calculationPeriodDates/effectiveDate/unadjustedDate
XPath Description:
Context: InterestRateStream
[exists(paymentDates/firstPaymentDate)] [exists(calculationPeriodDates/effectiveDate)]
paymentDates/firstPaymentDate gt calculationPeriodDates/effectiveDate/unadjustedDate
ird-7 (Mandatory)
English Description:
Context: InterestRateStream (complex type)
The existence of compoundingMethod is required when the calculation-period and payment frequencies differ, and prohibited when they are the same
XPath Description:
Context: InterestRateStream
exists(
calculationPeriodAmount/calculation/compoundingMethod) eq
different-frequencies((
paymentDates/paymentFrequency,
calculationPeriodDates/calculationPeriodFrequency))
ird-8 (Mandatory)
English Description:
Context: InterestRateStream
The @href attribute of payerPartyReference must not be equal to the @href attribute of receiverPartyReference
XPath Description:
Context: InterestRateStream
payerPartyReference/@href ne receiverPartyReference/@href
ird-9 (Mandatory)
English Description:
Context: InterestRateStream (complex type)
If calculationPeriodAmount/calculation/compoundingMethod exists, then resetDates must exist
XPath Description:
Context: InterestRateStream
[exists(calculationPeriodAmount/calculation/compoundingMethod)]
exists(resetDates)
ird-10 (Mandatory)
English Description:
Context: CalculationPeriodDates (complex type)
The first day is the day of the month from firstRegularPeriodStartDate if it exists, otherwise from effectiveDate/unadjustedDate. The second day is the lesser of the rollConvention, and the firstRegularPeriodStartDate if it exist or the effectiveDate/unadjustedDate if it doesn't. The first day must equal the second day.
XPath Description:
Context: CalculationPeriodDates
[calculationPeriodFrequency/rollConvention is a number]
dayFromDate((firstRegularPeriodStartDate, effectiveDate/unadjustedDate)[1]) = min(calculationPeriodFrequency/rollConvention, dayFromDate(functx:last-day-of-month((firstRegularPeriodStartDate, effectiveDate/unadjustedDate)[1])))
ird-11 (Mandatory)
English Description:
Context: CalculationPeriodDates (complex type)
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.
XPath Description:
Context: CalculationPeriodDates
[calculationPeriodFrequency/rollConvention is a number]
dayFromDate((lastRegularPeriodEndDate, terminationDate/unadjustedDate)[1]) = min(calculationPeriodFrequency/rollConvention, dayFromDate(functx:last-day-of-month((lastRegularPeriodEndDate, effectiveDate/unadjustedDate)[1])))
ird-12 (Mandatory)
English Description:
Context: CalculationPeriodDates (complex type)
If floatingRateIndex is not “CNY-CNREPOFIX=CFXS-Reuters”, the frequency specified in calculationPeriodFrequency must divide
precisely the schedule of regular periods from the first regular period start date to the last regular period end date. 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.
ird-14 (Mandatory)
English Description:
Context: CalculationPeriodDates (complex type)
If effectiveDate exists and If terminationDate exists, then terminationDate/unadjustedDate must be after effectiveDate/unadjustedDate
XPath Description:
Context: CalculationPeriodDates
[exists(effectiveDate)] [exists(terminationDate)]
terminationDate/unadjustedDate gt effectiveDate/unadjustedDate
ird-16 (Mandatory)
English Description:
Context: CalculationPeriodDates (complex type)
If firstRegularPeriodStartDate exists within any element of type CalculationPeriodDates, then terminationDate/unadjustedDate must be after firstRegularPeriodStartDate
XPath Description:
Context: CalculationPeriodDates
[exists(//element(*, CalculationPeriodDates)/firstRegularPeriodStartDate)]
terminationDate/unadjustedDate gt firstRegularPeriodStartDate
ird-17 (Mandatory)
English Description:
Context: CalculationPeriodDates (complex type)
If lastRegularPeriodEndDate exists, then terminationDate/unadjustedDate must be after lastRegularPeriodEndDate
XPath Description:
Context: CalculationPeriodDates
[exists(lastRegularPeriodEndDate)]
terminationDate/unadjustedDate gt lastRegularPeriodEndDate
ird-18 (Mandatory)
English Description:
Context: CalculationPeriodDates (complex type)
If firstRegularPeriodStartDate exists, and if lastRegularPeriodEndDate exists, then lastRegularPeriodEndDate must be after firstRegularPeriodStartDate
XPath Description:
Context: CalculationPeriodDates
[exists(firstRegularPeriodStartDate)] [exists(lastRegularPeriodEndDate)]
lastRegularPeriodEndDate gt firstRegularPeriodStartDate
ird-20 (Mandatory)
English Description:
Context: CalculationPeriodDates (complex type)
If lastRegularPeriodEndDate exists, then lastRegularPeriodEndDate must be after effectiveDate/unadjustedDate
XPath Description:
Context: CalculationPeriodDates
[exists(lastRegularPeriodEndDate)]
lastRegularPeriodEndDate gt effectiveDate/unadjustedDate
ird-21 (Mandatory)
English Description:
Context: CalculationPeriodDates (complex type)
If firstPeriodStartDate exists, then firstPeriodStartDate/unadjustedDate must be before effectiveDate/unadjustedDate
XPath Description:
Context: CalculationPeriodDates
[exists(firstPeriodStartDate)]
firstPeriodStartDate/unadjustedDate lt effectiveDate/unadjustedDate
ird-22 (Mandatory)
English Description:
Context: CalculationPeriodDates (complex type)
If firstPeriodStartDate exists, and if firstRegularPeriodStartDate exists, then firstPeriodStartDate/unadjustedDate must be before firstRegularPeriodStartDate
XPath Description:
Context: CalculationPeriodDates
[exists(firstPeriodStartDate)] [exists(firstRegularPeriodStartDate)]
firstPeriodStartDate/unadjustedDate lt firstRegularPeriodStartDate
ird-23 (Mandatory)
English Description:
Context: StubCalculationPeriodAmount (complex type)
if stubCalculationPeriodAmount/initialStub exists, the calculationPeriodDates element referenced by the @href attribute of stubCalculationPeriodAmount/calculationPeriodDatesReference contains firstRegularPeriodStartDate
XPath Description:
Context: StubCalculationPeriodAmount
[exists(stubCalculationPeriodAmount/initialStub)]
exists(id(stubCalculationPeriodAmount/calculationPeriodDatesReference/@href)/firstRegularPeriodStartDate)
ird-24 (Mandatory)
English Description:
Context: StubCalculationPeriodAmount (complex type)
finalStub exists if and only if the calculationPeriodDates element referenced by calculationPeriodDates/@href contains a lastRegularPeriodEndDate element
XPath Description:
Context: StubCalculationPeriodAmount
iff(exists(
finalStub), exists(id(
calculationPeriodDates/@href)/
lastRegularPeriodEndDate)
ird-25 (Mandatory)
English Description:
Context: Schedule (complex type)
If step does not exist, then initialValue must not be equal to 0
XPath Description:
Context: Schedule
[not(exists(step))]
initialValue ne 0
ird-27 (Mandatory)
English Description:
Context: MandatoryEarlyTermination (complex type)
cashSettlement/cashSettlementPaymentDate must not exist
XPath Description:
Context: MandatoryEarlyTermination
not(exists(cashSettlement/cashSettlementPaymentDate))
ird-29 (Mandatory)
English Description:
Context: Calculation (complex type)
If compoundingMethod exists, then fixedRateSchedule must not exist
XPath Description:
Context: Calculation
[exists(compoundingMethod)]
not(exists(fixedRateSchedule))
ird-30 (Mandatory)
English Description:
Context: CalculationPeriod (complex type)
unadjustedStartDate exists or adjustedStartDate exists
XPath Description:
Context: CalculationPeriod
exists(unadjustedStartDate) or exists(adjustedStartDate)
ird-31 (Mandatory)
English Description:
Context: CalculationPeriod (complex type)
unadjustedEndDate exists or adjustedEndDate exists
XPath Description:
Context: CalculationPeriod
exists(unadjustedEndDate) or exists(adjustedEndDate)
ird-33 (Mandatory)
English Description:
Context: Fra (complex type)
adjustedTerminationDate must be after adjustedEffectiveDate
XPath Description:
Context: Fra
adjustedTerminationDate gt adjustedEffectiveDate
ird-34 (Mandatory)
English Description:
Context: PaymentCalculationPeriod (complex type)
Either unadjustedPaymentDate or adjustedPaymentDate must exist
XPath Description:
Context: PaymentCalculationPeriod
exists(unadjustedPaymentDate) or exists(adjustedPaymentDate)
ird-35 (Mandatory)
English Description:
Context: PaymentDates (complex type)
If firstPaymentDate exists, and if lastRegularPaymentDate exists, then firstPaymentDate must be before lastRegularPaymentDate
XPath Description:
Context: PaymentDates
[exists(firstPaymentDate)] [exists(lastRegularPaymentDate)]
firstPaymentDate lt lastRegularPaymentDate
ird-36 (Mandatory)
XPath Description:
Context: PaymentDates
[exists(firstPaymentDate)] [exists(lastRegularPaymentDate)]
The period defined by the dates firstPaymentDate and lastRegularPaymentDate must be an integer multiple of paymentFrequency
ird-39 (Mandatory)
English Description:
Context: EarlyTerminationEvent (complex type)
adjustedExerciseDate must be before or equal to adjustedEarlyTerminationDate
XPath Description:
Context: EarlyTerminationEvent
adjustedExerciseDate le adjustedEarlyTerminationDate
ird-40 (Mandatory)
English Description:
Context: EarlyTerminationEvent (complex type)
adjustedExerciseDate must be before or equal to adjustedCashSettlementValuationDate
XPath Description:
Context: EarlyTerminationEvent
adjustedExerciseDate le adjustedCashSettlementValuationDate
ird-41 (Mandatory)
English Description:
Context: EarlyTerminationEvent (complex type)
adjustedCashSettlementValuationDate must be before or equal to adjustedCashSettlementPaymentDate
XPath Description:
Context: EarlyTerminationEvent
adjustedCashSettlementValuationDate le adjustedCashSettlementPaymentDate
ird-42 (Mandatory)
English Description:
Context: ExtensionEvent (complex type)
adjustedExerciseDate must be before adjustedExtendedTerminationDate
XPath Description:
Context: ExtensionEvent
adjustedExerciseDate lt adjustedExtendedTerminationDate
ird-43 (Mandatory)
English Description:
Context: FxLinkedNotionalAmount (complex type)
At least one element must exist
XPath Description:
Context: FxLinkedNotionalAmount
count(//*) ge 1
ird-44 (Mandatory)
English Description:
Context: MandatoryEarlyTerminationAdjustedDates (complex type)
adjustedEarlyTerminationDate must be before or equal to adjustedCashSettlementValuationDate must be before or the same as adjustedCashSettlementPaymentDate
XPath Description:
Context: MandatoryEarlyTerminationAdjustedDates
adjustedEarlyTerminationDate le adjustedCashSettlementValuationDate le adjustedCashSettlementPaymentDate
ird-46 (Mandatory)
English Description:
Context: OptionalEarlyTermination (complex type)
The cashSettlement/cashSettlementValuationDate/dateRelativeTo/@href attribute is equal to the cashSettlement/cashSettlementPaymentDate/@id attribute
XPath Description:
Context: OptionalEarlyTermination
[exists(cashSettlement/cashSettlementValuationDate)]
cashSettlement/cashSettlementValuationDate/dateRelativeTo/@href eq cashSettlement/cashSettlementPaymentDate/@id
ird-47 (Mandatory)
English Description:
Context: OptionalEarlyTermination (complex type)
The cashSettlement/cashSettlementPaymentDate/relativeDate/dateRelativeTo/@href attribute is equal to the americanExercise/@id, bermudaExercise/@id or europeanExercise/@id, whichever one exists
XPath Description:
Context: OptionalEarlyTermination
[exists(cashSettlement/cashSettlementPaymentDate)]
cashSettlement/cashSettlementPaymentDate/relativeDate/dateRelativeTo/@href eq (americanExercise/@id, bermudaExercise/@id, europeanExercise/@id)
ird-48 (Mandatory)
English Description:
Context: Swaption (complex type)
The cashSettlement/cashSettlementPaymentDate/relativeDate/dateRelativeTo/@href attribute is equal to the @id attribute of americanExercise, bermudaExercise or europeanExercise, whichever one exists
XPath Description:
Context: Swaption
[exists(cashSettlement/cashSettlementPaymentDate)]
cashSettlement/cashSettlementPaymentDate/relativeDate/dateRelativeTo/@href eq (americanExercise/@id, bermudaExercise/@id, europeanExercise/@id)
ird-49 (Mandatory)
English Description:
Context: ResetFrequency (complex type)
weeklyRollConvention should exist if and only if the period is "W"
XPath Description:
Context: ResetFrequency
iff(exist
weeklyRollConvention, period eq "
W")
ird-57 (Mandatory)
English Description:
Context: CalculationPeriodFrequency (complex type)
When the period is "M" or "Y," the rollConvention cannot be a week day, "NONE" or "SFE"
XPath Description:
Context: CalculationPeriodFrequency
[period eq ("M", "Y")]
not(rollConvention = ("NONE", "SFE", "MON", "TUE", "WED", "THU", "FRI", "SAT","SUN"))
ird-58 (Mandatory)
English Description:
Context: CalculationPeriodFrequency (complex type)
When the period is "W", the rollConvention must be a week day, "SFE" or "NONE"
XPath Description:
Context: CalculationPeriodFrequency
[ period eq "W"]
rollConvention = ("NONE", "SFE", "MON", "TUE", "WED", "THU", "FRI", "SAT","SUN")
ird-59 (Mandatory)
English Description:
Context: InterestRateStream (complex type)
If resetDates exists, in resetDates/calculationPeriodDatesReference, the @href attribute is equal to the @id attribute of calculationPeriodDates in the same swapStream
XPath Description:
Context: InterestRateStream
[exists(resetDates)]
id(resetDates/calculationPeriodDatesReference/@href) is calculationPeriodDates
ird-60 (Mandatory)
English Description:
Context: CalculationPeriodFrequency (complex type)
When the period is "T", the rollConvention must be "NONE"
XPath Description:
Context: CalculationPeriodFrequency
[ period ="T"]
rollConvention eq "NONE"
ird-61 (Mandatory)
English Description:
Context: NonNegativeSchedule (complex type)
If step does not exist, then initialValue must not be equal to 0
XPath Description:
Context: NonNegativeSchedule
[not(exists(step))]
initialValue ne 0
Deprecated rules
Removed rules
ird-15 (Mandatory)
REMOVED:
Context: CalculationPeriodDates; condition: exists(firstPeriodStartDate)
Description:terminationDate/unadjustedDate gt firstPeriodStartDate/unadjustedDate
Rationale for removal: ird-14 and ird-21 make ird-15 redundant
ird-19 (Mandatory)
REMOVED:
Context: CalculationPeriodDates; conditions: exists(firstPeriodStartDate), exists(lastRegularPeriodEndDate)
Description: lastRegularPeriodEndDate gt firstPeriodStartDate/unadjustedDate
Rationale for removal: ird-20 and ird-21 make ird-19 redundant
ird-26 (Mandatory)
REMOVED:
Context: BusinessCentersReference; Description: The @href attribute must match the @id attribute of a businessCenters element somewhere within the document.
Rationale for removal: the rule has been replaced by the reference rule number 39 (ref-39)
ird-28 (Mandatory)
REMOVED:
Context: MandatoryEarlyTermination; Description: If cashSettlement/cashSettlementValuationDate exists, the cashSettlement/cashSettlementValuationDate/dateRelativeTo/@href attribute is equal to the mandatoryEarlyTerminationDate/@id attribute.
Rationale for removal: the rule has been replaced by the reference rule number 38 (ref-38)
ird-32 (Mandatory)
REMOVED:
Context: Discounting; Description: If discountRate is absent then discountRateDayCountFraction must also be absent.
Rationale for removal: the rule has been replaced by a schema constraint.
ird-38 (Mandatory)
REMOVED:
Context: StubCalculationPeriodAmount; Description: Either initialStub or finalStub must exist.
Rationale for removal: the rule has been replaced by a schema constraint.
ird-55 (Mandatory)
REMOVED:
Context: InterestRateStream
Description: The paymentDates/calculationPeriodDatesReference/@href attribute is equal to the calculationPeriodDates/@id attribute.
Rationale for removal: the rule is an uneeded subset of reference rule number 8 (ref-8)
ird-56 (Mandatory)
REMOVED:
Context: InterestRateStream;
Condition: [exists(paymentDates/resetDatesReference)] [exists(resetDates)];
Description: The paymentDates/resetDatesReference/@href attribute is equal to the resetDates/@id.
Rationale for removal: the rule is an uneeded subset of reference rule number 12 (ref-12)