In (L) IBOR definitions and interest rate swaps there are generally two principles worth considering:
- Roll Day (a specific rule which help schedule generators know how to align schedules but not exemplified in this post)
- Adjustment Rules (other rules about what to do when dates are not business dates)
Generally the adjustment rules are easily stated as 'Following (F)' or 'Preceeding (P)'.
Fri 20th Jan + 6M goes to Sun 20th July and adjusted 'F' to Mon 21st July
Mon 31st Jan + 6M goes to Sun 31st July and adjusted 'F' to Mon 1st August.
There is a very common rule called 'Modified Following (MF)' and much less common 'Modified Preceeding (MP)' which precludes adjusting a date into a new month, i.e. tries to follow but fails so precedes.
Mon 31st Jan + 6M goes to Sun 31st July and adjusted 'MF' to Fri 29th July.
Almost all EUR and USD derivatives that I have encountered adopt this rule.
There is an additional rule called 'Modified Following Month End (MFME)' which is used for example with GBP derivatives and LIBOR, when the start date is a month end the end date is automatically modified to be a month end
Tue 28th Feb + 6M goes to Mon 28th August under 'MF'.
Tue 28th Feb + 6M goes to Thur 31st August under 'MFME'.
Specific Question Dates
In the case that you add a tenor to yield a date that does not exist such as:
Tue 30 Aug + 6M goes to 30th Feb
there are two possible logical conversions:
1) convert that date to the end of the month instead, 30th Feb -> 28th Feb (or 29th)
2) move forward into the new month by the overlapping days 30th Feb -> 2nd Mar (or 1st)
@Adam has provided an IDSA definition, but I would interpret this as enact 1) and then apply your adjustment rule; 'F' 'P' 'MF' 'MFME'. 2) is the least consistent choice and is not performed.
Tue 30th Aug + 6M goes to Mon 1st Mar (where 28th Feb is a Sunday) under 'F'
Tue 30th Aug + 6M goes to Fri 26th Feb (where 28th Feb is a Sunday) under 'MF'
Tue 30th Aug + 6M goes to Fri 26th Feb (where 28th Feb is a Sunday) under 'MFME' (actually this is not a month end start anyway)