/* (Centerd) Symmetric Moving Average WMA(w) */ new; cls; let data[50,1]= 60 61 60 62 60 63 64 65 69 70 69 66 64 64 62 64 65 55 53 57 60 58 63 63 63 68 69 69 68 69 70 67 66 67 68 69 69 77 80 80 78 76 76 72 71 70 73 71 78 80 ; data=rev(data); /* original data in reverse order */ t=seqa(1,1,rows(data)); library pgraph; graphset; _pltype=6; _plegctl=1; _plegstr="actual\000SYMWMA"; title("Symmetric Weighted Moving Average"); w={3,2,1}; xy(t,data~symwma(data,w)); proc symwma(x,w); local k,b,i,m; k=rows(w)-1; w=rev(w[2:k+1])|w; w=w/sumc(w); /* scaled */ print "w=" w; m=zeros(rows(x),cols(x)); i=k+1; do while i<=rows(x)-k; m[i,.]=w'x[i-k:i+k,.]; i=i+1; endo; m[1:k,.]=miss(m[1:k,.],0); m[rows(x)-k+1:rows(x),.]=miss(m[rows(x)-k+1:rows(x),.],0); retp(m); endp;