需用到的数据
- Markowitz_Frontile_Data.mat
copyright by fantuanxiaot
代码如下
本帖隐藏的内容
- function Markowitz_Frontile()
- % X是股价的序列:每一列代表一个股价的序列
- % copyright by fantuanxiaot
- load Markowitz_Frontile_Data
- [~,N]=size(X);
- % 共有N只股票
- % 建立回报矩阵
- X1=X(1:end-1,:);
- X2=X(2:end,:);
- ReturnMatrix=(X2-X1)./X1;
- % 期望收益
- ExpectedReturn=mean(ReturnMatrix);
- % 最大期望收益和最小的期望收益
- MaxR=max(ExpectedReturn);
- MinR=min(ExpectedReturn);
- Cov_Var=cov(ReturnMatrix);
- Var=var(ReturnMatrix);
- R=linspace(5.5*MinR,4*MaxR,100);
- Parameters=[];
- Std=[];
- StdVar=sqrt(Var);
- for i=1:length(R)
- [beta,fval]=quadprog(Cov_Var,zeros(N,1),[],[],[ones(1,10);ExpectedReturn],[1;R(i)]);
- Parameters=[Parameters beta];
- Std=[Std sqrt(fval*2)];
- end
- %% 最小方差边界作图
- figure(1)
- set(figure(1),'color','w')
- hold on
- plot(StdVar,ExpectedReturn,'ys','markersize',12,'markerfacecolor','b','markeredgecolor','k')
- FrontierReturn=zeros(1,length(R));
- for i=1:length(R)
- FrontierReturn(i)=ExpectedReturn*Parameters(:,i);
- end
- plot(Std,FrontierReturn,'k','linewidth',3)
- plot(Std,FrontierReturn,'mp','markersize',12,'markerfacecolor','m','markeredgecolor','k')
- title('最小方差边界作图','fontname','Times New Roman','fontsize',16)
- xlabel('标准差','fontname','Times New Roman','fontsize',16)
- ylabel('期望收益','fontname','Times New Roman','fontsize',16)
- hold on
- % 计算其他任意投资组合
- ExpectedReturn=ExpectedReturn';
- Para1=unifrnd(-0.8,1.2,1200,9);
- Para1=[Para1 ones(1200,1)-sum(Para1,2)];
- Return1=Para1*ExpectedReturn;
- for i=1:size(Return1)
- Var1(i)=Para1(i,:)*Cov_Var*Para1(i,:)';
- end
- Std1=sqrt(Var1);
- plot(Std1(1:300),Return1(1:300),'gv','markerfacecolor','g','markeredgecolor','k')
- plot(Std1(301:600),Return1(301:600),'ro','markerfacecolor','r','markeredgecolor','k')
- plot(Std1(601:900),Return1(601:900),'c<','markerfacecolor','c','markeredgecolor','k')
- plot(Std1(901:1200),Return1(901:1200),'bh','markerfacecolor','b','markeredgecolor','k')
- legend('个股','最小方差边界','最小方差边界组合','其他组合1','其他组合2','其他组合3','其他组合4')
- hold off
- %% 有效边界作图
- figure(2)
- set(figure(2),'color','w')
- hold on
- [~,index]=min(Std);
- plot(Std(index:end),FrontierReturn(index:end),'k','linewidth',3)
- plot(Std(index:end),FrontierReturn(index:end),'r>','markersize',10,'markerfacecolor','r','markeredgecolor','k')
- title('有效边界作图','fontname','Times New Roman','fontsize',16)
- xlabel('标准差','fontname','Times New Roman','fontsize',16)
- ylabel('期望收益','fontname','Times New Roman','fontsize',16)
- hold on
- % 计算其他任意投资组合
- Para1=unifrnd(-0.5,1,2000,9);
- Para1=[Para1 ones(2000,1)-sum(Para1,2)];
- Return1=Para1*ExpectedReturn;
- for i=1:size(Return1)
- Var1(i)=Para1(i,:)*Cov_Var*Para1(i,:)';
- end
- Std1=sqrt(Var1);
- % 寻找位于有效边界下方大于最低期望收益的组合
- index1=find(Return1>FrontierReturn(index));
- Return2=Return1(index1);
- Std2=Std1(index1);
- MM=length(Return2);
- a1=round(MM/3);
- a2=2*a1;
- plot(Std2(1:a1),Return2(1:a1),'m*')
- plot(Std2(a1+1:a2),Return2(a1+1:a2),'bv','markerfacecolor','b','markeredgecolor','k')
- plot(Std2(a2:end),Return2(a2:end),'go','markerfacecolor','c','markeredgecolor','k')
- legend('有效边界','有效边界离散组合','其他组合1','其他组合2','其他组合3')
- hold off