Fractional Differencing
Posted: Fri Nov 26, 2010 8:44 am
Below is a program to carry out fractional differencing as well as regular and seasonal differencing. Although regular and seasonal differences can be used consecutively, they cannot be combined with fractional difference. Please feel free to optimize and improve the code...
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