繁体   English   中英

使用熊猫市场日历获取下一个交易日

[英]Get next trading day using pandas market calendar

我想修改下面的代码,以便我可以从现在或 n 天前获取交易天数:

import pandas_market_calendars as mcal
holidays = nyse.holidays()
mydate = pd.to_datetime("12/24/2019")
holidays(mydate)
Timestamp('2019-12-26 00:00:00')

有没有办法提供天数作为假期()的参数?

我可以让它与联邦假期一起使用,如下所示:

from pandas.tseries.holiday import USFederalHolidayCalendar
bday_us1 = CustomBusinessDay(calendar=USFederalHolidayCalendar(), n=2)
mydate + bday_us1
Timestamp('2019-12-27 00:00:00')

我假设你已经在某处有这条线:

nyse = mcal.get_calendar('NYSE')

您可能正在寻找的是这样的:

nyse.valid_days(start_date='2016-12-20', end_date='2017-01-10')

这将返回包含开始日期和结束日期的所有有效日期(非节假日)的列表。 要获取此日期范围:

mydate = pd.to_datetime("12/24/2019")
d = datetime.timedelta(days = 10)
start_date = mydate - d
end_date = mydate + d

没有采用日期范围的holidays方法。 以当前日期为基础,我们可以生成一个包含 5 天前和 5 天前的日期列表。 然后每天我们将下一个假期收集到一个set中以避免重复。 可选地,我们对获得的list进行排序,因为set不维护顺序。

import pandas_market_calendars as mcal
import pandas as pd
from datetime import timedelta

mydate = pd.to_datetime("12/24/2019")
nyse = mcal.get_calendar('NYSE')
holidays = nyse.holidays()

delta = timedelta(5)
start = mydate - delta
end = mydate + delta

date_list = [end - (timedelta(x)) for x in range((end-start).days)]
holidays = list(set(holidays(d) for d in date_list))
for day in sorted(holidays):
    print(day)

输出

2019-12-23 00:00:00
2019-12-24 00:00:00
2019-12-26 00:00:00
2019-12-27 00:00:00
2019-12-30 00:00:00

我找到了一个有效的解决方案,我只是在我的函数中使用有效交易日的日期,而不是假期:

def next_business_day(start_day, business_days, HOLIDAYS):
    ONE_DAY = datetime.timedelta(days=1)
    temp_day = start_day
    for i in range(0, business_days):
        next_day = temp_day + ONE_DAY
        while next_day.weekday() in [5,6] or next_day not in nyse.valid_days(start_date='2000-12-20', end_date='2020-01-10'):
            next_day += ONE_DAY
        temp_day = next_day
    return temp_day 

请注意,这是基于来自不同论坛的帖子,其中使用了假期:

def next_business_day(start_day, business_days, HOLIDAYS):
    ONE_DAY = datetime.timedelta(days=1)
    temp_day = start_day
    for i in range(0, business_days):
        next_day = temp_day + ONE_DAY
        while next_day.weekday() in [5,6] or next_day in HOLIDAYS:
            next_day += ONE_DAY
        temp_day = next_day
    return temp_day 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM