在多个时间范围内聚合/重采样 pandas 多索引数据帧并预测 ARIMA

Posted

技术标签:

【中文标题】在多个时间范围内聚合/重采样 pandas 多索引数据帧并预测 ARIMA【英文标题】:Aggregating/resampling a pandas multiindex dataframe over many timeframes and forecasting ARIMA 【发布时间】:2019-10-10 05:18:57 【问题描述】:

我有多个要跟踪和预测值的时间范围(ARIMA 预测每个时间范围提前 1 个时期),我的算法检索最低时间范围内的数据。注意:每个时间框架都可以被较低的时间框架均匀(但不一定对称)整除。需要注意的是,盘中时间框架(1H、4H)应从上午 9:30(市场开市时间)开始。

1分钟、5分钟、15分钟、30分钟、1H、4H、1D、1W、1M

首先,该算法进行批量history 调用并获取给定时间跨度内的所有 1 分钟数据(预热数据)。然后在其运行过程中(永不停止;它是一种交易算法),它每分钟接收一次数据。

第一步(在接收大量历史数据后)是使用越来越小的数据集为每个相应的更高时间范围聚合它以节省处理时间:

即,

1 分钟时间范围数据 = 1 分钟数据(历史批量数据) 5 分钟时间范围数据 = 将 1 分钟时间范围数据汇总到 5 分钟 15 分钟时间范围数据 = 5 分钟时间范围数据汇总到 15 分钟 等等……


鉴于以下示例数据集(并假设可能包含其他符号):

                                 close        high         low        open
symbol time                                                                  
SPY    2018-05-22 09:31:00  270.245900  270.374166  270.226167  270.305100   
       2018-05-22 09:32:00  270.344566  270.374166  270.206434  270.245900   
       2018-05-22 09:33:00  270.374166  270.374166  270.314966  270.344566   
       2018-05-22 09:34:00  270.275500  270.374166  270.245900  270.374166   
       2018-05-22 09:35:00  270.413632  270.443232  270.275500  270.275500   
       2018-05-22 09:36:00  270.502431  270.522165  270.384032  270.413632   
       2018-05-22 09:37:00  270.541898  270.591231  270.492565  270.502431

Q1:如何聚合多索引 pandas 数据帧,以便按符号聚合时间索引和列?说明我的意图的部分未经测试(并且可能不起作用)的解决方案如下:

# Where timeframe.Frequency is a string such as "1H" or "1min"
df.resample(timeframe.Frequency).agg("open": "first", "close": "last", "low": "min", "high": "max")

A1df.groupby(['symbol', pd.Grouper(freq=timeframe.Frequency, level='time')]).agg('open':'first', 'close':'last', 'high':'max', 'low':'min')


Q2:鉴于将有部分完成的“柱”用于更高的时间范围(例如,5 分钟时间范围数据将包含@9:35am 完整的柱数据和@9:37am 表示的部分柱数据好像是@9:40am),在给定时间范围的数据集中有部分数据是明智,还是我应该使用 QuantConnect 的 consolidator 在运行时将其添加到数据集之前完成条形图?在处理history 时,我如何考虑这部分柱状数据?

A2:重采样时确实会创建部分条。例如,我可能在 6 月 1 日之后有一个 1 分钟的数据点,而我的每月时间框架数据框将有一个 6 月 30 日的条目,其中包含 1 分钟柱的 OHLC 值。此时,我可以删除该行,也可以在数据进入时继续使用新值更新它。

【问题讨论】:

【参考方案1】:

对于您的第一个问题,假设数据由symboltime 索引:

(df.groupby(['symbol', df.index.get_level_values(1).floor('5T')])
   .agg("open": "first", 
         "close": "last", 
         "low": "min", 
         "high": "max")
)

给予:

                                open        close       low         high
symbol  time                
SPY     2018-05-22 09:30:00     270.305     270.276     270.206     270.374
SPY     2018-05-22 09:35:00     270.276     270.542     270.276     270.591

第二个问题过于定性,很大程度上取决于您的数据以及采样窗口。

【讨论】:

我已经更新以反映这个答案;谢谢!在我能够聚合/重新采样之后,我注意到确实创建了部分条形。剩下的唯一任务就是进行时间戳比较,并根据结果进行更新或插入。

以上是关于在多个时间范围内聚合/重采样 pandas 多索引数据帧并预测 ARIMA的主要内容,如果未能解决你的问题,请参考以下文章

pandas_重采样多索引标准差协方差

多索引上的 Pandas TimeGrouper

Pandas 将时间序列数据重新采样为 15 分钟和 45 分钟 - 使用多索引或列

Pandas 中的多索引、多年和每小时数据每天随机采样 N 小时

panda的多索引的好处?

在 Pandas 多索引中选择日期范围的正确方法是啥?