[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