楼主: hurley18
1258 14

[SAS EM] 股票的周月数据计算问题 [推广有奖]

  • 0关注
  • 0粉丝

本科生

51%

还不是VIP/贵宾

-

威望
0
论坛币
12 个
通用积分
0.0073
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
143 点
帖子
44
精华
0
在线时间
121 小时
注册时间
2022-1-7
最后登录
2023-10-22

160论坛币

讲股票每周内每日交易量累计、高低值比较取大小,好像逻辑很简单。但是自己写的的程式跑完结果就是没有累计和比较。。。。。。头大,求高手指教

②另外想希望写个程式串联数据集股东数hold和monthly、weekly和日交易A,实现以下逻辑:

求股票代码+日期,满足:月MACD连续增长2月&周boll上传中轨&当日股东数小于一年前和半年前;如果同一支股票得出一个日期后,后面20个交易日的日期不纳入结果。

得出股票代码和日期后,求其次日的涨幅、交易后一周的涨幅、交易后一月的涨幅;

并将结果生成在新的数据集中。   




问题说明:

1.    附件说明:

数据集:

A.sas7bdat               -几只股票2018.01.01-2022.01.13的基本交易数据

hold.sas7bdat             -几只股票2018.01.01-2022.01.13的股东人数数据

Ymwd.sas7bdat           -想在a上生成日对应的周、月交易数据-本次问题

Weekly.sas7bd            -只剩下每周最后一日交易数据-生产周MACD与周Boll指标

Monthly.sas7bdat          -只剩下每月最后一日交易数据-生产月MACD与月Boll指标

SAS程式:

YMWD.sas                -想在a上生成日对应的周、月交易数据-本次问题

MW-BOLL-MACD.sas     -用数据集a生成的月周BOLL和MACD的程式

     图片:为YMWD.sas运行后得到的Ymwd.sas7bdat数据集问题数据画面

2.    问题:

想每天的数据后面都延申周和月的(周月开盘、周月收盘、周月最高价、周月最低价、周月成交量、以及当日对应周月MACD 周月DIFF、周月DEA、周月BOLL、周月BOLL上轨、周月BOLL下轨)数据。以上对应程式里变量:

数据集A里日交易初始变量:

OPEN-开盘价HIGH-最高价 LOW-最低价close-收盘价 VOLUME-成交量 nclose-前除权后的收盘价

Wnopen WNCLOSE Wvolume WnHigh WnLow

Mnopen MNCLOSE Mvolume MnHigh MnLow

WMACD WDIFF WDEA WBOLL WUPPERWLOWER;

MMACD MDIFF MDEA MBOLL MUPPERMLOWER

红色是目前程式测试失败的:

逻辑如下:排序每周第1交易日的周数据=日数据

Mnopen=nopen MNCLOSE=nclose Wvolume=volume;WnHigh=nHigh;WnLow=nLow;

后面若不为当周第一交易日则Mnopen不变retain下来,MNCLOSE始终=nclose;Wvolume需要上一日Wvolume+当日的volume, WnHigh需要上一交易日的Wnhign与当日nhigh取最大值,WnLow则取最小值;一直到本周最后一个交易日,可以做到每天的Mnopen都为当周第一交易日开盘,MNCLOSE始终为当日收盘价nclose,Wvolume为到当日为止的周交易量,WnHighWnLow为到当日为止的周最高价和最低价。

每个交易日假设为当周最后一天,对应的当天的WNCLOSE再加上之前各周最后一天的周收盘价都可以计算出当天的WMACD WDIFF WDEA WBOLL WUPPER WLOWER;只是要替换Weekly数据集中的当周Wclose即可计算出。需求在a自己的数据集里算出来。

自己写的的YMWD.sas 程式跑Wvolume WnHigh WnLow时结果不对,实际没有相加和比大小。。。。。。头

希望写个程式串联数据集股东数hold和monthly、weekly和日交易A,实现以下逻辑:

求股票代码+日期,满足:月MACD连续增长2月&周boll上传中轨&当日股东数小于一年前和半年前;如果同一支股票得出一个日期后,后面20个交易日的日期不纳入结果。

得出股票代码和日期后,求其次日的涨幅、交易后一周的涨幅、交易后一月的涨幅;

并将结果生成在新的数据集中。      

问题说明.docx (17.72 KB)

问题说明.rar (2.43 MB) 本附件包括:
  • ask.jpg
  • ask-simple.jpg
  • hold.sas7bdat
  • monthly.sas7bdat
  • MW-BOLL-MACD.sas
  • weekly.sas7bdat
  • YMWD.sas
  • ymwd.sas7bdat
  • 问题说明.docx
  • a.sas7bdat

ask-simple.jpg

ask.jpg    


最佳答案

HXAI102230 查看完整内容

data sorta; set raw.a; by stockcode year month wk date; retain Mvolume Mnhigh Mnlow Wvolume Wnhigh Wnlow; /*Stats by Year-Month*/ if first.month then do; Mvolume=0; Mnhigh=.; Mnlow=.; end; Mvolume+volume; if ^missing(nhigh) then Mnhigh=max(Mnhigh,nhigh); if ^missing(nlow) then Mnlow=min(Mnlow,nlow); /*Stats by Wk*/ if first.wk then do; Wvolume=0; Wnhigh=.; Wnlo ...
关键词:计算问题 月数据 sas7bdat Monthly volume
沙发
HXAI102230 在职认证  发表于 2022-1-17 23:21:20 |只看作者 |坛友微信交流群
data sorta;
  set raw.a;
        by stockcode year month wk date;
        retain Mvolume Mnhigh Mnlow Wvolume Wnhigh Wnlow;
        /*Stats by Year-Month*/
        if first.month then do;
    Mvolume=0;  Mnhigh=.;        Mnlow=.;
        end;
        Mvolume+volume;
        if ^missing(nhigh) then Mnhigh=max(Mnhigh,nhigh);
        if ^missing(nlow) then Mnlow=min(Mnlow,nlow);
        /*Stats by Wk*/
  if first.wk then do;
    Wvolume=0;  Wnhigh=.;        Wnlow=.;
        end;
        Wvolume+volume;
        if ^missing(nhigh) then Wnhigh=max(Wnhigh,nhigh);
        if ^missing(nlow) then Wnlow=min(Wnlow,nlow);
run;
已有 1 人评分论坛币 热心指数 收起 理由
pobel + 5 + 1 精彩帖子

总评分: 论坛币 + 5  热心指数 + 1   查看全部评分

使用道具

藤椅
HXAI102230 在职认证  发表于 2022-1-18 11:25:57 |只看作者 |坛友微信交流群
proc sort data=raw.a out=sorta;
  by stockcode year month wk date;
run;

proc sql;
  /*Stats by Year-Month*/
  create table montha as
  select distinct stockcode,year,month,
         sum(volume)as Mvolume,
         max(nhigh)as Mnhigh,
         min(nlow) as Mnlow
        from sorta
        group by stockcode,year,month;
        /*Stats by WK*/
  create table wka as
  select distinct stockcode,wk,
         sum(volume)as Wvolume,
         max(nhigh)as Wnhigh,
         min(nlow) as Wnlow
        from sorta
        group by stockcode,wk;
/*remerging*/
  create table YMWD as
        select a.*, b.Mvolume,b.Mnhigh,b.Mnlow,c.Wvolume,c.Wnhigh,c.Wnlow
  from sorta as a
       left join montha as b
       on (a.stockcode=b.stockcode) and (a.year=b.year) and (a.month=b.month)
       left join wka as c
       on (a.stockcode=c.stockcode) and (a.wk=c.wk);
quit;
已有 1 人评分论坛币 热心指数 收起 理由
pobel + 5 + 1 精彩帖子

总评分: 论坛币 + 5  热心指数 + 1   查看全部评分

使用道具

板凳
HXAI102230 在职认证  发表于 2022-1-18 11:27:03 |只看作者 |坛友微信交流群
第一个问题的程序,第二个问题还没有搞清楚

使用道具

报纸
hurley18 发表于 2022-1-18 18:29:16 |只看作者 |坛友微信交流群
HXAI102230 发表于 2022-1-18 11:27
第一个问题的程序,第二个问题还没有搞清楚
非常感谢,太厉害了,我还没看懂你的程式。
不过用你的程式跑出来的结果是整月和整周的数据相同,如下图。我其实是想当时每一天都是最后一天来对待,即每天的月周数据生成后,不随后面日期更新作update。即每天的数据都是对当天来的。
只有周最后交易日数据才是完全与整周数据吻合。


针对第2个问题:可能没表达好。
假想从2021年开始所有股票数据开始判断:
1.stockcode第一个,“000002”,2021年1月4日为第一个观测数据(1月4日对应的收盘价即为当周和当月收盘价,计算得当月对应的MACD和BOLL指标,如前面逻辑;而上周上月即2021年之前的都为整周数据),开始判断是否满足以下条件:
   月MACD连续增长2月&周boll上传中轨&当日股东数小于一年前和半年前;
   如果同一支股票得出一个日期后,后面20个交易日的日期不纳入结果。
   即判断是否(202101月MACD>202012月MACD>2020.11月MACD)
      & 当天的收盘价nclose>Boll(202101月周布林中轨)&前面连续两周的收盘价<Boll(对应前面两周各自的布林中轨)
     &当天的股东数stocksum<(前面一年即2020年1月4日,当天由于无开盘,回溯最新的2020年1月3日股东数)2020年1月3日的股东数;
如果以上判断条件都为是,则记录如新表。然后向下跳过20个观测即从2021.02.01日开始继续向面循环判断
如果以上判断有一个条件为否,则计算下一个观测2021年1月5日数据;
2.运行完“000002”,继续运行下一个股票代码数据;同样2021年1月4日为该组第一个观测数据


3运行完把所有符合逻辑的股票代码-日期及附带观测数据输出到新的数据集,然后查找到这些数据日期对应次日股价、7天后第一个交易日后股价,和30天后第一个交易日股价nclose。并用前后的股价得出收益率。




不知道说明白了没有




  







月MACD连续增长2月&周boll上传中轨&当日股东数小于一年前和半年前;如果同一支股票得出一个日期后,后面20个交易日的日期不纳入结果。

得出股票代码和日期后,求其次日的涨幅、交易后一周的涨幅、交易后一月的涨幅;


数据结果.jpg

使用道具

地板
hurley18 发表于 2022-1-18 18:31:16 |只看作者 |坛友微信交流群
HXAI102230 发表于 2022-1-18 11:27
第一个问题的程序,第二个问题还没有搞清楚
非常感谢,太厉害了,我还没看懂你的程式。
不过用你的程式跑出来的结果是整月和整周的数据相同,如下图。
我其实是想当时每一天都是最后一天来对待,即每天的月周数据生成后,不随后面日期更新作update。即每天的数据都是对当天来的。
只有周最后交易日数据才是完全与整周数据吻合。


针对第2个问题:可能没表达好。
假想从2021年开始所有股票数据开始判断:
1.stockcode第一个,“000002”,2021年1月4日为第一个观测数据(1月4日对应的收盘价即为当周和当月收盘价,计算得当月对应的MACD和BOLL指标,如前面逻辑;而上周上月即2021年之前的都为整周数据),开始判断是否满足以下条件:
   月MACD连续增长2月&周boll上传中轨&当日股东数小于一年前和半年前;
   如果同一支股票得出一个日期后,后面20个交易日的日期不纳入结果。
   即判断是否(202101月MACD>202012月MACD>2020.11月MACD)
      & 当天的收盘价nclose>Boll(202101月周布林中轨)&前面连续两周的收盘价<Boll(对应前面两周各自的布林中轨)
     &当天的股东数stocksum<(前面一年即2020年1月4日,当天由于无开盘,回溯最新的2020年1月3日股东数)2020年1月3日的股东数;
如果以上判断条件都为是,则记录如新表。然后向下跳过20个观测即从2021.02.01日开始继续向面循环判断
如果以上判断有一个条件为否,则计算下一个观测2021年1月5日数据;
2.运行完“000002”,继续运行下一个股票代码数据;同样2021年1月4日为该组第一个观测数据


3运行完把所有符合逻辑的股票代码-日期及附带观测数据输出到新的数据集,然后查找到这些数据日期对应次日股价、7天后第一个交易日后股价,和30天后第一个交易日股价nclose。并用前后的股价得出收益率。


不知道说明白了没有:)

数据结果.jpg
  
         





月MACD连续增长2月&周boll上传中轨&当日股东数小于一年前和半年前;如果同一支股票得出一个日期后,后面20个交易日的日期不纳入结果。
得出股票代码和日期后,求其次日的涨幅、交易后一周的涨幅、交易后一月的涨幅;

使用道具

7
hurley18 发表于 2022-1-18 18:37:10 |只看作者 |坛友微信交流群
HXAI102230 发表于 2022-1-18 11:25
proc sort data=raw.a out=sorta;
  by stockcode year month wk date;
run;
你的程式是把每月每周数据分别取最大最小和求和,并赋予这一组数值。
我是要每天更新的,且数据不覆盖前面日期的

使用道具

8
HXAI102230 在职认证  发表于 2022-1-18 20:09:48 |只看作者 |坛友微信交流群
已更新程序如上,对于问题2,还是没看懂各变量是怎么定义的。。。

使用道具

9
hurley18 发表于 2022-1-18 20:23:42 |只看作者 |坛友微信交流群
data STOCK.YMWD;
SET STOCK.YMWD;
BY STOCKCODE year month wk ;
first_month=first.month;
last_month=last.month;
first_wk=first.wk;
last_wk=last.wk;
run;

data STOCK.YMWD;
SET STOCK.YMWD;
by stockcode year month wk date;      /* 按照股票代码、年、月、周序、日期分组  */
WNCLOSE=nclose;                          /* 生成新变量周收盘价WNCLOSE,始终等于当天收盘价  */
retain wnopen;                                 /* 生成新变量周收盘价Wopen,且保留前面生成的数据 */
if first_wk=1 then do;                               /* 如果是周内第一个观测数据,则执行以下命令 ,周开盘价、最高价、最低价、交易量都取当天的日交易数据*/
Wnopen=nopen;WNCLOSE=nclose;Wvolume=volume;WnHigh=nHigh;WnLow=nLow;
end;
if first_wk=0 then do;       /* 如果不是周内第一个观测数据,则执行以下命令 */
Wvolume=lag(Wvolume)+volume;     /* '周交易量'=前一日生成的'周交易量'+'当天日交易量'*/
WnHigh=max(nhigh,lag(wnhigh));      /* '周最高价'=前一日生成的'周最高价'与'当天最高价'取较大的数值*/
WnLow=min(nlow,lag(wnlow));            /* '周最低价'=前一日生成的'周最低价'与'当天最低价'取较小的数值;*/
end;
run;



使用道具

10
hurley18 发表于 2022-1-18 20:30:02 |只看作者 |坛友微信交流群
data STOCK.YMWD;
SET STOCK.YMWD;
BY STOCKCODE year month wk ;
first_month=first.month;
last_month=last.month;
first_wk=first.wk;
last_wk=last.wk;
run;

data STOCK.YMWD;
SET STOCK.YMWD;
by stockcode year month wk date;      /* 按照股票代码、年、月、周序、日期分组  */
WNCLOSE=nclose;                          /* 生成新变量周收盘价WNCLOSE,始终等于当天收盘价  */
retain wnopen;                                 /* 生成新变量周收盘价Wopen,且保留前面生成的数据 */
if first_wk=1 then do;                               /* 如果是周内第一个观测数据,则执行以下命令 ,周开盘价、最高价、最低价、交易量都取当天的日交易数据*/
Wnopen=nopen;WNCLOSE=nclose;Wvolume=volume;WnHigh=nHigh;WnLow=nLow;
end;
if first_wk=0 then do;       /* 如果不是周内第一个观测数据,则执行以下命令 */
Wvolume=lag(Wvolume)+volume;     /* '周交易量'=前一日生成的'周交易量'+'当天日交易量'*/
WnHigh=max(nhigh,lag(wnhigh));      /* '周最高价'=前一日生成的'周最高价'与'当天最高价'取较大的数值*/
WnLow=min(nlow,lag(wnlow));            /* '周最低价'=前一日生成的'周最低价'与'当天最低价'取较小的数值;*/
end;
run;


新建位图图像.bmp

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

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

GMT+8, 2024-4-28 20:52