15

我有一个包含 1,500,000 行的 DataFrame。这是我从 QuantQuote.com 购买的一分钟级股市数据。(开盘价、最高价、最低价、收盘价、成交量)。我正在尝试对股市交易策略进行一些自制的回测。处理事务的直接 python 代码太慢了,我想尝试使用 numba 来加快速度。问题是numba 似乎不适用于 pandas 函数

谷歌搜索发现关于使用 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 获得的值矩阵是否保证不是数据的副本。

任何帮助是极大的赞赏。

4

1 回答 1

10

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 回测函数。

于 2017-06-27T12:37:36.623 回答