Calibrating Policy-Rate Expectations from FRA Quotes
Summary
The document outlines how to infer a short-term rate curve, and potentially policy-rate expectations, from forward rate agreement quotes when meeting dates do not line up with FRA accrual periods. It recommends constructing a discount curve with nodes at relevant dates and using log-linear interpolation, which corresponds to constant overnight forward rates between nodes. A multivariate solver calibrates discount factors to the observed FRA rates; simple bootstrapping may struggle with the misaligned dates.
The example uses multiple FRA instruments and market quotes to fit the curve, while emphasizing that date conventions and instrument specifications must be set correctly. The resulting curve can reprice the input FRAs, but that fit does not make policy predictions precise. Quotes rounded to two decimal places and their dispersion leave uncertainty in interpreting implied central-bank actions, and a possible spread between interbank rates and the central-bank deposit rate is assumed constant in the setup.
Key ideas
- FRA accrual dates may not align with central-bank meeting dates, complicating direct bootstrapping.
- A discount curve can be calibrated by solving for discount factors that reprice the observed FRAs.
- Log-linear interpolation represents constant overnight forward rates between curve nodes.
- Date conventions and instrument specifications are important to a stable calibration.
- A curve that fits FRA quotes can still imply uncertain policy expectations when market quotes are noisy.
Tags
Full text
# STIR Topic: How to calculate implied policy rate for next meetings using FRA
# STIR Topic: How to calculate implied policy rate for next meetings using FRA
Here a question about market implied rate using FRA: In some countries, like Poland, Hungary, Czech and South Africa, you have only FRA to find the zero rate for maturity less than 1 year. Here a example for Poland.
Using this data and knowing that the day convention of fixed leg is Act/365 and pay annualy, the float leg is Act/360 and pay quarterly, the today policy rate is 5.75 and the next meetings are 9-May-24, 5-Jun-24, 3-Jul-24, 4-sep-24, 2-oct-24 and 6-nov-24, how can I find what are the rates implied in next meetings? I have been trying to compound the rate between meetings with a bump in each meeting in order to match the fra rate, but this has not worked.
## Answer by Attack68 (score 2)
https://quant.stackexchange.com/a/78938
First you need to realise that the dates of your FRA do not align with the dates of the meetings meaning that in order to derive the underlying curve which can replicate your FRA rates is probably best solved by a more general multi-variate solver. A bootstrapping technique would struggle to do this.
Second you are aiming to produce a curve with constant overnight forward rates (log-linear interpolation) between meeting dates which reflect your central bank policy rates (probably plus/minus some basis between IBOR and the central bank deposit rate, but lets assume that basis is constant over time so we can ignore it).
You need to then build this curve, using discount factors:
```
# Python
from rateslib import *
curve = curve = Curve(
nodes={
dt(2024, 4, 11): 1.0,
dt(2024, 5, 9): 1.0,
dt(2024, 6, 5): 1.0,
dt(2024, 7, 3): 1.0,
dt(2024, 9, 4): 1.0,
dt(2024, 10, 2): 1.0,
dt(2024, 11, 6): 1.0,
dt(2025, 1, 16): 1.0,
},
interpolation="log_linear",
convention="act360",
)
```
All of the discount factors are initialised to 1.0 becuase we will use a solver to calibrate them to market prices of the FRAs.
```
solver = Solver(
curves=[curve],
instruments=[
FRA(effective=dt(2024, 4, 11), termination="3m", spec="eur_fra3", curves=curve),
FRA(effective=dt(2024, 5, 13), termination="3m", spec="eur_fra3", curves=curve),
FRA(effective=dt(2024, 6, 11), termination="3m", spec="eur_fra3", curves=curve),
FRA(effective=dt(2024, 7, 11), termination="3m", spec="eur_fra3", curves=curve),
FRA(effective=dt(2024, 8, 12), termination="3m", spec="eur_fra3", curves=curve),
FRA(effective=dt(2024, 9, 11), termination="3m", spec="eur_fra3", curves=curve),
FRA(effective=dt(2024, 10, 11), termination="3m", spec="eur_fra3", curves=curve),
],
s=[5.86, 5.87, 5.84, 5.83, 5.82, 5.78, 5.74]
)
SUCCESS: `func_tol` reached after 4 iterations (levenberg_marquardt), `f_val`: 7.95e-18, `time`: 9.1ms
```
This curve now reprices all of your FRAs. It is completely specified because there were 7 discount factors to solve and 7 FRA prices input with maturities that fell within appropriate windows to prevent any issues. Note one must be careful with date and instrument specification to avoid issues which lead to solver errors.
Your curve looks like this:
I dont personally think this is entirely informative, but your FRAs were to 2 decimal places and relatively close together and the second was higher than the first so all points of this curve are entirely explainable. But I think there is quite a lot of noise in your FRA prices and it leaves a fair amount of uncertainty in predicting central bank actions from that data.Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)
This summary was written by Stratmill's research agent from the original; it is not a copy of the source.