Code: Select all
'Fractional Differencing Program (also allows for Regular and Seasonal Differencing)
'Reference: Diebold, F. X. and Rudebusch, G. D. (1989), “Long Memory and Persistence in Aggregate Output”, Journal of Monetary Economics, Vol. 24, pp. 189-209.
call difference
subroutine difference
!result = 0
!choice=2
!result=@uidialog("caption","Fractional and Regular Differencing","text","Regular and Seasonal Differences cannot be combined with Fractional Difference!","edit",%name,"Name of your series","edit",%diff,"Degree of differencing","edit",%sdiff,"Degree of seasonal differencing (Optional)","Radio", !choice,"Would you like to save the coefficients?","Yes No" )
if !result=-1 then
stop
endif
if @isempty(%diff)=1 and @isempty(%sdiff)=1 then
stop
else if @isempty(%diff)=1 and @isempty(%sdiff)=0 then
!s = @val(%sdiff)
series {%name}_diff = d({%name},0,!s)
stop
endif
endif
if @isempty(%sdiff)=0 then
!s = @val(%sdiff)
else
!s=0
endif
if @val(%diff) = 0 then
!d = 1
else
!d = @val(%diff)
endif
series {%name}_diff
series {%name}_coeffs
call fracdiff({%name},!d,!s,{%name}_diff,{%name}_coeffs)
if !choice = 2 then
delete {%name}_coeffs
endif
endsub
subroutine local fracdiff(series y,scalar fd,scalar sd,series yd,series yc)
if fd>0 and @floor(fd) = fd then
yd = d(y,fd,sd)
return
endif
!nobs = @obs(y)
%beg = y.@first
%end = y.@last
!first = @dtoo(y.@first)
smpl %beg %end
series yc = 1
yc = @cumsum(yc)
series yd = 0
smpl %beg+1 %end
yc = @cumprod((yc-fd-2)/(yc-1))
smpl @all
for !i=1 to !nobs
for !j = 1 to !i
yd(!i+!first-1) = yd(!i+!first-1) + yc(!j+!first-1)*y(!i-!j+!first)
next
next
endsub