使用 Numba 处理 pandas DataFrame 时间序列的有效方法

2024-03-02

我有一个包含 1,500,000 行的 DataFrame。这是我从 QuantQuote.com 购买的一分钟级别的股市数据。 (开盘价、最高价、最低价、收盘价、交易量)。我正在尝试对股票市场交易策略进行一些自制的回测。直接使用 python 代码来处理交易太慢了,我想尝试使用 numba 来加快速度。麻烦的是numba 似乎不适用于 pandas 函数 https://groups.google.com/a/continuum.io/forum/#!topic/numba-users/ZNfJtXeH2Lc.

谷歌搜索发现,关于使用 numba 和 pandas 的信息令人惊讶地缺乏。这让我想知道我的考虑是否犯了错误。

我的设置是 Numba 0.13.0-1,Pandas 0.13.1-1。 Windows 7、带有 PTVS 的 MS VS2013、Python 2.7、Enthought Canopy

我现有的Python+Pandas内循环具有以下一般结构

  • 计算“指标”列(使用 pd.ewma、pd.rolling_max、pd.rolling_min 等)
  • 计算预定事件的“事件”列,例如移动平均线交叉、新高等。

然后我使用 DataFrame.iterrows 来处理 DataFrame。

我尝试了各种优化,但仍然没有我想要的那么快。并且优化会导致错误。

我想使用 numba 来处理行。有解决这个问题的首选方法吗?

因为我的 DataFrame 实际上只是一个浮点矩形,所以我正在考虑使用 DataFrame.values 之类的东西来访问数据,然后编写一系列使用 numba 来访问行的函数。但这会删除所有时间戳,我不认为这是可逆操作。我不确定从 DataFrame.values 获得的值矩阵是否保证不是数据的副本。

任何帮助是极大的赞赏。


Numba 是一个支持 NumPy 的即时编译器。您可以将 NumPy 数组作为参数传递给 Numba 编译的函数,但不能传递给 Pandas 系列。

截至 2017 年 6 月 27 日,您唯一的选择是使用 Pandas 系列值,它们实际上是 NumPy 数组。

另外,您询问这些值是否为“保证不是数据的副本”。它们不是复制品,您可以验证:

import pandas


df = pandas.DataFrame([0, 1, 2, 3])
df.values[2] = 8
print(df)  # Should show you the value `8`

在我看来,Numba 是一种很棒的(如果不是最好的)处理市场数据的方法,而您只想坚持使用 Python。如果您想看到巨大的性能提升,请务必使用@numba.jit(nopython=True)(请注意,这不允许您在 JIT 编译的函数中使用字典和其他 Python 类型,但会使代码运行得更快)。

请注意,您正在使用的某些指标可能已经在 Pandas 中有效实现,因此请考虑使用 Pandas 预先计算它们,然后将值(NumPy 数组)传递给您的 Numba 回测函数。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Numba 处理 pandas DataFrame 时间序列的有效方法 的相关文章

随机推荐