Skip to content

CDM Smart Contract Step 7: Adjust the Observation Dates #4414

@lukebanas

Description

@lukebanas

Background

The purpose of this issue is to implement Smart Contract Step 7 - Adjust the Observation Dates. Please refer to previous issues for an explanation of the Smart Contract process.

This is the seventh Smart Contract Step in the Interest Rate Reset Smart Contract process, the purpose of which is to determine and persist the list of one or more Adjusted Observation Dates that stem from the generated list of unadjusted observation dates of the sixth step.

Note: In this proposal we use the term “adjusted” in conjunction with dates or periods that have been adjusted by the applicable business day convention(s) or calculation methodology(ies).

By automating this step, downstream processes can function smoothly, as the observation of market rates hinges on the correct list of Adjusted Observation Dates obtained in this step.

Proposal

Objective

Implement Smart Contract Step 7 – Adjust the Observation Dates as an executable Smart Contract Step within the Reset Instruction Smart Contract. The step must:

  1. Use of the placeholder function (For Reset Date)
  • Function Name: GetNonBusinessDates
  • Takes either a list of one or more dates or a period, along with the applicable business centre to provide a list of non-business days to use for adjusting.
  • This function will be addressed in a separate issue
  • This is necessary in this step to be able to apply the correct business day Fixing Day Offset for Single Observation FROs.
  1. Use of the placeholder function (For Unadjusted Observation Dates)
  • Function Name: GetNonBusinessDates
  • Takes either a list of one or more dates or a period, along with the applicable business centre to provide a list of non-business days to use for adjusting.
  • This function will be addressed in a separate issue
  • This is necessary in this step to be able to apply the correct business day Lookback Shift for Multiple Observation FROs.

Note: Points (1) and (2) above are expected to call the same placeholder function. Depending on whether the Floating Rate Index requires Single or Multiple Observations, (1) or (2) will apply, respectively.

  1. Process the step:
  • Take the Unadjusted Observation Dates obtained in Step 6.
  • If the Floating Rate Index requires Single Observation:
    • Using the list of non-business dates related to the Reset Date, apply the Fixing Day Offset, if present, to the single Unadjusted Observation Date.
  • If the Floating Rate Index requires Multiple Observations:
    • First, using the list of non-business dates related to the Observation Dates, apply the Fixing Day Offset, if present, to the start and end dates of the Unadjusted Observation Dates.
    • Second, Using the list of non-business dates related to the Observation Dates, apply the Lookback Shift, if present, to the fixing date adjusted start and end dates of the Unadjusted Observation Dates.
    • Using the list of non-business dates related to the Observation Dates, adjust all of the dates in the middle following the Preceding Business Day Convention.
    • Repeat any day gaps in the list of dates with the previous date in the list in order to have the same number of dates as the number of calendar days in the period.
  • If the Floating Rate Index requires Index Level Observations:
    • Return the start and end dates of the Unadjusted Observation Dates

Scope

To implement an executable Smart Contract Step. To do this, the process is broken down into two parts:

  1. Use of the placeholder function:
  • Function Name: GetNonBusinessDates
  • (1) The Unadjusted Observation Dates from Step 6 and their Applicable Business Centers are used to obtain a list of applicable non business dates.
  • (2) The Reset Date and its Applicable Business Centers are used to obtain a list of applicable non business dates.
  • The results from (1) & (2) can differ, as the business centers applicable to the observation dates and the reset date can also be different.
  • This function will be addressed in separate issue. Note that the design and development of these functions are beyond the scope of this work and are included only for indicative purposes.
  1. Creating the Instruction
  • Step Name: AdjustObservationDates
  • Instruction Function: Create_AdjustObservationDatesInstruction
  • Purpose:
    • Receive the following:
      • The Unadjusted Observation Dates
      • The Fixing Day Offset, if present
      • The Lookback Shift, if present
      • The Category of the Floating Rate Index
      • The Style of the Floating Rate Index
      • The Method of the Floating Rate Index, if present
      • The Non-Business Dates related to the Calculation Period, if required.
      • The Non-Business Dates related to the Reset Date, if required.
    • Depending on whether the Floating Rate Index is Single Observation, Multiple Observation, or Compounded Index, three different routes can be chosen:
      • For Multiple Observation, apply first the Fixing Day Offset (if present) and second the Lookback Shift (if present), to the Observation Dates, and then adjust any dates within the period start and end to valid business days, filling any resulting gaps with the immediately preceding date
      • For Single Observation, apply Fixing Day Offset (if applicable) to the Unadjusted Observation Date (the Adjusted Reset date).
      • For Index Level Observation, return the first and last of the Unadjusted Observation Dates. Note that Index Level Observation dates have already been adjusted as part of the Calculation Period adjustments and do not require further adjustment.
    • Store the resulting list of one or more Adjusted Observation Dates in an AdjustObservationDatesInstruction type, which will be used to generate the Smart Contract Step and persist the output of this step in the Smart Contract History as the reference for subsequent steps

Inputs to Create_AdjustObservationDatesInstruction

  • The Unadjusted Observation Dates, extracted from the Smart Contract History in Step 6 (Determine Unadjusted Observation Dates)
  • The Fixing Day Offset, extracted from the Workflow Step if present, else from the Smart Contract History in Step 2
  • The Lookback Shift, extracted from the Workflow Step (if exists)
  • The Category of the Floating Rate Index, extracted from the Smart Contract History in Step 2
  • The Style of the Floating Rate index, extracted from the Smart Contract History in Step 2
  • The Index Method of the Floating Rate Index, extracted from the Smart Contract History in Step 2
  • The Calculation Period Non Business Dates, extracted from an external API call using the business centers specific to the Calculation Period
  • The Reset Date Non Business Dates, extracted from an external API call using the business centers specific to the Reset Date

Process

  1. The instruction is created using the Create_AdjustObservationDatesInstruction function with the below input:
    • unadjustedObservationDates date (0..*)
    • fixingDayOffset Offset (0..1)
    • lookbackShift OffsetCalculation (0..1)
    • category FloatingRateIndexCategoryEnum (1..1)
    • style FloatingRateIndexStyleEnum (0..1)
    • method FloatingRateIndexCalculationMethodEnum (0..1)
    • nonBusinessDatesCalculationPeriod date (0..*)
    • nonBusinessDatesResetDate date (0..*)
  2. To discern between Single Observation versus Multiple Observation vs Index Level Observation, the Category, Style, and Method are observed:
    • If the Floating Rate Index is a Category of Screen Rate and does not have a Style of Overnight, and the Method is absent, then the Floating Rate Index is Single Observation. In this case, the Fixing Day Offset (if present) is applied to the single Unadjusted Observation Date, and the business-day shifted date is returned as the output of this instruction. To apply the Fixing Day Offset, the Reset non-business dates list is utilised.
    • If the Floating Rate Index is (1) a Category of Calculated Rate, it has a Style of Average FRO, Compounded FRO, and a Method of OIS Compounding or Overnight Averaging, or (2) a Category of Screen Rate and a Style of OvernightRate then the Floating Rate Index is Multiple Observation.. In this case:
      1. First, the Fixing Day Offset (if present) is applied to the start and end dates of the Unadjusted Observation Dates. To apply the Fixing Day Offset, the Calculation Period non-business dates list is utilised.
      2. Second, the Lookback Shift (if present) is applied to the Fixing Day-adjusted start and end dates of the Unadjusted Observation Dates. To apply the Lookback Shift, the Calculation Period non-business dates list is utilised.
      3. The dates contained within the shifted start and end dates of the observation dates are all adjusted as per the non-business days applicable to the calculation period following the preceding business day convention.
      4. Any day gaps resulting from adjusting the middle dates are filled with the immediately preceding date, such that the total number of resulting Adjusted Observation Dates is equal to the number of calendar days in the period. * If the Floating Rate Index is a Category of Calculated Rate, has a Style of Compounded Index, and a Method of Compounded Index Method, then the Floating Rate Index is Compounded Index. In this case, the first and last date contained in the Unadjusted Observation Dates are returned as the output of this instruction.
  3. The generated instruction is then used to create the Smart Contract Step, which records the list of one or more Adjusted Observation Dates in the Smart Contract History

Outputs

  • Smart Contract containing:
    • A New Smart Contract Step
      • Smart Contract Step Identifier
      • The DetermineUnadjustedObservationDates Instruction
    • Trade Identifier
    • Smart Contract Type
    • Smart Contract Identifier
    • Smart Contract History
      • List of one or more Adjusted Observation Dates

Compatibility

This is a new model proposal and so should not affect the existing

Release

TBC

Additional Context

Smart Contract TaskForce

Metadata

Metadata

Assignees

Labels

No labels
No labels

Projects

Status

Current

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions