Interpreting the 1/1 Day Count for Zero-Coupon Inflation Swaps
Summary
The question investigates why a USD zero-coupon inflation swap’s fixed-leg payment can remain unchanged when its maturity date moves by a few days, then jump to the next annual compounding amount. The answer proposes interpreting the 1/1 convention through a schedule of annual pseudo-periods, each assigned a day-count fraction of one. Under this explanation, dates that do not create another schedule period leave the total accrual unchanged.
The examples show a three-year schedule with three annual periods and a short end stub that adds a fourth period with a full unit of accrual, despite covering only a few days. Business-day adjustments can also affect the displayed accrual dates. This is an illustrative reconstruction based on typical cash-flow representation and schedule behavior, not a definitive market-standard rule for all systems or maturities. The answer does not fully explain sub-year maturities, which were part of the original question.
Key ideas
- The answer interprets 1/1 accrual as annual pseudo-periods with a day-count fraction of one each.
- A maturity change can leave the accrual unchanged until it creates an additional schedule period.
- A short stub may contribute a full unit of accrual under the illustrated schedule construction.
- Business-day adjustments can influence the schedule dates shown by a pricing tool.
- The explanation is illustrative and leaves sub-year cases unresolved.
Tags
Full text
# Calculating 1/1 daycount convention for inflation swaps
# Calculating 1/1 daycount convention for inflation swaps
I'm looking at zero-coupon inflation swaps on USD and apparently those are defined with the 1/1 daycount convention on the fixed coupon leg. I've never seen it anywhere before and trying to understand what it means.
By reverse-engineering the tool I'm looking at, I can see that if I input exactly a 10Y maturity, I get the fixed coupon leg payment (1 + c)^10 - 1, with exact match. Now when I move the maturity date by a couple of days, the payment doesn't change by a cent.
Then after moving by something like 8~10 days, the coupon suddenly changes and its value turns out to be exactly (1 + c)^11 - 1. Even though I'm only a few days away from 10Y...
This convention is very strange. How does it determine when to move from 10 to 11? And what is it when the maturity is less than 1Y?
## Answer by Attack68 (score 2)
https://quant.stackexchange.com/a/83940
Judging by the typical Bloomberg cashflow representation for ZCIS it seems to construct pseudo-periods within the Zero schedule that it adds up to give the final DCF. Each period has a DCF of exactly 1.0.
This is how I would do the similar calculation:
```
from rateslib import * # Python 3.12, rateslib 2.1.0
s = Schedule(
effective=dt(2024, 3, 6),
termination=dt(2027, 3, 6),
frequency=Frequency.Months(12, None),
modifier="F",
calendar="bus"
)
print(s)
###
freq: 12M (roll: 6), accrual adjuster: F, payment adjuster: 2B,
Period Unadj Acc Start Unadj Acc End Acc Start Acc End Payment
0 Regular 2024-03-06 2025-03-06 2024-03-06 2025-03-06 2025-03-10
1 Regular 2025-03-06 2026-03-06 2025-03-06 2026-03-06 2026-03-10
2 Regular 2026-03-06 2027-03-06 2026-03-06 2027-03-08 2027-03-1
###
```
Notice this schedule has 3 annual periods so the total DCF would be 3.0.
Even if the end date is changed from 6th March '27 to 8th March '27 this stays the same because of holiday day adjustment.
```
s = Schedule(
effective=dt(2024, 3, 6),
termination=dt(2027, 3, 8), # <--- changed
frequency=Frequency.Months(12, None),
modifier="F",
calendar="bus"
)
print(s)
###
freq: 12M (roll: 6), accrual adjuster: F, payment adjuster: 2B,
Period Unadj Acc Start Unadj Acc End Acc Start Acc End Payment
0 Regular 2024-03-06 2025-03-06 2024-03-06 2025-03-06 2025-03-10
1 Regular 2025-03-06 2026-03-06 2025-03-06 2026-03-06 2026-03-10
2 Regular 2026-03-06 2027-03-06 2026-03-06 2027-03-08 2027-03-1
###
```
But once the `Schedule` is forced to add a stub period then the DCF is now 4.0. The two day stub period has a DCF of 1.0
```
s = Schedule(
effective=dt(2024, 3, 6),
termination=dt(2027, 3, 10), # <--- changed
frequency=Frequency.Months(12, None),
modifier="F",
calendar="bus"
stub="shortback",
)
print(s)
###
freq: 12M (roll: 6), accrual adjuster: F, payment adjuster: 2B,
Period Unadj Acc Start Unadj Acc End Acc Start Acc End Payment
0 Regular 2024-03-06 2025-03-06 2024-03-06 2025-03-06 2025-03-10
1 Regular 2025-03-06 2026-03-06 2025-03-06 2026-03-06 2026-03-10
2 Regular 2026-03-06 2027-03-06 2026-03-06 2027-03-08 2027-03-10
3 Stub 2027-03-06 2027-03-10 2027-03-08 2027-03-10 2027-03-12
###
```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.