SAS中文论坛

 找回密码
 立即注册

扫一扫,访问微社区

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

求助——挑战

[复制链接]

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
楼主
 楼主| 发表于 2012-7-1 19:01:40 | 只看该作者

求助——挑战

给出数据集的一部分
日期               收1              收2               量     利率
01jan2012       99                 100             200         3
02jan2012       98.1             99.9             100        3
04jan2012       98.3             99.5               0         3
05jan2012       98.5             99.1             0         3
06jan2012       99.7             98.1             4          3
02jan2012       98.1             99.9             80         3
......
现在想多增加一列收益率,如果滞后两行的量不为0,收益率=滞后两行的收2/收1—1—当前行的利率*滞后两行的日期与当前行的日期相隔的天数/100,
如果滞后两行的量为0,就往下寻找直到第一个量不为0的行,设为滞后n行,收益率=滞后n行的收2/收1—当前行的利率*滞后n行的日期与当前行的日期相隔的天数/36500
如上述第一行的收益率=滞后4行的收2/收1—当前行的利率*滞后4行的日期与当前行的日期相隔的天数/100=98.1/99—1—3*5/36500
求高手指教。
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
沙发
 楼主| 发表于 2012-7-2 22:35:29 | 只看该作者

Re: 求助——挑战

01jan2012 99 100 200 3
[color=#FF0000:mrr8l7aj]02jan2012 98.1 99.9 100 3[/color:mrr8l7aj]
04jan2012 98.3 99.5 0 3
05jan2012 98.5 99.1 0 3
06jan2012 99.7 98.1 4 3
[color=#FF0000:mrr8l7aj]02jan2012 98.1 99.9 80 3 [/color:mrr8l7aj]
请feixing0216确认一下
(1) 在日期的观测中出现相同的,是吗?
(2)日期的排列不是单调的,是吗?
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
板凳
 楼主| 发表于 2012-7-4 20:17:53 | 只看该作者

Re: 求助——挑战

楼主犀利,日期是单调增加,我随意举例时,没有注意。望楼主指教,不胜感激!
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
地板
 楼主| 发表于 2012-7-5 22:59:17 | 只看该作者

Re: 求助——挑战

最近有些忙,没能及时回复请原谅。其次,仔细看了 feixing0216 的要求,可能
有些地方,还不是太清楚。请feixing0216先看一下后,我们进一步交流。

[code:cum6ina4]
data ads;
input date date10. income1 income2 vol rate;
cards;
01jan2012 99   100  200 3
02jan2012 98.1 99.9 100 3
04jan2012 98.3 99.5 0   3
05jan2012 98.5 99.1 0   3
06jan2012 99.7 98.1 4   3
06jan2012 99.7 98.1 5   3
08jan2012 99.7 98.1 6   3
15jan2012 99.7 98.1 7   3
26jan2012 99.7 98.1 8   3
;

proc iml;
use ads;
read all into amx;
close ads;

nrw=nrow(amx);

date=amx[,1];
income1=amx[,2];
income2=amx[,3];
vol=amx[,4];
rate=amx[,5];

loc=loc(vol^=0);

fdate=date[loc];
fincome1=income1[loc];
fincome2=income2[loc];
fvol=vol[loc];
frate=rate[loc];

nrw=nrow(fvol);

difdate=fdate[3:nrw,1]-fdate[1:nrw-2,1];

subincome1=income1[1:nrw-2,];
subincome2=income2[3:nrw,];
subfrate=frate[1:nrw-2,];

r=subincome2/subincome1-1-subfrate#difdate/36500;

outmx=fdate[1:nrw-2,1]||r;

create bds var{date r};
append from outmx;
close bds;
quit;

data cds;
merge ads bds;
by date;
format date yymmdd10.;
run;

[/code:cum6ina4]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
5#
 楼主| 发表于 2012-7-6 14:33:35 | 只看该作者

Re: 求助——挑战

[code:1h1ctds7]
data ads;
input date date10. income1 income2 vol rate;
cards;
01jan2012 99   100  200 3
02jan2012 98.1 99.9 100 3
04jan2012 98.3 99.5 0   3
05jan2012 98.5 99.1 0   3
06jan2012 99.7 98.1 4   3
06jan2012 99.7 98.1 5   3
08jan2012 99.7 98.1 6   3
15jan2012 99.7 98.1 7   3
26jan2012 99.7 98.1 8   3
;
run;

data  result;
        set ads;
        n=1;
        do i=_n_+2 to count;
                n=n+1;
                set a(keep=date income2 vol rename=(date=date_lag income2=income2_lag vol=vol_lag)) nobs=count point=i;
                if vol_lag^=0 then leave;
        end;
        select;
                when (n=2) syl=income2_lag/income1-1-rate*(date_lag-date)/100;
                when (n>2) syl=income2_lag/income1-rate*(date_lag-date)/36500;
                otherwise;
        end;
        drop n date_lag income2_lag vol_lag;
run;

proc iml;
        use ads;
        read all into A[colname={'date','income1','income2','vol','rate'}];
        close ads;

        S=J(nrow(A),1,.);
        do i=1 to nrow(A);
                N=1;
                do j=i+2 to nrow(A);
                        N=N+1;
                        if A[j,4]^=0 & N>=2 then do;
                                if N=2 then do;C=1;D=100;end;else do;C=0;D=36500;end;
                                S[i]=A[j,3]/A[i,2]-C-A[i,5]#(A[j,1]-A[i,1])/D;
                                goto exit;
                        end;
                end;
                exit:;
        end;
        R=A||S;
       
        create result var {'date','income1','income2','vol','rate','syl'};
        append from R;
quit;

[/code:1h1ctds7]
回复 支持 反对

使用道具 举报

49

主题

76

帖子

1462

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1462
6#
 楼主| 发表于 2012-7-8 12:37:23 | 只看该作者

Re: 求助——挑战

谢谢两位的回复,不过貌似都有一点问题,我已经用excel解决了。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-8 23:08 , Processed in 0.078311 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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