SAS数据步实现贷款未来利息与摊销支付现值计算咨询
SAS贷款还款现值计算实现方案
基础规则
- 折现率采用年通胀率,默认取值为2%,可通过代码开头的全局参数调整
- 直接在原始数据集基础上新增现值字段输出,无需生成中间现金流数据集
- 支持等额本金(flat amortization)、等额本息(annuity)两类还款方式的利息现值、摊销本金现值计算
完整实现代码
/* 全局参数:可按需调整年通胀率取值 */ %let annual_inflation = 0.02; data want; set have; /* 转换为月维度计算参数 */ inflation_monthly = &annual_inflation / 12; loan_int_monthly = interestRateNominalAnnual / 12; repay_month_cnt = round(maturityMonth); /* 确保还款月数为整数 */ /* 初始化现值变量 */ PV_interest_flat = 0; /* 等额本金利息现值 */ PV_amort_flat = 0; /* 等额本金摊销现值 */ PV_interest_annuity = 0; /* 等额本息利息现值 */ PV_amort_annuity = 0; /* 等额本息摊销现值 */ /* 计算两类还款的固定还款额 */ flat_amort_per_month = loanAmount / repay_month_cnt; /* 等额本金月还固定本金 */ annuity_total_per_month = loanAmount * loan_int_monthly * (1 + loan_int_monthly)**repay_month_cnt / ((1 + loan_int_monthly)**repay_month_cnt - 1); /* 等额本息月固定总还款 */ annuity_remaining_principal = loanAmount; /* 单观测内循环计算各期折现,无需生成额外数据集 */ do month = 1 to repay_month_cnt; discount = 1 / (1 + inflation_monthly)**month; /* 当期折现系数 */ /* 等额本金当期计算 */ flat_int_current = flat_amort_per_month * loan_int_monthly * (repay_month_cnt - month + 1); PV_interest_flat + flat_int_current * discount; PV_amort_flat + flat_amort_per_month * discount; /* 等额本息当期计算 */ annuity_int_current = annuity_remaining_principal * loan_int_monthly; annuity_amort_current = annuity_total_per_month - annuity_int_current; PV_interest_annuity + annuity_int_current * discount; PV_amort_annuity + annuity_amort_current * discount; annuity_remaining_principal + (-annuity_amort_current); end; /* 格式化输出字段 */ format loanAmount comma10. interestRateNominalAnnual 5.2 maturityMonth 3.0 PV_: comma15.2; /* 按需保留输出字段,若只需某一类还款方式可删除另一类的PV字段 */ keep loanAmount interestRateNominalAnnual maturityMonth PV_interest_flat PV_amort_flat PV_interest_annuity PV_amort_annuity; run;
代码说明
- 内部循环仅在单条贷款观测内执行,即使是十万级以上的贷款数据集也可快速运行,无性能压力
- 若仅需要计算某一类还款方式的现值,删除另一类还款方式的对应计算代码即可
- 输出字段命名清晰,可根据需求自行调整字段名
内容的提问来源于stack exchange,提问作者aef
相关产品推荐
相关产品推荐

