나는 대출의 할부 상환 프로파일을 계산하고 기본값 (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()
감사합니다. 간단하고 효율적입니다! – Jelmerd