【问题标题】:Speeding up newton-raphson in pandas/python在 pandas/python 中加速 newton-raphson
【发布时间】:2013-01-02 17:40:41
【问题描述】:

我目前正在迭代一个非常大的数据集 ~85GB(~600M 行),并简单地使用 newton-raphson 来计算一个新参数。截至目前,我的代码非常慢,关于如何加快速度的任何提示? BSCallClass 和 BSPutClass 的方法是封闭形式的,所以没有什么可以真正加快速度。谢谢。

class NewtonRaphson:

    def __init__(self, theObject):
        self.theObject = theObject

    def solve(self, Target, Start, Tolerance, maxiter=500):
        y = self.theObject.Price(Start)
        x = Start
        i = 0
        while (abs(y - Target) > Tolerance):
            i += 1
            d = self.theObject.Vega(x)
            x += (Target - y) / d
            y = self.theObject.Price(x)
            if i > maxiter:
                x = nan
                break
        return x

    def main():
        for row in a.iterrows():
            print row[1]["X.1"]
            T = (row[1]["X.7"] - row[1]["X.8"]).days
            Spot = row[1]["X.2"]
            Strike = row[1]["X.9"]
            MktPrice = abs(row[1]["X.10"]-row[1]["X.11"])/2
            CPflag = row[1]["X.6"]

            if CPflag == 'call':
                option = BSCallClass(0, 0, T, Spot, Strike)
            elif CPflag == 'put':
                option = BSPutClass(0, 0, T, Spot, Strike)

            a["X.15"][row[0]] = NewtonRaphson(option).solve(MktPrice, .05, .0001)

编辑:

对于那些好奇的人,我最终通过使用 scipy 建议以及使用多处理模块显着加快了整个过程。

【问题讨论】:

  • 逐行迭代并不是特别有效,因为必须创建 Series 对象。
  • 所以我不太确定如何矢量化这个,就是这样。

标签: python pandas newtons-method


【解决方案1】:

不要在 Python 中编写自己的 Newton-Raphson 方法。使用root finders in scipy.optimize 之一,例如brentqnewton,您将获得更好的性能。 (大概,如果你有pandas,你也会安装scipy。)


信封计算:

对 brentq 的 600M 调用应该可以在标准硬件上进行管理:

import scipy.optimize as optimize
def f(x):
    return x**2 - 2

In [28]: %timeit optimize.brentq(f, 0, 10)
100000 loops, best of 3: 4.86 us per loop

因此,如果每次调用 optimize.brentq 需要 4.86 微秒,那么 6 亿次调用将需要大约 4.86 * 600 ~ 3000 秒 ~ 1 小时。


newton 可能会更慢,但仍然可以管理:

def f(x):
    return x**2 - 2
def fprime(x):
    return 2*x

In [40]: %timeit optimize.newton(f, 10, fprime)
100000 loops, best of 3: 8.22 us per loop

【讨论】:

  • 所以 AFAIK,您无法使用 scipy 的牛顿函数设置目标。使用 brentq 的结果不太令人满意(我昨晚用它做了一些事情)。
  • Target 只是一个常量,所以不要试图找到f(x) = 0 的根,而是定义g(x) = f(x) - Target 并将newton 应用于g
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 1970-01-01
  • 2012-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多