2014-07-18 5 views
1

이것은 이전에 질문했던 또 다른 질문과 관련이 있습니다. 큰 데이터 세트에서 newton 메서드를 실행하고 싶습니다. 아래 루프를 사용하여 만든 코드입니다. 나는 5 천만 라인에 그것을 실행해야하고 루프는 꽤 다루기 힘들다. Pandas/Numpy/ect를 사용하여 실행하는 더 효율적인 방법이 있습니까? 미리 감사드립니다.효율적인 뉴턴 알고리즘 실행

In: 
from pandas import * 
from pylab import * 
import pandas as pd 
import pylab as plt 
import numpy as np 
from scipy import * 
import scipy 

df = DataFrame(list([100,2,34.1556,9,105,-100])) 
df = DataFrame.transpose(df) 
df = df.rename(columns={0:'Face',1:'Freq',2:'N',3:'C',4:'Mkt_Price',5:'Yield'}) 
df2= df 
df = concat([df, df2]) 
df = df.reset_index(drop=True) 
df 

Out: 
    Face Freq N  C Mkt_Price Yield 
0 100  2 34.1556  9 105 -100 
1 100  2 34.1556  9 105 -100 

In: 
def Px(Rate): 
    return Mkt_Price - (Face * (1 + Rate/Freq) ** (- N) + (C/Rate) * (1 - (1 + (Rate/Freq)) ** -N)) 

for count, row in df.iterrows(): 
     Face = row['Face'] 
     Freq = row['Freq'] 
     N = row['N'] 
     C = row['C'] 
     Mkt_Price = row['Mkt_Price'] 
     row['Yield'] = scipy.optimize.newton(Px, .1, tol=.0001, maxiter=100) 
df 

Out: 
    Face Freq N   C Mkt_Price Yield 
0 100  2 34.1556  9 105  0.084419 
1 100  2 34.1556  9 105  0.084419 
+0

정말 고유 한 채권이 50M입니까? 얼굴, 가격, 쿠폰을 표준 단위로 변환하고 그룹화하면 문제의 크기가 줄어 듭니까? – chrisb

+0

그것의 약 40k 채권하지만 각기 다른 가격, 쿠폰, 성숙의 시간, 매일 요법과 시간 시리즈. –

답변

0

내 마음에 떠오르는 하나의 가능성은 당신이 벡터화를 할 수 있다는 것입니다. 그러나 모든 조건부 코드를 버리고 필요한 양의 반복을 실행해야합니다.

Newton-Raphson의 기본 단계는 항상 동일하므로 조건부 코드가 필요하지 않습니다. 귀하의 기능 Px은 마치 여분의 노력없이 벡터화 될 수있는 것처럼 보입니다.

단계는 대략 다음과 같습니다이 후

def Px(Rate, Mkt_Price, Face, Freq, N, C): 
    return Mkt_Price - (Face * (1 + Rate/Freq) ** (- N) + (C/Rate) * (1 - (1 + (Rate/Freq)) ** -N)) 

# initialize the iteration vector 
y = 0.1 * np.zeros(num_rows) 
# just a guess for the differentiation, might be smaller 
h = 1e-6 

# then iterate for a suitable number of iterations 
for i in range(100): 
    f = Px(y, Mkt_Price, Face, Freq, N, C) 
    fp = Px(y+h, Mkt_Price, Face, Freq, N, C) 
    y -= h * f/(fp - f) 

당신이 y의 반복 결과가 있습니다. 나는 Mkt_Price, Face 등이 5,000 만 행 벡터라고 가정했다.

수십억 개의 계산이 있으므로이 작업에는 여전히 12 초가 걸립니다. 또한 오류 검사가 없기 때문에 무언가가 격렬하게 진동하는 경우 경고 할 내용이 없습니다.

이 방법을 개선하는 한 가지 방법은 첫 번째 미분을 분석적으로 계산하는 것입니다. 그러나 실제적인 개선은 작을 수 있습니다. 최상의 반복 횟수를 찾으려면 실험을해야합니다. 만약 함수가 빨리 수렴한다면, 20 번의 반복이 충분할 것입니다.

코드가 완전히 테스트되지 않았지만 아이디어를 설명해야합니다.