楼主: mandyshi
4380 10

SAS中数据移动分组相关问题 [推广有奖]

  • 0关注
  • 0粉丝

小学生

71%

还不是VIP/贵宾

-

威望
0
论坛币
0 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
42 点
帖子
5
精华
0
在线时间
12 小时
注册时间
2010-10-16
最后登录
2011-9-12

楼主
mandyshi 发表于 2011-4-20 21:37:38 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
各位SAS大侠,我正在做一个关于基金业绩方面的研究,需要对数据进行移动分组回归。数据简化的例子如下:

fundcode     date                       rif             rmf
1                  2004-01-01           0.5          0.4
1                  2004-01-02           0.7          0.8
1                  2004-01-03           0.5          0.8
1                  2004-01-04           0.4          0.9
...                 ...                           ...            ....
2                  2004-01-01           0.7          0.4
2                  2004-01-02           0.6           0.8
2                 2004-01-03            0.4          0.8
2                  2004-01-04           0.3          0.9

...                 ...                           ...            ....

数据就一直这样下去,大约有200多个基金,每个基金的日期数目不等(因为有的上市早有的上市晚,不都是从2004.1.1开始的),现在我想对每只基金移动的30天分组回归,即对1号基金分别做从2004.1.1 开始30天一个回归,然后1号基金从2004.1.2开始30天的回归。。。一直到1号基金移动30天回归完毕之后,做2号基金的。

这个应该是需要分组吧,但是不知道该怎么分啊。。。想了N久也米有解决的办法,特向各位大侠请教。希望得到各位赐教,小妹感激不尽!!!!   
二维码

扫码加我 拉你入群

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

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

关键词:分组回归 感激不尽 基金业绩 code date 数据 SAS 分组

回帖推荐

rpg163 发表于2楼  查看完整内容

一个想法(处理的有点复杂),不确定是否一定能用,供参考: %macro x; %let n=0; %do i=1 %to 30; %let n=%eval(&n+1); data dsn&n; set your_org_dsn; * stkcd=你的股票/基金代码变量; * date=你的时间变量; * Al_B; by stkcd; if first.stkcd date2=date else date2=lag(date2); if date>date2+&n and date'01jan2004'd+&n and date

本帖被以下文库推荐

沙发
rpg163 发表于 2011-4-20 22:52:08
一个想法(处理的有点复杂),不确定是否一定能用,供参考:
%macro x;
        %let n=0;
        %do i=1 %to 30;
                %let n=%eval(&n+1);
                data dsn&n;
                        set your_org_dsn;
                        * stkcd=你的股票/基金代码变量;
                        * date=你的时间变量;
                        * Al_B;
                        by stkcd;
                                if first.stkcd date2=date else date2=lag(date2);
                                if date>date2+&n and date<date2+29+&n;
                        *        Al_E;
                        *        不是很确定你的意思,所以上面这部分(Al_B to Al_E)也可能是下面一段;
                        *        if date>'01jan2004'd+&n and date<'30jan2004'd+&n;
                run;
                ods listing close;
                *        ParameterEstimates是系统的表名不能改;
                *        也可使用outest进行输出,看你想要什么样的结果;
                ods output ParameterEstimates=dsn_out&n;
                *        其他一些输出选项,取决于个人;
                *        ods output RSquare=dsnrsq&n;
                *        ods output NObs=NObs&n;
                proc reg data=dsn&n;
                        model DV=IV;
                        by stkcd;
                run;
                ods listing;
        %end;
        proc sql;
                create table _null_ like dsn_out&n;
        quit;
        data dsn_out_full;
                set _null_;
        run;
        *        合并输出结果;
        %do i=1 %to 30;
                        data dsn_out_full;
                        set dsn_out_full dsn_out&n;
                run;
        %end;
%mend x;
%x;
已有 2 人评分经验 论坛币 热心指数 收起 理由
bakoll + 3 + 3 精彩帖子
crackman + 2 鼓励积极发帖讨论

总评分: 经验 + 3  论坛币 + 3  热心指数 + 2   查看全部评分

藤椅
sas_user 发表于 2011-4-21 00:56:31
1# mandyshi
请各位老师前辈们多多指导。谢谢。
data funds;
input code date : anydtdte10. rif rmf;
format date date9.;
datalines;
1 2004-01-01 0.5 0.4
1 2004-01-02 0.7 0.8
1 2004-01-03 0.5 0.8
1 2004-01-04 0.4 0.9
2 2004-01-01 0.7 0.4
2 2004-01-02 0.6 0.8
2 2004-01-03 0.4 0.8
2 2004-01-04 0.3 0.9
;
run;
%macro funds ;
%let start= %sysfunc(mdy(01,01,2004));
%let end=%eval((%eval(&start)+4));
%do date=&start %to &end;
%put _user_;
%do code=1 %to 2;
proc reg data=funds (where=(code=&code and date=&date));
model code=rif;
model code=rmf;
run;
%end;
%end;
%mend;
%funds;

已有 1 人评分热心指数 收起 理由
crackman + 2 鼓励积极发帖讨论

总评分: 热心指数 + 2   查看全部评分

板凳
sas_user 发表于 2011-4-21 00:58:33
2# rpg163
学习了。谢谢

报纸
mandyshi 发表于 2011-4-21 09:47:46
谢谢2楼3楼,我先尝试下,看看行不。

地板
mandyshi 发表于 2011-4-21 12:31:25
2# rpg163 我补充一下问题哈,因为基金在周六日不交易,没有数据,还有神马五一十一春节之类的都不交易。。。我想用30个交易日的数据,应该怎么办呢?
数据如下:

Fundcd     Clsdt        Naps
000001  2004-01-02  1.046
000001  2004-01-05  1.091
000001  2004-01-06  1.109
000001  2004-01-07  1.113
000001  2004-01-08  1.125
000001  2004-01-09  1.115
000001  2004-01-12  1.138
000001  2004-01-13  1.132
000001  2004-01-14  1.116
000001  2004-01-15  1.119
。。。。
表里一共有200多个基金,都是这样的数据,但是可能每个基金的最初clsdt不是2004-01-02.
可不可以每个基金分组分成下面这样的:

000001  2004.1.2-2004.2.24(第一个30个交易日);
000001  2004.1.5-2004.2.25(第二个30个交易日);



每个基金都像这样分组。是不是很复杂啊?弄了好久还是没弄出来,我有点抑郁了

7
mandyshi 发表于 2011-4-21 12:41:06
3# sas_user 谢谢指导~补充了下问题,同上~
貌似这样的话就不能:(&start)+4)了。。。
可以用每个fundcd的观测值编号来分组吗?就是先给每个fund的所有交易日编号,然后根据标号分组?

8
rpg163 发表于 2011-4-21 21:11:31
6# mandyshi
这个的确比较麻烦

关于周六周日,记得SAS好像有个关于时间方面的计数的函数,可以跳过周六周日计算,王燕的时间序列中好像有这个函数。具体的一时也想不起来的...
这样的话可以 date_start-date_end>30(因为跳过了周六周日,date_end肯定是间隔了30个交易日的)
或者建立一个全部日期的样本,把原始数据merge进去,在建立一个周的变量(1-7,定义周六周日为1)并将周六周日的收益率赋值为0;

节假日也可建立类似的变量cele=1/0 节日就==1
if cele=1 then n=n-1。

然后可以定义一个drop: if cele=1 or week=1 then drop=1 else=0;

然后可以类似这样:

%let n=0;
%let i=0;
%do %until &n=30;
* 如果下一天不是节假日n=n+1,如果是n=n一直到n=30为止 然后计算i;
&i=%eval(&i+1)
&n=ifn(%eval(&date_start+&i) and week=0, %eval(&n+1),&n);
&date_end=%eval(&date_start+&i);
%end;

n相当于一个计数器,通过n=30得到实际需要的i,这样对每个观测都可以计算得到一个最终的date_end,同时每个观测自己的date就是date_start;可生产这样一个新变量再merge回去。(先生成一个全样本,把实际样本merge进来,最好加个标签变量(flag=1)方便以后导出,然后处理下周六周日和节假日,节假日可能要手工处理,然后计算得到date_end,利用flag=1导出,再merge回去 这样每次计算时只要date_start<date<date_end就行)

一点零散的想法,不知能不能用,仅供参考。

9
sas_user 发表于 2011-4-22 05:58:38
6# mandyshi
data funds;
input code clsdt : anydtdte10. naps;
format clsdt date9.;
datalines;
000001 2004-01-02 1.046
000001 2004-01-05 1.091
000001 2004-01-06 1.109
000001 2004-01-07 1.113
000001 2004-01-08 1.125
000001 2004-01-09 1.115
000001 2004-01-12 1.138
000001 2004-01-13 1.132
000001 2004-01-14 1.116
000001 2004-01-15 1.119
000002 2004-01-02 1.034
000002 2004-01-05 1.045
000002 2004-01-06 1.145
000002 2004-01-07 1.156
000002 2004-01-08 1.167
000002 2004-01-09 1.156
000002 2004-01-12 1.134
000002 2004-01-13 1.189
000002 2004-01-14 1.142
000002 2004-01-15 1.146
;
run;
proc sql;
select distinct clsdt into : workdate separated by ' ' from funds;
select distinct code into : code separated by ' ' from funds;
quit;

10
sas_user 发表于 2011-4-22 05:58:57
options symbolgen mlogic mprint;

%macro funds;
%let codeno=1;
%do codea=%scan(&code,1) %to %scan(&code,-1);
%let dateno=1;
%let a=%sysfunc(left(%scan(&workdate,1," ")));
%let start=%sysfunc(inputn(&a,date9.));
%let end=%sysfunc(intnx(day,&start,29));
%do datea=&start %to &end;
proc reg data=funds (where=(code=&codea));
model clsdt=naps;
run;
%let dateno=%eval(&dateno+1);
%end;
%let codeno=%eval(&codeno+1);
%end;
%mend;
%funds
已有 1 人评分热心指数 收起 理由
crackman + 2 鼓励积极发帖讨论

总评分: 热心指数 + 2   查看全部评分

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

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