楼主: advancedmath
9688 11

[原创博文] sas如何算一个时间序列数据前六十天的均值和标准差 [推广有奖]

  • 0关注
  • 0粉丝

小学生

21%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
42 点
帖子
5
精华
0
在线时间
6 小时
注册时间
2009-11-8
最后登录
2019-5-5

楼主
advancedmath 发表于 2012-3-3 14:16:10 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
现在数据格式有两列,第一列是时间,第二列是沪深300指数的时间序列走势,我现在想在这个数据集上面加两列,分别是前六十天沪深300的均值和方差,那么前59填这两列因为missing value,请教一下这个在sas里面应该怎么写代码?
谢谢各位了!
二维码

扫码加我 拉你入群

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

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

关键词:时间序列数据 序列数据 时间序列 标准差 沪深300指数 标准差 如何 沪深 走势

回帖推荐

来梦来人 发表于6楼  查看完整内容

/*假设原数据集有变量date和p两字段*/ proc sort data= raw_data; by date; run; %let lag_n=60; data final_data2(drop=index); array pp[0:%eval(&lag_n-1)] _temporary_; /* 创建数组,下标0-59 */ retain index 0; /* 为下标变量赋初值 */ set raw_data; pp = p; /* 为数组元素赋p值 */ index = mod(index+1, &lag_n); /* 下标变量+1,取模保证值域为0-59 */ /* 计算部分 */ ...

本帖被以下文库推荐

沙发
来梦来人 发表于 2012-3-3 16:52:54

%let lag_n=60;
data final_data2(drop=index);
   array pp[0:%eval(&lag_n-1)] _temporary_;   /* 创建数组,下标0-59 */
   index = 0; /* 为下标变量赋初值 */
      set raw_data;   
      pp[index] = p; /* 为数组元素赋p值 */
      index = mod(index+1, &lag_n);   /* 下标变量+1,取模保证值域为0-59 */
     /* 计算部分 */
      if _n_>=&lag_n then do;
         mean_p = mean(of pp[*]);
         var_p = var(of pp[*]);
      end;
run;

藤椅
来梦来人 发表于 2012-3-3 16:53:19
看看上面的对不???

板凳
来梦来人 发表于 2012-3-3 16:54:49
%let lag_n=60;
data final_data2(drop=index);
   array pp[0:%eval(&lag_n-1)] _temporary_;   /* 创建数组,下标0-59 */
retain  index  0; /* 为下标变量赋初值 */
      set raw_data;   
      pp[index] = p; /* 为数组元素赋p值 */
      index = mod(index+1, &lag_n);   /* 下标变量+1,取模保证值域为0-59 */
     /* 计算部分 */
      if _n_>=&lag_n then do;
         mean_p = mean(of pp[*]);
         var_p = var(of pp[*]);
      end;
run;

报纸
来梦来人 发表于 2012-3-3 16:56:22
看看最后这个版本行不???

地板
来梦来人 发表于 2012-3-3 16:59:07
/*假设原数据集有变量date和p两字段*/
proc sort data= raw_data;
by date;
run;

%let lag_n=60;
data final_data2(drop=index);
   array pp[0:%eval(&lag_n-1)] _temporary_;   /* 创建数组,下标0-59 */
retain  index  0; /* 为下标变量赋初值 */
      set raw_data;   
      pp[index] = p; /* 为数组元素赋p值 */
      index = mod(index+1, &lag_n);   /* 下标变量+1,取模保证值域为0-59 */
     /* 计算部分 */
      if _n_>=&lag_n then do;
         mean_p = mean(of pp[*]);
         var_p = var(of pp[*]);
      end;
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
zoumingwang2004 + 1 + 1 + 1 精彩帖子

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

7
来梦来人 发表于 2012-3-3 22:11:36
可以不?

8
advancedmath 发表于 2012-3-5 12:45:34
来梦来人 发表于 2012-3-3 22:11
可以不?
非常感谢啊,我一会儿回去试一下

9
advancedmath 发表于 2012-3-6 00:14:05
来梦来人 发表于 2012-3-3 22:11
可以不?
  1. proc fcmp outlib=sasuser.MySubs.MathFncs;
  2. function VaR(S0,mu,sigma,T,N);        /*Monte carlo simulation function*/
  3.         array S[1000]/nosymbols;
  4.         do         i = 1 to 1000;
  5.                 S[i] = simulation(S0,mu,sigma,T,N);
  6.         end;
  7.         do j = 1 to 1000;
  8.                 do k = 1 to 1000-j;
  9.                         if S(k)>S(k+1) then do;
  10.                                 temp = S(k);
  11.                                 S(k) = S(k+1);
  12.                                 S(k+1) = S(k);
  13.                         end;
  14.                 end;
  15.         end;
  16.         return(array(50)-S0);
  17. endsub;
  18. run;
  19. quit;
复制代码
高手!!!请留步!!!我在问你一个问题!!!我在实现一个蒙特卡洛模拟计算VaR的程序,你看这样哪里出错了???里面的simulation函数是模拟集合布朗运动的函数,返回的是每次模拟的最终值。我自己写的,测试过,貌似没问题,然后VaR这个函数我是先模拟的1000次,然后冒泡排序,找出在5%的那个值,一次算出VaR,但是程序貌似不对,你帮我看看啊。。。还有,你有没有其他好一点的办法能实现?谢谢!!!

10
mymine 发表于 2012-3-6 08:20:58
发一个简单语句达到此目的的程序

proc sort data=temp;
by datatime;
run;

data temp;
set temp;
a=int(_n_/60);
b=mod(_n_,60);
if b=0 then do;
a=a-1;
b=60;
end;
run;

proc sql;
create table temp1 as
select *,mean(value) as value_mean,std(value) as value_std
from temp group by a;
quit;

data temp1;
set temp1;
if b^=60 then do;
value_mean=.;
value_std=.;
end;
run;

proc sort data=temp1;
by a b;
run;

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

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