Observations

Equity forward payoff

The payoff of financial derivatives depends on the performance of a certain underlying in the future. As an example, consider an equity forward contract where a party agrees to purchase one stock of Apple at a predetermined date and price in the future. The contract buyer will make a profit if the market price of the stock is greater than the purchase price they pay (and make a loss otherwise).

This payoff can be written as follows

    maturity = date 2023 Aug 31
    c = when (at maturity) $ scale (Observe "AAPL" - Const 195.0) $ one "USD"

    acquisitionDate = date 2023 Aug 01

In this example, the predetermined purchase price (strike price) is 195 USD.

Observe "AAPL" is used to represent the time-dependent market price of Apple, which is unknown at trade inception.

When lifecycling the claim at maturity, we must provide the observed market value for the observable AAPL in order to resolve the claim’s cashflows.

    observations =
      [
        ("AAPL", [(date 2023 Aug 31, 200.0)])
      ]

This yields the expected payoff

"--- EFFECT on 2023-08-31 ---"
"TARGET INSTRUMENT : MyClaim version 0"
"RECEIVING"
" => 5.0 USD"
"GIVING"

You can change the stock’s observed value in the script and see how this impacts the generated cashflows.

As you might have realised, the multiplying factor within a scale builder does not have to be a constant or deterministic quantity. It is a generic Observation, which is a combination of known amounts (built with Const) and market observables (built with Observe). These building blocks can be combined together using standard algebraic operations (+, -, * , /).

In the example above, once the maturity date is reached the sub-claim scale (Observe "AAPL" - Const 195.0) $ one "USD" is acquired and the value of the observation is looked up in the table for that maturity date.

Floating Rate Note

There are cases where we want to explicitly specify the date at which a market observable is evaluated. Take for example the case of a Floating Rate Note, which is a financial instrument that pays a floating coupon based on an interest rate value observed a few days earlier.

An example of such payoff is the following

    maturity = date 2023 Aug 31
    observation =  ObserveAt "USD_LIBOR_3M" (date 2023 Aug 10) * Const 1000000.0
    c = when (at maturity) $ scale observation $ one "USD"

    acquisitionDate = date 2023 Aug 01

where

  • we observe the value of the 3 month US Dollar LIBOR rate on 10 Aug 2023
  • we pay a coupon for that rate on 31 Aug 2023

The ObserveAt observation builder is used to specify when the rate should be observed. In order to lifecycle the claim at maturity we must include the rate observation in the table

    observations =
      [
        ("USD_LIBOR_3M", [(date 2023 Aug 10, 0.0563)])
      ]

which then yields to the expected payout

"--- EFFECT on 2023-08-31 ---"
"TARGET INSTRUMENT : MyClaim version 0"
"RECEIVING"
" => 56300.0 USD"
"GIVING"

Interest Rate Swap

As an exercise, try to model

  • a fixed-for-floating interest rate swap, where the claim owner receives coupons based on a floating rate in exchange for fixed rate coupons.
  • a basis rate swap, where the owner receives coupons based on 3 month US Dollar LIBOR and pays coupons based on 6 month US Dollar LIBOR to their counterparty

Summary

You now know how to setup payoffs containing complex time-dependent market observables. You have the tools to model a large set of financial products, such as forwards and most interest rate swap variations.