3

私は現在、〜85GB(〜6億行)の非常に大きなデータセットを反復処理しており、単純に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 の提案と multiprocessing モジュールを使用して、このプロセス全体を大幅に高速化しました。

4

1 に答える 1

2

Python で独自の Newton-Raphson メソッドをコーディングしないでください。brentqnewtonなどのscipy.optimize のルート ファインダーの 1 つを使用すると、パフォーマンスが向上します。(おそらく、 がある場合は、 もインストールします。)pandasscipy


エンベロープ計算の裏:

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.brentq4.86 マイクロ秒かかる場合、600M の呼び出しには約 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
于 2013-01-18T22:29:12.150 に答える