楼主: 忙先森
7413 8

[统计软件与数据分析] 求用SAS计算股票数据移动平均值!! [推广有奖]

  • 0关注
  • 0粉丝

小学生

21%

还不是VIP/贵宾

-

威望
0
论坛币
481 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
45 点
帖子
6
精华
0
在线时间
4 小时
注册时间
2013-10-17
最后登录
2016-4-20

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 个论坛币  [购买]

关键词:移动平均值 移动平均 股票数据 平均值 market 平均值 文件夹 收益率 开盘价 收盘价
沙发
luckersss 发表于 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 中含有你想要的两个移动平均。
已有 1 人评分论坛币 收起 理由
admin_kefu + 50 根据规定进行奖励

总评分: 论坛币 + 50   查看全部评分

使用道具

藤椅
忙先森 发表于 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中数据有重复的所以不能用。

使用道具

板凳
luckersss 发表于 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这个问题 运行出来的结果也是不正确的 建议你把程序运行一遍好好检验下。

使用道具

地板
luckersss 发表于 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;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
忙先森 + 3 + 4 + 4 精彩帖子

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

使用道具

7
忙先森 发表于 2015-4-1 16:54:33 |只看作者 |坛友微信交流群
luckersss 发表于 2015-3-30 11:27
你的数据有问题,将第一行删掉,然后将"\t\t\t"替换为“\t0\t0\t",之后运行下面的代码就可以了:
data  ...
方案可行 但是数据是直接从国泰安下下来 应该没有问题 如果以后都要用这个方法来求移动平均会有点麻烦 不过还是谢谢了!

使用道具

8
忙先森 发表于 2015-4-1 16:54:36 |只看作者 |坛友微信交流群
luckersss 发表于 2015-3-30 11:27
你的数据有问题,将第一行删掉,然后将"\t\t\t"替换为“\t0\t0\t",之后运行下面的代码就可以了:
data  ...
方案可行 但是数据是直接从国泰安下下来 应该没有问题 如果以后都要用这个方法来求移动平均会有点麻烦 不过还是谢谢了!

使用道具

9
忙先森 发表于 2015-4-2 20:25:30 |只看作者 |坛友微信交流群
luckersss 发表于 2015-3-30 11:27
你的数据有问题,将第一行删掉,然后将"\t\t\t"替换为“\t0\t0\t",之后运行下面的代码就可以了:
data  ...
你试下这个程序 是不是要简单得更多
proc datasets kill nolist;
libname home "E:\大学课程学习资料\专业课\大三课程\SAS\lecture1\";

data t1;
set home.Trd_mnth;
year=substr(Trdmnt,1,4);
month=substr(Trdmnt,6,2);
ymonth=mdy(month,1,year);
format ymonth yymmdd10.;
if year>2000;
if markettype in (1,4,16);
if missing(Mretwd)=0;
if missing(Mretnd)=0;
run;

proc sort data=t1; by stkcd year month;run;

proc expand data=t1 out=t2(drop=time) method=none;
by stkcd ;
convert Mretwd=Mretwd_60/ transform=(reverse movave 60 reverse trimleft 59);
convert Mretnd=Mretnd_60/ transform=(reserve movave 60 reverse trimleft 59);
run;

使用道具

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

本版微信群
加JingGuanBbs
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-5-10 09:54