设定RRule的日期和时小时
我正在使用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)