vuoi
o PayPal
tutte le volte che vuoi
Dati = readtable('Base_Dati.xlsx');
% Estrazione rendimenti titoli
rendimenti = Dati{:,2:end};
% Statistiche di base
rendimento_medio = mean(rendimenti);
deviazione_standard = std(rendimenti, 1);
matrice_covarianza = cov(rendimenti, 1);
matrice_correlazione = corr(rendimenti);
% Creazione pesi randomizzati
numero_portafogli = 10000;
numero_titoli = size(rendimenti,2);
pesi = randn(numero_portafogli, numero_titoli);
pesi = pesi(abs(sum(pesi,2)) > 0.05, :);
pesi = pesi ./ sum(pesi,2);
% Calcolo rendimento e rischio dei portafogli
rendimento_portafogli = pesi * rendimento_medio';
rischio_portafogli = sqrt(sum((pesi *
matrice_covarianza) .* pesi,
2));
% Identificazione portafogli con e senza vendita allo
scoperto
ha_short = any(pesi < 0, 2);
senza_short = ~ha_short;
% Calcolo della Frontiera Efficiente
Matrice_supporto = [rendimento_medio;
ones(1,numero_titoli)];
a = Matrice_supporto(2,:) * (matrice_covarianza \
Matrice_supporto(2,:)');
b = Matrice_supporto(1,:) * (matrice_covarianza \
Matrice_supporto(2,:)');
c = Matrice_supporto(1,:) * (matrice_covarianza \
Matrice_supporto(1,:)');
rendimenti_target =
linspace(min(rendimento_portafogli),
max(rendimento_portafogli), numero_portafogli);
rischio_frontiera = sqrt((a * rendimenti_target.^2 -
2*b*rendimenti_target + c) / (a*c - b^2));
% Calcolo portafoglio di minima varianza
rendimento_minvar = b/a;
rischio_minvar = sqrt((a*rendimento_minvar^2 -
2*b*rendimento_minvar
+ c) / (a*c - b^2));
[min_rischio, indice_min] = min(rischio_frontiera);
parte_efficiente =
indice_min:length(rischio_frontiera);
parte_non_efficiente = 1:indice_min;
% Quote del portafoglio di minima varianza
quote_minvar = (matrice_covarianza \
ones(numero_titoli,1)) /
(ones(1,numero_titoli) * (matrice_covarianza \
ones(numero_titoli,1)));
disp('Quote del portafoglio di minima varianza:');
disp(quote_minvar');
% Modello CAPM e Capital Market Line
rendimento_riskfree = 0.02;
sharpe = (rendimenti_target(parte_efficiente) -
rendimento_riskfree) ./
rischio_frontiera(parte_efficiente);
[max_sharpe, indice_max_sharpe] = max(sharpe);
rendimento_mercato =
rendimenti_target(parte_efficiente(indice_max_sharpe))
;
rischio_mercato =
rischio_frontiera(parte_efficiente(indice_max_sharpe))
;
rischi_CML = linspace(0, max(rischio_portafogli),
100);
CML = rendimento_riskfree + ((rendimento_mercato -
rendimento_riskfree) / rischio_mercato) * rischi_CML;
% Calcolo beta dei titoli rispetto al portafoglio di
mercato
rendimento_mercato_storico = rendimenti *
pesi(indice_max_sharpe, :)';
varianza_mercato = var(rendimento_mercato_storico, 1);
beta = (rendimenti' * rendimento_mercato_storico) /
(rendimento_mercato_storico' *
rendimento_mercato_storico);
disp('Beta dei singoli titoli:');
disp(beta');
% Grafico finale
figure; hold on; grid on; box on;
% Definizione colori
colori = struct('long', [0.2 0.6 1], 'short', [1 0.4
0.4],
'frontiera', [0 0 0], ...
'minvar', [0.3 0.9 0.4], 'cml', [1 0.6
0],
'mercato', [0.7 0 0.7], 'subfrontiera', [0.4 0.4
0.4]);
% Disegno portafogli
scatter(rischio_portafogli(senza_short),
rendimento_portafogli(senza_short), 20, 'o',
'MarkerFaceColor',
colori.long, 'MarkerEdgeColor', 'k', 'LineWidth',
0.5);
scatter(rischio_portafogli(ha_short),
rendimento_portafogli(ha_short), 20, 'x',
'MarkerEdgeColor',
colori.short, 'LineWidth', 1.2);
% Disegno frontiera efficiente e non efficiente
plot(rischio_frontiera(parte_efficiente),
rendimenti_target(parte_efficiente), '-', 'LineWidth',
2.5, 'Color',
colori.frontiera);
plot(rischio_frontiera(parte_non_efficiente),
rendimenti_target(parte_non_efficiente), '--',
'Color', [0.5 0.5 1],
'LineWidth', 2);
% Disegno portafoglio di minima varianza
plot(rischio_minvar, rendimento_minvar, 's',
'MarkerSize', 10,
'MarkerEdgeColor', 'k', 'MarkerFaceColor',
colori.minvar);
% Disegno Capital Market Line
plot(rischi_CML, CML, '-', 'Color', colori.cml,
'LineWidth', 2);
% Disegno portafoglio di mercato
plot(rischio_mercato, rendimento_mercato, 'p',
'MarkerSize', 12,
'MarkerFaceColor', colori.mercato, 'MarkerEdgeColor',
'k');
% Disegno singoli titoli
scatter(deviazione_standard, rendimento_medio, 60,
'k', 'filled');
text(deviazione_standard + 0.002, rendimento_medio,
Dati.Properties.VariableNames(2:end),
'VerticalAlignment', 'bottom',
'FontSize', 9, 'FontWeight', 'bold');
% Disegno alcune subfrontiere a due titoli
numero_subfrontiere = 3;
rng(1);
combinazioni = nchoosek(1:numero_titoli, 2);
indici_random = randperm(size(combinazioni,1),
numero_subfrontiere);
for i = 1:numero_subfrontiere
idx = combinazioni(indici_random(i), :);
r_sub = rendimento_medio(idx);
cov_sub = matrice_covarianza(idx, idx);
Matrice_sub = [r_sub; ones(1,length(idx))];
a_sub = Matrice_sub(2,:) * (cov_sub \
Matrice_sub(2,:)');
b_sub = Matrice_sub(1,:) * (cov_sub \
Matrice_sub(2,:)');
c_sub = Matrice_sub(1,:) * (cov_sub \
Matrice_sub(1,:)');
rendimenti_sub = linspace(min(r_sub), max(r_sub),
100);
rischi_sub = sqrt((a_sub * rendimenti_sub.^2 -
2*b_sub*rendimenti_sub + c_sub) / (a_sub*c_sub -
b_sub^2));
plot(rischi_sub, rendimenti_sub, '--', 'Color',
colori.subfrontiera, 'LineWidth', 1.5);
end
% Migliorie grafiche