交易数据记录于上午9:30开始的非假日工作日,并定期(5秒,5分钟,30分钟等)记录数据,直至下午4:00。例如,非假日工作日[上午9:30,上午9:35,......,下午3:50,下午3:55]是有5分钟数据的时间。
pandas
是否具备正确使用此类时间结构所需的功能?我已经看到有办法在工作日(上午9:00到下午4:00)添加custom holidays。但我还没有看到定义自定义营业时间,如(上午9:30至下午4:00)。例如,是否可以定义自定义交易时间 [上午9:30,上午10:30,下午3:30]或交易5分钟任何代码都支持营业时间?
例如,是否有一种pandas
方式可以生成DatetimeIndex
,即5分钟的频率,遵循交易时间规则:
或者目前这还不支持?
换句话说,pandas
目前有哪些方法/类来实现这种功能?如果没有,有没有人知道其他可以提供帮助的图书馆?
答案 0 :(得分:1)
我有同样的问题,至少是关于
<块引用>是否有一种 Pandas 驱动的方式来生成一个 DatetimeIndex,比如说,遵循交易时间规则的 5 分钟频率?
我在下面给你一个答案,但首先,关于:
<块引用>pandas 是否具备正确处理这种时间结构所需的能力?
“一起工作”这个词相当含糊;你想做的“工作”是什么?
Pandas 绝对可以在这种时间结构下正常工作做一些事情,但也许不能做其他事情。
和关于。
<块引用>例如,是否可以定义自定义交易时间 [9:30AM, 10:30AM, ... 3:30PM] ... ?
答案是肯定的,但是有一些限制,我将在下面描述。 也就是说,我将主要关注生成遵循交易时间和交易日规则的日期时间索引的能力,并在下面演示如何使用 Pandas 执行此操作。首先,我将提及一些现有的 Pandas 工具及其局限性。
我昨天晚上大部分时间都在研究这个。 pandas 必须生成日期时间索引范围的大多数函数都接受输入频率 freq
作为字符串(例如 '15T'
表示 15 分钟,或 {{1} } 每天)。
这些相同的函数通常也会接受一个 pandas time series offset 对象来代替频率。有许多不同种类的偏移量:每个都定义了一个可以有规则的频率,例如跳过周末(例如,offsets.BusinessDay)或为 business hours only 生成日期时间索引,例如仅从上午 9 点到下午 5 点.
我在频率和偏移对象方面遇到的主要问题是(在大多数情况下)无法将它们组合起来。>
例如,使用 BusinessHour offset class 我可以指定我想生成一个只包含营业时间(交易时间)的索引,我什至可以只在工作日(在一堆日期上)这样做< em>但我不能将其与指定频率相结合,例如每分钟一次或每 15 分钟一次。相反,BusinessHour 偏移类似乎默认为每小时一次的频率,我发现无法更改它。
或者,例如,我可以使用 'D'
指定频率 pandas.bdate_range()
以每 30 分钟生成一个索引点,但将包括非工作日。如果我仅针对工作日将频率设置为 '30T'
,则它会跳过非工作日,但我每天只能获得一个索引点。我发现没有办法将这两个频率结合起来。
我想出的最简单的解决方案是生成一个工作日(交易日)列表,然后循环遍历该列表,以所需的频率(1 分钟、5 分钟或 15 分钟)为每个日期生成索引) 从每个日期的开放时间到关闭时间。然后我使用 pandas 'B'
方法将日期时间索引合并为一个。代码如下所示:
DatetimeIndex.union_many()
以下是使用它的一些示例:
def trading_day_range(bday_start=None,bday_end=None,bday_freq='B',
open_time='09:30',close_time='16:00',iday_freq='15T',weekmask=None):
if bday_start is None: bday_start = pd.Timestamp.today()
if bday_end is None: bday_end = bday_start + pd.Timedelta(days=1)
daily = []
for d in pd.bdate_range(start=bday_start,end=bday_end,freq=bday_freq,weekmask=weekmask):
topen = pd.Timestamp(open_time)
d1 = d.replace(hour=topen.hour,minute=topen.minute)
tclose = pd.Timestamp(close_time)
d2 = d.replace(hour=tclose.hour,minute=tclose.minute+1)
daily.append(pd.date_range(d1,d2,freq=iday_freq))
index = daily[0].union_many(daily[1:])
return index
ix = trading_day_range()
print('len(ix)=',len(ix))
print(ix[20:40])
print(ix[-20:])
len(ix)= 54
DatetimeIndex(['2021-04-13 14:30:00', '2021-04-13 14:45:00',
'2021-04-13 15:00:00', '2021-04-13 15:15:00',
'2021-04-13 15:30:00', '2021-04-13 15:45:00',
'2021-04-13 16:00:00', '2021-04-14 09:30:00',
'2021-04-14 09:45:00', '2021-04-14 10:00:00',
'2021-04-14 10:15:00', '2021-04-14 10:30:00',
'2021-04-14 10:45:00', '2021-04-14 11:00:00',
'2021-04-14 11:15:00', '2021-04-14 11:30:00',
'2021-04-14 11:45:00', '2021-04-14 12:00:00',
'2021-04-14 12:15:00', '2021-04-14 12:30:00'],
dtype='datetime64[ns]', freq=None)
DatetimeIndex(['2021-04-14 11:15:00', '2021-04-14 11:30:00',
'2021-04-14 11:45:00', '2021-04-14 12:00:00',
'2021-04-14 12:15:00', '2021-04-14 12:30:00',
'2021-04-14 12:45:00', '2021-04-14 13:00:00',
'2021-04-14 13:15:00', '2021-04-14 13:30:00',
'2021-04-14 13:45:00', '2021-04-14 14:00:00',
'2021-04-14 14:15:00', '2021-04-14 14:30:00',
'2021-04-14 14:45:00', '2021-04-14 15:00:00',
'2021-04-14 15:15:00', '2021-04-14 15:30:00',
'2021-04-14 15:45:00', '2021-04-14 16:00:00'],
dtype='datetime64[ns]', freq=None)
ix1 = trading_day_range('01/01/2021 09:30','01/13/2021 16:00',
bday_freq='C',iday_freq='30T',weekmask='Wed Thu Fri')
print('len(ix1)=',len(ix1))
print(ix1[20:40])
print(ix1[-20:])
答案 1 :(得分:0)
您可以以正常方式生成5分钟代码,然后使用DatetimeIndex.indexer_between_time获取自定义交易时间的datetimeindex(https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DatetimeIndex.indexer_between_time.html)
例如: 如果我是您创建的日期时间索引,那么下面的代码将为您提供交易时间的自定义datetimeindex
i [i.indexer_between_time('09:30:00','04:00:00',include_end = False)]