%%clear;clc;%获得购买美团股票、京东股票、百度股票的月均盈利率数据priceuprate=[-1.46 +4.06 +58.60 -11.00 -10.08 -15.90 +16.23 -7.00 -15.00 +5.00 +8.00 -5.00 +14.56 -8.00;13.20 0.29 -1.29 -0.21 -0.64 -20.67 -1.03, 2.90 17.45 -8.35 -7.98 1.55 48.15 2.31;-7.01 +27.40 -13.35 -6.77 -0.87 +7.46 -4.58 +6.45 -4.57 -4.57 +2.84 +4.70 +2.25 +38.27]/100;r_f = 0.002;%无风险利率priceuprate = priceuprate';size_priceuprate = size(priceuprate);average_priceuprate = sum(priceuprate)/size_priceuprate(1);%取平均利率risk_matrix = cov(priceuprate);%取方差-协方差矩阵%%num_dots = 5000;%设置二次规划点数target_priceuprates = linspace(min(average_priceuprate) ,...max(average_priceuprate),num_dots);%设定固定利率weights = zeros(size_priceuprate(2) , num_dots);risks = zeros(1 , num_dots);Aeq = [ones(1 , size_priceuprate(2)) ; average_priceuprate];lb = zeros(size_priceuprate(2) , 1);%设置下界(不允许卖空)ub = ones(size_priceuprate(2) , 1);%设置上界(不允许其他为负)H = 2 * risk_matrix;p = zeros(size_priceuprate(2) , 1);%给出求解函数options = optimoptions('quadprog','Algorithm','interior-point-convex',...'Display','iter','MaxIterations',200);%给出二次规划设置%进行二次规划for i = 1 : num_dotstarget_priceuprate = target_priceuprates(i);beq = [1 ; target_priceuprate];[weight , risk_min , exitflag , output , lambda]=...quadprog(H , p , [] , [] , Aeq , beq , lb , ub , [] , options);if exitflag > 0weights(: , i) = weight;risks(1 , i) =sqrt( weight'*risk_matrix*weight );elserisk(1 , i) = NaN;end%检验规划结果并保存end%%excess_priceuprate = average_priceuprate - r_f;weight_tan =risk_matrix \ excess_priceuprate';weight_tan = weight_tan / sum(weight_tan);risk_tan = sqrt(weight_tan' * risk_matrix *weight_tan);priceuprate_tan = average_priceuprate * weight_tan;k_tan = (priceuprate_tan - r_f) / (risk_tan);%求解资本市场线权重、风险以及利率,并据此求解斜率options = optimoptions('quadprog','Algorithm','interior-point-convex'...,'Display','iter','MaxIterations',200);beq = [1 , priceuprate_tan];[weight_tan1 , risk_min , exitflag , output , lambda]=...quadprog(H , p , [] , [] , Aeq , beq , lb , ub , [] , options);%再次求解权重value1 = 0;for i = 1 : size_priceuprate(2)if weight_tan(i,1) ~= weight_tan1(i,1)weight_tan = weight_tan1;break;endend%保证非负结果%%% 可视化结果figure('Position', [100, 100, 1200, 500]);% 子图1:有效前沿和资本市场线subplot(1,2,1);plot(risks , target_priceuprates, 'b-', 'LineWidth', 2);hold on;% 绘制资本市场线cml_risks = linspace(0, max(risks)*1.2, 100);cml_priceuprate = r_f + k_tan * cml_risks;plot(cml_risks, cml_priceuprate, 'r--', 'LineWidth', 2);% 标记切点plot(risk_tan, priceuprate_tan, 'ro', 'MarkerSize', 8, 'MarkerFaceColor', 'red');% 标记无风险资产plot(0, r_f, 'go', 'MarkerSize', 8, 'MarkerFaceColor', 'green');xlabel('风险(标准差)');ylabel('预期收益率');title('有效前沿和资本市场线');legend('有效前沿', '资本市场线', '切点组合', '无风险资产', 'Location', 'southeast');grid on;% 子图2:切点组合权重subplot(1,2,2);bar(weight_tan);xlabel('资产');ylabel('权重');title('切点组合权重分配');set(gca, 'XTickLabel', {'美团股票', '京东股票', '百度股票'});grid on;
上面这段代码在北太天元中会一直运行但无结果输出,但在Matlab中可以正常运行并输出结果