【问题标题】:SAS - Calculating the present value of future interest and amortization payments of loansSAS - 计算贷款未来利息和摊销的现值
【发布时间】:2021-12-16 08:03:37
【问题描述】:

我想计算数据集中未来贷款利息和摊销(固定摊销和年金)的现值 (PV)。贴现率应该是通货膨胀,例如2%。我在SAS 中看到了 finance 函数,但是由于数据集的性质,它需要每个现金流。

例如如果您借 100,000 100 个月(固定摊销),您将每月偿还(摊销)1,000。但由于通货膨胀(例如 2%),100 个月的还款与实际的 1 个月不同。利息成本也是如此。

最后,我希望在我的数据集后面有列,显示所有未来利息和摊销支付的现值。

如果可能,我希望在数据步骤中提供解决方案。

我的数据集示例

data have;
    call streaminit(12345);
    do i = 1 to 5;
        loanAmount = abs(rand("normal", 300E3, 200E3));
        interestRateNominalAnnual = abs(rand('normal',0.05,0.05));
        maturityMonth = abs(rand("normal", 120, 24));
        output;
    end;
    format loanAmount comma10. interestRateNominalAnnual 5.2 maturityMonth 3.0;
run;

想要

loanAmount interestRateNominalAnnual maturityMonth PV interest PV Amortization
352,847 0.10 140
189,445 0.13 90
271,693 0.10 122
545,052 0.04 127
70,121 0.03 109

【问题讨论】:

  • 您是否要求以 3% 的利率在 109 个月内还清 70,121 所需的每月付款分为利息和本金?还是 109 笔利息的总和?如果后者,那么最后一列的含义是什么?也是每月(每次付款)利率或年利率的 3%(因此每月利率为 0.25%)。
  • 利率为年利率。因此,70,121 笔贷款的月利率为 0.03/12。我想计算的是所有未来付款(利息和摊销)的现值。不是贷款发票。由于通货膨胀,第 100 个月的利息和摊销付款与第 109 个月的价值不同。所以,摊销的现值也应该计算出来。
  • proc贷款怎么样?你有 SAS/ETS 吗?

标签: loops sas finance calculation datastep


【解决方案1】:
options cmplib=work.ORBA;
proc fcmp outlib=work.ORBA.pv; * Present value;
    subroutine pvLoan(  /* input */
                        loanAmount,
                        maturityMonth,
                        interestRateAnnual,
                        inflationAnnual,

                        /* output */
                        amortizationSumAnnuity,
                        interestSumAnnuity,
                        invoiceSumAnnuity,

                        amortizationSumFlat,
                        interestSumFlat,
                        invoiceSumFlat,

                        pvAmortizationSumAnnuity,
                        pvInterestSumAnnuity,
                        pvInvoiceSumAnnuity,

                        pvAmortizationSumFlat,
                        pvInterestSumFlat,
                        pvInvoiceSumFlat);

    outargs amortizationSumAnnuity,     interestSumAnnuity,     invoiceSumAnnuity,
            amortizationSumFlat,        interestSumFlat,        invoiceSumFlat, 
            pvAmortizationSumAnnuity,   pvInterestSumAnnuity,   pvInvoiceSumAnnuity,
            pvAmortizationSumFlat,      pvInterestSumFlat,      pvInvoiceSumFlat;

        if missing(loanAmount) or missing(maturityMonth) or missing(interestRateAnnual) then 
            do;
                pvAmortizationSumAnnuity    = .;
                pvInterestSumAnnuity        = .;
                pvInvoiceSumAnnuity         = .;
                pvAmortizationSumFlat       = .;
                pvInterestSumFlat           = .;
                pvInvoiceSumFlat            = .;
            end;
        else
            do;
                inflationMonth  = sum(exp((log(sum(1,inflationAnnual)))/12),-1);

                do maturityPeriod = 1 to maturityMonth;
*                   ------------------------------------------------------------------------------------------;
*                               ANNUITY;
*                   ------------------------------------------------------------------------------------------;
                    fv                      = 0; * Specifies the future value after the last payment is made;
                    paymentDueDate          = 0; * Specifies whether the payments occur at the beginning or end of a period. 0 represents the end-of-period payments;

*                   NOMINAL VALUE;
*                   If the interest rate is zero you only amortize. Equal to flat amortization;
                    if interestRateAnnual = 0 then 
                        do;
                            amortizationAnnuity         = loanAmount / maturityMonth;
                            interestPaymentAnnuity      = 0;
                            invoiceAnnuity              = sum(amortizationAnnuity, interestPaymentAnnuity);
                        end;
                        else
                            do;
                                amortizationAnnuity     = abs(finance('ppmt', interestRateAnnual/12, maturityPeriod, maturityMonth, loanAmount, paymentDueDate));
                                invoiceAnnuity          = abs(finance('pmt', interestRateAnnual/12, maturityMonth, loanAmount, fv, paymentDueDate));
                                interestPaymentAnnuity  = abs(sum(invoiceAnnuity, - amortizationAnnuity));
                            end;

*                   Cumulative nominal flat amortization;
                    amortizationSumAnnuity      = sum(amortizationSumAnnuity, amortizationAnnuity);
                    interestSumAnnuity          = sum(interestSumAnnuity, interestPaymentAnnuity);
                    invoiceSumAnnuity           = sum(amortizationSumAnnuity, interestSumAnnuity);

*                   PRESENT VALUE;
*                   Present value of the interest and amortization for a annuity;
                    pvAmortizationAnnuity       = amortizationAnnuity    / ((1+inflationMonth)**maturityPeriod);
                    pvInterestAnnuity           = interestPaymentAnnuity / ((1+inflationMonth)**maturityPeriod);
                    pvInvoiceAnnuity            = sum(pvAmortizationAnnuity, pvInterestAnnuity);

*                   Cumulative present value annuity;
                    pvAmortizationSumAnnuity    = sum(pvAmortizationSumAnnuity, pvAmortizationAnnuity);
                    pvInterestSumAnnuity        = sum(pvInterestSumAnnuity, pvInterestAnnuity);
                    pvInvoiceSumAnnuity         = sum(pvAmortizationSumAnnuity, pvInterestSumAnnuity);

*                   ------------------------------------------------------------------------------------------;
*                               FLAT AMORTIZATION;
*                   ------------------------------------------------------------------------------------------;
*                   NOMINAL VALUE;
*                   Payment in period n;
                    amortizationFlat        = loanAmount / maturityMonth;
                    interestPaymentFlat     = (sum(loanAmount, -amortizationFlat*(maturityPeriod-1)) * interestRateAnnual/12);
                    invoiceFlat             = sum(amortizationFlat, interestPaymentFlat);

*                   Cumulative nominal flat amortization;
                    amortizationSumFlat     = sum(amortizationSumFlat, amortizationFlat);
                    interestSumFlat         = sum(interestSumFlat, interestPaymentFlat);
                    invoiceSumFlat          = sum(amortizationSumFlat, interestSumFlat);

*                   PRESENT VALUE;
*                   Present value of the interest and amortization for flat amortization;
                    pvAmortizationFlat      = amortizationFlat    / ((1+inflationMonth)**maturityPeriod);
                    pvInterestFlat          = interestPaymentFlat / ((1+inflationMonth)**maturityPeriod);
                    pvInvoiceFlat           = sum(pvAmortizationFlat, pvInterestFlat);

*                   Cumulative present value flat amortization;
                    pvAmortizationSumFlat   = sum(pvAmortizationSumFlat, pvAmortizationFlat);
                    pvInterestSumFlat       = sum(pvInterestSumFlat, pvInterestFlat);
                    pvInvoiceSumFlat        = sum(pvAmortizationSumFlat, pvInterestSumFlat);
                end;
            end;
    endsub;
run;

data have;
    call streaminit(12345);
    do i = 1 to 5;
        loanAmount          = abs(floor(rand("normal", 300E3, 200E3)));
        maturityMonth       = abs(floor(rand("normal", 120, 24)));
        interestRateAnnual  = abs(rand('normal',0.05,0.05));
        output;
    end;
    format loanAmount maturityMonth comma10. interestRateAnnual percent10.2;
    drop i;
run;

data want;
set have;
*   Call the subroutine and performe the calculations;
    call pvLoan(    /* input */
                    loanAmount,
                    maturityMonth,
                    interestRateAnnual,
                    0.02,
                    /* output */
                    amortizationSumAnnuity,
                    interestSumAnnuity,
                    invoiceSumAnnuity,

                    amortizationSumFlat,
                    interestSumFlat,
                    invoiceSumFlat,

                    pvAmortizationSumAnnuity,
                    pvInterestSumAnnuity,
                    pvInvoiceSumAnnuity,

                    pvAmortizationSumFlat,
                    pvInterestSumFlat,
                    pvInvoiceSumFlat);
    format _numeric_ comma20. interestRateAnnual percent5.2;
run;

【讨论】:

  • 请不要只发布代码作为答案,还要解释您的代码的作用以及它如何解决问题的问题。带有解释的答案通常更有帮助,质量更高,更有可能吸引投票。
  • 感谢您的提示。我很快就会回来解释。
猜你喜欢
  • 2013-01-23
  • 2015-05-04
  • 1970-01-01
  • 1970-01-01
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 1970-01-01
相关资源
最近更新 更多