/*
 Copyright (C) 2008 Srinivas Hasti
 Copyright (C) 2008 Dominik Holenstein

 This source code is release under the BSD License.

 This file is part of JQuantLib, a free-software/open-source library
 for financial quantitative analysts and developers - http://jquantlib.org/

 JQuantLib is free software: you can redistribute it and/or modify it
 under the terms of the JQuantLib license.  You should have received a
 copy of the license along with this program; if not, please email
 . The license is also available online at
 .

 This program is distributed in the hope that it will be useful, but WITHOUT
 ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
 FOR A PARTICULAR PURPOSE.  See the license for more details.

 JQuantLib is based on QuantLib. http://quantlib.org/
 When applicable, the original copyright notice follows this notice.
 */

package org.jquantlib.time.calendars;

import org.jquantlib.lang.annotation.QualityAssurance;
import org.jquantlib.lang.annotation.QualityAssurance.Quality;
import org.jquantlib.lang.annotation.QualityAssurance.Version;
import org.jquantlib.lang.exceptions.LibraryException;
import org.jquantlib.time.Calendar;
import org.jquantlib.time.Date;
import org.jquantlib.time.Month;
import org.jquantlib.time.Weekday;


/**
 * United States calendars 
* Public holidays (see: http://www.opm.gov/fedhol/): *
    *
  • Saturdays
  • *
  • Sundays
  • *
  • New Year's Day, JANUARY 1st (possibly moved to Monday if actually on * Sunday, or to Friday if on Saturday)
  • *
  • Martin Luther King's birthday, third Monday in JANUARY
  • *
  • Presidents' Day (a.k.a. Washington's birthday), third Monday in February
  • *
  • Memorial Day, last Monday in May
  • *
  • Independence Day, July 4th (moved to Monday if Sunday or Friday if * Saturday)
  • *
  • Labor Day, first Monday in September
  • *
  • Columbus Day, second Monday in October
  • *
  • Veterans' Day, November 11th (moved to Monday if Sunday or Friday if * Saturday)
  • *
  • Thanksgiving Day, fourth Thursday in November
  • *
  • Christmas, December 25th (moved to Monday if Sunday or Friday if * Saturday)
  • *
* * Holidays for the stock exchange (data from http://www.nyse.com): *
    *
  • Saturdays
  • *
  • Sundays
  • *
  • New Year's Day, JANUARY 1st (possibly moved to Monday if actually on * Sunday)
  • *
  • Martin Luther King's birthday, third Monday in JANUARY (since 1998)
  • *
  • Presidents' Day (a.k.a. Washington's birthday), third Monday in February
  • *
  • Good Friday
  • *
  • Memorial Day, last Monday in May
  • *
  • Independence Day, July 4th (moved to Monday if Sunday or Friday if * Saturday)
  • *
  • Labor Day, first Monday in September
  • *
  • Thanksgiving Day, fourth Thursday in November
  • *
  • Presidential election day, first Tuesday in November of election years * (until 1980)
  • *
  • Christmas, December 25th (moved to Monday if Sunday or Friday if * Saturday)
  • *
  • Special historic closings (see http://www.nyse.com/pdfs/closings.pdf)
  • *
* * Holidays for the government bond market (data from * http://www.bondmarkets.com): *
    *
  • Saturdays
  • *
  • Sundays
  • *
  • New Year's Day, JANUARY 1st (possibly moved to Monday if actually on * Sunday)
  • *
  • Martin Luther King's birthday, third Monday in JANUARY
  • *
  • Presidents' Day (a.k.a. Washington's birthday), third Monday in February
  • *
  • Good Friday
  • *
  • Memorial Day, last Monday in May
  • *
  • Independence Day, July 4th (moved to Monday if Sunday or Friday if * Saturday)
  • *
  • Labor Day, first Monday in September
  • *
  • Columbus Day, second Monday in October
  • *
  • Veterans' Day, November 11th (moved to Monday if Sunday or Friday if * Saturday)
  • *
  • Thanksgiving Day, fourth Thursday in November
  • *
  • Christmas, December 25th (moved to Monday if Sunday or Friday if * Saturday)
  • *
* * Holidays for the North American Energy Reliability Council (data from * http://www.nerc.com/~oc/offpeaks.html): *
    *
  • Saturdays
  • *
  • Sundays
  • *
  • New Year's Day, JANUARY 1st (possibly moved to Monday if actually on * Sunday)
  • *
  • Memorial Day, last Monday in May
  • *
  • Independence Day, July 4th (moved to Monday if Sunday)
  • *
  • Labor Day, first Monday in September
  • *
  • Thanksgiving Day, fourth Thursday in November
  • *
  • Christmas, December 25th (moved to Monday if Sunday)
  • *
* * @category calendars * * @author Srinivas Hasti * @author Zahid Hussain */ @QualityAssurance(quality = Quality.Q3_DOCUMENTATION, version = Version.V097, reviewers = { "Zahid Hussain" }) public class UnitedStates extends Calendar { /** * US calendars */ public static enum Market { SETTLEMENT, // generic settlement calendar NYSE, // New York stock exchange calendar GOVERNMENTBOND, // government-bond calendar NERC // off-peak days for NERC } // // public constructors // public UnitedStates() { this(Market.SETTLEMENT); } public UnitedStates(final Market market) { switch (market) { case SETTLEMENT: impl = new SettlementImpl(); break; case NYSE: impl = new NyseImpl(); break; case GOVERNMENTBOND: impl = new GovernmentBondImpl(); break; case NERC: impl = new NercImpl(); break; default: throw new LibraryException(UNKNOWN_MARKET); } } // // private final inner classes // private final class SettlementImpl extends WesternImpl { @Override public String name() { return "US settlement"; } @Override public boolean isBusinessDay(final Date date) { final Weekday w = date.weekday(); final int d = date.dayOfMonth(), dd = date.dayOfYear(); final Month m = date.month(); final int y = date.year(); final int em = easterMonday(y); if (isWeekend(w) // New Year's Day (possibly moved to Monday if on Sunday) || ((d == 1 || (d == 2 && w == Weekday.Monday)) && m == Month.January) // (or to Friday if on Saturday) || (d == 31 && w == Weekday.Friday && m == Month.December) // Martin Luther King's birthday (third Monday in January) || ((d >= 15 && d <= 21) && w == Weekday.Monday && m == Month.January) // Washington's birthday (third Monday in February) || ((d >= 15 && d <= 21) && w == Weekday.Monday && m == Month.February) // Memorial Day (last Monday in May) || (d >= 25 && w == Weekday.Monday && m == Month.May) // Independence Day (Monday if Sunday or Friday if Saturday) || ((d == 4 || (d == 5 && w == Weekday.Monday) || (d == 3 && w == Weekday.Friday)) && m == Month.July) // Labor Day (first Monday in September) || (d <= 7 && w == Weekday.Monday && m == Month.September) // Columbus Day (second Monday in October) || ((d >= 8 && d <= 14) && w == Weekday.Monday && m == Month.October) // Veteran's Day (Monday if Sunday or Friday if Saturday) || ((d == 11 || (d == 12 && w == Weekday.Monday) || (d == 10 && w == Weekday.Friday)) && m == Month.November) // Thanksgiving Day (fourth Thursday in November) || ((d >= 22 && d <= 28) && w == Weekday.Thursday && m == Month.November) // Christmas (Monday if Sunday or Friday if Saturday) || ((d == 25 || (d == 26 && w == Weekday.Monday) || (d == 24 && w == Weekday.Friday)) && m == Month.December)) // // New Year's Day (possibly moved to Monday if on Sunday) // || ((d == 1 || (d == 2 && w == Weekday.Monday)) && m == Month.January) // // Martin Luther King's birthday (third Monday in JANUARY) // || ((d >= 15 && d <= 21) && w == Weekday.Monday && m == Month.January) // // Washington's birthday (third Monday in Month.FEBRUARY) // || ((d >= 15 && d <= 21) && w == Weekday.Monday && m == Month.February) // // Good Weekday.FRIDAY // || (dd == em-3) // // Memorial Day (last Monday in Month.MAY) // || (d >= 25 && w == Weekday.Monday && m == Month.May) // // Independence Day (Monday if Sunday or Weekday.FRIDAY if Saturday) // || ((d == 4 || (d == 5 && w == Weekday.Monday) || // (d == 3 && w == Weekday.Friday)) && m == Month.July) // // Labor Day (first Monday in Month.SEPTEMBER) // || (d <= 7 && w == Weekday.Monday && m == Month.September) // // Columbus Day (second Monday in October) // || ((d >= 8 && d <= 14) && w == Weekday.Monday && m == Month.October) // // Veteran's Day (Monday if Sunday or Weekday.FRIDAY if Saturday) // || ((d == 11 || (d == 12 && w == Weekday.Monday) || // (d == 10 && w == Weekday.Friday)) && m == Month.November) // // Thanksgiving Day (fourth Weekday.THURSDAY in Month.NOVEMBER) // || ((d >= 22 && d <= 28) && w == Weekday.Thursday && m == Month.November) // // Christmas (Monday if Sunday or Weekday.FRIDAY if Saturday) // || ((d == 25 || (d == 26 && w == Weekday.Monday) || // (d == 24 && w == Weekday.Friday)) && m == Month.December)) return false; return true; } } private final class NyseImpl extends WesternImpl { @Override public String name() { return "New York stock exchange"; } @Override public boolean isBusinessDay(final Date date) { final Weekday w = date.weekday(); final int d = date.dayOfMonth(), dd = date.dayOfYear(); final Month m = date.month(); final int y = date.year(); final int em = easterMonday(y); if (isWeekend(w) // New Year's Day (possibly moved to Monday if on Sunday) || ((d == 1 || (d == 2 && w == Weekday.Monday)) && m == Month.January) // Washington's birthday (third Monday in Month.FEBRUARY) || ((d >= 15 && d <= 21) && w == Weekday.Monday && m == Month.February) // Good Weekday.FRIDAY || (dd == em-3) // Memorial Day (last Weekday.MONDAY in Month.MAY) || (d >= 25 && w == Weekday.Monday && m == Month.May) // Independence Day (Weekday.MONDAY if Sunday or Weekday.FRIDAY if Saturday) || ((d == 4 || (d == 5 && w == Weekday.Monday) || (d == 3 && w == Weekday.Friday)) && m == Month.July) // Labor Day (first Weekday.MONDAY in Month.SEPTEMBER) || (d <= 7 && w == Weekday.Monday && m == Month.September) // Thanksgiving Day (fourth Weekday.THURSDAY in Month.NOVEMBER) || ((d >= 22 && d <= 28) && w == Weekday.Thursday && m == Month.November) // Christmas (Weekday.MONDAY if Sunday or Weekday.FRIDAY if Saturday) || ((d == 25 || (d == 26 && w == Weekday.Monday) || (d == 24 && w == Weekday.Friday)) && m == Month.December) ) return false; if (y >= 1998) { if (// Martin Luther King's birthday (third Weekday.MONDAY in JANUARY) ((d >= 15 && d <= 21) && w == Weekday.Monday && m == Month.January) // President Reagan's funeral || (y == 2004 && m == Month.June && d == 11) // Month.SEPTEMBER 11, 2001 || (y == 2001 && m == Month.September && (11 <= d && d <= 14)) // President Ford's funeral || (y == 2007 && m == Month.January && d == 2) ) return false; } else if (y <= 1980) { if (// Presidential election days ((y % 4 == 0) && m == Month.November && d <= 7 && w == Weekday.Tuesday) // 1977 Blackout || (y == 1977 && m == Month.July && d == 14) // Funeral of former President Lyndon B. Johnson. || (y == 1973 && m == Month.January && d == 25) // Funeral of former President Harry S. Truman || (y == 1972 && m == Month.December && d == 28) // National Day of Participation for the lunar exploration. || (y == 1969 && m == Month.July && d == 21) // Funeral of former President Eisenhower. || (y == 1969 && m == Month.March && d == 31) // Closed all day - heavy snow. || (y == 1969 && m == Month.February && d == 10) // Day after Independence Day. || (y == 1968 && m == Month.July && d == 5) // Month.JUNE 12-Dec. 31, 1968 // Four day week (closed on Wednesdays) - Paperwork Crisis || (y == 1968 && dd >= 163 && w == Weekday.Wednesday) ) return false; } else if (// Nixon's funeral (y == 1994 && m == Month.April && d == 27) ) return false; return true; } } private final class GovernmentBondImpl extends WesternImpl { @Override public String name() { return "US government bond market"; } @Override public boolean isBusinessDay(final Date date) { final Weekday w = date.weekday(); final int d = date.dayOfMonth(), dd = date.dayOfYear(); final Month m = date.month(); final int y = date.year(); final int em = easterMonday(y); if (isWeekend(w) // New Year's Day (possibly moved to Weekday.MONDAY if on Sunday) || ((d == 1 || (d == 2 && w == Weekday.Monday)) && m == Month.January) // Martin Luther King's birthday (third Weekday.MONDAY in Month.JANUARY) || ((d >= 15 && d <= 21) && w == Weekday.Monday && m == Month.January) // Washington's birthday (third Weekday.MONDAY in Month.FEBRUARY) || ((d >= 15 && d <= 21) && w == Weekday.Monday && m == Month.February) // Good Weekday.FRIDAY || (dd == em-3) // Memorial Day (last Monday in Month.MAY) || (d >= 25 && w == Weekday.Monday && m == Month.May) // Independence Day (Monday if Sunday or Weekday.FRIDAY if Saturday) || ((d == 4 || (d == 5 && w == Weekday.Monday) || (d == 3 && w == Weekday.Friday)) && m == Month.July) // Labor Day (first Monday in Month.SEPTEMBER) || (d <= 7 && w == Weekday.Monday && m == Month.September) // Columbus Day (second Monday in October) || ((d >= 8 && d <= 14) && w == Weekday.Monday && m == Month.October) // Veteran's Day (Monday if Sunday or Weekday.FRIDAY if Saturday) || ((d == 11 || (d == 12 && w == Weekday.Monday) || (d == 10 && w == Weekday.Friday)) && m == Month.November) // Thanksgiving Day (fourth Weekday.THURSDAY in Month.NOVEMBER) || ((d >= 22 && d <= 28) && w == Weekday.Thursday && m == Month.November) // Christmas (Monday if Sunday or Weekday.FRIDAY if Saturday) || ((d == 25 || (d == 26 && w == Weekday.Monday) || (d == 24 && w == Weekday.Friday)) && m == Month.December)) return false; return true; } } private final class NercImpl extends WesternImpl { @Override public String name(){ return "North American Energy Reliability Council"; } @Override public boolean isBusinessDay(final Date date) { final Weekday w = date.weekday(); final int d = date.dayOfMonth(); final Month m = date.month(); if (isWeekend(w) // New Year's Day (possibly moved to Monday if on Sunday) || ((d == 1 || (d == 2 && w == Weekday.Monday)) && m == Month.January) // Memorial Day (last Monday in Month.MAY) || (d >= 25 && w == Weekday.Monday && m == Month.May) // Independence Day (Monday if Sunday) || ((d == 4 || (d == 5 && w == Weekday.Monday)) && m == Month.July) // Labor Day (first Monday in Month.SEPTEMBER) || (d <= 7 && w == Weekday.Monday && m == Month.September) // Thanksgiving Day (fourth Weekday.THURSDAY in Month.NOVEMBER) || ((d >= 22 && d <= 28) && w == Weekday.Thursday && m == Month.November) // Christmas (Monday if Sunday) || ((d == 25 || (d == 26 && w == Weekday.Monday)) && m == Month.December)) return false; return true; } } }

Ads help maintain this website.