2015-10-13 13 views
13

私はPandasを使用してTradingカレンダーを作成しようとしています。 USFederalHolidayCalendarに基づいてcalインスタンスを作成できます。 USFederalHolidayCalendarは、取引カレンダーにコロンブスの日と退役軍人の日が含まれていない点で、取引カレンダーと一致しません。ただし、トレーディングカレンダーにはグッドフライデーが含まれています(USFederalHolidayCalendarには含まれていません)。次のコードの最後の行を除くすべては動作します:Pandasで取引休日カレンダーを作成

from pandas.tseries.holiday import get_calendar, HolidayCalendarFactory, GoodFriday 
from datetime import datetime 

cal = get_calendar('USFederalHolidayCalendar') # Create calendar instance 
cal.rules.pop(7)        # Remove Veteran's Day rule 
cal.rules.pop(6)        # Remove Columbus Day rule 
tradingCal = HolidayCalendarFactory('TradingCalendar', cal, GoodFriday) 

私はホリデールールを見ることができるという点でtradingCalインスタンスが機能しているようです。

In[10]: tradingCal.rules 
Out[10]: 
[Holiday: Labor Day (month=9, day=1, offset=<DateOffset: kwds={'weekday': MO(+1)}>), 
Holiday: Presidents Day (month=2, day=1, offset=<DateOffset: kwds={'weekday': MO(+3)}>), 
Holiday: Good Friday (month=1, day=1, offset=[<Easter>, <-2 * Days>]), 
Holiday: Dr. Martin Luther King Jr. (month=1, day=1, offset=<DateOffset: kwds={'weekday': MO(+3)}>), 
Holiday: New Years Day (month=1, day=1, observance=<function nearest_workday at 0x000000000A190BA8>), 
Holiday: Thanksgiving (month=11, day=1, offset=<DateOffset: kwds={'weekday': TH(+4)}>), 
Holiday: July 4th (month=7, day=4, observance=<function nearest_workday at 0x000000000A190BA8>), 
Holiday: Christmas (month=12, day=25, observance=<function nearest_workday at 0x000000000A190BA8>), 
Holiday: MemorialDay (month=5, day=31, offset=<DateOffset: kwds={'weekday': MO(-1)}>)] 

私は日付範囲での休日を一覧表示しようとすると、私は次のエラーを取得する:

In[11]: tradingCal.holidays(datetime(2014, 12, 31), datetime(2016, 12, 31)) 
Traceback (most recent call last): 
    File "C:\Python27\lib\site-packages\IPython\core\interactiveshell.py", line 3035, in run_code 
    exec(code_obj, self.user_global_ns, self.user_ns) 
    File "<ipython-input-12-2708cd2db7a0>", line 1, in <module> 
    tradingCal.holidays(datetime(2014, 12, 31), datetime(2016, 12, 31)) 
TypeError: unbound method holidays() must be called with TradingCalendar instance as first argument (got datetime instance instead) 

任意のアイデア?

答えて

22

は、おそらくそれはそうのように、ゼロから貿易のカレンダーを作成することがより簡単です。それが助け場合

import datetime as dt 

from pandas.tseries.holiday import AbstractHolidayCalendar, Holiday, nearest_workday, \ 
    USMartinLutherKingJr, USPresidentsDay, GoodFriday, USMemorialDay, \ 
    USLaborDay, USThanksgivingDay 


class USTradingCalendar(AbstractHolidayCalendar): 
    rules = [ 
     Holiday('NewYearsDay', month=1, day=1, observance=nearest_workday), 
     USMartinLutherKingJr, 
     USPresidentsDay, 
     GoodFriday, 
     USMemorialDay, 
     Holiday('USIndependenceDay', month=7, day=4, observance=nearest_workday), 
     USLaborDay, 
     USThanksgivingDay, 
     Holiday('Christmas', month=12, day=25, observance=nearest_workday) 
    ] 


def get_trading_close_holidays(year): 
    inst = USTradingCalendar() 

    return inst.holidays(dt.datetime(year-1, 12, 31), dt.datetime(year, 12, 31)) 


if __name__ == '__main__': 
    print(get_trading_close_holidays(2016)) 
    # DatetimeIndex(['2016-01-01', '2016-01-18', '2016-02-15', '2016-03-25', 
    #     '2016-05-30', '2016-07-04', '2016-09-05', '2016-11-24', 
    #     '2016-12-26'], 
    #     dtype='datetime64[ns]', freq=None) 
6

クラスの新しいインスタンスを作成する必要があります:cal1 = tradingCal()。これは私のために働く。

from pandas.tseries.holiday import get_calendar, HolidayCalendarFactory, GoodFriday 
from datetime import datetime 

cal = get_calendar('USFederalHolidayCalendar') # Create calendar instance 
cal.rules.pop(7)        # Remove Veteran's Day rule 
cal.rules.pop(6)        # Remove Columbus Day rule 
tradingCal = HolidayCalendarFactory('TradingCalendar', cal, GoodFriday) 
print tradingCal.rules 

#new instance of class 
cal1 = tradingCal() 

print cal1.holidays(datetime(2014, 12, 31), datetime(2016, 12, 31)) 

#DatetimeIndex(['2015-01-01', '2015-01-19', '2015-02-16', '2015-04-03', 
#    '2015-05-25', '2015-07-03', '2015-09-07', '2015-11-26', 
#    '2015-12-25', '2016-01-01', '2016-01-18', '2016-02-15', 
#    '2016-03-25', '2016-05-30', '2016-07-04', '2016-09-05', 
#    '2016-11-24', '2016-12-26'], 
#    dtype='datetime64[ns]', freq=None, tz=None) 
+0

パーフェクト、jezrael。ありがとうございました。 – vlmercado

+4

これには大きな欠点があると私は思います! '.pop'を使うことは、" in-place "操作(用語が分からないため)であるため、基本クラス' pandas.tseries.holiday.USFederalHolidayCalendar'に影響します。つまり、 'get_calendar( 'USFederalHolidayCalendar')'からcal2を試して再作成すると、ルールは 'cal'と同じになります。つまり、もう存在しないので、あなたは 'USFederalHolidayCalendar'のクリーンなバージョンを手に入れません。それを修正しました! – evan54

+0

@ evan54私はこれにも気づいた。解決策はありますか? – WillZ

8

、私は、為替取引カレンダーの同様の必要性を持っていました。 QuantopianがZiplineプロジェクトに埋め込んだ優れたコードがいくつかありました。私は関連する部分を抜き出し、パンダで市場取引のカレンダーを作成するための新しいプロジェクトを作成しました。ここにはリンクがあり、以下に説明する機能の一部が含まれています。ここで

https://pypi.python.org/pypi/pandas-market-calendars

https://github.com/rsheftel/pandas_market_calendars

は、NYSEのための有効なオープン時間のすべてのパンダのDatetimeIndexを作成することで何ができるかです:あなただけを取得したい場合は

import pandas_market_calendars as mcal 
nyse = mcal.get_calendar('NYSE') 

early = nyse.schedule(start_date='2012-07-01', end_date='2012-07-10') 
early 

        market_open    market_close 
=========== ========================= ========================= 
2012-07-02 2012-07-02 13:30:00+00:00 2012-07-02 20:00:00+00:00 
2012-07-03 2012-07-03 13:30:00+00:00 2012-07-03 17:00:00+00:00 
2012-07-05 2012-07-05 13:30:00+00:00 2012-07-05 20:00:00+00:00 
2012-07-06 2012-07-06 13:30:00+00:00 2012-07-06 20:00:00+00:00 
2012-07-09 2012-07-09 13:30:00+00:00 2012-07-09 20:00:00+00:00 
2012-07-10 2012-07-10 13:30:00+00:00 2012-07-10 20:00:00+00:00 

mcal.date_range(early, frequency='1D') 

DatetimeIndex(['2012-07-02 20:00:00+00:00', '2012-07-03 17:00:00+00:00', 
       '2012-07-05 20:00:00+00:00', '2012-07-06 20:00:00+00:00', 
       '2012-07-09 20:00:00+00:00', '2012-07-10 20:00:00+00:00'], 
       dtype='datetime64[ns, UTC]', freq=None) 

mcal.date_range(early, frequency='1H') 

DatetimeIndex(['2012-07-02 14:30:00+00:00', '2012-07-02 15:30:00+00:00', 
       '2012-07-02 16:30:00+00:00', '2012-07-02 17:30:00+00:00', 
       '2012-07-02 18:30:00+00:00', '2012-07-02 19:30:00+00:00', 
       '2012-07-02 20:00:00+00:00', '2012-07-03 14:30:00+00:00', 
       '2012-07-03 15:30:00+00:00', '2012-07-03 16:30:00+00:00', 
       '2012-07-03 17:00:00+00:00', '2012-07-05 14:30:00+00:00', 
       '2012-07-05 15:30:00+00:00', '2012-07-05 16:30:00+00:00', 
       '2012-07-05 17:30:00+00:00', '2012-07-05 18:30:00+00:00', 
       '2012-07-05 19:30:00+00:00', '2012-07-05 20:00:00+00:00', 
       '2012-07-06 14:30:00+00:00', '2012-07-06 15:30:00+00:00', 
       '2012-07-06 16:30:00+00:00', '2012-07-06 17:30:00+00:00', 
       '2012-07-06 18:30:00+00:00', '2012-07-06 19:30:00+00:00', 
       '2012-07-06 20:00:00+00:00', '2012-07-09 14:30:00+00:00', 
       '2012-07-09 15:30:00+00:00', '2012-07-09 16:30:00+00:00', 
       '2012-07-09 17:30:00+00:00', '2012-07-09 18:30:00+00:00', 
       '2012-07-09 19:30:00+00:00', '2012-07-09 20:00:00+00:00', 
       '2012-07-10 14:30:00+00:00', '2012-07-10 15:30:00+00:00', 
       '2012-07-10 16:30:00+00:00', '2012-07-10 17:30:00+00:00', 
       '2012-07-10 18:30:00+00:00', '2012-07-10 19:30:00+00:00', 
       '2012-07-10 20:00:00+00:00'], 
       dtype='datetime64[ns, UTC]', freq=None) 

pandas休日のカレンダーは、それを引数として取る他のパンダの機能で使用できます:

holidays = nyse.holidays() 

holidays.holidays[-5:] 
(numpy.datetime64('2030-05-27'), 
numpy.datetime64('2030-07-04'), 
numpy.datetime64('2030-09-02'), 
numpy.datetime64('2030-11-28'), 
numpy.datetime64('2030-12-25')) 
+0

このライブラリは信頼性が高くありません。試してみると、2010年1月1日と新年の日がカレンダーやグッド・フライデーなどに出ていました。 –

+2

パッケージを正しく使用していない可能性があります。 2010年1月1日およびその他のすべての新年の日および良い金曜日は取引日として含まれません。上のサンプルコードを試してみてください。パッケージの使用方法を知りたい場合は、オンラインドキュメントを提案するか、問題がまだ残っている場合は直接メッセージすることができます。 –

+0

あなたはそうです。私は1995年以来、私がテストしたカレンダーとの比較で、それは正確でした。私が望ましくない結果をもたらした構文を覚えていない。 –

関連する問題