2017-12-16 15 views
0

私はローンの償却プロファイルを計算し、デフォルト(cdr =一定のデフォルトレート)と前払い(cpr =一定の前払いレート)を可能にするコードを持っています。ループ内のPythonオフセット

また、リカバリを含めることもできますが、このリカバリは将来の期間に受け取る必要があります。下記の例では3%のcdrを適用していますが、6ヵ月後にデフォルトローン残高の60%を回収することを希望します。 私はこれを各ループで前の期間に戻って参照する必要があるように苦労しています。

リカバリなしでテーブル/データフレームを最初に作成し、次に2番目のステージでこの問題を解決するには、カラムリカバリのデフォルトの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

関連する問題