在pandas/python中加速牛顿-拉弗森算法

3

我目前正在迭代处理一组非常大的数据,大约85GB(约600M行),只是使用牛顿-拉弗森方法计算新参数。目前我的代码运行非常缓慢,请问如何加速?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建议以及使用multiprocessing模块来显着加快了整个过程。


按行迭代不太高效,因为需要创建Series对象。 - root
所以我不太确定如何将其向量化,这就是问题所在。 - ast4
1个回答

2
不要在Python中编写自己的牛顿-拉弗森方法。使用scipy.optimize中的一个brentqnewton等{{root finders}}可以获得更好的性能。 (假设您已经安装了scipy,则也应该安装pandas。)
信封背面计算:
在标准硬件上进行600M次对brentq的调用应该是可管理的。
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微秒,那么600M次调用将需要约4.86 * 600 ~ 3000秒 ~ 1小时。
"牛顿可能会慢一些,但仍然可控:"
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

据我所知,使用scipy的newton函数无法设置目标。使用brentq的结果不太令人满意(昨晚我用它编写了一些东西)。 - ast4
Target只是一个常数,所以不必试图找到 f(x) = 0 的根,而是定义 g(x) = f(x) - Target 并将 newton 应用于 g - unutbu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接