楼主: 一眼瞬间
1992 2

[问答] SAS能做面板数据的移动平均么? [推广有奖]

  • 0关注
  • 1粉丝

讲师

50%

还不是VIP/贵宾

-

威望
0
论坛币
730 个
通用积分
0.0001
学术水平
0 点
热心指数
4 点
信用等级
0 点
经验
903 点
帖子
376
精华
0
在线时间
309 小时
注册时间
2010-3-14
最后登录
2023-8-19

楼主
一眼瞬间 发表于 2013-11-6 10:24:10 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
有很多公司的每日股票价格数据,

需要做每个当日价格前5天到前125天的移动平均。

不知道用SAS能实现么?

还请大家指点,谢谢了!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:面板数据 移动平均 股票价格 不知道 股票价格

沙发
bakoll 发表于 2015-2-4 23:02:16
方法1:proc expand的用法
出处:http://elek.me/calculate-moving-average-using-proc-expand-in-sas.html

data have;
do group=2 to 6;
do value=1 to 20 by 3,21,28,29,50;
output;
end;
end;
run;
/*1. Backward moving average: five-period
Yt = ( Xt-4 + Xt-3 + Xt-2 + Xt-1 + Xt ) / 5*/
proc expand data=have method=none out=want1(drop=time);
by group notsorted;
convert value=value1 / transform=(movave 5 trimleft 4);
run;
/*2. Forward moving average: five-period
Yt = ( Xt + Xt+1 + Xt+2 + Xt+3 + Xt+4) / 5*/
proc expand data=have method=none out=want2(drop=time);
by group notsorted;
convert value=value2 / transform=(reverse movave 5 reverse trimleft 4);
run;
/*3. Centered moving average:

3.1 the centered moving time window operator is an odd number, for example, five-period
Yt = ( Xt-2 + Xt-1 + Xt + Xt+1 + Xt+2 ) / 5 */
proc expand data=have method=none out=want3(drop=time);
by group notsorted;
convert value=value3 / transform=(cmovave 5 trim 2);
run;
/*3.2 the centered moving time window operator is an even number, for example, 4-period
3.2.1 one more lead value than lagged value is included in the time window
Yt = ( Xt-1 + Xt + Xt+1 + Xt+2 ) / 4*/
proc expand data=have method=none out=want4(drop=time);
by group notsorted;
convert value=value4 / transform=(cmovave 4 trimleft 1 trimright 2);
run;
/*3.2.2 one more lagged value than lead value is included in the time window
Yt = ( Xt-2 + Xt-1 + Xt + Xt+1 ) / 4*/
proc expand data=have method=none out=want5(drop=time);
by group notsorted;
convert value=value5 / transform=(reverse cmovave 4 reverse trimleft 2 trimright 1);
run;

/*3.2.3 weighted moving time window operator; the lead value and lagged value are all weighted 0.5
Yt = ( 0.5 * Xt-2 + Xt-1 + Xt + Xt+1 + 0.5 * Xt+2 ) / 4*/
proc expand data=have method=none out=want6(drop=time);
by group notsorted;
convert value=value61 / transform=(cmovave (0.5 1 1 1 0.5) trim 2 *5/4);
run;
复制代码方法2:
复制代码
%macro move_avg(var,num);
%let lagnum=%eval(&num-1);
(&var
%do i=1 %to &lagnum;
+lag&i(&var)
%end;
)/&num
%mend move_avg;

/*前面5天的ltt均值作为当天的mean,只选取2008年来的数据*/
data r4(where=(m>=(&t1.+1)));
set r3;
aa=%move_avg(ltt,&t1.);/*这个参数可以改动*/
mean=lag(aa);
run;
来源论坛网友

藤椅
mengha 发表于 2016-2-5 10:29:27
非常impressive

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-3 14:35