SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

查看: 692|回复: 5
打印 上一主题 下一主题

交易记录修正问题

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2009-9-9 08:08:48 | 只看该作者

交易记录修正问题

最近数据处理碰到如下问题,请教。
数据格式如下:
company   date  stock   share
1            2003-6-30  000001   34567
1           2003-6-30  000002    56789
1    2003-6-30   000003   12345
2   2003-6-30    000001   345
2  2003-6-30    000002    123
1   20004-6-30     000001    12345
1 20004-6-30    000003      54321

大致这样的。想通过持仓数量考虑公司是都增持股票还是减仓。 如果stock 的代码在前后日期都出现好办,但是是如果股票全部减仓,那么该代码不会在出现,如上述数据中的公司1 持有000002 的情况,这是时候也要考虑000002 被卖出的信息。

上述问题如何解决?是不是将前期的股票代码在第二期补全纪录,然后再考虑?往高手指点。谢谢!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2009-9-9 11:06:17 | 只看该作者

Re: 交易记录修正问题

每个company的每只stock是只有期初期末2条记录,还是有N条交易记录?
[code:2td93s6v]data raw;
        input company date yymmdd10. stock $ share;
        format date yymmdd10.;
datalines;
1 2003-6-30 000001 34567
1 2003-6-30 000002 56789
1 2003-6-30 000003 12345
2 2003-6-30 000001 345
2 2003-6-30 000002 123
1 2004-6-30 000001 12345
1 2004-6-30 000003 54321
;

proc sort data=raw out=temp;
        by company stock date;
run;

data temp2;
        missing x;
        retain company stock date_start share_start date share share_diff;
        do _n_=1 by 1 until(last.stock);
                set temp;
                by company stock date;
                if _n_=1 then do;
                        share_start=share;
                        date_start=date;
                end;
        end;
        share_diff=share-share_start;
        if share_diff=0 then do;
                share_diff=-share_start;
                share=.x;
                date=.x;
        end;
        rename share=share_end date=date_end;
        format date_start yymmdd10.;
run;[/code:2td93s6v]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2009-9-9 11:16:50 | 只看该作者

Re: 交易记录修正问题

楼上代码很好,只是有个局限,如果数据量很大,甚至达到数万条的话就行不通了。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2009-9-9 18:09:47 | 只看该作者

Re: 交易记录修正问题

[code:3ua8ek3m]data raw;
   input company date yymmdd10. stock $ share;
   format date yymmdd10.;
datalines;
1 2003-6-30 000001 34567
1 2003-6-30 000002 56789
1 2003-6-30 000003 12345
2 2003-6-30 000001 345
2 2003-6-30 000002 123
1 2004-6-30 000001 12345
1 2004-6-30 000003 54321
;

proc sort data=raw out=temp;
   by company stock date;
run;

data stock_start stock_end;
        set temp;
        by company stock;
        if first.stock then output stock_start;
        if last.stock then output stock_end;
run;

proc sql noprint;
        create table temp as
                select a.company, a.stock, a.date as date_start, a.share as share_start,
                                b.date as date_end, b.share as share_end,
                                case share_start-share_end
                             when 0 then -share_start
                             else share_start-share_end
                                end as share_diff
                        from stock_start a, stock_end b
                        where a.company=b.company and a.stock=b.stock;
quit;[/code:3ua8ek3m]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2009-9-10 13:24:54 | 只看该作者

Re: 交易记录修正问题

谢谢!

hopewell 的方法并没有解决我的问题/。

学习了sas sql 的又一新招。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2009-9-10 20:44:26 | 只看该作者

Re: 交易记录修正问题

我没辙了,祝你好运吧 <!-- s:) --><img src="{SMILIES_PATH}/icon_smile.gif" alt=":)" title="Smile" /><!-- s:) -->
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|SAS中文论坛  

GMT+8, 2026-2-5 23:14 , Processed in 0.085659 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表