Skip to content
All library documents

Business-Day and Calendar-Day Conventions in Curve Discount Factors

Article Quant Q&A · Author: leo52353

Summary

The document examines why changing a Brazilian DI futures curve's day-count convention can change discount factors even when the instruments, quoted rates, and solver settings are held fixed. Its answer points to the difference between BUS/252, which accrues over business days, and conventions based on calendar days. Weekends and local holidays reduce the accrued-day count; clusters of holidays can make the effect especially pronounced over short periods.

The response also explains why the denominator used by BUS/252 does not exactly compensate for the fewer accruing days relative to calendar-day conventions. As a result, the period fractions can differ materially, changing the rates or time coordinates used in curve construction and interpolation, and therefore the queried discount factors. The example contrasts BUS/252 with Act/360 in a curve built from Brazilian instruments. The explanation is specific to day-count mechanics and the curve setup; it does not quantify how much of the observed difference comes from interpolation versus accrual conventions.

Key ideas

  • BUS/252 counts accruing business days, excluding weekends and relevant holidays.
  • Calendar-day conventions count time differently, so the same dates can produce different year fractions.
  • The BUS/252 denominator does not exactly offset its shorter accrual numerator.
  • Different period fractions can lead to different fitted or interpolated discount factors.
  • Holiday clustering can make convention differences conspicuous over short periods.

Tags

Full text
# rateslib curves: Why does changing day count convention affect discount factors?


# rateslib curves: Why does changing day count convention affect discount factors?












I'm using the rateslib Python package to build a yield curve from Brazilian DI1 futures using piecewise/spline interpolation. My expectation was that changing the day count convention of the curve itself (e.g. from 'bus252' to 'act360') wouldn't affect the discount factors much, assuming the instruments and rates used to solve the curve are unchanged.

However, when I change the convention of the curve from 'bus252' to 'act360', I get noticeably different discount factors when querying the curve at the same date.

For example,

```
mixed_curve[dt.datetime(2026, 6, 24)]
```

returns:

0.871460 for convention='bus252' 0.869912 for convention='act360'

Here’s the curve setup code (plot for the code also attached):

```
di1_info = {'N25': 14.90, 'Q25': 14.91, 'U25': 14.93, 'V25': 14.94, 'X25': 14.94, 'Z25': 14.94, 'F26': 14.94, 'G26': 14.94, 'H26': 14.92, 
            'J26': 14.90, 'K26': 14.83, 'M26': 14.80, 'N26': 14.73, 'V26': 14.48, 'F27': 14.21, 'J27': 14.00, 'N27': 13.79, 'V27': 13.61,
            'F28': 13.46, 'J28': 13.37, 'N28': 13.34, 'V28': 13.33, 'F29': 13.32, 'J29': 13.33, 'N29': 13.35, 'V29': 13.35, 'F30': 13.39, 
            'J30': 13.41, 'N30': 13.43, 'F31': 13.48, 'F32': 13.55, 'F33': 13.58, 'F34': 13.58, 'F35': 13.61
            }
...

bra = rateslib.Cal(holidays=[dat.strptime(_, "%Y-%m-%d") for _ in di1_pricing_holidays], week_mask=[5, 6])

mixed_curve = rateslib.curves.Curve(
    nodes= discount_estimate_nodes,
    interpolation="log_linear",
    t = t,
    id="mixed_curve",
    calendar = bra,
    convention='Act360'
)

zcs_args = dict(frequency="A", calendar=bra, curves="mixed_curve", currency="brl", convention="bus252")
instruments = []

for element in di1_intervals:
   date1 = dt.datetime(element[0].year, element[0].month, element[0].day)
   date2 = dt.datetime(element[1].year, element[1].month, element[1].day)
   instruments.append(rateslib.ZCS(date1, date2, **zcs_args))

solver = rateslib.Solver(
    curves=[mixed_curve],
    instruments=instruments,
    s=di1_rates,
    algorithm  = "levenberg_marquardt"
)
```

My question: Why does changing the convention parameter of the curve object change the resulting discount factors, even when all instrument inputs and solver settings are unchanged?

## Answer by Dimitri Vulis (score 2)

https://quant.stackexchange.com/a/83702

besides the interpolation, Brazilian BUS/252 behaves differently from other daycounts, that accrue on calendar days, in that: the numerator of the period fraction has at least $\frac{2}{7}\approx.29$ fewer days, because Saturdays and Sundays are not accruing. There are also many Brazil holidays that sometimes cluster. For example, the Carnival is Monday through (Ash) Wednesday; and both Good Friday and Easter Monday are not accruing.

The denominator is $\frac{365-252}{365}\approx.31$ which doesn't exactly offset the difference in days of accrual. The fraction for a short period that also includes Brazil holidays can turn out to be surprisingly different from 30/360 or Actual/365.

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.