Title: | Business Days Calculations and Utilities |
Description: | Business days calculations based on a list of holidays and nonworking weekdays. Quite useful for fixed income and derivatives pricing. |
Version: | 1.0.17 |
URL: | https://github.com/wilsonfreitas/R-bizdays |
VignetteBuilder: | knitr |
Suggests: | RQuantLib, timeDate, knitr, testthat, covr, rmarkdown |
Imports: | methods, utils, jsonlite |
Collate: | 'R-bizdays-package.r' 'calendar.R' 'adjust.date.R' 'bizdays.options.R' 'bizseq.R' 'is.bizday.R' 'offset.R' 'bizdiff.R' 'bizdays.R' 'create-calendars.R' 'calendar-export.R' 'getdate.R' 'getbizdays.R' 'load-buildin-calendars.R' 'zzz.R' |
Depends: | R (≥ 4.0.0) |
License: | MIT + file LICENSE |
RoxygenNote: | 7.3.1 |
Encoding: | UTF-8 |
NeedsCompilation: | no |
Packaged: | 2025-01-08 14:00:36 UTC; wilso |
Author: | Wilson Freitas [aut, cre] |
Maintainer: | Wilson Freitas <wilson.freitas@gmail.com> |
Repository: | CRAN |
Date/Publication: | 2025-01-08 15:00:05 UTC |
Business Days Calculations and Utilities
Description
In many countries the standard approach to price derivatives and fixed income
instruments involves the use of business days. In Brazil, for example, the
great majority of financial instruments are priced on business days counting
rules. Given that the use of business days is somehow vital to handle many
tasks. That's the reason why bizdays
came up, to make these tasks
easier.
Excel's NETWORKDAYS is fairly at hand and once you have a list of
holidays it is quite easy to put your data into a spreadsheet and make
things happen.
bizdays
brings that ease to R.
Although R's users have similar feature in packages like RQuantLib
and
timeDate
it doesn't come for free. Users have to do some stackoverflow
in order to get this task accomplished. bizdays
is a tiny package
dramatically focused on that simple task: support calculations involving
business days for a given list of holidays.
bizdays
was designed to work with all common date types and ISO
formatted character strings and all methods have support for vectorized
operations and handle the recycle rule.
Author(s)
Wilson Freitas
See Also
Useful links:
Adjusts the given dates to the next/previous business day
Description
Rolls the given date to the next or previous business day, unless it is a business day.
Usage
adjust.next(dates, cal)
following(dates, cal)
adjust.none(dates, cal)
modified.following(dates, cal)
adjust.previous(dates, cal)
preceding(dates, cal)
modified.preceding(dates, cal)
Arguments
dates |
dates to be adjusted |
cal |
an instance of |
Details
adjust.next
and following
return the next business day if the
given date
is not a business day.
adjust.previous
and preceding
are similar, but return the
previous
business day.
modified.following
rolls the given date to the next business day,
unless
it happens in the next month, in this case it returns the previous business
day.
modified.preceding
is similar to modified.following
, but rolls
the given
date to the previous business day.
Value
Date
objects adjusted accordingly.
Date types accepted
The argument dates
accepts Date
objects and any
object that returns a valid Date
object when passed through
as.Date
, which include all POSIX*
classes and character
objects with ISO formatted dates.
Examples
adjust.next("2013-01-01", "Brazil/ANBIMA")
following("2013-01-01", "Brazil/ANBIMA")
modified.following("2016-01-31", "Brazil/ANBIMA")
adjust.previous("2013-01-01", "Brazil/ANBIMA")
preceding("2013-01-01", "Brazil/ANBIMA")
modified.preceding("2016-01-01", "Brazil/ANBIMA")
Computes business days between two dates.
Description
Returns the amount of business days between 2 dates taking into account the
provided Calendar
(or bizdays.options$get("default.calendar")
).
Usage
bizdays(from, to, cal)
Arguments
from |
the initial dates |
to |
the final dates |
cal |
the calendar's name |
Value
integer
objects representing the amount of business days.
Date types accepted
The arguments from
and to
accept Date
objects and any
object that returns a valid Date
object when passed through
as.Date
, which include all POSIX*
classes and character
objects with ISO formatted dates.
Recycle rule
These arguments handle the recycle rule so vectors of dates can be provided and once those vectors differs in length the recycle rule is applied.
Date adjustment
from
and to
are adjusted when nonworking dates are
provided. Since bizdays
function returns the amount of business days
between 2 dates, it must start and end in business days.
The default behavior, that is defined in Calendar
's instantiation with
adjust.from
and adjust.to
, reproduces the Excel's NETWORKDAYS.
A common and useful setting is adjust.to=adjust.next
which moves
expiring maturities to the next business day, once it is not.
Examples
bizdays("2013-01-02", "2013-01-31", "Brazil/ANBIMA")
# Once you have a default calendar set, cal does not need to be provided
bizdays.options$set(default.calendar = "Brazil/ANBIMA")
bizdays("2013-01-02", "2013-01-31")
dates <- bizseq("2013-01-01", "2013-01-10")
bizdays(dates, "2014-01-31")
bizdays' options
Description
bizdays.options
defines option parameters used internally in
bizdays
.
Usage
bizdays.options
Format
A list
object with methods get
and set
attached to.
Details
Parameters are stored in bizdays.options
using get
and
set
bizdays.options$set(option.key=value) bizdays.options$get("option.key")
bizdays
supports the option default.calendar
.
It defines the default calendar to be used with the
functions: bizdays
, bizdayse
, adjust.next
,
adjust.previous
, is.bizday
, bizseq
, offset
.
Examples
create.calendar(name = "actual")
bizdays.options$set(default.calendar = "actual")
bizdays("2013-07-12", "2013-07-22")
Business days and current days equivalence
Description
bizdayse
stands for business days equivalent, it returns the amount
of business days equivalent to a given number of current days.
Usage
bizdayse(dates, curd, cal)
Arguments
dates |
the reference dates |
curd |
the amount of current days |
cal |
the calendar's name |
Details
Let us suppose I have a reference date dates
and I offset that date
by curd
current days. bizdayse
returns the business days
between the reference date and the new date offset by curd
current
days.
This is equivalent to
refdate <- Sys.Date() curd <- 10 newdate <- refdate + 10 # offset refdate by 10 days # this is equals to bizdayse(refdate, 10) bizdays(refdate, newdate)
Value
An integer
representing an amount of business days.
Date types accepted
The argument dates
accepts Date
objects and any
object that returns a valid Date
object when passed through
as.Date
, which include all POSIX*
classes and character
objects with ISO formatted dates.
Recycle rule
These arguments handle the recycle rule so a vector of dates and a vector of numbers can be provided and once those vectors differs in length the recycle rule is applied.
Examples
bizdayse("2013-01-02", 3, "Brazil/ANBIMA")
Compute the amount of business days between dates
Description
Returns the number of business days between dates in a given vector of dates.
Usage
bizdiff(dates, cal)
Arguments
dates |
a vector containing the dates to be differenced |
cal |
the calendar's name |
Value
A 'numeric' vector of length 'n-1' (where 'n' is the input vector length), containing the business days computed between pairs of dates.
Date types accepted
The arguments from
and to
accept Date
objects and any
object that returns a valid Date
object when passed through
as.Date
, which include all POSIX*
classes and character
objects with ISO formatted dates.
Examples
dates <- c("2017-05-10", "2017-05-12", "2017-05-17")
bizdiff(dates, "Brazil/ANBIMA")
Create a sequence of business days
Description
Returns a sequence of dates with business days only.
Usage
bizseq(from, to, cal)
Arguments
from |
the initial date |
to |
the final date (must be greater than |
cal |
the calendar's name |
Value
A vector of Date
objects that are business days according to the
provided Calendar
.
Date types accepted
The arguments from
and to
accept Date
objects and any
object that returns a valid Date
object when passed through
as.Date
, which include all POSIX*
classes and character
objects with ISO formatted dates.
Examples
bizseq("2013-01-02", "2013-01-31", "Brazil/ANBIMA")
Calendar's holidays and weekdays
Description
Returns calendar's list of holidays and weekdays
Usage
holidays(cal)
## Default S3 method:
holidays(cal)
## S3 method for class 'Calendar'
holidays(cal)
## S3 method for class 'character'
holidays(cal)
## Default S3 method:
weekdays(x, ...)
## S3 method for class 'Calendar'
weekdays(x, ...)
## S3 method for class 'character'
weekdays(x, ...)
Arguments
cal |
character with calendar name or the calendar object |
x |
character with calendar name or the calendar object |
... |
unused argument (this exists to keep compliance with
|
Examples
holidays("actual")
weekdays("actual")
# empty calls return the default calendar attributes
holidays()
weekdays()
Import and export calendars
Description
The calendars can be specified in JSON files and these functions helps with importing and exporting calendars to text files.
Usage
save_calendar(cal, con)
load_calendar(con)
Arguments
cal |
the calendar's name |
con |
a connection object or a character string. |
Details
save_calendar
exports a calendar to a JSON file and
load_calendar
imports.
In load_calenadar
, the con
argument can be a connection object
or a character string specifying either the file or the JSON text.
JSON calendar's specification
Here's an example of a calendar's specification.
{ "name": "Brazil/ANBIMA", "weekdays": ["saturday", "sunday"], "holidays": ["2001-01-01", "2001-02-26", "2001-02-27", "2001-04-13"], "adjust.from": "following", "adjust.to": "preceding" "financial": true, }
Examples
con <- tempfile(fileext = ".json")
save_calendar("actual", con)
load_calendar(con)
Calendars register
Description
Every calendar created with create.calendar
is stored in the
calendar register.
The idea behind this register is allowing calendars to be accessed
by its names.
Usage
calendars()
remove_calendars(cals)
has_calendars(cals)
Arguments
cals |
character vector of calendars names |
Details
calendars
returns the object which represents the calendars register.
Since the register inherits from environment
, the calendars are
retrieved with the [[
operator.
But the register object has its own print
generic which helps listing
all registered calendars.
remove_calendars
remove calendars from the register.
Examples
# ACTUAL calendar
cal <- create.calendar("Actual")
cal <- calendars()[["Actual"]]
remove_calendars("Actual")
# lists registered calendars
calendars()
has_calendars(c("actual", "weekends"))
Creates calendars
Description
create.calendar
creates calendars and stores them in the calendar
register.
Usage
create.calendar(
name,
holidays = integer(0),
weekdays = NULL,
start.date = NULL,
end.date = NULL,
adjust.from = adjust.none,
adjust.to = adjust.none,
financial = TRUE
)
Arguments
name |
calendar's name. This is used to retrieve calendars from register. |
holidays |
a vector of Dates which contains the holidays |
weekdays |
a character vector which defines the weekdays to be used as
non-working days (defaults to |
start.date |
the date which the calendar starts |
end.date |
the date which the calendar ends |
adjust.from |
is a function to be used with the |
adjust.to |
is a function to be used with the |
financial |
is a logical argument that defaults to TRUE.
This argument defines the calendar as a financial or a non
financial calendar.
Financial calendars don't consider the ending business day
when counting working days in |
Details
The arguments start.date
and end.date
can be set but once
they aren't and holidays
is set, start.date
is defined to min(holidays)
and
end.date
to max(holidays)
.
If holidays isn't set start.date
is set to '1970-01-01'
and
end.date
to '2071-01-01'
.
weekdays
is controversial but it is only a sequence of nonworking
weekdays.
In the great majority of situations it refers to the weekend but it is also
possible defining
it differently.
weekdays
accepts a character
sequence with lower case
weekdays (
sunday
, monday
, tuesday
, wednesday
,
thursday
, friday
, saturday
).
This argument defaults to NULL
because the default intended behavior
for
create.calendar
returns an actual calendar, so calling
create.calendar(name="xxx")
returns a actual calendar named xxx.
(for more calendars see
Day Count Convention)
To define the weekend as the nonworking weekdays one could simply
use weekdays=c("saturday", "sunday")
.
The arguments adjust.from
and adjust.to
are used to adjust
bizdays
' arguments
from
and to
, respectively.
These arguments need to be adjusted when nonworking days are provided.
The default behavior, setting adjust.from=adjust.previous
and
adjust.to=adjust.next
,
works like Excel's function NETWORKDAYS, since that is fairly used by a
great number of practitioners.
Calendars register
Every named calendar is stored in a register so that it can be retrieved by
its name (in calendars
).
bizdays' methods also accept the calendar's name on their cal
argument.
Given that, naming calendars is strongly recommended.
See Also
Examples
# ANBIMA's calendar (from Brazil)
holidays <- as.Date(c(
"2015-01-01", "2015-02-16", "2015-02-17", "2015-04-03", "2015-04-21",
"2015-05-01", "2015-06-04", "2015-09-07", "2015-10-12", "2015-11-02",
"2015-11-15", "2015-12-25", "2016-01-01", "2016-02-08", "2016-02-09",
"2016-03-25", "2016-04-21", "2016-05-01", "2016-05-26", "2016-09-07",
"2016-10-12", "2016-11-02", "2016-11-15", "2016-12-25"
))
cal <- create.calendar("ANBIMA",
holidays = holidays,
weekdays = c("saturday", "sunday")
)
# ACTUAL calendar
cal <- create.calendar("Actual")
# named calendars can be accessed by its name
create.calendar(name = "Actual")
bizdays("2016-01-01", "2016-03-14", "Actual")
Obtaining business days using other dates (or month or year) as reference
Description
Calculates the number of business days for some specific periof of a year
or a month.
getbizdays
returns the number of business days according to a
reference than can be another date, a month or an year.
Usage
getbizdays(ref, cal = bizdays.options$get("default.calendar"))
Arguments
ref |
a reference which represents a month or year, where the date has to be found. |
cal |
the calendar's name
|
Examples
# for years
getbizdays(2022:2024, "Brazil/ANBIMA")
# for months
getbizdays("2022-12", "Brazil/ANBIMA")
Obtaining dates using other dates (or month or year) as reference
Description
Imagine you have one date and want the first or last day of this date's
month.
For example, you have the date 2018-02-01 and want the last day of its month.
You have to check whether or not its year is a leap year, and this sounds a
tough task.
getdate
helps with returning specific dates according to a reference
than can be another date, a month or an year.
Usage
getdate(expr, ref, cal = bizdays.options$get("default.calendar"))
Arguments
expr |
a character string specifying the date to be returned (see Details) |
ref |
a reference which represents a month or year, where the date has to be found. |
cal |
the calendar's name |
Details
expr
represents the day has to be returned, here it follows a few
examples:
-
"second day"
-
"10th bizday"
-
"3rd wed"
-
"last bizday"
-
"first fri"
expr
is a character string with two terms: "<position> <day>"
positions:
first
or1st
,second
or2nd
,third
or3rd
,last
andXXth
(examples6th
or11th
)days:
day
,bizday
, or weekdays (sun
,mon
,tue
,wed
,thu
,fri
,sat
)
getdate
returns dates according to a reference that can be a month or
an year. This reference can be passed as a character vector representing
months or years, or as a numeric vector representing years.
The ISO format must be used to represent years or months with character
vectors.
Value
a vector of dates according to a reference (month or year)
Examples
getdate("10th wed", 2018, "Brazil/ANBIMA")
getdate("last bizday", 2010:2018, "Brazil/ANBIMA")
dts <- seq(as.Date("2018-01-01"), as.Date("2018-12-01"), "month")
getdate("first bizday", format(dts, "%Y-%m"), "Brazil/ANBIMA")
getdate("last bizday", Sys.Date(), "Brazil/ANBIMA")
getdate("next bizday", Sys.Date(), "Brazil/ANBIMA")
getdate("2nd wed", Sys.Date())
getdate("next wed", Sys.Date())
getdate("last wed", Sys.Date())
getdate("next mon", Sys.Date())
getdate("last mon", Sys.Date())
Checks if the given dates are business days.
Description
Returns TRUE
if the given date is a business day and FALSE
otherwise.
Usage
is.bizday(dates, cal)
Arguments
dates |
dates to be checked |
cal |
the calendar's name |
Value
logical
objects informing that given dates are or are not business
days.
Date types accepted
The argument dates
accepts Date
objects and any
object that returns a valid Date
object when passed through
as.Date
, which include all POSIX*
classes and character
objects with ISO formatted dates.
Examples
is.bizday("2013-01-02", "Brazil/ANBIMA")
# Once you have a default calendar set, cal does not need to be provided
bizdays.options$set(default.calendar = "Brazil/ANBIMA")
dates <- seq(as.Date("2013-01-01"), as.Date("2013-01-05"), by = "day")
is.bizday(dates)
Load builtin calendars
Description
bizdays comes with builtins calendars:
Usage
load_builtin_calendars()
Details
- actual - weekends - Brazil/ANBIMA - Brazil/B3
This function creates and registers these calendars. Once the calendars are loaded they can be used directly by their names.
This function is called in package '.onAttach', so it is not necessary to call it directly. It is for internal use, package development or in situations where the user wants to call bizdays functions without attach the package.
Value
Has no return
Examples
bizdays::load_builtin_calendars()
bizdays::calendars()
bizdays::is.bizday("2020-01-01", "Brazil/ANBIMA")
Offsets the given dates
by n
business days
Description
Returns the given dates
offset by the given amount of n
business days.
Usage
offset(dates, n, cal)
add.bizdays(dates, n, cal)
Arguments
dates |
dates to be offset |
n |
the amount of business days to offset |
cal |
the calendar's name |
Details
The argument n
accepts a sequence of integers and if its length
differs from dates
' length, the recycle rule is applied to fulfill the
gap.
Value
Date
objects offset by the amount of days defined.
Date types accepted
The argument dates
accepts Date
objects and any
object that returns a valid Date
object when passed through
as.Date
, which include all POSIX*
classes and character
objects with ISO formatted dates.
Recycle rule
These arguments handle the recycle rule so a vector of dates and a vector of numbers can be provided and once those vectors differs in length the recycle rule is applied.
Examples
offset("2013-01-02", 5, "Brazil/ANBIMA")
# Once you have a default calendar set, cal does not need to be provided
bizdays.options$set(default.calendar = "Brazil/ANBIMA")
dates <- seq(as.Date("2013-01-01"), as.Date("2013-01-05"), by = "day")
is.bizday(dates)
offset(dates, 1)
Calendars from other packages
Description
The packages RQuantLib and timeDate (Rmetrics) have functions to compute business days between 2 dates according to a predefined calendar. bizdays creates calendars based on these functions.
Usage
load_quantlib_calendars(ql_calendars = NULL, from, to, financial = TRUE)
load_rmetrics_calendars(year, financial = TRUE)
Arguments
ql_calendars |
(QuantLib only) A character vector with the names of QuantLib's calendars. This parameter defaults to NULL, which loads all calendars. |
from |
(QuantLib only) the start date |
to |
(QuantLib only) the end date |
financial |
is a logical argument that defaults to TRUE. |
year |
(timeDate Rmetrics only) a vector with years to create the calendars. |
Details
To load QuantLib's calendars use load_quantlib_calendars
defining
which
calendar has to be loaded by its name and the range of dates the calendar
has to handle.
All QuantLib calendars have the QuantLib
prefix.
To load Rmetrics' calendars use load_rmetrics_calendars
defining the
years the calendar has to handle.
All Rmetrics calendars have the Rmetrics
prefix.
Financial calendars
This argument defines the calendar as a financial or a non financial
calendar.
Financial calendars don't consider the ending business day when counting
working days in bizdays
.
In QuantLib, Financial calendars are those that includeLast
is set
to FALSE
.
List of calendars
QuantLib Calendars:
QuantLib/TARGET
QuantLib/Argentina
QuantLib/Australia
QuantLib/Brazil
QuantLib/Canada
QuantLib/Canada/Settlement
QuantLib/Canada/TSX
QuantLib/China
QuantLib/CzechRepublic
QuantLib/Denmark
QuantLib/Finland
QuantLib/Germany
QuantLib/Germany/FrankfurtStockExchange
QuantLib/Germany/Settlement
QuantLib/Germany/Xetra
QuantLib/Germany/Eurex
QuantLib/HongKong
QuantLib/Hungary
QuantLib/Iceland
QuantLib/India
QuantLib/Indonesia
QuantLib/Italy
QuantLib/Italy/Settlement
QuantLib/Italy/Exchange
QuantLib/Japan
QuantLib/Mexico
QuantLib/NewZealand
QuantLib/Norway
QuantLib/Poland
QuantLib/Russia
QuantLib/SaudiArabia
QuantLib/Singapore
QuantLib/Slovakia
QuantLib/SouthAfrica
QuantLib/SouthKorea
QuantLib/SouthKorea/KRX
QuantLib/Sweden
QuantLib/Switzerland
QuantLib/Taiwan
QuantLib/Turkey
QuantLib/Ukraine
QuantLib/UnitedKingdom
QuantLib/UnitedKingdom/Settlement
QuantLib/UnitedKingdom/Exchange
QuantLib/UnitedKingdom/Metals
QuantLib/UnitedStates
QuantLib/UnitedStates/Settlement
QuantLib/UnitedStates/NYSE
QuantLib/UnitedStates/GovernmentBond
QuantLib/UnitedStates/NERC
Rmetrics Calendars:
Calendar Rmetrics/LONDON
Calendar Rmetrics/NERC
Calendar Rmetrics/NYSE
Calendar Rmetrics/TSX
Calendar Rmetrics/ZURICH
Examples
if (require("RQuantLib")) {
# loading Argentina calendar
load_quantlib_calendars("Argentina",
from = "2016-01-01",
to = "2016-12-31"
)
bizdays("2016-01-01", "2016-03-14", "QuantLib/Argentina")
# loading 2 calendars
load_quantlib_calendars(c("UnitedStates/NYSE", "UnitedKingdom/Settlement"),
from = "2016-01-01", to = "2016-12-31"
)
bizdays("2016-01-01", "2016-03-14", "QuantLib/UnitedStates/NYSE")
# loading all QuantLib's 50 calendars
load_quantlib_calendars(from = "2016-01-01", to = "2016-12-31")
bizdays("2016-01-01", "2016-03-14", "QuantLib/Brazil")
}
if (require("timeDate")) {
# loading all Rmetrics calendar
load_rmetrics_calendars(2016)
bizdays("2016-01-01", "2016-03-14", "Rmetrics/NERC")
bizdays("2016-01-01", "2016-03-14", "Rmetrics/NYSE")
}