加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2014-10-08 20:49:10)
标签:

转载

分类: 股票

证券投资组合——实例解析

    第一,收益率均值和方差的计算

这里要纠正一些人的错误:

    首先,收益率的计算方法选择很重要,投资组合一定要选择连续复利计算公式。投资组合依赖于收益率的二阶矩存在,一阶矩可加的假设,这就说明必须采用连续复利计算公式,简单来说,单利和连续复利的计算区别在于,二者是否具有可加性。举一例就会一目了然,今天您的股票涨停了,明天你的这支股票跌停了,那么这两天这支股票你是陪是赚,如果是单利计算,这两天的平均收益率为:(10%-10%)=0,即不赔不赚,显然这是错误的,由于计算的基数不同,涨幅一定,但是涨跌的绝对额不一样,假设当前你的股票10元,第一天涨停,则一股赚了1元,到了11元;第二天,跌停,11*10%=1.1,那么当前你的股票价格为9.9元,从这两天来看,你一股赔了0.1元,按连续复利计算的收益率分别为0.09531、-0.10536,二者之和为-0.1005,则这两天的净盈利为10*(-0.01005)=0.1元。单利计算出来的是你不赔不赚,很明显错误,这说明单利不具有可加性。

连续复利的好处在于其是可加的,有兴趣的可以证明,不懂的可以再咨询。

http://s4/bmiddle/6c640c7907c18de351e83&690
图0 连续复利计算公式

    其次,样本相关系数的计算一定要保持时间上的一致。由于节假日、周末效应,以及每只股票受事件影响造成的停牌等,造成了时间上的跳跃,从时间周一到周五,A、B股票分别在周三和周五停牌,表明停牌这一天没有收盘数据,取这一周的样本,在计算协方差时,必须保持时间上的一致,这就是说,A股有收盘价的时间集合记为T1,则T1={周一,周二,周四,周五},而B股票有收盘价的时间集合T2={周一,周二,周三,周四},这时虽然样本点一样,但是由于样本点对应的日期不同,在求这两只股票的相关系数时,要保持时间上的一致,这时,参与计算样本相关系数的时间集合应该是二者的交集T= T1 U T2={周一,周二,周四}。这个细节往往被忽略掉,由于样本期间内不一致的日期天数较少,同时,受限于涨跌幅的限制,一般来讲这种影响不是很大,但是为了更加的准确计算出样本期内股票之间的相关系数,还是要精准对待。

    投资组合步骤:

第一步,下载股票数据。以横店东磁、三维丝和五矿发展为例,数据库选择为华西证券网上交易系统。

1. 打开软件,进入到横店东磁的k线图界面。如图1所示:

 http://s5/mw690/6c640c794d8f8ae0bfa14&690

 图1

 

2.进入数据下载对话框。点击右上角的系统——数据导出,进入数据导出对话框,单击保存。如图2和图3所示。

http://s7/mw690/6c640c794d8f8c5b77ea6&690
 图2 “系统”下拉菜单


 

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

    将所有的数据重新命名,这里横店东磁的数据保存着hddc矩阵中,三维丝的数据保存着sws矩阵中,五矿发展的数据保存在wkfz矩阵中,对照表头,知道各个矩阵的第四列是收盘价。

第三步,保存日期。在每次导入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    40    41    42    43]

说明在第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:

    1.确定时间交集在各个股票对应时间的位置,分别记作为hddcIndex、swsIndex、wkfzIndex:

[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  coSwsR  coWkfzR]);

方法二,用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所示:

 http://s16/bmiddle/6c640c794d8f8ae3cb92f&690

图6  投资组合的可行域

第三步,计算有效边界

hold on

portopt(ExpReturn,ExpCovariance,'-B')

 

投资组合的有效边界如图7所示:

  http://s7/bmiddle/6c640c794d8f8ae2c0376&690

图7 投资组合的有效边界

 

第四步,有效边界和可行域的叠加图,如图8所示:

 http://s5/mw690/6c640c794d8f8ae1defc4&690

图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)

 

0

  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有