【问题标题】:Converting OHLC stock data into a different timeframe with python and pandas使用 python 和 pandas 将 OHLC 股票数据转换为不同的时间范围
【发布时间】:2023-04-07 21:08:01
【问题描述】:

关于使用Pandas 进行 OHLC 数据时间帧转换,有人可以为我指明正确的方向吗?我正在尝试做的是构建一个包含更高时间范围数据的数据框,给定具有更低时间范围的数据。

例如,假设我有以下一分钟 (M1) 数据:

                       Open    High     Low   Close  Volume
Date                                                       
1999-01-04 10:22:00  1.1801  1.1819  1.1801  1.1817       4
1999-01-04 10:23:00  1.1817  1.1818  1.1804  1.1814      18
1999-01-04 10:24:00  1.1817  1.1817  1.1802  1.1806      12
1999-01-04 10:25:00  1.1807  1.1815  1.1795  1.1808      26
1999-01-04 10:26:00  1.1803  1.1806  1.1790  1.1806       4
1999-01-04 10:27:00  1.1801  1.1801  1.1779  1.1786      23
1999-01-04 10:28:00  1.1795  1.1801  1.1776  1.1788      28
1999-01-04 10:29:00  1.1793  1.1795  1.1782  1.1789      10
1999-01-04 10:31:00  1.1780  1.1792  1.1776  1.1792      12
1999-01-04 10:32:00  1.1788  1.1792  1.1788  1.1791       4

每分钟都有开盘价、最高价、最低价、收盘价 (OHLC) 和成交量值我想构建一组 5 分钟读数 (M5),如下所示:

                       Open    High     Low   Close  Volume
Date                                                       
1999-01-04 10:25:00  1.1807  1.1815  1.1776  1.1789      91
1999-01-04 10:30:00  1.1780  1.1792  1.1776  1.1791      16

所以工作流程是这样的:

  • Open 是时间窗口中第一行的 Open
  • High 是时间窗口中的最高 High
  • Lo​​w是最低的Low
  • Close 是最后一个 Close
  • Volume 只是 Volumes 的总和

不过有几个问题:

  • 数据有间隙(注意没有 10:30:00 行)
  • 5 分钟的间隔必须从循环时间开始,例如M5 开始于 10:25:00 而不是 10:22:00
  • 首先,不完整的集合可以像本例一样被省略,也可以包括在内(所以我们可以有 10:20:00 5 分钟的条目)

Pandas documentation on up-down sampling 给出了一个例子,但他们使用平均值作为上采样行的值,这在此处不起作用。我曾尝试使用groupbyagg,但无济于事。对于一个人来说,获得最高的最高价和最低的最低价可能并不难,但我不知道如何获得第一个开盘和最后一个收盘。

我尝试的内容大致如下:

grouped = slice.groupby( dr5minute.asof ).agg( 
    { 'Low': lambda x : x.min()[ 'Low' ], 'High': lambda x : x.max()[ 'High' ] } 
)

但它会导致以下错误,我不明白:

In [27]: grouped = slice.groupby( dr5minute.asof ).agg( { 'Low' : lambda x : x.min()[ 'Low' ], 'High' : lambda x : x.max()[ 'High' ] } )
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
/work/python/fxcruncher/<ipython-input-27-df50f9522a2f> in <module>()
----> 1 grouped = slice.groupby( dr5minute.asof ).agg( { 'Low' : lambda x : x.min()[ 'Low' ], 'High' : lambda x : x.max()[ 'High' ] } )

/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in agg(self, func, *args, **kwargs)
    242         See docstring for aggregate
    243         """
--> 244         return self.aggregate(func, *args, **kwargs)
    245 
    246     def _iterate_slices(self):

/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in aggregate(self, arg, *args, **kwargs)
   1153                     colg = SeriesGroupBy(obj[col], column=col,
   1154                                          grouper=self.grouper)
-> 1155                     result[col] = colg.aggregate(func)
   1156 
   1157             result = DataFrame(result)

/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in aggregate(self, func_or_funcs, *args, **kwargs)
    906                 return self._python_agg_general(func_or_funcs, *args, **kwargs)
    907             except Exception:
--> 908                 result = self._aggregate_named(func_or_funcs, *args, **kwargs)
    909 
    910             index = Index(sorted(result), name=self.grouper.names[0])

/usr/lib/python2.7/site-packages/pandas/core/groupby.pyc in _aggregate_named(self, func, *args, **kwargs)
    976             grp = self.get_group(name)
    977             grp.name = name
--> 978             output = func(grp, *args, **kwargs)
    979             if isinstance(output, np.ndarray):
    980                 raise Exception('Must produce aggregated value')

/work/python/fxcruncher/<ipython-input-27-df50f9522a2f> in <lambda>(x)
----> 1 grouped = slice.groupby( dr5minute.asof ).agg( { 'Low' : lambda x : x.min()[ 'Low' ], 'High' : lambda x : x.max()[ 'High' ] } )

IndexError: invalid index to scalar variable.

因此,我们将不胜感激任何帮助。如果我选择的路径不起作用,请建议其他相对有效的方法(我有数百万行)。一些关于使用 Pandas 进行财务处理的资源也很好。

【问题讨论】:

  • 你用的是什么版本的熊猫?我们正在努力改进时间序列功能,这将大大简化这个过程,但它不太可能在 4 月底左右发布。不过,这里可能也有需要修复的错误
  • 嗨,韦斯,我使用的是 0.7.2。我想等待新版本发布是一个可行的选择,因为我没有这个转换的最后期限(我需要私人研究的数据)。让我借此机会感谢您为开发 Pandas 付出的努力! :)
  • 至于潜在的错误,请注意我没有为 Dataframe 中的所有列指定值(仅 5 列中的 2 列),如果这就是您的意思的话。

标签:
python
stock
pandas