楼主: 带发修行僧
1749 6

如何使用sql语言查找符合要求的交易 [推广有奖]

  • 0关注
  • 0粉丝

大专生

10%

还不是VIP/贵宾

-

威望
0
论坛币
859 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
294 点
帖子
25
精华
0
在线时间
48 小时
注册时间
2007-11-11
最后登录
2024-4-22

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
请教各位大神:

       小弟现在有两个表格。 表格1是事件发生的时间,格式如下:

FIRM      EVENTDATE
  A           20101025
  A           20120718
  B           19980101
.........       ..................


表格2是时间序列,表示每个公司,每个交易日的交易数量,其形式如下:


FIRM          DATE      SHARES
A          20101011      8000
A          20101012      1000
A          20101013        0
A          20101014        0
A          20101015        0

A          20101018      800
A          20101019      1000
A          20101020        0
A          20101021        0
A          20101022        0
A          20101025      600
... ......

现在想为表A中的每一个事件计算eventdate 前十交易日的交易量(SHARES)的累积值。以表A第一个事件为例:事件发生在2010年10月25号,那么事件前十交易日的累计交易数量为10800 (10月11到10月22的shares累加)。

请教一下各位这个过程应当如何实现。此外有两个问题需要考虑:第一个问题是需要考虑交易日。表B的原始数据中是把周末和假期自动去除的; 第二个问题是如果事件日之前的交易日不足十日(比如只有五日),那么 有多少便累加多少。

先谢谢了!
二维码

扫码加我 拉你入群

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

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

关键词:sql语言 如何使用 sql Shares share sql语言 如何

沙发
huntdreamer 发表于 2014-7-28 09:34:03 |只看作者 |坛友微信交流群
其实 你没必要考虑周6和周日,因为那2天不开盘,也可以等同于交易为0.
data a;
input firm(用时候把这部分去掉,防止提交改变字体)$ eventdate yymmdd8.@@;
cards;
A 20101025
A 20120718
B 19980101
;
run;

/****倒入数据集B*****/

data b;
input firm(用时候把这部分去掉,防止提交改变字体)$ date yymmdd8. SHARES@@;
cards;
B 19971231 30
B 19971230 20
A 20101011 8000
A 20101012 1000
A 20101013 0
A 20101014 0
A 20101015 0
A 20101018 800
A 20101019 1000
A 20101020 0
A 20101021 0
A 20101022 0
A 20101025 600
;
run;


/****汇总****/
proc sql;
create table c as
select a.firm,a.eventdate,b.date,sum(b.shares) as sum
from a,b
where a.firm=b.firm
and a.eventdate-14<=b.date<=a.eventdate-1
group by a.firm,a.eventdate;
quit;

使用道具

藤椅
带发修行僧 发表于 2014-7-28 15:55:35 |只看作者 |坛友微信交流群
huntdreamer 发表于 2014-7-28 09:34
其实 你没必要考虑周6和周日,因为那2天不开盘,也可以等同于交易为0.
data a;
input firm(用时候把这部分去 ...
谢谢,我明白您的code中的逻辑。 但是还有一天eventdate+14<eventdate<eventdate_1这一句code可以保证选择出前十天的交易么?比如说,除了周末以外。如果还碰到其他节假日停盘的情况,那么这个code选出来的交易日可能会少于10天

使用道具

板凳
带发修行僧 发表于 2014-7-28 16:20:31 |只看作者 |坛友微信交流群
huntdreamer 发表于 2014-7-28 09:34
其实 你没必要考虑周6和周日,因为那2天不开盘,也可以等同于交易为0.
data a;
input firm(用时候把这部分去 ...
如果不考虑eventdate的逻辑,能否采取如同lag variablels的方法,察看某个时间日之前的十个observation?

使用道具

报纸
huntdreamer 发表于 2014-7-28 16:24:03 |只看作者 |坛友微信交流群
那也可以啊!LAG--lag10(var)

使用道具

地板
freerunning_sky 在职认证  发表于 2014-7-28 19:14:22 |只看作者 |坛友微信交流群
  1. data a;
复制代码

使用道具

7
freerunning_sky 在职认证  发表于 2014-7-28 20:09:10 |只看作者 |坛友微信交流群
freerunning_sky 发表于 2014-7-28 19:14
  1. data a;
  2. input firm $ eventdate yymmdd8.@@;
  3. format eventdate yymmdd10.;
  4. cards;
  5. A 20101025
  6. A 20120718
  7. B 19980101
  8. ;
  9. run;

  10. /****倒入数据集B*****/

  11. data b;
  12. input firm $ date yymmdd8. SHARES@@;
  13. format date yymmdd10.;
  14. cards;
  15. B 19971231 30
  16. B 19971230 20
  17. A 20101011 8000
  18. A 20101012 1000
  19. A 20101013 0
  20. A 20101014 0
  21. A 20101015 0
  22. A 20101018 800
  23. A 20101019 1000
  24. A 20101020 0
  25. A 20101021 0
  26. A 20101022 0
  27. A 20101025 600
  28. A 20101026 700
  29. A 20101027 800
  30. ;
  31. run;

  32. proc sort data=b;by firm date;run;
  33. proc sort data=a;by firm eventdate;run;
  34. data c;
  35.         set b;
  36.         by firm date;
  37.         retain tmp_dt tot_10d;
  38.         format tmp_dt date9.;
  39.         array amt(11) _temporary_ (0,0,0,0,0,0,0,0,0,0,0);
  40.         if first.firm then do;
  41.                 tmp_dt=date;
  42.                 do i=1 to dim(amt);
  43.                         amt(i)=0;
  44.                 end;
  45.         end;else
  46.         tmp_dt=tmp_dt+1;

  47.         if tmp_dt<date then do;
  48.                 do while(tmp_dt<date);
  49.                         output;
  50.                         tmp_dt=tmp_dt+1;
  51.                 end;
  52.         end;
  53.         tot_10d=.;
  54.         do i=2 to amt(1)+1;
  55.                 tot_10d=sum(tot_10d,amt(i));
  56.         end;
  57.         if amt(1)<10 then amt(1)=amt(1)+1;
  58.         do i=amt(1)+1 to 3 by -1;
  59.                 amt(i)=amt(i-1);
  60.         end;
  61.         amt(2)=shares;
  62.         output;
  63.         if last.firm then do;
  64.                       tmp_dt=tmp_dt+1;
  65.                                 tot_10d=.;
  66.                                 do i=2 to amt(1)+1;
  67.                         tot_10d=sum(tot_10d,amt(i));
  68.                         end;
  69.                 output;
  70.         end;
  71.         drop i;
  72. run;

  73. data out;
  74.         merge a(in=a) c(keep=firm tmp_dt tot_10d rename=(tmp_dt=eventdate));
  75.         by firm eventdate;
  76.         if a;
  77. run;
复制代码

使用道具

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

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

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

GMT+8, 2024-4-28 13:27