组合优化- 均值方差、最大夏普、风险平价模型-基于matlab的实现
理论性质的大家参考网上搜索吧:
关键词:均值方差模型的实现 风险平价模型的实现 组合优化matlab
以上模型实现本质是 二次规划问题求最优。数理理解还最好搜索下 二次型,规划求解,导数常见概念。
简单概括:
均值方差模型思想:在一定收益水平下,最小化风险
风险平价模型的思想:每个子资产贡献给组合的风险相同。
最大夏普思想:组合的超额收益除以波动最大化。组合超额一般和0比较了,所以即为组合收益除以波动。
如果刚开始有点晕乎,可以先运行下 试下 https://545c.com/file/24889670-436467883 然后 再根据结果看以下理论 :
一、对思想的理解程序类:
1 、组合优化思想
均值-方差模型
资产配置在投资中是非常重要的过程,经典的资产配置方式就是马格维茨的均值-方差模型。目标是在给定预期收益率下最小化方差(风险),或给定风险水平下最大化收益,通过拉格朗日乘子法,可以计算出一个有效前沿,我们可以根据有效前沿来配置资产。但在实践过程中,我们常常发现计算的结果是某几个资产的权重特别大,收益和风险都集中在了这些资产上
风险平价组合(risk parity)
基于均值方差模型的不足,PanAgora基金的首席投资官Edward Qian博士提出了著名的风险平价(Risk Parity)策略,这一思想被Bridgewater基金运用于实际投资。
1 、组合优化思想
马科维茨(Harry M.Markowitz,)1990年因其在1952年提出的投资组合选择(Portfolio Selection)理论获得诺贝尔经济学奖。
主要贡献:发展了一个在不确定条件下严格陈述的可操作的选择资产组合理论:均值方差方法 Mean-Variance methodology.
主要思想:Markowitz把投资组合的价格变化视为随机变量,以它的均值来衡量收益,以它的方差来衡量风险(因此Markowitz理论又称为均值-方差分析);把投资组合中各种证券之间的比例作为变量,那么求收益一定的风险最小的投资组合问题就被归结为线性约束下的二次规划问题。
再根据投资者的偏好,进行投资决策。
Markowitz投资组合模型是根据每种证券的预期收益率、方差及证券之间的协方差矩阵,计算得到投资组合的有效边界。再根据投资者的效用无差异曲线,确定最佳投资组合。
以上是理论熟悉和理解。
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
二、下面是 多资产配置的目前实际基金的应用配置:
*3、均值方差模型在 多资产运用 和31 锐2 天4 日享 远4 远1 **
直接程序吧:如果报错 如算绩效提示没有函数 注释掉即可。上传了资源才发现,少打包了绩效计算函数,不影响,此处已经注释掉。
主函数:mainOptimization
%% 均值方差模型
%%
xianxingguihua % 线性规划 和0 1问题 求最优 实现
youxiaoqianyan % 资产组合有效前沿的实现 和0 - 1 最优问题
youxiaoqianyanShixian % 资产组合有效前沿的实现 用和31、日享、远4净值 求出最佳配置方式
% junzhifangchaModel% 均方模型
% junzhifangcha1 % 均方模型
% junzhifangcha4 % 均方模型 实现
%
% calcWeight
% SharpeFunc %夏普最优
%% 风险平价模型
%%
fengxianPingjia %风险平价
均值方差 优化 youxiaoqianyanShixian:
在这里插入代码片% https://blog.csdn.net/qq_43264642/article/details/89413594
% matlab——资产组合的有效前沿
% 现有3种资产的投资组合,预期的资产未来可实现的收益率,成为预期收益率,其值为.
% 未来投资收益的不确定性投资风险称为投资风险,可以用预期收益率的标准差来表示,称为与其标准差,其值为,
% 现在问,
% (1)当资产收益为0.4时,求解最优组合。
% (2)有效前沿是什么
% 首先让我们感受资产组合
% 我们要求的是投资比例,
% 其中预期收益率为
% 投资组合预期方差为,其中V是协方差矩阵。
% 我们的目标函数是 预期最大 ?方差最小? 约束条件为权重=1
% 以下是资产组合预期收益率、预期标准差的分布状况
%% 求解 r s ro v
clear; clc; close all
[~,~,raw] = xlsread('净值.xlsx','风险平价数据');
% [~,~,raw] = xlsread('净值.xlsx','sheet1');
% 统一
Date = raw(2:end,1);
Date=datenum(Date);
Price = cell2mat(raw(2:end,2:end)); %基础资产净值
Ret = tick2ret(Price);
v =cov(Ret);
r= sum(Ret);
%%
% r=[0.1,0.15,0.12];%收益率
% s=[0.2,0.25,0.18];% 标准差
% ro=[1,0.8,0.4;0.8,1,0.3;0.4,0.3,1];% 相关系数
% v=diag(s)*ro*diag(s)%求协方差阵
count=5000;%模拟次数
wrand=rand(count,size(Price,2));%产生count=5000组1以内的随机数 为权重
total=sum(wrand,2);%按行加和
for j=1:size(Price,2)
wrand(:,j)=wrand(:,j)./total;%归一化
end
expectation=wrand*r';%求每组预期期望和
for j=1:count
risk(j)=wrand(j,:)*v*wrand(j,:)';%求每组的风险
end
figzhanbi=figure;
plot(risk,expectation,'b.')%以风险为横轴,预期为纵轴,绘制散点图
xlabel('风险','FontSize',12);
ylabel('预期','FontSize',12);
grid on;
%%
% 下面我们来求最优解
% 可知这是一个多目标规划问题
% 我们要将其转化为单目标规划问题,由问题知我们可以将预期收益率设为大于等于0.39
% 由此,有以下模型
% 我们可以运用非线性规划来求解
% 构造句柄函数
%% 收益 retE=0.2或者 40% 最小风险组合点
retE=0.2;
x0=ones(1,size(Price,2))./size(Price,2);
Aeq=ones(1,size(Price,2));% 每个资产权重相加等于1
beq=1;% 每个资产权重相加等于1
% [X,FVAL,EXITFLAG] = fmincon(FUN,X,A,B,Aeq,Beq,LB,UB,NONLCON,options,varargin)
[x,fval]=fmincon(@(x) fun2(x,v),x0,-r,-retE,Aeq,beq,zeros(size(Price,2),1),ones(size(Price,2),1)) %收益在,波动最小
E=x*r';
hold on
plot(fval,E,'ro', 'markersize',12,'linewidth',3)
hold on
%% 收益 retE 最小风险组合点净值计算
RetTotal = Ret*x';
NetValueminRisk = ret2tick(RetTotal); % 净值
%% 最大夏普 组合点
[weight,fval,exitflag,output]=fmincon(@(w) SharpeFunc(w,Ret),x0,[],[],Aeq,beq,zeros(size(Price,2),1),ones(size(Price,2),1),[]); %夏普最大
Esharp=weight*r';
risk=weight*v*weight'
hold on
plot(risk,Esharp,'gx', 'markersize',12,'linewidth',3)
saveas(figzhanbi,['有效前言最大夏普最小风险.jpg'])
%% 最大夏普 组合点 weight * Ret计算净值
%%
RetTotal = Ret*weight';
NetValueSharp = ret2tick(RetTotal); % 净值
%% 画图 净值
close all
fignet=figure;
plot(Date,NetValueminRisk,'b') %单利收益40%最小风险净值 蓝色表示
% 此处单利收益是40% 代表每天收益率直接相加,非累乘。净值是累成得到的结果,即为复利计算得到的,所以两数据不等
hold on;
plot(Date,NetValueSharp,'g') %最大夏普净值
hold on;
plot(Date,ret2tick(mean(Ret,2)),'r') %等权净值
hold on;
set(gca,'XTick',Date) % 为了x数轴为日期形式,用了dateNum7 格式的date,别问我 为什么。怒对日期的处理化和很大比例,本来已经是在很多日期处理总结经验上的,不想说话
datetick('x','yy/mm/dd')
legend('单利收益20%最小风险净值','最大夏普净值','等权净值')
saveas(fignet,['净值比较.jpg'])
Al=[NetValueminRisk NetValueSharp ret2tick(mean(Ret,2))];
%[Perf,RawPerf]=calcPerformance(Al,1,250,0)%计算绩效
此处为风险收益的 有效前沿,前沿线上的点 可以简单理解为 在一定的风险承受下,我需要的收益预期水平。 前沿点,也正是风险预算一定下,最大可能达到的收益预期。由此左侧是达不到的地方,右侧也是可以实现的地方。
风险平价 :fengxianPingjia:
在这里插入代码片clc;clear;
%% 数据处理??
% https://cloud.tencent.com/developer/article/1397794
% http://m.sohu.com/a/279062829_750247
DataSet = xlsread('RiskParity2.xlsx');
DataSet = DataSet(:,2:end);
[M,N] = size(DataSet); %
NT = ceil((M-360)/30);
algow = 1/N*ones(N,1);
num = zeros(NT,1);
W = 1/N*ones(1,N);
%% ?????????
for j=1:N
for i=1:M-1
if isnan(DataSet(i+1,j))==1
DataSet(i+1,j) = DataSet(i,j);
end
end
end
%% ??????????
ReturnRate = zeros(M-1,N);
for j=1:N
for i=1:M-1
ReturnRate(i,j)=(DataSet(i+1,j)-DataSet(i,j))/DataSet(i,j);
end
end
%% 协方差矩阵???????
covmatrix = cov(ReturnRate);
%% ????fmincon????????????????
options = optimoptions('fmincon','Algorithm','sqp','Display','off','TolCon',eps);
X_old = [];
fval_old = Inf;
weightall= [];
fvalall= [];
for i=1:20000
% rng('default'); % For reproducibility
x0 = trnd(1,N,1); % Best: Cauchy distribution 1/(pi(1+x^2))
% x0 = randn(N,1); % Ok: Normal distributon N(0,1)
% x0 = rand(N,1); % Worst: Uniform distritbuion [0 1]
x0 = abs(x0);
x0 = x0/sum(x0);
Aeq = ones(1,N);
Beq = 1;
lb = zeros(N,1);
up = ones(N,1);
fun = @(x) riskparity_function(covmatrix, x);
[X,fval] = fmincon(fun,x0,[],[],Aeq,Beq,lb,up,[],options);
if fval<=fval_old
X_old = X;
fval_old = fval;
end
fprintf('Step %d: %.15f\n',i,fval_old)
weightall= [weightall;x0'];
fvalall= [fvalall;fval];
end
X = X_old;
fval_min = fval_old;
fprintf('The optimal X = [%f %f %f %f %f %f %f]\n', X)
fprintf('The minimum is %.15f\n', fval_min)
% The optimal X = [0.013376 0.026426 0.501881 0.327611 0.041506 0.053454 0.035747]
% The minimum is 0.000000000000713
% The optimal X = [0.036771 0.021524 0.470257 0.304334 0.058272 0.055556 0.053285]
% The minimum is 0.000000000001605
% The optimal X = [0.009767 0.025995 0.421532 0.422122 0.031370 0.049227 0.039988]
% The minimum is 0.000000000001895
%% 2?????
%The optimal X = [0.146752 0.146585 0.190320 0.999990 0.148092 0.221034 0.147227]
%The minimum is 0.000000001965164
不同优化方式 权重和结果
资源打包 附有excel 数据和结果。有需要的朋友可以先跑起来。
matlab 我的是2016b, 以防没有个别函数,请您也用这个或者以上版本。
代码、数据及结果:
https://download.csdn.net/download/zhyl4669/11269297
https://download.csdn.net/my/uploads