[转载]投资组合理论——matlab实现

标签:
转载 |
证券投资组合——实例解析
这里要纠正一些人的错误:
连续复利的好处在于其是可加的,有兴趣的可以证明,不懂的可以再咨询。
http://s4/bmiddle/6c640c7907c18de351e83&690
图0 连续复利计算公式
第一步,下载股票数据。以横店东磁、三维丝和五矿发展为例,数据库选择为华西证券网上交易系统。
1. 打开软件,进入到横店东磁的k线图界面。如图1所示:
2.进入数据下载对话框。点击右上角的系统——数据导出,进入数据导出对话框,单击保存。如图2和图3所示。
http://s7/mw690/6c640c794d8f8c5b77ea6&690
http://s8/bmiddle/6c640c7907c18de3853e7&690
图3 数据导出对话框
第二步,将txt格式的数据导入到matlab中。可以选择函数导入的方式,也可以选择对话框的形式。这里以对话框的形式导入,进入到matlab的“workspace”界面,单击导入数据图标,进入到数据导入对话框,如图4所示。选中横店东磁对应的文件,单击打开,进入到数据导入窗口,如图5所示,单击“next”,完成数据导入,这时,数据被保存在矩阵data中,而表头及时间以字符串的形式保存在数组textdata中。
http://s2/bmiddle/6c640c7907c18de366df1&690
图4
http://s16/bmiddle/6c640c794d8f8ae26b31f&690
图5
第三步,保存日期。在每次导入txt数据时,日期都保存在textdata的第一列,第5行至倒数第二行中,因此,提取出时间分别命名为hddcDates、swsDates、wkfzDates:
hddcDates=datenum(textdata1(5:end-1,1));
swsDates=datenum(textdata2(5:end-1,1));
wkfzDates=datenum(textdata3(5:end-1,1));
第四步,计算收益率。
增长率的计算方法选择连续复利计算公式,横店东磁、三维丝和五矿发展的连续复利收益率分别记作为hddcR、swsR、wkfzR。在matlab中输入:
hddcR=price2ret(hddc(:,4));
swsR= price2ret (sws(:,4));
wkfzR= price2ret (wkfz(:,4));
第五步,调整三支股票的时间,使三支股票在时间起点和时间终点的日期一致。虽然三支股票都是从2012/02/02开始,到2013/03/27,样本点都是280个,但是,这期间的日期是不同的。比如找出横店东磁和三维丝在这个时间区间相同的样本序数对应的日期不同的时刻:
u=find(hddcDates~=swsDates);
u=[39
说明在第39、40、41、42、43处,两支股票的时间不相等,可以查看这些样本点对应的日期:
>> datestr(hddcDates(u))
27-Mar-2012
28-Mar-2012
29-Mar-2012
30-Mar-2012
05-Apr-2012
>> datestr(swsDates(u))
28-Mar-2012
29-Mar-2012
30-Mar-2012
05-Apr-2012
06-Apr-2012
接下来,寻找三支股票时间的交集。
首先寻找横店东磁和三维丝的时间交集,保存在向量HS中,然后寻找HS和五矿发展的时间交集,保存在HSW中:
HS=intersect(hddcDates, swsDates);
HSW=intersect(HS, wkfzDates);
第六步,提取相同时间点上的收益率数据,分别记作为coHddcR、coSwsR、coWkfzR:
[index1,hddcIndex]=ismember(HSW(2:end),hddcDates);
[index2,swsIndex]=ismember(HSW(2:end),swsDates);
[index3,wkfzIndex]=ismember(HSW(2:end),wkfzDates);
注:由于时间集合包含了时间起始时间,而收益率数据是从第二个时间起点开始的,因此,时间起点是没有收益率数据的,这时要删除,故采用HSW(2:end)的方式。
2.根据时间交集在各个股票日期中的位置信息,提取受利率数据,分别记作为coHddcR、coSwsR、coWkfzR:
coHddcR=hddcR(hddcIndex-1);
coSwsR=hddcR(swsIndex-1);
coWkfzR=hddcR(wkfzIndex-1);
++++++++++++++++++++++++++++投资组合部分——不允许卖空+++++++++++++++
第一步,计算收益率均值和协方差
法一,直接调用ewstats函数.
[Return,Covariance]=ewstats(R)
输入:R是股票收益率,每一列是一只股票的收益率数据。
输出:
ExpReturn:每一只股票的收益率均值;
Covariance:协方差。
[ExpReturn,ExpCovariance]=ewstats([coHddcR
方法二,用cov计算协方差,用mean计算均值。
方法三,用std计算标准差,用corr计算相关系数,用corr2cov(std,corr)转化为协方差。
第二步,计算证券组合的可行域
首先,选择4000组权重
Weights=rand(4000,3);
Total=sum(Weights,2);
Total=Total(:,ones(3,1));
Weights=Weights./Total;
然后,计算可行域:
[PortRisk,PortReturn]=portstats(ExpReturn,ExpCovariance, Weights);
plot(PortRisk,PortReturn,'.r')
投资组合的可行域效果如图6所示:
图6
第三步,计算有效边界
hold on
portopt(ExpReturn,ExpCovariance,'-B')
投资组合的有效边界如图7所示:
图7 投资组合的有效边界
第四步,有效边界和可行域的叠加图,如图8所示:
图8 叠加图
附录——所有代码:
hddcR=price2ret(hddc(:,4));
swsR= price2ret (sws(:,4));
wkfzR= price2ret (wkfz(:,4));
hddcDates=datenum(textdata1(5:end-1,1));
swsDates=datenum(textdata2(5:end-1,1));
wkfzDates=datenum(textdata3(5:end-1,1));
HS=intersect(hddcDates, swsDates);
HSW=intersect(HS, wkfzDates);
[index1,hddcIndex]=ismember(HSW(2:end),hddcDates);
[index2,swsIndex]=ismember(HSW(2:end),swsDates);
[index3,wkfzIndex]=ismember(HSW(2:end),wkfzDates);
coHddcR=hddcR(hddcIndex-1);
coSwsR=hddcR(swsIndex-1);
coWkfzR=hddcR(wkfzIndex-1);
[ExpReturn,ExpCovariance]=ewstats([coHddcR, coSwsR,coWkfzR])
Weights=rand(4000,3);
Total=sum(Weights,2);
Total=Total(:,ones(3,1));
Weights=Weights./Total;
[PortRisk,PortReturn]=portstats(ExpReturn,ExpCovariance, Weights);
plot(PortRisk,PortReturn,'.r')
hold on
portopt(ExpReturn,ExpCovariance)