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



我有一个150万行的DataFrame。这是我从QuantQuote.com上买的一分钟级别的股市数据。(打开,高,低,关闭,音量)。我正试着对股市交易策略进行一些自制的回测。直接使用python代码来处理事务太慢了,我想尝试使用numba来加快速度。问题是numba似乎不能与pandas函数一起工作。

谷歌搜索发现,关于使用numba与熊猫的信息令人惊讶地缺乏。这让我怀疑我考虑它是否犯了一个错误。

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

我现有的Python+Pandas内部循环具有以下通用结构

  • 计算"指示器"列,(带pd)。ewma pd。rolling_max pd。rolling_min等等)
  • 为预定事件计算"事件"列,如移动平均线交叉、新高等

然后使用DataFrame。迭代处理DataFrame

我已经尝试了各种优化,但它仍然没有我想的那么快。而且这些优化会导致bug。

我想使用numba来处理这些行。有没有更好的方法来解决这个问题?

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

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

您唯一的选择,仍然是2017-06-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回测函数。

最新更新