005964113 发表于 2020-8-20 20:14 
原始数据是利率变化的时间点,如果2003没有,说明没有变化,值等于上次变化之后的利率,也就是上一年度最 ...
个人理解,数据Cdate为利率调整的日期,interest为调整后的利率,您的数据第一个是21feb2002——1.98,因而2000——2002年最后是不知道的,从2003年开始可以通过公式计算。公式应该算是一个加权平均,权重为该利率实行的时长比上该自然年度的天数,某一年度没有变化(没有数据)应该等于前一个调整利息,实际该年度以前一个调整利息持续了一个自然年度。因为存在闰年的情况,个人觉得除以365不太严谨,可以分年份计算。(下面代码有体现)
计算方法上来说,第一:先构造了2000——2019的年份和年初和年末的Cdate变量;第二:将构造的辅助数据与interest数据merge,对year、Cdate排序,因为interest为调整后的利率,因为对于interest现有的空值来说,赋值前一个调整的利率;第三:计算权重,分子上就是该利率持续的时长,分母为该自然年度的天数,特别之处在于年末这一天,需要单独列出;第四:加权求和。
如果解释不清楚,分步实现代码,可能更好理解。
- clear
- set obs 40
- egen year=seq(), f(2000) t(2019) b(2)
- bys year: gen Cdate=date(string(year)+"-01-01","YMD") if _n==1
- bys year: replace Cdate=date(string(year)+"-12-31","YMD") if _n==2
- format %td Cdate
- //interest.dta数据在工作目录下可以直接运行,不在的话需要引用数据的绝对路径
- qui merge 1:1 year Cdate using interest.dta,nogen
- sort year Cdate
- replace interest=interest[_n-1] if interest==.
- bys year: gen W=(Cdate[_n+1]-Cdate) /(Cdate[_N]-Cdate[1]+1) if _n!=_N & year>2002
- bys year: replace W=(1)/(Cdate[_N]-Cdate[1]+1) if _n==_N & year>2002
- bys year:egen wanted=sum(interest*W) if year>2002
复制代码