Skip to content

Day Counters

The DayCounter enum provides standard day count conventions used in financial calculations.

Available conventions

Value Description
ACT/360 Actual days over 360
ACT/365 Actual days over 365
30/360 30-day months over 360 (US/NASD convention)
30E/360 30-day months over 360 (European convention: end date always capped at 30)
ACT/ACT Actual days over actual days in the year
BUS/252 Business days over 252 (Brazilian convention)

Usage

from ccy import DayCounter
from datetime import date

start = date(2024, 1, 1)
end = date(2024, 7, 1)

dc = DayCounter.ACT360
print(dc.count(start, end))   # 182.0
print(dc.dcf(start, end))     # 0.5055...

Instantiate from its string value:

dc = DayCounter("ACT/365")
print(dc.dcf(start, end))     # 0.4986...

Iterate over all conventions:

for dc in DayCounter:
    print(dc.value, dc.dcf(start, end))

Class reference

ccy.core.daycounter.DayCounter

Bases: StrEnum

Day count convention types

ACT360 class-attribute instance-attribute

ACT360 = 'ACT/360'

ACT365 class-attribute instance-attribute

ACT365 = 'ACT/365'

THIRTY360 class-attribute instance-attribute

THIRTY360 = '30/360'

THIRTYE360 class-attribute instance-attribute

THIRTYE360 = '30E/360'

ACTACT class-attribute instance-attribute

ACTACT = 'ACT/ACT'

BUS252 class-attribute instance-attribute

BUS252 = 'BUS/252'

dcf

dcf(start, end)

Day count fraction between 2 dates

Source code in ccy/core/daycounter.py
def dcf(self, start: date, end: date) -> float:
    """Day count fraction between 2 dates"""
    match self:
        case DayCounter.ACT360:
            return count_days(start, end) / 360.0
        case DayCounter.ACT365:
            return count_days(start, end) / 365.0
        case DayCounter.THIRTY360:
            return _thirty_360(start, end)
        case DayCounter.THIRTYE360:
            return _thirty_e360(start, end)
        case DayCounter.ACTACT:
            return _act_act_years(end) - _act_act_years(start)
        case DayCounter.BUS252:
            return count_days(start, end) / 252.0
        case _:
            raise ValueError(f"Unknown day counter: {self}")

Methods

count(start, end) -> float

Returns the number of days between two dates. Accepts both date and datetime objects.

from datetime import datetime, timezone

start = datetime(2024, 1, 1, 9, 0, tzinfo=timezone.utc)
end = datetime(2024, 1, 2, 15, 0, tzinfo=timezone.utc)

DayCounter.ACT360.count(start, end)  # 1.25

dcf(start, end) -> float

Returns the day count fraction — the period length expressed as a fraction of a year, according to the convention.

start = date(2024, 1, 1)
end = date(2025, 1, 1)

DayCounter.ACT365.dcf(start, end)   # 1.0027... (366 days / 365)
DayCounter.ACT360.dcf(start, end)   # 1.0166... (366 days / 360)
DayCounter.ACTACT.dcf(start, end)   # 1.0 (spans exactly one year)
DayCounter.THIRTY360.dcf(start, end) # 360.0 (30/360 raw result)