在pandas/python中加速newtonraphson

2024-07-03 06:51:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前正在迭代一个非常大的数据集~85GB(约600万行),并简单地使用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建议和多处理模块,大大加快了整个过程。在


Tags: selftargetdeftolerancestartrowoptionsolve
1条回答
网友
1楼 · 发布于 2024-07-03 06:51:49

不要用Python编写自己的Newton-Raphson方法。使用root finders in scipy.optimize中的一个,例如brentq或{a3},可以获得更好的性能。 (大概,如果您有pandas,那么您还应该安装scipy。)


信封背面计算:

向brentq拨打6亿个电话应该可以在标准硬件上进行管理:

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可能较慢,但仍然可以管理:

^{pr2}$

相关问题 更多 >