最优投资组合选择SAS实现
- 格式:doc
- 大小:188.00 KB
- 文档页数:23
最优投资组合选择——SAS实现 1、分享一些感觉 当初,在我翻看《金融计算与建模》这本书的时候,我也感觉:哇,会很难懂吧!yes,有这种感觉应该正常,因为书中的有些细节确实不是那么好理解,但这不影响我们有选择性地加以应用。整本书的大部内容都突出了“计算”二字——各种收益率计算、各种指数计算、各种风险价值(价格或指标)计算、VaR计算、利率计算等等。这些计算搞得我很“蒙蔽”,因为,当我在阅读程序语句时总是搞不明白,这些计算对应的是哪个数据集、哪个字段。 现在,用一种轻松的感觉挑选着翻看其中某些章节的内容,顿时发现“山重水复疑无路,柳暗花明又一村”了,原来当初是“不识庐山真面目,只缘生在此山中”啊,好吧,接下来,我就股票/证券领域中的投资组合理论来介绍一下我是如何柳暗花明的。 参看书籍是朱世武的《金融计算与建模》,数据集来自锐思数据库。 2、一句话的阳光 在SAS中进行最优投资组合选择需要: 计算股票期望收益率—— 计算风险度量指标——/ 优化求解组合权重——weight Yes,就是这三句话。前两句没什么好说的,第三句由于是规划问题,所以就要考虑到优化建模的一系列问题,比如,灵敏度分析、整型规划、变量限制条件,等等。 投资组合就这些内容吧,分解一下就so easy吧。 3、各个击破 在对上述三个步骤进行各个击破前,让我们来熟悉一下,我们所要使用的数据集,以及数据集中的字段吧————这是一个十分十分重要的觉悟性认识! 需要字段:8只股票包括代码名、1995-2005年A股市场月持有收益率、3只股票月持有收益率。由于这三个字段来自不同方的数据集,所以需要进行整合。为什么选择这8只股票?这就是我们最初选股的问题了,而不是投资组合问题。 数据说明:resdat是自建的存储在SAS系统逻辑库下的库名,类似Work。monret是个股月持有期收益率数据集;monretm是市场持有期收益率数据集。(这里,我门不关心这两个收益率是如何得来的) ➢ 数据准备阶段,程序见下: ⑴创建8只股票的代码收益率 data Stk8; input stkcd$6.; cards; 000002 000007 000011 000016 600601 600604 600651 600653 ;run;
⑵按8只股票名合并数据,回忆一下merge函数,学习samp变量作用哟 data return; merge resdat.monret stk8(in=samp); by stkcd; if samp; year=year(date); month=month(date); if 1995<=year<=2005; keep stkcd date year month monret;
⑶提取1995-2005年A股市场月持有期收益率
data monretm; set resdat.monretm; year=year(date); month=month(date); If 1995<=year<=2005 and Exchflg='0' and Mktflg='A'; keep date year month Mretmc; proc sort data=return; by year month;
⑷合并市场月收益率数据集和8只股票月收益率
data return; merge return monretm; by year month; proc sort data=return; by stkcd year month; run;
➢ 数据计算阶段,程序见下:
⑴计算期望收益,没什么好解释的,复习一下output和where proc means data=return noprint; by stkcd; var monret; output out=m_out; data m_out1a; set m_out; where _stat_='MEAN'; keep stkcd monret; run;
⑵计算风险度量指标
常用的风险度量指标有股票收益标准差i和资本资产定价模型(CAPM)的。 ①计算
i
注意,_stat_=“大写”(看看m_out数据集就知道了),SAS不分
函数大小写,但是变量名(有些时候也宽容地认为不分大小写的)和值分大小写。 data m_out1b; set m_out; where _stat_='STD'; keep stkcd monret; rename monret=std; label monret='月收益率标准差'; run;
②计算
根据CAPM模型,资产i的期望收益和市场收益之间的关系为:)()(ERRMiiiE,设投资组合权重为Xi,投资组合p的参数为:
NiiipX1, NiiipX1
,(在这里要理解一下N和p的关
系,N可以理解为股票的个数,p可以理解为选出的组合,p≤N,M就不难理解了,表示市场总体)定义总风险为收益的标准差,则资产i收益的方差为:2222iiMi,投资组合p收益的方差为:
NiiMpiX122222
p
,2i相当于单个股票的收益方法差,
NiiiX122
写成这样有一个隐含的假设,即各只股票的收益不相关(独
立),既然这样,当投资组合相当分散时,NiiiX122会趋近于0,收益方差近似为:222pMp。其实,在我们的数据分析中,就是搞了一个线性回归(由于是时间序列数据,所以做了一个dw自相关检验),来看下程序吧: proc reg data=return outest=capmest11; by stkcd; model monret=Mretmc/dw; quit;/*换成run也可以,这就是SAS的包容性所在,交互环境问题*/ /*我查看了一下常数项不显著,反正它没什么解释性意义,去掉常数项重新拟合模型,这里保持原文,不做修改*/ /*proc reg data=return outest=capmest11;*/ /*by stkcd;*/ /*model monret=Mretmc/dw noint;*/ /*run;*/
⑶优化求解组合权重——无限制权重
对期望收益进行组合后的最大化求解,选择为风险 ①建立优化求解的数据格式,这种实现整理好优化建模所需数据集格式的方式真值得学习(只要足够认真,就能发现书中的错误,改正之便是一种超越,走进书还要跳出书) data weight1; input _id_ : $10. r000002 r000007 r000011 r000016 r600601 r600604 r600651 r600653 _type_ $ _rhs_ ; cards; exp_return 0.0247 0.0127 0.0124 0.008 0.0216 0.0068 0.0263 0.0144 max . beta 1.1185001891 1.3470123011 1.3185749233 1.0260654129 1.3509499965 0.9038958443 1.2559109335 1.2961143173 eq 1.2 sum_wts 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 eq 1.0 available 1 1 1 1 1 1 1 1 upperbd . available 0 0 0 0 0 0 0 0 lowerbd . ;run;
②优化求解权重
proc lp data=weight1 primalout=lp_out1; title1 '最优投资组合权重'; run; quit; ⑷优化求解组合权重——增加限制权重条件 将权重设置为0.05~0.3333,这样做的意义何在呢?确保投资组合的分散性 data weight2; input _id_ : $10. r000002 r000007 r000011 r000016 r600601 r600604 r600651 r600653 _type_ $ _rhs_ ; cards; exp_return 0.0247 0.0127 0.0124 0.008 0.0216 0.0068 0.0263 0.0144 max . beta 1.1185001891 1.3470123011 1.3185749233 1.0260654129 1.3509499965 0.9038958443 1.2559109335 1.2961143173 eq 1.2 sum_wts 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 eq 1.0 available .3333 .3333 .3333 .3333 .3333 .3333 .3333 .3333 upperbd . available .05 .05 .05 .05 .05 .05 .05 .05 lowerbd . ; run; proc lp data=weight2 primalout=lp_out2; title2 '多约束的投资组合权重'; run; quit;