在SAS DO循环中正确设置avail_cashA取值逻辑的问题求助
SAS DO循环中avail_cashA赋值错误的修正方案
我在SAS的DO循环里想实现:avail_cashA列的第一个值等于pool_payment,后续每一行的值等于当期pool_payment加上上一期的reserve。之前尝试在output语句后更新avail_cashA,但结果不对,用Excel验证过确实不符合预期。
相关代码片段如下:
do Month = 1 to maturity; pool_payment = pmt(coupon, maturity - month + 1, pool_net_bal, 0); *Certificate A; avail_cashA = pool_payment; *Money leftover; Reserve = avail_cashC - actl_pmtC; output; avail_cashA = pool_payment + reserve; end;
问题原因
当前代码的核心问题是每次循环开头都会强制把avail_cashA重置为pool_payment,导致output语句后的更新操作完全被下一次循环的开头覆盖,后续行根本没用到reserve的值来计算。
修正后的代码
要实现需求,需要单独处理第一行的赋值,后续行用上一期的reserve来计算:
do Month = 1 to maturity; pool_payment = pmt(coupon, maturity - month + 1, pool_net_bal, 0); * 处理avail_cashA:首月用pool_payment,后续用当期pool_payment加前一期Reserve; if Month = 1 then avail_cashA = pool_payment; else avail_cashA = pool_payment + Reserve; * 计算当期的Reserve,下一次循环会用到这个值; Reserve = avail_cashC - actl_pmtC; output; end;
逻辑说明
- 首月(Month=1)直接给avail_cashA赋值为pool_payment,符合初始需求;
- 从第二个月开始,avail_cashA用当期的pool_payment加上上一期计算好的Reserve(Reserve是当期output前计算的,下一次循环时保留的就是上一期的结果);
- 去掉了原代码中output后的avail_cashA赋值,避免无效操作。
内容的提问来源于stack exchange,提问作者bandcar
相关产品推荐
相关产品推荐

