设定RRule的日期和时小时

0 投票
1 回答
3767 浏览
提问于 2025-04-17 19:26

我正在使用Python的rrule来计算交易时间。对于普通的交易日,这个过程很简单,我用的是在这个网站上找到的一个稍微修改过的例子:

def get_rset(start_date):    
    # Create a rule to recur every weekday starting today
    r = rrule.rrule(rrule.DAILY,
                    byweekday=[rrule.MO, rrule.TU, rrule.WE, rrule.TH, rrule.FR],
                    dtstart=start_date)
    # Create a rruleset
    rs = rrule.rruleset()
    # Attach our rrule to it
    rs.rrule(r)
    # Add holidays as exclusion days
    for exdate in holidays:
        rs.exdate(exdate)
    return rs

问题是,这个方法对于股票交易很好用,但我需要以不同的方式来计算外汇的交易日期。我需要按小时来计算,还要考虑公共假期等等。

在协调世界时(UTC)下,我认为市场的开放时间是从周日晚上10点到下周五晚上10点。

为了把这个变成一个rrule,我现在需要设置6个不同的交易日,其中周日和周五的交易时间需要特别处理,而其他工作日则需要算作全天开放。我很确定我需要把rrule的byday和byhour结合起来,但我找不到好的例子来实现这个。

任何帮助都非常欢迎!

1 个回答

1

我找到了一个更简单的方法,这个过程我花了一些时间在谷歌上查资料,还有查看代码和类的文档。这个方法用了一点小技巧,但这是合适的。请看下面的示例解决方案。

from dateutil import rrule
from datetime import  timedelta , datetime
holidays = [] # This is just a list of dates to exclude

def datetime_in_x_trading_hours(start_dt,future_hours):
    # First we add two hours. This is because its simpler to view the timeset
    # as 24hrs MON - FRI. (This also helps align the dates for the holidays)
    print start_dt
    start_dt += timedelta(hours=2)
    rs = get_fx_rset(start_dt)
    # Now using the set get the desired time and put the the missing hours
    future_time = rs[future_hours]
    future_time -= timedelta(hours=2)
    return future_time

def get_fx_rset(start_date_time):

    # Create a rule to recur every weekday starting today
    r = rrule.rrule(rrule.HOURLY,
                    byweekday=[rrule.MO, rrule.TU, rrule.WE, rrule.TH, rrule.FR],
                    byhour=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23],
                    byminute=[0],
                    bysecond=[0],
                    dtstart=start_date_time)

    # Create a rruleset
    rs = rrule.rruleset()
    # Attach our rrule to it
    rs.rrule(r)
    # Add holidays as exclusion days
    for exdate in holidays:
        rs.exdate(exdate)

    return rs

today = datetime.now() - timedelta(days=2)
print datetime_in_x_trading_hours(today, 7)

撰写回答