|
|
9#

楼主 |
发表于 2009-7-27 10:43:27
|
只看该作者
Re: 同志们,来帮额看这个问题怎么解决
凑个热闹,瞎写的.
[code:fn5jnbfk]data original;
input id: $ dt: yymmdd10. stk: $ type ;
format dt yymmdd10.;
cards;
10001 2001-12-12 100037 4
10001 2001-12-12 111001 1
10001 2001-12-21 100795 1
10001 2002-1-9 000973 1
10001 2002-1-9 100018 1
10001 2002-1-9 100392 1
10001 2002-1-9 100961 1
10001 2002-1-17 000973 4
10001 2002-1-17 111333 1
10001 2002-1-19 100795 4
10001 2002-1-19 100961 4
10001 2002-2-13 000931 4
10001 2002-2-13 111628 1
10001 2002-2-14 111001 4
10001 2002-3-23 100018 4
10001 2002-3-23 111333 4
10001 2002-4-19 100392 4
10001 2002-6-21 111628 4
10001 2002-6-21 111988 1
10001 2002-6-29 100018 1
10001 2002-8-13 111988 4
10001 2002-8-21 100018 4
10001 2002-10-25 100886 1
10001 2002-11-22 111857 1
10001 2003-4-23 111857 4
10001 2003-6-2 100037 1
10001 2003-6-2 111628 1
10001 2003-6-6 111988 1
10001 2003-6-12 100030 1
;
/* 设定起止时间 */
%let start=2001-12-01;
%let end=2003-07-31;
/* 对原始数据排序 */
/* temp1:补齐记录的交易数据 */
proc sort data=original out=temp1;
by stk dt type;
run;
/* 按起止时间补齐缺少的记录 */
data temp1;
set temp1;
by stk dt type;
output;
/* 补开始记录 */
if first.stk and type=4 then do;
dt=input("&start",yymmdd10.);
type=1;
output;
return;
end;
/* 补结束记录 */
if last.stk and type=1 then do;
dt=input("&end",yymmdd10.);
type=4;
output;
end;
run;
/* 对temp1重新排序 */
proc sort data=temp1;
by stk dt type;
run;
/* 建新的分组变量 */
/* temp2:转换为持仓区间的交易记录 */
data temp2;
set temp1;
if type=1 then flag=_n_;
else flag=_n_-1;
run;
/* 创建持仓期间 */
data temp2;
do _n_=1 by 1 until(last.flag);
set temp2;
by flag;
if type=1 then start=dt;
else end=dt;
end;
format start end yymmdd10.;
keep id stk start end;
run;
/* 按建仓时间排序 */
proc sort data=temp2;
by id start;
run;
/* 比较持仓区间 */
/* temp3:包含有效的持仓区间 */
data temp3;
set temp2;
retain start_dt end_dt;
if _n_=1 then do;
start_dt=start;
end_dt=end;
end;
else do;
if start>end_dt then start_dt=start;
if end>end_dt then end_dt=end;
end;
have_day=end_dt-start_dt;
output;
format start_dt end_dt yymmdd10.;
keep id start_dt end_dt have_day;
run;
/* 汇总持仓区间 */
data temp3;
do _n_=1 by 1 until(last.start_dt);
set temp3;
by start_dt;
end;
run;
/* result:结果数据 */
data result;
set temp3 end=last;
date_range=input("&end",yymmdd10.)-input("&start",yymmdd10.);
sum_have_day+have_day;
final_enpty_day=date_range-sum_have_day;
if last then output;
drop start_dt end_dt have_day;
run;[/code:fn5jnbfk] |
|