SAS中文论坛

标题: 求助——挑战 [打印本页]

作者: shiyiming    时间: 2012-7-1 19:01
标题: 求助——挑战
给出数据集的一部分
日期               收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
求高手指教。
作者: shiyiming    时间: 2012-7-2 22:35
标题: 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)日期的排列不是单调的,是吗?
作者: shiyiming    时间: 2012-7-4 20:17
标题: Re: 求助——挑战
楼主犀利,日期是单调增加,我随意举例时,没有注意。望楼主指教,不胜感激!
作者: shiyiming    时间: 2012-7-5 22:59
标题: 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]
作者: shiyiming    时间: 2012-7-6 14:33
标题: 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]
作者: shiyiming    时间: 2012-7-8 12:37
标题: Re: 求助——挑战
谢谢两位的回复,不过貌似都有一点问题,我已经用excel解决了。




欢迎光临 SAS中文论坛 (http://mysas.net/forum/) Powered by Discuz! X3.2