大部分数据可以分成两类,静态(Static)和动态(Time Series,文中将称为时间序列,简称序列)。静态的包含那些不会随时间变化的数据,动态就是那些随时间变化的。以房贷为例,贷款(初始)金额,所在州及邮政编码,第一次付款日期(First Payment Day) 等显然属于静态,不用每月更新。下面介绍几个动态变量。每月月底剩余金额,就是指月付付掉以后的金额。付款违例次数,你欠了几个月的付款。(每月)即时状态,有正常,付清(即所剩金额为0),进入拍卖程序(Foreclosure),所有权转换(REO)。如果是可调利率,每月的利息也是随时间变化的,当然一般来说不会每月都变。这儿金额一项是连续变量,最容易出错。其它各项都是离散量,出错可能就小得多。就象录像带容易损坏,CD就耐用的多。 所谓数据“错误”,实际又分两类。一种是明显的操作错误,比如房贷利率625%,显然是6.25%之误。即使是这样的错误,也不是操作人员可以自己修改的。至少至少也要老板签个字,然后备案。至于下面要说的那些“错误”,是根本不允许改的。有些从数据角度来说根本不是错。有些是错,比如数据空缺,但你不可以耍小聪明把它补上去。原始数据不许动,但使用时你还是可以根据具体要求将其修补的。还有些时候,一个问题有两个正确答案。有一次有人问我,房贷的终结日期(Liquidation Date)怎么定义。我差点脱口而出,本金付清的那一天,忽然想到不完全对。如果模型或报表是为债劵投资人服务的,那是对的,因为在那一天,他们把投资全部收回。同样道理,给税务部门或证管会的报表也要这么处理,因为在那一天这笔钱从你账上划掉了。但对于担保债劵的部门,从这个房贷停止月付那个月起,他们就开始亏损了。如果屋主后来痛改前非,担保者有惊无险,亏的钱总算拿回来。如果屋主一直没付,直至被银行拍卖,对他们来说这个房贷从停止月付的那个月起,这个房贷就已经终止了。解决这个问题的方法有两种。一是数据库再加个变量,使用者到时候各取所需。另一个是使用者临阵磨枪,用的时候自己发挥。 以前我一直避免贷款支付的细节,上一篇涉及了一些,这儿稍微再深入一些,讨论只涉及固定利率。月底剩余金额,我们一般称为UPB(Unpaid Balance),两个月的UPB之间,存在着简单关系 UPBi+1 = UPBi × (1 + C) - PMT 这儿PMT(Payment)就是(固定的)月付,C就是每月利率。这公式很容易理解,上月剩余金额,到这个月底,就要付利息,再减去付款,就是这个月剩余金额。所以如果一切正常,这序列就类似上一篇中的20年“房贷”,你自己就可以计算,当然存在计算机里的数字,是实际数字,而不是算出来的。 算出的数字和实际数字,会有什么区别呢?可能有上一篇中说过的部分提前付款(Curtailment),你不能想当然认为没有,不过我们这儿不讨论,就假定没有。比较常见的有拖欠(Delinquency,DELQ),到时间贷款公司没收到支票。人非圣贤,偶然失误总是有的,所以一般要连续两次没付你的信用评估(FICO)才会受影响。有时候你忘了又想起来,或者因为种种原因耽搁了几天,打电话给贷款公司,偶然一次通融的可能性也是有的。但数据部门没收到钱就是没收到,只能把实际数字记录下来。下面给个假想的DELQ的例子,30万贷款,15年期限,年利6%,月付2,531.57。 Month | LPI | 实际剩余金额 | 修复后金额 | 10 | 10 | 289,449.07 | 289,449.07 | 11 | 10 | 289,449.07 | 288,364.75 | 12 | 10 | 289,449.07 | 287,275.00 | 13 | 13 | 286,179.81 | 286,179.81 | 14 | 14 | 285,079.14 | 285,079.14 | 15 | | | 283,972.96 | 16 | 16 | 262,861.26 | 282,861.26 | 17 | 20 | 278,358.57 | 281,743.99 | 18 | 20 | 278,358.57 | 280,621.14 | 19 | 20 | 278,358.57 | 279,492.68 | 20 | 20 | 278,358.57 | 278,358.57 | 21 | 21 | 277,218.80 | 277,218.80 | 这张表中,屋主11,12两个月没寄支票,到第13个月把欠帐全部付清,利息当然逃不了,想来还有罚款。第15个月由于种种原因,没有数据。17-19月是另一种情况,我们下面会讨论。这儿第二列LPI(Last Principle Installment)是你最后一次付的本金的月份,如果你每个月按时付钱这个数字就和第一列完全相同。这个例子中屋主最后一次付款是第10个月,以后两个月种种原因没有付,所以这个数字就保持不变,直到他第13个月一笔付清才恢复正常。 这张表中的数据基本正确,只有第15个月没有数据是错的,11,12,17-19尽管看上去有些不对劲,但从数据角度来说,并无错误,它们忠实记录了实际发生的现金流动情况。即使有错的第15个月,你也不能在原始数据中修改。这些没有错的数据,你必须清理以后才能用来建立模型。第一,模型是为投资人服务的,屋主没有付,按照这一行的行规,债劵投资人还是要到时候拿钱,这钱就只能由债劵的保险机构垫支,所以模型及某些报表用的数据必须是“假定他付了。。。”另一个原因是纯粹技术性的。我们在第9篇《四两拨千斤》中计算存活率r,存活率当然不能大于1。但把这些UPB代进那儿的公式第11和12月r就会大于1,这是不允许的,读者可自己验证。 修正这些数据(11,12),用肉眼当然很容易,我们需要用程序来修正。大致思路是考察第一列(Month)和第二列LPI的差别。如果两者相同,什么都不用干。如果后者比前者少K个月,就把前面关于UPB的计算重复K次。程序见下面“保险机构垫支”。你也可以不用循环,用公式直接做。但K一般不大,用幂函数CPU要多得多(参见第6篇《不厌其“烦”》。这些并没有错的数据必须经过这番修正,模型才能使用。 现在来看第15个月缺掉的UPB。这种“缺”有两种可能,一是干脆没有记录,即少了一行,另一个是有记录,但是是个空白。不管哪一种,我们都要把正确数值填进去。为了减少麻烦,我的程序读数据时就把空白数据扔掉了。当然这个断层两面的LPI都可能不对,所以先要用上面的那段程序测试以后才能做这一步,现在可以假定上下的LPI都已修正过。思路是用上面那个月的UPB用公式把缺掉的月份算出来再填进去。下面的Lag函数是SAS的,其他语言自己想办法,应该不难。程序见下面“填补断层”。中间缺了K-1个月,输出K次是因为断层下端的原有的那条正确数据也要输出。 第17个月,好像屋主一下子付了3个月的钱,所以LPI一下子跳到了20。果然,下面3个月UPB和LPI就没变过。这种情况,我在公司工作了好多年以后才搞明白。有钱人要去欧洲度长假,或者乘游轮出游。每个月寄信回来付房贷很不方便,而且也很危险,一不小心就会过期限。于是他们就开3张支票,同时再写一封短信,告诉贷款公司这是第17,18,19 三个月的付款。所以反映在这张表格上,就是第17个月的LPI一下子从上个月的16跳到19。当然出现拖欠的经济拮据家庭是不可能去欧洲度假的,这儿放在一起只是为了叙述方便。这种情况的解决方法和第一段程序几乎相同,只是以前要减掉,现在要加上去。这段程序也必须在修复断层的程序前执行。程序见下面“有人提前付款”。 我把三段程序按执行次序放一起如下,修正后的数据放在上面表格最后一列。 K = Month - LPI; if K > 0 then do i = 1 to K; *** 保险机构垫支; UPB = UPB * (1 + C) - PMT; end; else if K < 0 then do i = 1 to -K; *** 有人提前付款; UPB = (UPB + PMT) / (1 + C); end; Lag_Date = lag(Month); *** 填补断层; Lag_UPB = lag(UPB); K = Month - Lag_Month; if K = 1 then output; else do; UPB = Lag_UPB; do i = 1to K; UPB = UPB * (1 + C) - PMT; Month = Month + 1; LPI = Month; output; end; end; 有钱人因休假提前支付若干个月和前面所说勤俭持家人士有了多余的钱就还房贷(Curtailment)是不一样的。前者没使你房贷的终止日期提前,他18,19两个月就不用付了,他这么做损失了些利息的利息。在上面的例子里,第18个月早付了一个月,第19个月早付了两个月,一共是大约2,500三个月的利息,有钱去欧洲度长假的不在乎这点小钱。而后者下一个月的房贷照付不误,短期压力一点没有减少。这样做可以使房贷终结日期提前,不是损失利息,还可以节约可观的利息(参看《假“公”济私》)。上面说前者必须写封短信,支票也以分开为妥,如果你不加说明或没讲清楚,贷款公司一律按后者处理,表中的LPI和实际月份还是一样,18,19两个月就算拖欠了。。 时间序列的数据还会有其他毛病,不一定是错误,你必须尽可能修正。但是无法修正的还是有不少,一般不外两个原因,一是根本不知道它怎么错的,也就无法猜测什么是对的。二是技术原因无法修正。曾有外行人问我为什么某个错误不能修正,我想到一个极妙的例子。Unix 有一个指令“diff",会告诉你两个文件A和B有什么不同。有时A多了一行,有时B多了一行,有时一个句子里文件A多了几个单字等等。不管怎么样,两个文件总得有很大程度的相似。现在把美国的《独立宣言》和Clinton在就职典礼上的演说来“diff"一下,你觉得会怎么样。依此类推,如果把上面表中每一行的UPB都乘个随机数,我看你怎么修正,这下终于没人多嘴了。 |