5
$\begingroup$

I'm building a short end of the libor curve using deposit & fra due to overlapping in dates I get wrong values of Discount factor, here's the data i'm working with:

  • My today date is : 23/10/2019
  • Start of my deposit 6m contract is 25/10/2019 end date is 27/04/2020,day count is act/360 with rate 5%
  • Start of my fra 6x12m contract is 27/04/2020 end date is 27/10/2020,day count conv is act/360 with rate 5.2%

Can someone please explain how to manage that overlapping between deposit and fra? and how to get the right discount factor ?

thanks

$\endgroup$
  • $\begingroup$ Can you please clarify: (1) Where is the date overlap? (2) You got wrong results for Discount Factor compared to what results, where are you getting the "correct" results? $\endgroup$ – Alex C Dec 20 '19 at 22:25
  • $\begingroup$ @AlexC I'm comparing my results to Murex results $\endgroup$ – Gogo78 Dec 24 '19 at 14:20
3
$\begingroup$

There is no overlapping, the first instrument is tied to the LIBOR rate starting at $25/10/2019$, the second one is tied to the LIBOR Rate at $27/04/2020$.

For the sake of clarity, let assume that the spot date and today's date are the same, that there is only one curve (LIBOR Curve).

WE use the definition of the forward rate starting at $T$ and ending at $U$ as $$F(0,T,U)=\frac{1}{U-T}\left(\frac{P(0,T)}{P(0,U)}-1\right)$$

where $P(0,T)$ is the zero-coupon bond paying one unit at time $T$

$T_0= 25/10/2019$,$T_1= 27/04/2020$ , $T_2= 27/10/2020$

We have that $$0.05=\frac{1}{0.5}\left(\frac{1}{P(0,T_1)}-1\right)$$, therefore

$$P(0,T_1)=\frac{1}{1+0.5\times0.05}$$

As for the FRA : $$0.052=\frac{1}{0.5}\left(\frac{P(0,T_1)}{P(0,T_2)}-1\right)$$

Thus, $$P(0,T_2)=P(0,T_1)\frac{1}{1+0.5\times0.052}$$

| improve this answer | |
$\endgroup$
  • 3
    $\begingroup$ I would like to hear the reason of the negative vote. $\endgroup$ – Canardini Dec 20 '19 at 22:24
  • 1
    $\begingroup$ The question was about overlapping. Taking that direction one should also consider how to extrapolate between today and the spot date, which I also ignored here $\endgroup$ – Canardini Dec 23 '19 at 22:40
  • 1
    $\begingroup$ how about the fact that most FRAs are paid on the start date ? hence the need of convexity adjustment? $\endgroup$ – Canardini Dec 23 '19 at 22:42
  • $\begingroup$ Can you please develop more about how to extrapolate between today and the spot date ? Because my question is more about that ... $\endgroup$ – Gogo78 Dec 24 '19 at 10:11
  • 1
    $\begingroup$ The first instrument is the 6m Libor deposit, let say its value is $r_1$. We have that $$r_1=\frac{1}{\delta_{s,1}}\left(\frac{P(0,T_s)}{P(0,T_1)}-1\right)$$ where $T_s$ is the spot date, and $T_1$ the end date of the LIBOR rate.In the simple case, we have two equations and two unknowns $P(0,T_1)$ and $P(0,T_2). In reality, we have three(P(0,T_s) is added), even more, as the start date of the FRA does not have to match with the end date of the deposit. In practice, you would define an interpolator with two parameters (and I hope that is what you do)this will fill the gaps. $\endgroup$ – Canardini Dec 25 '19 at 14:23
2
+25
$\begingroup$

Your rates do not overlap. You have a 6M (185/360) rate of 5%. And a forward rate agreement where the 5.2% rate starts at the end of your initial contract (4/27/20) for a period of 6M (183/360).

Your first contract will earn you (1 + .05*(185/360)) = 1.025694. You will then earn (1 + .052*(183/360)) on that amount, or 1.052807 over the entire period from 10/25/19 to 10/27/20. The 1Yr (10/27/20) discount factor would therefore be the reciprocal of that amount: 1/1.052807 = 0.949842. The 6M (4/27/20) discount factor would be 0.974949. The 6M Forward discount factor (from 10/27/20 to 4/27/20) would be 0.974247.

The money market equivalent discount factor would be 0.95050249, based on 370 days between trade date and the end of the FRA, using a 365 day year. I used 370 days to account for the fact that Libor settles t+2 and you may be trying to account for the 2 days in pricing.

| improve this answer | |
$\endgroup$
  • $\begingroup$ I already applied this method but when I compare it to murex curve there’s differences between my DFs and murex DFs $\endgroup$ – Gogo78 Dec 24 '19 at 10:57
  • $\begingroup$ What does Murex say ? Also can you confirm the currency so that we can be sure of the day count convention e.g. GBP is Act/365. $\endgroup$ – Dom Dec 24 '19 at 19:06
  • $\begingroup$ @Dom i'm using EUR $\endgroup$ – Gogo78 Dec 25 '19 at 11:12
  • $\begingroup$ The results from murex are quite different .... from this results (I've the same as you) .... $\endgroup$ – Gogo78 Jan 6 at 12:32
0
$\begingroup$

There are no overlapping dates because the rate for the 6M deposit is for an investment starting 25/10/2019 and ending 27/04/2020. The rate for the FRA is for an investment starting 27/04/2020 and ending 27/10/2020. That is why you can determine the discount factor (or zero rate) from 25/10/2019 to 27/10/2020, because the return on an investment for these dates has to be the same as the combination of the 6M Deposit and 6x12 FRA.

Here are two possible simple implementations in python that yield the same result to help you figure out where might be the problem.


Using native python:

from datetime import date, timedelta

today = date(2019,10,23)
spot = today + timedelta(days=2)

deposit_maturity = date(2020, 4, 27)
deposit_dcf = (deposit_maturity - spot).days / 360
df1 = 1 / ( 1+ 0.05 * deposit_dcf)

fra_maturity = date(2020, 10, 27)
fra_dcf = (fra_maturity - deposit_maturity).days / 360
df2 = df1 / (1 + 0.052 * fra_dcf)

print(df1, df2)

Output is: 0.974949221394719 0.9498417381171556


Using QuantLib in python:

import QuantLib as ql
today = ql.Date(23,10,2019)
ql.Settings.instance().evaluationDate = today
helpers = []
helpers.append(
    ql.DepositRateHelper(ql.QuoteHandle(ql.SimpleQuote(0.05)),
                              ql.Period(6, ql.Months), 2,
                              ql.TARGET(), ql.Following, False, ql.Actual360())
)
index = ql.Euribor6M()
helpers.append(
    ql.FraRateHelper(ql.QuoteHandle(ql.SimpleQuote(0.052)), 6, index)
)
curve = ql.PiecewiseLogCubicDiscount(2, ql.TARGET(), helpers,
                                            ql.Actual365Fixed())
for dt in curve.dates():
    print(dt, curve.discount(dt))

Output is:

October 25th, 2019 1.0
April 27th, 2020 0.9749492213947191
October 27th, 2020 0.9498417381171556
| improve this answer | |
$\endgroup$
  • $\begingroup$ lets assume there's an overlapping in dates or gap how to manage that ? $\endgroup$ – Gogo78 Jan 5 at 22:43

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.