[R-sig-finance] Problems with monthly sequences

davidr@rhotrading.com davidr at rhotrading.com
Mon Feb 6 16:04:53 CET 2006


I thought the original poster might want end-end or modified following:
see http://www.bba.org.uk/bba/jsp/polopoly.jsp?d=225&a=1412 .
(It just helps to use the technical jargon so we are all clear.)

In any case, Gabor's function seems to satisfy.

David L. Reiner
Rho Trading Securities, LLC
 

> -----Original Message-----
> From: r-sig-finance-bounces at stat.math.ethz.ch [mailto:r-sig-finance-
> bounces at stat.math.ethz.ch] On Behalf Of Franklin Parlamis
> Sent: Sunday, February 05, 2006 3:50 PM
> To: Wojciech Slusarski
> Cc: r-sig-finance
> Subject: Re: [R-sig-finance] Problems with monthly sequences
> 
> 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
> >
> >
> 
> _______________________________________________
> 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