2017-12-16 34 views
0

나는 대출의 할부 상환 프로파일을 계산하고 기본값 (cdr = 상수 기본 요율)과 선결제 (cpr = 일정 선불 요율)를 허용하는 코드 조각을 가지고 있습니다.파이썬 오프셋 루프

복구도 포함하고 싶지만이 복구는 이후 기간에 받아야합니다. 아래 예에서는 3 % cdr을 적용하고 있으며, 6 개월 후에 부도 채무 잔액의 60 %를 회수하겠습니다. 각 루프에서 이전 기간을 다시 참조해야 할 때와 마찬가지로이 작업에 어려움을 겪고 있습니다.

먼저 복구없이 테이블/데이터 프레임을 작성한 다음 두 번째 단계에서 열 복구의 기본값 60 %를 6 개월 씩 추가하여 복구를 적용하십시오.

그러나 나는 amortize 함수 안에서 이것을하는 더 나은/깨끗한 방법이 있기를 바라고 있습니다.

도움을 주시면 감사하겠습니다.

import pandas as pd 
import numpy as np 
from datetime import date 
from collections import OrderedDict 
from dateutil.relativedelta import * 
pd.options.display.float_format = '{:,.2f}'.format 

def amortize(principal, int_rate,periods, cpr, cdr, date, recovery_rate, recovery_timing): 
    p = 0 
    beg_balance = principal 
    end_balance = principal 

    while end_balance > 1: 
     default = round((1-(1-cdr/100)**(1/12)) * beg_balance,2) 
     interest = round((int_rate/12)*max(beg_balance-default,0),2)   
     if p < periods: 
      pmt = -round(np.pmt(int_rate/12, periods -p, 
           beg_balance - default),2) 
     else: 
      pmt = 0 
     principal = pmt - interest 
     prepay = round((1-(1-cpr/100)**(1/12)) * (beg_balance - principal),2) 

     end_balance = max(beg_balance - principal - prepay - default,0) 
     recovery = default * recovery_rate/100 

     total_cash = pmt + prepay + recovery #plus a recovery lag 
     yield OrderedDict([('Period',p+1), 
          ('Month', date), 
          ('Begin_Bal', beg_balance), 
          ('Default',default), 
          ('Sched Princ',principal), 
          ('Prepay Princ',prepay), 
          ('Interest',interest), 
          ('Recovery',recovery), 
          ('Total CF',total_cash), 
          ('End Balance', end_balance)]) 
     p += 1 
     date += relativedelta(months=1) 
     beg_balance = end_balance 


table = amortize(300000,0.03,360,10,3,date(2017,12,11),60,6)        

pd.DataFrame(table).head() 

답변

0

솔루션 소리가 깨끗합니다. 당신은 또한 다음 대출 기간이 매우 긴 경우 (6)의 고정 용량 대신 과도한 된 계산을 유지 피하기 목록 collections.deque을 사용할 수 있습니다 defaults[-6]

를 참조 defaults.append(..)와 과거의 기본값 목록을 만들 수 있습니다.

+0

감사합니다. 간단하고 효율적입니다! – Jelmerd