[R-sig-finance] Problems with monthly sequences
Franklin Parlamis
fparlamis at mac.com
Sun Feb 5 22:49:42 CET 2006
you want end.end convention (like for the interbank deposits underlying BBA Libor quotations). here's some code I wrote recently. caveats:
(i) i just learned to code, so this probably doesn't exhibit professional programming standards
(ii) you need the Methods package (which is default loaded when R opens)
(iii) the functions are not yet complete (in that i don't deal with improper arguments as fully as i intend to)
(iv) you will need to separately check whether the output dates are business days, and then apply the mod.following convention or whichever other convention you want; all these functions do is move you forward an increment subject to the end.end standard.
(v) the date arguments are not character vectors as you envision; rather they are objects that can be compelled to POSIXlt dates via as.POSIXlt, or timeDate objects (you could easily add a method to convert the character vectors to POSIXlt objects or timeDate objects)
(vi) i'm pretty sure these functions won't work for negative increments as you request, but I thank you for pointing out that functionality, as it shouldn't be hard for me to alter the functions to get there.
----
########################
## last.of
########################
last.of <- function(date) {
date<-as.POSIXlt(date)
switch(date[["mon"]]+1,31,28+leap.year(date[["year"]]+1900),31,30,31,30,31,31,30,31,30,31)}
setMethod("last.of", signature(date="timeDate"), function(date)
last.of(date at Data))
is.last.of <- function(date) {
date<-as.POSIXlt(date)
date[["mday"]]==last.of(date)}
setMethod("is.last.of", signature(date="timeDate"), function(date)
is.last.of(date at Data))
########################
## end.end
########################
end.end <- function(date, num, inc) {
date<-as.POSIXlt(date)
trial<-as.POSIXlt(seq(from=date,len=2,by=paste(num,inc))[2])
if(inc=="month") {
while((trial[["mon"]]-date[["mon"]])%%12>num)
trial<-as.POSIXlt(seq(from=trial,len=2,by="-1 day")[2])
if(is.last.of(date)) while(is.last.of(trial)==FALSE)
trial<-as.POSIXlt(seq(from=trial,len=2,by="1 day")[2])}
if(inc=="year") {
while(trial[["mon"]]!=date[["mon"]])
trial<-as.POSIXlt(seq(from=trial,len=2,by="-1 day")[2])
if(is.last.of(date)) while(is.last.of(trial)==FALSE)
trial<-as.POSIXlt(seq(from=trial,len=2,by="1 day")[2])}
trial}
setMethod("end.end", signature(date="timeDate"), function(date, num, inc)
end.end(date at Data, num, inc))
-----
franklin parlamis
On Sunday, February 05, 2006, at 12:18PM, Wojciech Slusarski <wojciech.slusarski at gmail.com> wrote:
>Well, thanks for the help, but not exactly. The function I would like to
>have would give results for starting dates
>
>charvec = c("2005-12-25", "2006-01-30")
>
>>function_name(charvec,+1M)
>
>[1] [2006-01-25] [2006-02-28]
>
>So it's adding one month to a date, but when it exceeds the last day of the
>next month, it gives the las day.
>
>The other way could be also useful:
>
>charvec = c("2005-12-25", "2006-02-28")
>
>>function_name(charvec,-1M)
>
>[1] [2005-11-25] [2006-01-31]
>#first date was decreased by one month, the second was decreased to the last
>day of january (not 28th January).
>
>Having such functions, one could set up proper dates for tenors in discount
>curve. In the function you published few days ago, you setup fixed year
>fractions for each tenor, which don't take into account holidays etc.
>
>Best regards,
>Wojtek
>
>2006/2/5, Diethelm Wuertz <wuertz at itp.phys.ethz.ch>:
>>
>>
>> Here comes a function which computes time and date for the last Day
>> n-month ahead.
>> It is Rmetrics conform and preserves time zone, daylight saving and
>> Financial Centers.
>>
>> Is that what you wanted?
>>
>> DW
>>
>>
>>
>> timeLastDayNMonthAhead =
>> function(charvec, month, format = "%Y-%m-%d", FinCenter = "GMT")
>> {
>> if (Sys.getenv("TZ")[[1]] != "GMT") warning("Set timezone to GMT!")
>> if (FinCenter == "") FinCenter = "GMT"
>> if (month < 0) stop("month must be positive")
>> date = timeLastDayInMonth(charvec, format = format, FinCenter =
>> FinCenter)
>> for (i in 1:month) date = timeLastDayInMonth(date, format = format,
>> FinCenter = FinCenter) + 3600*24
>>
>> # Return Value:
>> timeLastDayInMonth(date, format = format, FinCenter = FinCenter)
>> }
>>
>> # Example:
>> > timeLastDayNMonthAhead(c("2005-12-25", "2006-02-28"), month = 2)
>> [1] "GMT"
>> [1] [2006-02-28] [2006-04-30]
>>
>>
>>
>>
>>
>> Wojciech Slusarski wrote:
>>
>> >I thought a bit about the function below, and see a problem, when n<0 (I
>> >would like to decrease the date.s by one month). I still have no Idea how
>> to
>> >implement it.
>> >
>> >Best regards,
>> >Wojtek
>> >
>> >
>> >2006/2/5, Wojciech Slusarski <wojciech.slusarski at gmail.com>:
>> >
>> >
>> >>Well,
>> >>
>> >>Thanks for the help, but I thought about something more general, that
>> >>could allow me adding n months to a date. I am sorry, that my question
>> >>wasn't so clear. If someone needed, here's the code:
>> >>
>> >>
>> >>EMONTH =
>> >>function(date.s, n)
>> >>{
>> >> #function adds 'n' months to 'date.s'
>> >> dates = timeSequence(from = format(date.s at Data, "%Y-%m-%d"),
>> length.out= n+1, by = "month")
>> >> if(atoms(date.s)[1,"d"]>28)
>> >> {
>> >> if(atoms(dates)[n+1,"d"]<4)
>> >> {
>> >> emonth = dates[n+1]-atoms(dates)[n+1,"d"]*24*3600
>> >> } else {
>> >> emonth = dates[n+1]
>> >> }
>> >> } else {
>> >> emonth = dates[n+1]
>> >> }
>> >> emonth
>> >>}
>> >>
>> >>
>> >>
>> >># test
>> >>
>> >>date.s = timeDate("2005-12-30")
>> >>
>> >>
>> >>
>> >>>EMONTH(date.s, 2)@Data
>> >>>
>> >>>
>> >>[1] "2006-02-28"
>> >>Best regards,
>> >>Wojtek
>> >>
>> >>
>> >>2006/2/5, Diethelm Wuertz <wuertz at itp.phys.ethz.ch>:
>> >>
>> >>
>> >>>Gabor Grothendieck wrote:
>> >>>
>> >>>
>> >>>
>> >>>>Try this:
>> >>>>
>> >>>>library(fCalendar)
>> >>>>dates <- timeSequence(from = "2005-12-1", to = "2006-12-1", format =
>> >>>>"%Y-%m-%d", by="month", FinCenter = "Europe/Warsaw")
>> >>>>dates <- timeLastDayInMonth(dates)
>> >>>>
>> >>>>
>> >>>>
>> >>>>
>> >>>Alternatively you can use
>> >>>
>> >>>
>> >>>
>> >>>>timeSequence(from = "2006-01-01", to = "2007-01-01", format =
>> >>>>
>> >>>>
>> >>>+ "%Y-%m-%d", by="month", FinCenter = "Europe/Warsaw") - 3600*24
>> >>>[1] "Europe/Warsaw"
>> >>>[1] [2005-12-31] [2006-01-31] [2006-02-28] [2006-03-31] [2006-04-30]
>> >>>[6] [2006-05-31] [2006-06-30] [2006-07-31] [2006-08-31] [2006-09-30]
>> >>>[11] [2006-10-31] [2006-11-30] [2006-12-31]
>> >>>
>> >>>Please use proper ISO-8601 notation: 2006-01-05 and not 2006-1-5 !
>> >>>
>> >>>DW
>> >>>
>> >>>
>> >>>
>> >>>>On 2/4/06, Wojciech Slusarski < wojciech.slusarski at gmail.com> wrote:
>> >>>>
>> >>>>
>> >>>>
>> >>>>
>> >>>>>Dear R users,
>> >>>>>
>> >>>>>Could anyone help me with creating a monthly series of dates?
>> >>>>>When I try to do:
>> >>>>>
>> >>>>>dates = timeSequence(from = "2005-12-31", to = "2006-12-31", format =
>> >>>>>"%Y-%m-%d", by="month", FinCenter = "Europe/Warsaw")
>> >>>>>
>> >>>>>I get:
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>>>dates
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>>
>> >>>>>[1] "Europe/Warsaw"
>> >>>>>[1] [2005-12-31] [2006-01-31] [2006-03-03] [2006-03-31] [2006-05-01]
>> >>>>>[6] [2006-05-31] [2006-07-01] [2006-07-31] [2006-08-31] [2006-10-01]
>> >>>>>[11] [2006-10-31] [2006-12-01] [2006-12-31]
>> >>>>>
>> >>>>>Unfourtunately, I would like to heave end of month at each point.
>> >>>>>I thought, that maybe using this function would also help when trying
>> >>>>>
>> >>>>>
>> >>>to add
>> >>>
>> >>>
>> >>>>>a month to a date. I would like to have
>> >>>>>
>> >>>>>"2006-01-31" + 1M = "2006-02-28"
>> >>>>>
>> >>>>>in MS EXCEL I would use EDATE("2006-01-31";1), and that would work. I
>> >>>>>couldn't find any similar function in R for that. Am I missing some
>> >>>>>function?
>> >>>>>
>> >>>>>Best regards,
>> >>>>>Wojtek
>> >>>>>
>> >>>>> [[alternative HTML version deleted]]
>> >>>>>
>> >>>>>_______________________________________________
>> >>>>>R-sig-finance at stat.math.ethz.ch mailing list
>> >>>>>https://stat.ethz.ch/mailman/listinfo/r-sig-finance
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>>
>> >>>>_______________________________________________
>> >>>>R-sig-finance at stat.math.ethz.ch mailing list
>> >>>>https://stat.ethz.ch/mailman/listinfo/r-sig-finance
>> >>>>
>> >>>>
>> >>>>
>> >>>>
>> >>>>
>> >>>_______________________________________________
>> >>>R-sig-finance at stat.math.ethz.ch mailing list
>> >>>https://stat.ethz.ch/mailman/listinfo/r-sig-finance
>> >>>
>> >>>
>> >>>
>> >>
>> >>
>> >
>> > [[alternative HTML version deleted]]
>> >
>> >_______________________________________________
>> >R-sig-finance at stat.math.ethz.ch mailing list
>> >https://stat.ethz.ch/mailman/listinfo/r-sig-finance
>> >
>> >
>> >
>>
>>
>
> [[alternative HTML version deleted]]
>
>_______________________________________________
>R-sig-finance at stat.math.ethz.ch mailing list
>https://stat.ethz.ch/mailman/listinfo/r-sig-finance
>
>
More information about the R-sig-finance
mailing list