在使用北太天元處理二次規(guī)劃問題時(shí),特定條件下,北太天元會持續(xù)運(yùn)行(卡死)且無法退出(無論怎么按退出鍵都沒用),請問這是什么原因?
% 投資組合優(yōu)化示例 - 3個股票 + 儲蓄% 基于Markowitz投資組合理論clear; clc; close all;%% 輸入數(shù)據(jù)% 假設(shè)我們有3個股票的預(yù)期收益率(年化)expected_returns = [0.08; 0.23; 0.15]; % 股票1, 股票2, 股票3% 假設(shè)儲蓄的無風(fēng)險(xiǎn)利率risk_free_rate = 0.03; % 3% 年化收益率% 協(xié)方差矩陣(反映股票間的風(fēng)險(xiǎn)關(guān)系)covariance_matrix = [0.04 0.01 0.02; % 股票1的方差和協(xié)方差0.01 0.09 0.03; % 股票20.02 0.03 0.16]; % 股票3%% 有效前沿計(jì)算n_assets = length(expected_returns);n_points = 100;% 生成不同的目標(biāo)收益率target_returns = linspace(min(expected_returns), max(expected_returns), n_points);% 預(yù)分配存儲空間portfolio_risks = zeros(n_points, 1);portfolio_weights = zeros(n_points, n_assets);% 計(jì)算有效前沿for i = 1:n_pointstarget_return = target_returns(i);% 使用二次規(guī)劃求解最小風(fēng)險(xiǎn)組合H = 2 * covariance_matrix; % 二次項(xiàng)系數(shù)矩陣f = zeros(n_assets, 1); % 線性項(xiàng)系數(shù)向量% 約束條件:權(quán)重和為1,預(yù)期收益率等于目標(biāo)值A(chǔ)eq = [ones(1, n_assets); expected_returns'];beq = [1; target_return];% 邊界條件:不允許賣空lb = zeros(n_assets, 1);ub = ones(n_assets, 1);% 求解二次規(guī)劃問題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%% 計(jì)算包含儲蓄的最優(yōu)組合(資本市場線)% 超額收益率excess_returns = expected_returns - risk_free_rate;% 計(jì)算切點(diǎn)組合tangent_weights = covariance_matrix \ excess_returns;tangent_weights = tangent_weights / sum(tangent_weights);% 切點(diǎn)組合的收益率和風(fēng)險(xiǎn)tangent_return = tangent_weights' * expected_returns;tangent_risk = sqrt(tangent_weights' * covariance_matrix * tangent_weights);% 資本市場線斜率cml_slope = (tangent_return - risk_free_rate) / tangent_risk;%% 可視化結(jié)果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);% 標(biāo)記切點(diǎn)plot(tangent_risk, tangent_return, 'ro', 'MarkerSize', 8, 'MarkerFaceColor', 'red');% 標(biāo)記無風(fēng)險(xiǎn)資產(chǎn)plot(0, risk_free_rate, 'go', 'MarkerSize', 8, 'MarkerFaceColor', 'green');xlabel('風(fēng)險(xiǎn)(標(biāo)準(zhǔn)差)');ylabel('預(yù)期收益率');title('有效前沿和資本市場線');legend('有效前沿', '資本市場線', '切點(diǎn)組合', '無風(fēng)險(xiǎn)資產(chǎn)', 'Location', 'southeast');grid on;% 子圖2:切點(diǎn)組合權(quán)重subplot(1,2,2);bar(tangent_weights);xlabel('資產(chǎn)');ylabel('權(quán)重');title('切點(diǎn)組合權(quán)重分配');set(gca, 'XTickLabel', {'股票1', '股票2', '股票3'});grid on;%% 輸出結(jié)果fprintf('=== 投資組合優(yōu)化結(jié)果 ===\n');fprintf('無風(fēng)險(xiǎn)利率: %.2f%%\n', risk_free_rate*100);fprintf('\n各股票預(yù)期收益率:\n');for i = 1:n_assetsfprintf('股票%d: %.2f%%\n', i, expected_returns(i)*100);endfprintf('\n切點(diǎn)組合信息:\n');fprintf('預(yù)期收益率: %.2f%%\n', tangent_return*100);fprintf('風(fēng)險(xiǎn)(標(biāo)準(zhǔn)差): %.2f%%\n', tangent_risk*100);fprintf('夏普比率: %.4f\n', (tangent_return - risk_free_rate) / tangent_risk);fprintf('\n切點(diǎn)組合權(quán)重:\n');for i = 1:n_assetsfprintf('股票%d: %.2f%%\n', i, tangent_weights(i)*100);endfprintf('\n投資建議:\n');fprintf('投資者可以根據(jù)自己的風(fēng)險(xiǎn)偏好,在無風(fēng)險(xiǎn)資產(chǎn)和切點(diǎn)組合之間分配資金。\n');fprintf('風(fēng)險(xiǎn)厭惡型投資者可以增加儲蓄比例,風(fēng)險(xiǎn)偏好型投資者可以增加股票組合比例。\n');%% 計(jì)算不同風(fēng)險(xiǎn)偏好下的最優(yōu)組合fprintf('\n=== 不同風(fēng)險(xiǎn)偏好下的投資建議 ===\n');risk_tolerances = [0.1, 0.3, 0.5, 0.7, 0.9]; % 風(fēng)險(xiǎn)承受能力for i = 1:length(risk_tolerances)alpha = risk_tolerances(i); % 投資于切點(diǎn)組合的比例savings_weight = 1 - alpha; % 儲蓄比例portfolio_return = savings_weight * risk_free_rate + alpha * tangent_return;portfolio_risk = alpha * tangent_risk;fprintf('\n風(fēng)險(xiǎn)承受能力 %.0f%%:\n', risk_tolerances(i)*100);fprintf(' 儲蓄比例: %.1f%%\n', savings_weight*100);fprintf(' 股票組合比例: %.1f%%\n', alpha*100);fprintf(' 預(yù)期收益率: %.2f%%\n', portfolio_return*100);fprintf(' 預(yù)期風(fēng)險(xiǎn): %.2f%%\n', portfolio_risk*100);end計(jì)算有效前沿那個 100 次的 for 循環(huán),當(dāng) i = 3 時(shí)求解器 quadprog 求解不出來,不是卡死,運(yùn)行最終會報(bào)求解失敗的內(nèi)部錯誤。
