SAS綜合題1-15_第1頁
SAS綜合題1-15_第2頁
SAS綜合題1-15_第3頁
SAS綜合題1-15_第4頁
SAS綜合題1-15_第5頁
已閱讀5頁,還剩54頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、SAS金融數(shù)據(jù)處理綜合練習題1. 創(chuàng)建一包含10000個變量(X1-X10000),100個觀測值的SAS數(shù)據(jù)集。分別用DATA步,DATA步數(shù)組語句和IML過程實現(xiàn)。1. Drop=i2. 刪除變量i,否則就會有10001個變量。3. i會掃描到第101次。4. Retain語句給變量付初值。Data步:data p1(drop=i);retain x1-x10000 0;do i=1 to 100;output;end;run;data步數(shù)組:Array:隱含下標數(shù)組,數(shù)值變量,默認下標變量_i_ Do over, 隱含下標數(shù)組元素執(zhí)行do組Ranuni:隨機數(shù)函數(shù),返回來自均勻分布的隨機

2、變量。Output:輸出觀測到數(shù)據(jù)集中,p157data p1(drop=i);array x x1-x10000;do i=1 to 100;do over x;x=ranuni(0);end;output;end;run;宏:%macro names(name,number,obs);data a;%do i=1 %to &obs;%do n=1 %to &number;&name&n=1;%end;output;%end;Run;%mend names;%names(x, 10000,100);2. 多種方法創(chuàng)建包含變量X的10000個觀測值的SAS數(shù)據(jù)集

3、。初值為0:data a;retain x 0;do i=1 to 10000;drop i;output;end;run;隨機數(shù):data a (drop=i);do i=1 to 10000;x=ranuni(0);output;end;run;讀入其他數(shù)據(jù)文件:(先創(chuàng)建數(shù)據(jù)文件a,再從中讀取)data a (drop=i);do i=1 to 10000;x=ranuni(0);output;file 'x:a.txt'put x;end;run;data b;infile 'x:a.txt'input x;output;run;讀入其他數(shù)據(jù)集:data

4、a;do i=1 to 10000;x=ranuni(0);output;end;run;data b;set a;drop i;output;run;3. 數(shù)據(jù)集A中日期變量DATE包含有缺失值,創(chuàng)建包含日期變量DATE的數(shù)據(jù)集B,并填充開始到結(jié)束日之間的所有日期值?!鞠仍趕as中建立邏輯庫Resdat的鏈接,便于數(shù)據(jù)集的引用】data a;/*可用用stk000001數(shù)據(jù)集*/set Resdat.stk000001;if date=. then delete;/*要排序之前必須先把缺失值去掉,否則缺失值會排在最前面*/run;proc sort data=a; /*set語句前必須要排序

5、*/by date;data b(drop=date);set a end=end;/*文件結(jié)束的臨時變量,不包含在數(shù)據(jù)集中。前面的end是函數(shù),后面的end是變量名*/by date;retain start; /*沒有retain語句則start的值為缺失*/if _n_=1 then start=date;if end then do; /*也可以寫if end then do last=date;*/last=date;output;end;run;/*此時只有一個觀測,start值為date最小值,last值為date最大值*/data b(keep=date);/*只留date一個

6、變量*/informat date yymmdd10.;format date yymmdd10.;set b;do date=start to last;output;end;run;如圖,缺失的日期被補充完整,觀測數(shù)從4056變?yōu)?167.方法二:data a;set a nobs=nobs;call symput('temp',nobs);/*查找a的觀測值個數(shù),并賦值給宏變量temp*/if date=. then delete;/*要排序之前必須先把缺失值去掉,否則缺失值會排在最前面*/run;proc sort data=a; /*set語句前必須要排序*/by d

7、ate;data b(drop=date1);set a(rename=(date=date1) end=end;/*文件結(jié)束的臨時變量,不包含在數(shù)據(jù)集中*/by date1;retain date; /*沒有retain語句則date的值為缺失*/if _n_=1 then date=date1; /*查找第一個觀測值*/else delete;run;data b(keep=date);informat date yymmdd10.;format date yymmdd10.;set b;do n=1 to &temp;date=date+1;output;end;run;/*方法

8、二并不能產(chǎn)生開始和截止日之間所有日期,只能產(chǎn)生和觀測值相等的天數(shù)的日期,因為&temp是等于觀測值的*/如圖,仍然是4056個觀測。4. 創(chuàng)建包含日期變量DATE的SAS數(shù)據(jù)集,日期值從1900年1月1日到2000年1月1日。data c(keep=date);format date ddmmyy10.;sdate='01jan1900'd;edate='01jan2000'd;do date=sdate to edate;output;end;run;5. 利用隨機數(shù)函數(shù)RANUNI對某數(shù)據(jù)集設(shè)計返回抽樣方案。data a;set resdat.cla

9、ss;keep name;run;data b;set a nobs=nobs;/*記錄讀入數(shù)據(jù)集的觀測總數(shù)*/ran=ceil(nobs*ranuni(1);/*ceil()返回大于等于自變量的最小整數(shù)值,1可以隨便取值,只要大于0*/run;proc sort data=b;by ran;data c;set b;if _n_<=5;run;【n個人,隨機賦予編號,重新排序后取前5個】方法二:data rv ;retain _seed_ 0;do _i_=1 to 5;n=int(19*ranuni(_seed_);/*int是取整數(shù)部分*/output;end;drop _seed

10、_ _i_;proc sort data=RV;by n;run;data a;set resdat.class;n=_N_;run;data sample;merge a rv(in=id); /*合并的時候在數(shù)據(jù)集rv中的n才會被合并*/if id;by n;run;【隨機生成5個數(shù),給原數(shù)據(jù)集編號n,通過Merge挑選對應(yīng)序號的觀測】6. 利用隨機數(shù)函數(shù)RANUNI對某數(shù)據(jù)集設(shè)計不返回抽樣方案。data a;set resdat.class;keep name;run;data b;set a nobs=nobs;ran=ceil(nobs*ranuni(2007);run;proc s

11、ort data=b;by ran;data c;set b;if ran=lag(ran) then delete; /*與上一題的區(qū)別在于,刪除序號相同的觀測*/run;data d;set c;if _n_<=5;run;7. 計算數(shù)據(jù)集A中變量X的累乘。data a (drop=i);do i=1 to 10;x=10*ranuni(0);output;end;run;data b; set a; retain y 1; y=y*x; run; 8. 如何改變一個SAS數(shù)據(jù)集的變量順序?data a;/*可用用stk000001數(shù)據(jù)集*/set Resdat.stk000001;

12、run;Data b; retain date code; set a; run;Data b; format date yymmdd10. Stkcd $6.; run;9. 數(shù)據(jù)集A和B包含同樣兩變量DATE和PRICE,以DATE為標識變量合并數(shù)據(jù)集A和B為C。合并時應(yīng)該注意什么?【使用redat中的stk00001,stk00002,同樣兩變量日期date,收盤價clpr,以date為標識合并數(shù)據(jù)集,使用by語句,注意重命名stkcd, clpr】data a;/*可用stk000001數(shù)據(jù)集*/set Resdat.stk000001;keep stkcd date clpr;run

13、;data b;/*可用stk000002數(shù)據(jù)集*/set Resdat.stk000002;keep stkcd date clpr;rename stkcd=stkcd2 clpr=clpr2;run;data c;merge a b;by date;run;10. 給下段程序的主要語句加注釋。STOP語句能否刪除?為什么? data a;do obsnum=1 to last by 20; /*從觀測1到所有觀測,間隔20執(zhí)行do語句*/set ResDat.stk000001 point=obsnum nobs=last;/*觀測序號變量為obsnum,所有觀測變量為last*/out

14、put;/*輸出到數(shù)據(jù)a*/end;/*結(jié)束do組*/stop;/*結(jié)束data步*/run;【刪除stop語句會使SAS系統(tǒng)陷入死循環(huán)】11. 假設(shè)數(shù)據(jù)集A中的變量logdate為如下形式的字符格式:1998-12-2 1999-8-6 1999-8-10 將其轉(zhuǎn)換為日期格式變量date。data a;input logdate $9.;cards;1998-12-21999-8-6 1999-8-10;run;data b(keep=date);set a;date=input(logdate,yymmdd10.);informat date yymmdd10.;format date y

15、ymmdd10.;run;12. 運行SAS程序過程中,SAS系統(tǒng)創(chuàng)建的自動變量是否包含在創(chuàng)建的數(shù)據(jù)集?一般情況下,怎樣查看系統(tǒng)自動變量的值?【不包括,將自動變量賦值給定義的變量,或者使用put _all_語句】data a;retain x 0;do i=1 to 10;output;end;run;data b; set a; n=_n_; run;13. SAS系統(tǒng)顯示表達式、函數(shù)、數(shù)據(jù)集、數(shù)組或矩陣的具體值時,常需要哪些語句和過程?【Put語句,set語句,proc print過程】data a;x=date();/*今天的日期*/y='_'put x= y=;form

16、at x yymmdd10.;run;data b;set resdat.class;keep name;put name;run;proc print data=resdat.class (obs=5);var name sex;run;觀測值為12345,LOG窗口輸出為n=614. 寫出下面各段程序創(chuàng)建數(shù)據(jù)集的所有觀測值,并指出PUT語句分別在LOG窗口輸出什么結(jié)果? data a1;do n=1 to 5;output;end;put n=;run;觀測值同上,LOG窗口輸出為:n=1n=2一直到n=6data a1;do n=1 to 5;output;put n=;end;put

17、n=;run;LOG窗口輸出同第二問,觀測值只有一個6data a1;do n=1 to 5;put n=;end;put n=;run;/*無output語句*/LOG窗口和觀測值都只有6data a1;do n=1 to 5;end;put n=;run;觀測值是從2到5,LOG輸出一個5data a2;n=1;do until(n>=5); /*等于5就不run了,所以n等于4之后就停止*/n+1;output;end;put n=;run;同上data a3;n=1;do while(n<5);n+1;output;end;put n=;run;窗口和觀測值都只有8;即un

18、til語句是無論如何都要執(zhí)行一次的data a4;n=7;do until(n>=5);n+1;output;end;put n=;run;LOG輸出為7,觀測值缺失。即while語句第一次是先判斷再第一次執(zhí)行的data a5;n=7;do while(n<5);n+1;output;end;put n=;run;15. 數(shù)據(jù)集A有一個變量n,5個觀測值1,2,3,4,5。數(shù)據(jù)A1由下面程序2產(chǎn)生,同樣有一個變量n,5個觀測值1,2,3,4,5。試分析下面兩段程序中,PUT語句在Log窗口輸出結(jié)果的差異,為什么?程序1:LOG窗口顯示n從1到5Data a;Set a;Put n=

19、;Run;LOG窗口顯示n=6程序2:data a1;do n=1 to 5;output;end;put n=;run;16. 試由以下的9種德國馬克對美元匯率看跌期權(quán)和9種英鎊對美元匯率的看跌期權(quán)產(chǎn)生81種組合。 一年期,DM/USD匯率的9種不同看跌期權(quán)的執(zhí)行價格和成本執(zhí)行價格Kdm成本 Cdm0.660.0858550.650.0321910.640.0207950.630.0170010.620.0137110.610.0108510.600.0083880.590.0062910.550.001401一年期,BP/USD匯率的9種不同看跌期權(quán)的執(zhí)行價格和成本執(zhí)行價格 Kbp成本 C

20、bp1.300.1372131.250.0826451.200.0450601.150.0283481.100.0161461.050.0078601.000.0032770.950.0011340.900.000245答案:data dm;input Kdm Cdm;cards;0.660.0858550.650.0321910.640.0207950.630.0170010.620.0137110.610.0108510.600.0083880.590.0062910.550.001401;run;data bp;input Kbp Cbp;cards;1.300.1372131.250.

21、0826451.200.0450601.150.0283481.100.0161461.050.0078601.000.0032770.950.0011340.900.000245;run;data dm;set dm;dm_no=_n_;run;/*對dm的種類標號*/data bp;set bp;bp_no=_n_;run;/*對bp的種類標號*/%macro names(name,number);%do i=1 %to &number;&name%end;%mend names; /*下面set要用到一段重復(fù)的文本*/data a;set %names(dm,9);by

22、dm_no;run; /*連接9個相同的數(shù)據(jù)集dm,然后對其按照標號排序*/data b;set %names(bp,9);run; /*連接9個相同的數(shù)據(jù)集bp,序列為1-9循環(huán)9次*/data c;merge a b; /*合并a和b,這樣產(chǎn)生81個不重復(fù)的組合,每一個a中的標號(如1)都對應(yīng)了b中的9個標號*/run;方法2:data test16;do i=1 to 9;set dm point=i; /*依次讀入數(shù)據(jù)集dm中的第1至9個觀測*/do j=1 to 9 ;set bp point=j;/*在讀入dm的第i個觀測后,依次讀入bp中的所有觀測*/output;end;end

23、;stop;run;17. 不用SAS函數(shù),用宏%a(n,p)計算二項分布的概率分布和累計概率(k=1,2,n)。方法1:%macro a(n,p);data a;do k=0 to &n;fn=fact(&n);fk=fact(k);fnk=fact(&n-k);d=&p*k*(1-&p)*(&n-k);f=fn/(fk*fnk);binomial=f*d;output;end;data a;set a;cum+binomial;proc gplot data=a;symbol1 v=star i=needle c=red;plot binom

24、ial*k=1;run;quit;%mend a;%a(20,0.2);方法2:%macro a(n,p);data a1;retain fn 1;do i=1 to &n;fn=fn*i;end;do k=0 to &n;fk=1;fnk=1; /*一定要使第二重循環(huán)開始時這兩個變量的值為1,這里不能為retain語句*/do i=1 to k;fk=fk*i;end; /*輸出的只有最后的fk,如果在這里加上了output則會輸出中間值*/do i=1 to &n-k;fnk=fnk*i;end;d=&p*k*(1-&p)*(&n-k);f=

25、fn/(fk*fnk);binomial=f*d;output;end;run;data a1;set a1;cum+binomial;run;proc gplot data=a;symbol1 v=star i=needle c=red;plot binomial*k=1;run;quit;%mend a;%a(20,0.2);18. 創(chuàng)建組標識變量GROUP,將數(shù)據(jù)集A中的觀測等分為10組,觀測值不能整除10時,前余數(shù)組各多加一個觀測值。data a;set resdat.treat nobs=nobs;x=(nobs-mod(nobs,10)/10;call symput('no

26、bs',nobs); /*宏變量傳遞觀測值個數(shù)*/call symput('groupn',x);/*宏變量傳遞商*/call symput('mod',mod(nobs,10);/*宏變量傳遞余數(shù)*/drop x;run;%put &nobs &groupn;data b;do i=1 to &mod ;do _n_=1 to &groupn+1; /*前余數(shù)組各多加一個觀測值*/group=i;output;end;end;do i=&mod+1 to 10;do _n_=1 to &groupn; /

27、*后面各組觀測值數(shù)為商數(shù)*/group=i;output;end;end;drop i;run;data c;merge a b; /*合并后即可對數(shù)據(jù)集a的觀測值分組*/proc sort data=c;by group;run;方法二(更好);data a;set resdat.treat;retain groupid 0; /*規(guī)定變量groupid的初始值為0,同時規(guī)定該變量的值在下一次使用時不被清空*/groupid=groupid+1; if groupid=11 then groupid=1;/*相當于分十組,第10*n+m個變量被重新分到第m組*/run;19. 現(xiàn)有一個數(shù)據(jù)流

28、:a 2 b 3 c d 4 6,按下面要求創(chuàng)建SAS數(shù)據(jù)集。用語句input id $ no; 變量id取值上面數(shù)據(jù)流里的a,b,c,d,變量no取值2,3,4,6。但是這個數(shù)據(jù)流存在問題:如有的id沒有no,有的no沒有id。創(chuàng)建SAS數(shù)據(jù)集,刪除只有id沒有no或者只有no沒有id的觀測,即把上面的c和6去掉,最后得到三個觀測,a 2, b 3與d 4。data a;input t$;cards;a 2 b 3 c d 4 6;data b;set a;id=lag(t);no=t;if 'a'<=id<='z' and '0'

29、<=no<='9'drop t;run;20. 現(xiàn)有一個數(shù)據(jù)流:a23 223 bc4 36 3c5 11d 400 620,按下面要求創(chuàng)建SAS數(shù)據(jù)集。用語句input id $ no; 變量id取值上面數(shù)據(jù)流里的a23, bc4, 11d ,變量no取值233,36,400。但是這個數(shù)據(jù)流存在問題:如有的id沒有no,有的no沒有id。創(chuàng)建SAS數(shù)據(jù)集,刪除只有id沒有no或者只有no沒有id的觀測,即把上面的3c5和620去掉,最后得到三個觀測:a23 223bc4 3611d 400data b;input t $ ;cards;a23 223 bc4 36

30、 3c5 11d 400 620;data c;set b;file 'e:mac.txt'put t $;run;data a ;infile 'e:mac.txt'input id $ / no;idtest=id+1;if no='.' or idtest ne '.' then lostcard;run;方法二:data a(keep=id no);input x $ ;id=lag1(x);no=input(x,8.);/*把變量x轉(zhuǎn)換成數(shù)值,若遇非純數(shù)字的值,則轉(zhuǎn)成缺失值,同時日志窗口NOTE會提示轉(zhuǎn)換無效,不必在意。

31、如果數(shù)據(jù)很多,可以用系統(tǒng)選項把note去掉:options nonotes*/y=lag1(no);if y='.' and id=' ' and no='.'/*選擇觀測,如果y是缺失值,但id和no不是缺失值,就是我們想要的觀測*/cards;a23 223 bc4 36 3c5 11d 400 620;run;21. 用SAS軟件作三維Hat圖,x和y軸取值區(qū)間為-5,5,z = sin(sqrt(y*y + x*x)。data a; do x=-5 to 5 by 0.1; do y=-5 to 5 by 0.1; z=sin(sqrt(

32、x*2+y*2); output; end; end;run;proc g3d data=a;plot y*x=z;run;22. 創(chuàng)建馬鞍圖形,其數(shù)學公式為,p和q的值不同會導致圖形的變化,生成p=20,q=1的馬鞍圖形。提示:產(chǎn)生x, y和z的數(shù)據(jù)后,用下面的過程實現(xiàn)作圖。proc g3d;plot y*x=z;run;data a; do x=-20 to 20 by 0.1; do y=-20 to 20 by 0.1; z=-x*x/20+y*y; output; end; end;run;proc g3d data=a;plot y*x=z;run;23. 數(shù)據(jù)集Calendar只

33、有日期變量,test包含股票代碼、日期與收盤價三個變量。合并兩個數(shù)據(jù)集,用Calendar中的日期數(shù)據(jù)替代test數(shù)據(jù)集中每只股票的日期數(shù)據(jù)。創(chuàng)建樣本數(shù)據(jù)集:data calendar;input Date yymmdd10.;format Date yymmdd10.;cards;2003-1-202003-1-212003-1-222003-1-232003-1-242003-1-272003-1-282003-1-292003-1-302003-1-312003-2-32003-2-42003-2-52003-2-62003-2-72003-2-8;run;data test; infi

34、le datalines missover ;informat Stkcd $6. Date yymmdd10. Clpr 8.2;input Stkcd $ Date Clpr;format Stkcd $6. Date yymmdd10. Clpr 8.2;cards;600000 2003-1-20 9.94600000 2003-1-22 9.66600000 2003-1-24 9.88600000 2003-1-27 10.07600000 2003-1-28 10.17600000 2003-1-29 10.31600000 2003-2-4 10.31600000 2003-2

35、-5 10.13600001 2003-1-20 8.13600001 2003-1-21 8.14600001 2003-1-22 8.17600001 2003-1-23 8.40600001 2003-1-24 8.65600001 2003-1-31 8.93600001 2003-2-4 9.02600001 2003-2-5 8.63600002 2003-1-31 2.25600002 2003-2-3 2.26600002 2003-2-4 2.35600002 2003-2-6 2.556000022003-2-82.12;run;proc sort data=test;by

36、 stkcd date;proc sort data=calendar;by date;run; /*先排序*/data b(drop=date);set calendar end=end;by date;if _n_=1 then call symput('start',date);if end then call symput('end',date);run; /*將起始日和終止日的值賦給宏變量*/data stkcd(keep=stkcd);set test;if stkcd=lag1(stkcd) then delete;run;/*找到包含的股票的代碼

37、*/data stkcd;set stkcd nobs=nobs;call symput('n_stk',nobs);run; /*查找包含的股票的數(shù)量*/data stkcd_r;format date yymmdd10.;informat date yymmdd10.;set stkcd;do date=&start to &end;output;end;proc sort data=stkcd_r;by date;run; /*使每一只股票的在每一天都有觀測值*/%macro names(name,n);%do i=1 %to &n;&na

38、me%end;%mend names;data c;set %names(calendar,&n_stk);i=1;run; /*新數(shù)據(jù)集包含了相同數(shù)量的觀測*/proc sort data=c;by date;run;data d;merge c stkcd_r;by date;if i=. then delete;drop i; /*二者合并后去掉calendar中沒有的日期值*/proc sort data=d;by stkcd date;run;data final;retain stkcd date clpr;merge d test; /*按照股票代碼和日期合并,解決缺失值

39、的問題*/by stkcd date;run;方法二:data stkcd;set stkcd nobs=nobs;call symput('n_stk',nobs);run;data calendar;set calendar nobs=nobs;call symput('n_date',nobs);run;data stkdate;do i=1 to &n_stk ;set stkcd point=i ;do j=1 to &n_date;set calendar point=j;output;end;end;stop;run;data fi

40、nal;retain stkcd date clpr;merge stkdate test; /*按照股票代碼和日期合并,解決缺失值的問題*/by stkcd date;run;24. 當股票的分配事件分兩次完成,且第一次分配在節(jié)假日或該股票的停牌日,第二次分配在下一個交易日時,一般的數(shù)據(jù)庫會有如下表所示的觀測值存貯方式。寫程序?qū)⑼E迫眨礇]有收盤價的那個觀測值)中的分配事件合到下一個觀測中。股票代碼日期收盤價送股比例轉(zhuǎn)增比例配股比例配股價增發(fā)比例增發(fā)價格現(xiàn)金紅利.xxxxxxxxxxxx.0.20.100000xxxxxxxxxxxx000.55.20 000.50 xxxxxxxxxxxx

41、.xxxxxxxxxxxx.注:表示有數(shù)據(jù)值,.表示缺失值。編程變量名參考:股票代碼Hstkcd,日期Dt,收盤價Closepr,送股比例Stkdrate,轉(zhuǎn)增比例Capissurate,配股比例Rigoffrate,配股價Rigoffpr,增發(fā)比例Snirate,增發(fā)價格Snipr,現(xiàn)金紅利Dividend。data test;input hstkcd Dt mmddyy8. Closepr Stkdrate Capissurate Rigoffrate Rigoffpr Snirate Snipr Dividend;format Dt mmddyy8.;cards;600001 01-01

42、-01 8 . . . . . . . 600001 01-01-02 . 0.3 0.3 0 0 0 0 0 600001 01-01-03 9 0 0 0.5 0.2 0 0 0.1600002 01-01-02 10 0 0 0 0 0 0 0600002 01-01-03 . 0.2 0.3 0.5 0 0 0.1 0.2600002 01-01-04 12 0 0 0 0.2 0.3 0.5 0.6;run;proc sort data=test;/*排序原數(shù)據(jù)集*/by hstkcd dt;run;data p17 (keep=hstkcd Dt Closepr Stkdrate

43、Capissurate Rigoffrate Rigoffpr Snirate Snipr Dividend);/*只保留原數(shù)據(jù)集中的變量*/set test;array origin0:7 closepr Stkdrate Capissurate Rigoffrate Rigoffpr Snirate Snipr Dividend;/*為處理方便,創(chuàng)建數(shù)組*/array lagn0:7 lag0-lag7;/*創(chuàng)建另一個數(shù)組*/lagcd=lag1(hstkcd);/*為防止分配數(shù)據(jù)不全的情況,下面有檢查是否同一股票的條件*/do i=0 to 7;lagn(i)=lag1(origin(i

44、);/*后滯,用來下面判斷*/end;if lagcd=hstkcd and lag0='.' then do i=1 to 7;/*必須滿足是同一股票,且收盤價為缺失值*/origin(i)=origin(i)+lagn(i);/*分配數(shù)據(jù)加和*/end;if closepr='.'/*刪除收盤價是缺失值的觀測*/run;25假設(shè)股票市場的股本數(shù)據(jù)如下表,對每支股票(至少1000支股票),按如下要求設(shè)計填充總股本和流通股股本數(shù)據(jù)的SAS程序:以該股票前面的股本數(shù)據(jù)填充后面的缺失值,如果某支股票上市交易時就缺失股本數(shù)據(jù),則用該股票上市后的第一個股本數(shù)據(jù)向前填充。

45、股票代碼日期收盤價股本變動日總股本流通股.000001xxxxxx .缺失缺失000001xxxxxx2000-10-101000000500000.000001xxxxxx2003-11-111200000600000000001xxxxxx.0000022001-09-0832000001500000000002.注:表示有數(shù)據(jù)值,.表示缺失值。編程變量名參考:股票代碼Stkcd日期Date收盤價Clpr股本變動日CapchgDate總股本Fullshr流通股trdshr/* 創(chuàng)建樣本數(shù)據(jù)集 */data test; infile datalines missover ;informat

46、Stkcd $6. Date yymmdd10. Clpr 8.2 capchgDate yymmdd10. fullshr Trdshr 20. ;input Stkcd $ Date Clpr capchgDate fullshr Trdshr;format Stkcd $6. Date yymmdd10. Clpr 8.2 capchgDate yymmdd10. fullshr Trdshr 20.;cards;6000002003-1-209.942003-1-2039150000009000000006000002003-1-219.686000002003-1-229.66600

47、0002003-1-239.66000002003-1-249.886000002003-1-2710.076000002003-1-2810.176000002003-1-2910.316000002003-2-1010.096000002003-2-1110.26000002003-2-1210.316000002003-2-1310.136000012000-5-298.132000-5-296000012000-5-308.146000012000-5-318.656000012000-6-18.936000012000-6-29.116000012000-6-59.022000-6-

48、514865531004900000006000012000-6-68.636000012000-6-78.526000012000-6-88.556000012000-6-98.36000012000-6-128.34;Run;proc sort data=a;by stkcd descending capchgdate; /*先對數(shù)據(jù)集進行排序*/run;data b;set a;by stkcd descending capchgdate; /*capchgdate按照降序排列,為下面的lag函數(shù)做好準備*/x=lag1(fullshr);y=lag1(trdshr);/*在有if-th

49、en限制的條件下,lag函數(shù)的的結(jié)果是滿足if條件的上一個之后觀測值的值,所以這里先不用if條件*/if first.stkcd=0 and capchgdate=. and fullshr=. then do;/*需要判斷的條件:不是同一只股票的第一個觀測值(從而保證是相同的股票),要有股權(quán)變動日,同時數(shù)據(jù)缺失*/fullshr=x;trdshr=y;end;drop x y;proc sort data=b;by stkcd date;run;data b;retain stkcd date clpr capchgdate fullshr trdshr; /*保持原有變量的順序,同時ret

50、ain對fullshr和trdshr的缺失值處理*/set b(rename=(fullshr=fshr trdshr=tshr);if capchgdate=. then do;fullshr=fshr;trdshr=tshr;end;drop fshr tshr;run;解法二:data test25;set test25;n=_n_; /*取出觀測號*/run;proc sort data=test25;by stkcd n; /*先按stkcd后按n排序*/run;data test25;set test25;by stkcd n; /*按先stkcd后n的順序讀入觀測*/retain

51、 tempf; /*規(guī)定變量tempf 若沒有新值讀入,就不清空原值,保持從上一觀測得到的值*/if first.stkcd=1 then tempf=.; /*若是該stkcd的第一個變量,則tempf值為空*/if fullshr=. then tempf=fullshr;/*若該觀測不為空,則tempf值為fullshr值*/else fullshr=tempf;/*若該觀測的fullshr值為空,則fullshr的值通過前一個值向后填充*/drop tempf;run;/*上一段程序保證了向后填充,且若第一個觀測值為空,則之后的觀測為空直到某個觀測不為空*/proc sort data=test25;by stkcd descending n; /*通過stkcd和倒序的n排列*/run;data test25;set test25;by stkcd descending n;retain tempf;if first.stkcd=1 then tempf=.;if fullshr=. then tempf=fullshr;else fullshr=tempf;drop tempf;run;/*本段程序遇上一段原理相同,保證了若第一個觀測股本為空,則由最近的觀測向前

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論