Currency Date Calculation

This is a subject which is actually more complex than initially thought of. How do you calculate the Spot Date for a given Currency Pair. The new CurrencyDateCalculator does not pretend to be the ultimate calculator but we gave it a good shot.

I want to thank London FX Ltd for their page about valid dates and for answering my questions.

Definitions

It would be useful to clarify some terms.
Trade Date
Your start date, the date that you agree a trade with a counterparty. For all intend and purpose, this is the startDate used by our calculator.
Spot Date
The earliest date that the currencies can be delivered.
Spot Lag
The minimum number of days that must elapse for each currency before you can deliver the currencies, usually 2 but it could be 1 (USD/CAD), or even 0 (e.g. TRY, but RUB under some circumstances can be 0, 1 or 2 so it is up to you to select it)
Tenor Date
A period from Spot Date (usually, except for Overnight and TomNext). So a 1M trade is in fact 1 month FROM SPOT DATE.
Broken Date
A calculated Date which falls on the cross-currency non-working day (e.g. if the ccy pair goes through USD, a broken date would be July 4). There is a configuration flag in the calculator builder to enable or disable this (disabled by default, i.e. NO broken date)

Spot Date for Most Currencies

The Spot Date for most currencies are using a SpotLag.T_2, meaning 2 clear days for each currency after TradeDate. By clear days, we mean no weekend and no holiday for the currency in question. Furthermore, in case of cross currency pair (not involving USD explicitly ), the Spot Date cannot be a USD holiday. So, let's go through the logic for GBP/EUR with Trade Date 2 July 2013. It is a tad long but will help you to understand our algo.

  1. If calculator is setup so, check that TradeDate July 2 is a working day for GBP and for EUR, if not move forward. Since July 2 is a working day, T+0 remains July 2.
  2. Consider GBP, calculate T+1: July 3 is it a weekend or a GBP holiday? If yes, T+1 should move forward but July 3 is a working day for GBP and so it is T+1
  3. Consider GBP, calculate T+2: July 3 plus 1 day => July 4 is it a weekend or a GBP holiday? If yes, T+2 should move forward but July 4 is a working day for GBP and so it is T+2
  4. Consider EUR, calculate T+1: July 3 is it a weekend or a EUR holiday? If yes, T+1 should move forward but July 3 is a working day for EUR and so it is T+1
  5. Consider EUR, calculate T+2: July 3 plus 1 day => July 4 is it a weekend or a EUR holiday? If yes, T+2 should move forward but July 4 is a working day for EUR and so it is T+2
  6. So pickup the MAX date for T+2 for GBP and EUR, in this case July 4
  7. Finally check that T+2 is still a working day for EUR, GBP AND USD. In this case, July 4 is bank holiday for USD and therefore the SpotDay moves forward until it is a working day for all 3 currency calendars and the final result is July 5.

If July 5 had been a weekend or a bank holiday for any currency, the algo would keep moving forward. The important realisation is that the Spot date for a currency pair requires the calculation of SpotDate for each currency separately. You cannot combine the calculation as we will see in the case of Latin American and Arabic currencies

It should also be noted that if one of the currency is USD, the USD holidays do NOT affect T+1, so, for the avoidance of doubt, the algo would be for EUR/USD:

  1. If calculator is setup so, check that TradeDate July 3 is a working day for EUR and for USD, if not move forward. It is ok, T+0 remains July 3.
  2. Consider USD, calculate T+1: July 4, it is not a weekend and USD holidays do not impact T+1, so keep July 3
  3. Consider USD, calculate T+2: July 4 plus 1 day => July 5 is it a weekend or a USD holiday? No, so keep July 5
  4. Consider EUR, calculate T+1: July 4 is it a weekend or a EUR holiday? If yes, T+1 should move forward but July 4 is a working day for EUR and so it is T+1
  5. Consider EUR, calculate T+2: July 4 plus 1 day => July 5 is it a weekend or a EUR holiday? If yes, T+2 should move forward but July 5 is a working day for EUR and so it is T+2
  6. So pickup the MAX date for T+2 for USD and EUR, in this case July 5
  7. Finally check that T+2 is still a working day for EUR AND USD. In this case, July 5 is a working day for EUR and USD and so the final result is July 5.

Spot Date for some Latin American Currencies

As described above, USD Holidays do not impact the calculation of T+1; unfortunately, this is not the case for ARS, CLP and MXN.

For these currencies, T+1 should take into account the USD holidays. So GBP/MXN with a TradeDate on July 3 2013 is not July 5 2013 but July 6 2013!

Spot Date for Arabic Currencies

Here is the main reason why spot dates must be initially calculated for individual currencies. The WorkingWeek for some Arabic countries (AED, BHD, EGP, KWD, OMR and QAR) would be Sunday to Thursday. So assuming a USD/EGP with a trade date of Thursday would have:

  1. USD: T+1 Friday and T+2 Monday
  2. EGP: T+1 Sunday and T+2 Monday
  3. Meaning that the common date for Spot is Monday indeed as we have left 2 clear days for each currency

But of course there are exceptions, SAR and JOD use a 3-day weekend (Friday -> Sunday; nice!) so USD/JOD would be:

  1. USD: T+1 Friday and T+2 Monday
  2. JOD: T+1 Monday and T+2 Tuesday
  3. Meaning that the common date for Spot is Tuesday indeed as we need 2 clear days for each currency

Examples

Assuming that USD is the cross currency and that July 4 is a bank holiday for USD; finally, we do not allow 'Broken Date' (configurable).

Ccy Pair Start/Trade Date Spot Date Details
EUR/USD Fri Jun 30, 2006 Wed July 5, 2006 July 4 USD holiday
EUR/USD Mon July 3, 2006 Wed July 5, 2006 July 4 has no impact on T+1
EUR/GBP Fri Jun 30, 2006 Wed July 5, 2006 No Broken Date by default (Move forward from July 4)
EUR/MXN Mon July 3, 2006 Thu July 6, 2006 July 4 USD holiday must be skipped for T+1 for MXN
USD/EGP Thursday Monday USD 2 Days: Friday & Monday; EGP:Sunday & Monday so Spot=Monday
USD/SAR Thursday Tuesday SAR weekend Fri to Sun, T+1 = Monday, T+2 = Tuesday