您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 信息化管理 > 第2章 股票收益计算(金融计算与建模-清华大学,朱世武)
第2章股票收益计算清华大学经管学院朱世武Zhushw@sem.tsinghua.edu.cnResdat样本数据:论坛:。百分比收益和连续复利收益的定义如下:单期百分比收益为k期百分比收益为11tttPPR11111123()(1)(1)(1)111ttttkttttkttttkttkRkRRRPPPPPPPPPP2.1收益定义与加总单期连续复利收益为其中,k期连续复利收益为11log(1)log()ttttttPrRPpplog()ttpP,)1log()1log()1log()1()1)(1(log))(1log()(111111ktttktttktttttrrrRRRRRRkRkr2.1.2收益加总对于百分比(复合)收益,单期收益一般比较小,于是,对年收益公式进行一阶泰勒(Taylor)展开得近似的年收益公式,年收益而对于投资组合的连续复利收益我们有下面的近似公式,1Nptiitirwr101[()]kttjjRkRk1NptiitiRwR1()TiittrTr1lnitNrptiirwe1()(1)1TiittRTR加和方式(Aggregation)时序(Temporal)截面(Cross-Section)百分比收益(PercentReturns)连续复利收益(ContinuouslyCompoundReturns)2.2单个股票收益计算2.2.1创建单期收益计算环境2.2.2年收益计算2.2.3季收益计算2.2.4月收益计算2.2.5周收益计算2.2.6日收益计算2.2.7绘制收益图2.2.8多期平均收益率计算2.2.1创建单期收益计算环境计算上证指数(Idx000001)和股票深发展(Stk000001)收盘价单期收益。这里要计算有收益有:年收益、季收益、月收益、周收益和日收益。对期末收盘价加标识:dataa;setResDat.Idx000001;year=year(date);qtr=qtr(date);month=month(date);procsortdata=a;byyearqtrmonth;run;databb;seta;last_y=last.year;/*标出某年的最后一个交易日*/last_q=last.qtr;/*标出某季的最后一个交易日*/last_m=last.month;/*标出某月的最后一个交易日*/byyearqtrmonth;run;2.2.2年收益计算计算上证指数(Idx000001)的相应收益时,不需要用调整后的收盘价。datar_year(keep=dater_pctr_loglabel=年收益);setbb;iflast_y=1;/*取各年最后一个交易日的数据*/r_pct=dif(clpr)/lag(clpr);/*计算百分比收益*/r_log=log(clpr)-log(lag(clpr));/*计算对数收益*//*函数log(x)是以e为底的自然对数,其它对数函数还有log2(x),log10(x)*/run;2.2.5周收益计算程序一:dataa;setResDat.Idx000001;wd=weekday(date);dif=dif(wd);dif2=dif(date);if(dif0anddif^=.)ordif2=7thenindex=1;/*第二天的星期日小于第一天的星期日,或第二天与第一天的时间间隔大于7天时,表示第二天为新的一周*/elseindex=0;dataa(keep=dateclprindex);seta;date=lag(date);clpr=lag(clpr);ifindex=1;datar_week(keep=dater_pctr_log);seta;r_pct=dif(clpr)/lag(clpr);r_log=log(clpr)-log(lag(clpr));run;datab;setResDat.Idx000001;wk=int((date-3)/7+2);/*wk为周序号,设定1960年1月1日为第一周。由于1960年1月1日为周五,所以第1周共有3天。注意该周(1960年1月1日到3日)对应日期按SAS的标准分别为0,1和2(于是(date-3)/7都等于-1)。由此可以理解为什么这样设定表达式*/procsort;bydate;run;datab;setb;last_wk=last.wk;bywk;run;datab(keep=dater_pct1r_log1);setb;iflast_wk=1;r_pct1=dif(clpr)/lag(clpr);r_log1=log(clpr)-log(lag(clpr));run;程序二datac;setResDat.Idx000001;last_wk=Wkflg;/*Wkflg;为周末交易日标识*/run;datac(keep=dater_pct2r_log2);setc;iflast_wk=1;r_pct2=dif(clpr)/lag(clpr);r_log2=log(clpr)-log(lag(clpr));run;程序三:datad;merger_weekb;bydate;datad;mergedc;bydate;ifr_pct=r_pct1andr_pct=r_pct2thenaa=1;elseaa=0;/*最后一个不一样*/run;datae;setd;ifaa=0;run;检测程序一、程序二和程序三的一致性:注:方法二和三是完全一致的,虽然方法一与二、三的最后一个观测不一致。因为方法一的最后一个观测是缺失值。2.2.6日收益计算datar_day(keep=dater_pctr_loglabel=日收益);setResDat.Idx000001;r_pct=dif(clpr)/lag(clpr);/*dif(clpr)等价于clpr-lag(clpr)*/r_log=log(clpr)-log(lag(clpr));run;2.2.7绘制收益图计算收益后,可以绘制收益对时间的散点图来发现其随时间增长的发展趋势。例如,对上面计算的相关收益,其对时间的散点图SAS程序如下。procgplotdata=r_day;plotr_pct*date/vref=0;plotr_log*date/vref=0;run;quit;选项VREF=要求在竖轴上的某个指定值处画一条垂直于此轴的参照线,该例程中其值为0。2.2.8多期平均收益率计算多期收益的度量包括计算多个单期收益的算术平均值和几何平均值。计算上证指数(IDX000001)收盘价1995~2005年间年平均、月平均和日平均收益。/*建立满足条件的数据集*/dataa1;setr_year;where1995=year(date)=2005;procprint;run;/*对数据集转置*/proctransposedata=a1out=a2;varr_pct;procprint;run;/*计算年平均收益*/dataa3(keep=amgm);seta2;c1=col1+1;c2=col2+1;……c11=col11+1;gm=(c1*c2*c3*….*c11)**(1/11)-1;am=mean(ofcol1-col11);procprint;run;/*变量太多时,用数组的方法处理简单些*/%lett=%eval(2005-1995+1);dataa4(keep=amgm);seta2;arraycol(&t)col1-col&t;arrayc(&t)c1-c&t;gm0=1;doi=1to&t;c(i)=col(i)+1;gm0=gm0*c(i);end;gm=(gm0)**(1/&t))-1;am=mean(ofcol1-col&t);procprint;run;平均年收益:一般来说,平均收益用的是几何平均收益,即上面程序中的GM。求几何平均收益时,还有更简单且更精确的方法,通过下面程序可以体会一下应用SAS编程的妙处。dataa5;setbb;iflast_y=1and1997=year(date)=2005;run;dataa6;retainbeginend;seta5end=lastobs;if_n_=1thenbegin=clpr;/*将数据集第一个观测值的价格赋给变量begin*/iflastobsthendo;end=clpr;/*将数据集最后一个观测值的价格赋给变量end*/output;end;dataa6(keep=gm);seta6;T=2005-1997+1;gm=(end/begin)**(1/t)-1;procprint;run;/*该方法主要优点是精确*/其它多期平均收益的计算留为习题。2.3多股票收益计算实际应用时,往往需要计算多个股票的收益并将这些收益放在一张数据表中。以下程序可以用于多股票日对数收益和百分比收益数据。2.3.1由最新股票信息数据集创建宏文本2.3.2由个股数据集目录文件创建宏文本2.3.3多股票收益计算程序2.3.4收益SAS数据集转换为EXCEL数据表2.3.1由最新股票信息数据集创建宏文本利用最新股票信息数据集Lstkinfo创建多股票宏文本:Stk.txt.data_null_;setResDat.Lstkinfo;a='%a(';b=',';c=');';fileStk.txt;/*这里输出的宏文本存于默认的文件夹下,这样存贮不需要查看和保留的中间文件、可以避免以后引用该文件或不同机器拷贝程序时,需要重新创建文件夹的问题。*/puta$stkcd$b$lstknm$c$;run;创建沪市股票宏文本:SHStk.txtData_null_;setResDat.Lstkinfo;ifsubstr(stkcd,1,1)in('6','9')orsubstr(stkcd,1,2)='99';a='%a(';b=',';c=');';fileSHStk.txt;puta$stkcd$b$lstknm$c$;run;创建深市股票宏文本:SZStk.txt;Data_null_;setResDat.Lstkinfo;ifsubstr(stkcd,1,1)='0'orsubstr(stkcd,1,2)='20';a='%a(';b=',';c=');';fileSZStk.txt;puta$stkcd$b$lstknm$c$;run;2.3.2由个股数据集目录文件创建宏文本个股股票数据存在于目录ResDat下。目录ResDat下所有个股股票SAS数据集.SAS7BDAT文件列表与宏的形成过程如下。DOS操作系统下→进入ResDat→执行列目录文件命令:dirStk*.*/boutlist在相应的目录下打开文件OUTLIST,可以看到文件前两行的结果如下:stk000001.sas7bdatstk000002.sas7bdat………这里DOS命令dir*.*/b中的参数/b表示只列出文件名。删除文件名stkcdref.sas7bdat。dataa;lengthfiles$9;infiled:\ResDat\outlist;inputfiles$;iffiles='stkcdref.'thendelete;run;形成文件名数据集:Data_null_;seta;stkcd=substr(files,4,6);a='%a(';c=');';fileStk1.txt;puta$stkcd$c$;run;创建目录ResDat下全部股票代码的宏文本:Stk1.txt.:2.3.3
本文标题:第2章 股票收益计算(金融计算与建模-清华大学,朱世武)
链接地址:https://www.777doc.com/doc-4296554 .html