全部版块 我的主页
论坛 提问 悬赏 求职 新闻 读书 功能一区 悬赏大厅
8085 8
2015-03-25
悬赏 80 个论坛币 未解决
股票数据附件如下 Stkcd="证券代码";Trdmnt="交易月份";Opndt="月开盘日期"; Mopnprc="月开盘价";Clsdt="月收盘日期"; Mclsprc="月收盘价"; Mnshrtrd="月个股交易股数";Mnvaltrd="月个股交易金额";Msmvosd="月个股流通市值";Msmvttl="月个股总市值";Ndaytrd="月交易天数";Mretwd="考虑现金红利再投资的月个股回报率";Mretnd="不考虑现金红利再投资的月个股回报率";Markettype="市场类型"Capchgdt="最新股本变动日期"。

现在希望能够选出其中的2001年到2010年的A股数据。然后计算出每支股票1-30个月的移动平均收益率(包括考虑现金红利和不考虑现金红利),即1-30,2-31以此类推不足30个月的用缺失值表示。

用宏和proc expand两种方法來解!希望各路大神帮帮忙,给点思路,在家里对着电脑捣鼓了一下午也没懂,实在是不知道该如何解决!!!!!



股票数据.txt

大小:20.36 MB

只需: 1 个论坛币  马上下载

二维码

扫码加我 拉你入群

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

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

全部回复
2015-3-27 10:18:23
先读入数据,假设读入数据集命名为stockdata,变量名都是你提供的变量名。
proc sort data = stockdata;
        by stkcd opndt;
run;
proc expand data = stockdata out = stock_MA30 method = none;
        convert Mretwd = Mretwd_MA30 / tout = (movave 30);
        convert Mretnd = Mretnd_MA30 / tout = (movave 30);
        id Opndt;
        by stkcd;
run;
/* 将不满30个月的置为缺失值 */
data stockreturn_MA30;
        set stock_MA30;
        by stkcd opndt;
        retain number;
        if first.opndt then do;
                number = 0;
        end;
        number = number + 1;
        if number < 30 then do;
                Mretwd_MA30 = .;
                Mretnd_MA30 = .;
        end;
        drop number;
run;
stockreturn_MA30 中含有你想要的两个移动平均。
二维码

扫码加我 拉你入群

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

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

2015-3-27 19:04:01
luckersss 发表于 2015-3-27 10:18
先读入数据,假设读入数据集命名为stockdata,变量名都是你提供的变量名。
proc sort data = stockdata;
...
总体还好 中间出了点错误
241  proc expand data =t1 out=stock_MA30 method=none;
242          convert Mretwd=Mretwd_MA30 / tout=(movave 30);
243          convert Mretnd=Mretnd_MA30 / tout=(movave 30);
244          id Opndt;
ERROR: 列表中的变量 Opndt 与该列表规定的类型不匹配。
245          by stkcd;
246  run;

还有
248  data stockreturn_MA30;
249          set stock_MA30;
250          by stkcd opndt;
251          retain number;
252          if first.opndt then do;
253                  number=0;
254          end;
255          number=number + 1;
256          if number < 30 then do;
257                  Mretwd_MA30=.;
258                  Mretnd_MA30=.;
259          end;
260          drop number;
261  run;

ERROR: BY 变量 stkcd 不在输入数据集 WORK.STOCK_MA30 中。
ERROR: BY 变量 opndt 不在输入数据集 WORK.STOCK_MA30 中。
NOTE: SAS 系统由于错误而停止了该步的处理。
  

不知道哪里又出了问题。另外id 是用来针对不重复数据列表 原数据表中的opndt中数据有重复的所以不能用。
二维码

扫码加我 拉你入群

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

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

2015-3-28 13:44:29
忙先森 发表于 2015-3-27 19:04
总体还好 中间出了点错误
241  proc expand data =t1 out=stock_MA30 method=none;
242          conv ...
看了你的数据,我之前理解错了,以为月开盘日期包含了年月,将其改为交易月份就可以了。
改后如下:
proc sort data = stockdata;
        by stkcd Trdmnt;
run;
proc expand data = stockdata out = stock_MA30 method = none;
        convert Mretwd = Mretwd_MA30 / tout = (movave 30);
        convert Mretnd = Mretnd_MA30 / tout = (movave 30);
        id Trdmnt;
        by stkcd;
run;
/* 将不满30个月的置为缺失值 */
data stockreturn_MA30;
        set stock_MA30;
        by stkcd Trdmnt;
        retain number;
        if first.stkcd then do;
                number = 0;
        end;
        number = number + 1;
        if number < 30 then do;
                Mretwd_MA30 = .;
                Mretnd_MA30 = .;
        end;
        drop number;
run;
二维码

扫码加我 拉你入群

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

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

2015-3-29 18:49:29
luckersss 发表于 2015-3-28 13:44
看了你的数据,我之前理解错了,以为月开盘日期包含了年月,将其改为交易月份就可以了。
改后如下:
pro ...
不对 还是运行错误 那个id对应的应该是数值型 而且就算解决了id这个问题 运行出来的结果也是不正确的 建议你把程序运行一遍好好检验下。
二维码

扫码加我 拉你入群

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

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

2015-3-30 11:27:06
忙先森 发表于 2015-3-29 18:49
不对 还是运行错误 那个id对应的应该是数值型 而且就算解决了id这个问题 运行出来的结果也是不正确的 建议 ...
你的数据有问题,将第一行删掉,然后将"\t\t\t"替换为“\t0\t0\t",之后运行下面的代码就可以了:
data temp_test;
        infile 'D:\temp.txt' dlm='09'x;
        input Stkcd  $ Trdmnt $ Opndt $ Mopnprc        Clsdt        Mclsprc        Mnshrtrd Mnvaltrd Msmvosd Msmvttl Ndaytrd        Mretwd Mretnd Markettype Capchgdt yymmdd10.;
run;
data temp_test;
        set temp_test;
        Trdmnt = compress(Trdmnt,'-');
        Trdmnt = input(Trdmnt,yymmn6.);
run;
proc sort data = temp_test;
        by stkcd Trdmnt;
run;
proc expand data = temp_test out = stock_MA30 method = none;
        convert Mretwd = Mretwd_MA30 / tout = (movave 30);
        convert Mretnd = Mretnd_MA30 / tout = (movave 30);
        by stkcd;
run;
/* 将不满30个月的置为缺失值 */
data stockreturn_MA30;
        set stock_MA30;
        by stkcd Trdmnt;
        retain number;
        if first.stkcd then do;
                number = 0;
        end;
        number = number + 1;
        if number < 30 then do;
                Mretwd_MA30 = .;
                Mretnd_MA30 = .;
        end;
        drop number;
run;
二维码

扫码加我 拉你入群

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

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

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群