在使用北太天元处理二次规划问题时,特定条件下,北太天元会持续运行(卡死)且无法退出(无论怎么按退出键都没用),请问这是什么原因?
% 投资组合优化示例 - 3个股票 + 储蓄% 基于Markowitz投资组合理论clear; clc; close all;%% 输入数据% 假设我们有3个股票的预期收益率(年化)expected_returns = [0.08; 0.23; 0.15]; % 股票1, 股票2, 股票3% 假设储蓄的无风险利率risk_free_rate = 0.03; % 3% 年化收益率% 协方差矩阵(反映股票间的风险关系)covariance_matrix = [0.04 0.01 0.02; % 股票1的方差和协方差0.01 0.09 0.03; % 股票20.02 0.03 0.16]; % 股票3%% 有效前沿计算n_assets = length(expected_returns);n_points = 100;% 生成不同的目标收益率target_returns = linspace(min(expected_returns), max(expected_returns), n_points);% 预分配存储空间portfolio_risks = zeros(n_points, 1);portfolio_weights = zeros(n_points, n_assets);% 计算有效前沿for i = 1:n_pointstarget_return = target_returns(i);% 使用二次规划求解最小风险组合H = 2 * covariance_matrix; % 二次项系数矩阵f = zeros(n_assets, 1); % 线性项系数向量% 约束条件:权重和为1,预期收益率等于目标值Aeq = [ones(1, n_assets); expected_returns'];beq = [1; target_return];% 边界条件:不允许卖空lb = zeros(n_assets, 1);ub = ones(n_assets, 1);% 求解二次规划问题options = optimoptions('quadprog', 'Display', 'off');[weights, ~, exitflag] = quadprog(H, f, [], [], Aeq, beq, lb, ub, [], options);if exitflag > 0portfolio_weights(i, :) = weights';portfolio_risks(i) = sqrt(weights' * covariance_matrix * weights);elseportfolio_risks(i) = NaN;endend%% 计算包含储蓄的最优组合(资本市场线)% 超额收益率excess_returns = expected_returns - risk_free_rate;% 计算切点组合tangent_weights = covariance_matrix \ excess_returns;tangent_weights = tangent_weights / sum(tangent_weights);% 切点组合的收益率和风险tangent_return = tangent_weights' * expected_returns;tangent_risk = sqrt(tangent_weights' * covariance_matrix * tangent_weights);% 资本市场线斜率cml_slope = (tangent_return - risk_free_rate) / tangent_risk;%% 可视化结果figure('Position', [100, 100, 1200, 500]);% 子图1:有效前沿和资本市场线subplot(1,2,1);plot(portfolio_risks, target_returns, 'b-', 'LineWidth', 2);hold on;% 绘制资本市场线cml_risks = linspace(0, max(portfolio_risks)*1.2, 100);cml_returns = risk_free_rate + cml_slope * cml_risks;plot(cml_risks, cml_returns, 'r--', 'LineWidth', 2);% 标记切点plot(tangent_risk, tangent_return, 'ro', 'MarkerSize', 8, 'MarkerFaceColor', 'red');% 标记无风险资产plot(0, risk_free_rate, 'go', 'MarkerSize', 8, 'MarkerFaceColor', 'green');xlabel('风险(标准差)');ylabel('预期收益率');title('有效前沿和资本市场线');legend('有效前沿', '资本市场线', '切点组合', '无风险资产', 'Location', 'southeast');grid on;% 子图2:切点组合权重subplot(1,2,2);bar(tangent_weights);xlabel('资产');ylabel('权重');title('切点组合权重分配');set(gca, 'XTickLabel', {'股票1', '股票2', '股票3'});grid on;%% 输出结果fprintf('=== 投资组合优化结果 ===\n');fprintf('无风险利率: %.2f%%\n', risk_free_rate*100);fprintf('\n各股票预期收益率:\n');for i = 1:n_assetsfprintf('股票%d: %.2f%%\n', i, expected_returns(i)*100);endfprintf('\n切点组合信息:\n');fprintf('预期收益率: %.2f%%\n', tangent_return*100);fprintf('风险(标准差): %.2f%%\n', tangent_risk*100);fprintf('夏普比率: %.4f\n', (tangent_return - risk_free_rate) / tangent_risk);fprintf('\n切点组合权重:\n');for i = 1:n_assetsfprintf('股票%d: %.2f%%\n', i, tangent_weights(i)*100);endfprintf('\n投资建议:\n');fprintf('投资者可以根据自己的风险偏好,在无风险资产和切点组合之间分配资金。\n');fprintf('风险厌恶型投资者可以增加储蓄比例,风险偏好型投资者可以增加股票组合比例。\n');%% 计算不同风险偏好下的最优组合fprintf('\n=== 不同风险偏好下的投资建议 ===\n');risk_tolerances = [0.1, 0.3, 0.5, 0.7, 0.9]; % 风险承受能力for i = 1:length(risk_tolerances)alpha = risk_tolerances(i); % 投资于切点组合的比例savings_weight = 1 - alpha; % 储蓄比例portfolio_return = savings_weight * risk_free_rate + alpha * tangent_return;portfolio_risk = alpha * tangent_risk;fprintf('\n风险承受能力 %.0f%%:\n', risk_tolerances(i)*100);fprintf(' 储蓄比例: %.1f%%\n', savings_weight*100);fprintf(' 股票组合比例: %.1f%%\n', alpha*100);fprintf(' 预期收益率: %.2f%%\n', portfolio_return*100);fprintf(' 预期风险: %.2f%%\n', portfolio_risk*100);end