vuoi
o PayPal
tutte le volte che vuoi
PRIMA ESERCITAZIONE
%% === LOAD PRICE DATA" ===
lename = "DatasetEsercitazione";
sheet = "Stock Prices";
% Imposta le opzioni di importazione dei dati da un le Excel chiamato "DatasetEsercitazione",
% speci cando il foglio da cui leggere (variabile 'sheet' da de nire precedentemente).
opts = detectImportOptions("DatasetEsercitazione","sheet",sheet);
% Imposta il tipo di variabili, dalla seconda colonna in poi, a "double" (numerico).
opts = setvartype(opts,2:numel(opts.VariableNames),"double");
% Speci ca che le stringhe "NaN" nelle celle del le devono essere trattate come valori mancanti
(NaN reali).
opts = setvaropts(opts,2:numel(opts.VariableNames),"TreatAsMissing","NaN");
% Importa tutti i dati del foglio selezionato come tabella.
T = readtable("DatasetEsercitazione",opts);
% Estrae il vettore delle date (prima colonna).
D = T{:,1};
% Estrae i nomi delle variabili (nomi degli stock), escludendo la colonna della data.
Names = T.Properties.VariableNames(2:end);
% Estrae la matrice dei prezzi, convertendo le colonne dalla seconda in poi in un array numerico.
P = table2array(T(:,2:end));
% Crea la prima gura con i prezzi dei titoli 1 e 40 nel tempo.
gure(1)
plot(D,P(:,[1 40])) %Plotta i prezzi dei due titoli selezionati
legend(Names{[1 40]}) %Aggiunge la legenda con i nomi dei due titoli
title("stock 1 and 40 - Prices")
xlabel("Date"); ylabel("Prices")
% Calcola i rendimenti percentuali giornalieri (o per intervallo temporale tra righe) per ogni titolo.
R = ((P(2:end,:)-P(1:end-1,:))./P(1:end-1,:))*100;
% Aggiorna il vettore delle date per adattarsi alla nuova lunghezza dei rendimenti (una in meno).
D_R = D(2:end);
% Estrae i rendimenti per lo stock 1 e lo stock 40.
R1 = R(:,1);
R40 = R(:,40);
% Crea la seconda gura con i rendimenti dei titoli 1 e 40.
gure(2)
plot(D_R,R1) %Plotta i rendimenti del primo titolo
legend(Names{[1 40]})
title("stock 1 and 40 - Prices") %(NB: titolo da correggere non prices ma returns, è sui rendimenti
non sui prezzi)
xlabel("Date"); ylabel("Prices")
hold on %mi tiene aperto il primo plot, e mandando il secondo plot mi verra sovrapposto al
precedente, Mantiene il primo gra co per sovrapporre il secondo
fi
fi
fi fi fi fi fi fi fi fi fi
plot(D_R,R40) %Sovrappone i rendimenti del titolo 40
hold o
% De nisce i pesi del portafoglio: 70% in R1, 30% in R40.
w = [0.7;0.3];
% Calcola la matrice di covarianza tra i rendimenti di R1 e R40
C_2 = cov(R1,R40);
%% metodo1- formula analitica 2 asset
% Calcola il rendimento atteso del portafoglio (media pesata).
mu_1 = w(1)*mean(R1)+w(2)*mean(R40);
% Calcola la varianza del portafoglio usando la formula per 2 asset.
Vp_1 = w(1)^2*var(R1)+w(2)^2*var(R40)+2*w(1)*w(2)*C_2(2,1);
% Calcola la deviazione standard (rischio) del portafoglio.
Sp_1 = sqrt(Vp_1);
%% metodo 2 - notazione matriciale (per piu asset)
% Calcola il rendimento atteso in forma matriciale.
mu_2 = [mean(R1) mean(R40)]*w;
% Calcola la varianza e il rischio del portafoglio in forma matriciale.
Vp_2 = (w'*C_2*w);
Sp_2 = sqrt(w'*C_2*w);
%% example per 10 asset
% Calcola i rendimenti medi per i primi 10 titoli, escludendo eventuali NaN.
mu_10 = mean(R(:,1:10),"omitnan");
% Calcola la matrice di covarianza tra i primi 10 titoli.
C_10 = cov(R(:,1:10));
%% trasformo il dataset
P=readmatrix("DatasetEsercitazione.xlsx","Sheet","stock prices","Range","B2:SJ3274");
% "P=" Assegna i dati letti a una variabile chiamata P. Dopo l'esecuzione, P conterrà una matrice
con i dati importati.
% "readmatrix" È la funzione di MATLAB per leggere dati da un le Excel in formato matrice
numerica (i testi vengono ignorati o convertiti in NaN se non possono essere interpretati come
numeri).
% "DatasetEsercitazione" È il nome del le Excel da cui leggere i dati. Deve trovarsi nella current
folder o devi fornire il percorso completo
% "sheet" Speci ca il foglio di Excel da cui leggere i dati. In questo caso il foglio si chiama "stock
prices".
% "Range.." Indica l'intervallo preciso di celle da leggere: dalla cella B2 no a SJ3274.
N=readcell("DatasetEsercitazione.xlsx","Sheet","stock prices","Range","B1:SJ1");
R= 100*(P(2:end,:)-P(1:end-1,:))./P(1:end-1,:);
assets=[494,268];
% stai creando un vettore riga chiamato assets contenente due valori
% numerici:494,268
Port=R(:,assets);
% Questo comando estrae da una matrice R solo le colonne speci cate nel vettore assets,
mantenendo tutte le righe, e assegna il risultato alla variabile Port.
fi ff fi fi fi fi fi
mu=mean(Port);
mu=mu';
Sigma=cov(Port);
% calcoliamo rendimento e rischio del portafoglio
w_s= [0.3;0.7];
mu_s = mu'*w_s;
sigma_s=sqrt(w_s'*Sigma*w_s);
%% calcoliamo ora la frontiera
N=100;
w1=linspace(0,1,N);
w2=1-w1;
w=[w1;w2];
%valore atteso portafoglio
mu_p=mu'*w;
%sigma portafoglio versione intuitiva, ossia con il "for loop"
sigma_p = nan(N,1);
for j = 1:N
w_j = w(:,j);
sigma_p(j) = sqrt(w_j'*Sigma*w_j);
end
%% visualizziamo la frontiera e ciente
gure (1);
plot(sigma_p,mu_p,"b-","LineWidth",2);
hold on
plot(sqrt(diag(Sigma)),mu,"ro","MarkerSize",8);
plot(sigma_s,mu_s,"kp","MarkerSize",12,"MarkerFaceColor","k");
xlabel("\sigma");
ylabel("\mu")
title("Frontiera Portafogli")
legend("Frontiera","Singoli Titoli","Portafoglio Scelto","Location","best");
grid on
hold o
SECONDA ESERCITAZIONE
P=readmatrix("DatasetEsercitazione.xlsx","Sheet","Stock Prices","Range","B2:SJ3274");
Mkt = readmatrix("DatasetEsercitazione.xlsx","Sheet","Factors","Range","B2:B3273");
Rf=readmatrix("DatasetEsercitazione.xlsx","Sheet","Factors","Range","F2:F3273");
Mkt= ipud(Mkt);
Rf= ipud(Rf);
Mkt= Mkt+Rf;
R= 100*(P(2:end,:)-P(1:end-1,:))./P(1:end-1,:);
R_494= R(:,494);
R_268= R(:,264);
check494= anynan(R_494);
check268= anynan(R_268);
gure(1);
subplot(1,2,1);
scatter(Mkt,R_494);
xlabel("R_m");
ylabel("R_{494}");
h=lsline;
fi
fi fl fl ff ffi
set(h,"color","r");
subplot(1,2,2);
scatter(Mkt,R_268);
xlabel("R_m");
ylabel("R_{268}");
h=lsline;
set(h,"color","r");
%% Stimiamo Market Model
mm_494 = tlm(Mkt,R_494);
b_494 = mm_494.Coe cients.Estimate;
mm_268 = tlm(Mkt,R_268);
b_268 = mm_268.Coe cients.Estimate;
%per tutti i titoli
[T,N]= size(R);
b2 = nan(N,2);
for i=1:N
if not(anynan(R(:,i)))
Y=R(:,i);
b2(i,:)= tlm(Mkt,Y).Coe cients.Estimate;
end
end
%compute the Market Model for a portfolio
w_1=0.6;
TERZA ESERCITAZIONE
P=readmatrix("DatasetEsercitazione.xlsx","Sheet","Stock Prices","Range","B2:SJ3274");
Emkt = readmatrix("DatasetEsercitazione.xlsx","Sheet","Factors","Range","B2:B3273");
Rf=readmatrix("DatasetEsercitazione.xlsx","Sheet","Factors","Range","F2:F3273");
Emkt= ipud(Emkt);
Rf= ipud(Rf);
R= 100*(P(2:end,:)-P(1:end-1,:))./P(1:end-1,:);
R_494= R(:,494);
R_268= R(:,264);
%stimiamo il CAPM
B1_CAPM= tlm(Emkt,R_494-Rf);
%testiamo la validità di questa formula,stiamo il CAPM per tutti i titoli
Y=R-Rf;
[T,N]=size(Y);
%stiamiamo la X ossia tutti i titoli del portafoglio ma non con tlm che è
%fancy ma con regress che pero stimerà solo Y=BX e quindi dobbiamo
%speci cargli che vogliamo anche "a" (+BX);con horzcat che ci aggrega
X=horzcat(ones(T,1),Emkt);
B=nan(N,2);
for i=1:N
B(i,:)=regress(Y(:,i),X);
end
%andiamo a fare la SML
fl fl fi fi
fi fi
fi ffi
ffi ffi fi
gure(1)
scatter(B(:,2),mean(Y,'omitnan')')
xlabel('\beta_{im}');
ylabel('E(R_i-Rf');
title('SML');
h=lsline;
set(h,'color','r');
SML= tlm(B(:,2),mean(Y)');
check_g1=mean(Emkt);
%%black jensen scholes metod
Nport=10;
W=252;
B_p=nan( oor(T/W),N);
Rp=nan(T-W,Nport);
for t=1: oor(T/W)
t0=(t-1)*W+1;
t1=t*W;
t2=min((t+1)*W,T);
window_est=t0:t1;
window_port=t1+1:t2;
for j=1:N
Y=R(window_est,j)-Rf(window_est);
if not(anynan(Y))
X=horzcat(ones(W,1),Emkt(window_est));
B_temp=regress(Y,X);
end
B_p(t,j)=B_temp(2);
end
P1=prctile(B_p(t,:),[0 10:10:100]);
for k=1:Nport
Rp(window_port-W,k)=mean(R(window_port,B_p(t,:)>P1(k) & B_p(t,:) <=
P1(k+1) ),2,'omitnan');
end
end
%stima CAPM dei 10 portafogli BJS
Y_bj=Rp-Rf(W+1:end);
X_bj=Emkt(W+1:end);
B_bj=NaN(Nport,2);
ep_bj=NaN(T-W,Nport);
for k=1:Nport
capm= tlm(X_bj,Y_bj(:,k));
B_bj(k,:)=capm.Coe cients.Estimate;
ep_bj(:,k)=capm.Residuals.Raw;
end
%SML, ora possiamo farla
gure(2)
scatter(B_bj(:,2),mean(Y_bj,'omitnan'));
xlabel('\beta_{pm}');
ylabel('E(Rp-Rf');
title('SML BJS');
fi
fi fi fl fi
fl ffi
h=lsline;
set(h,'color','r');
SMKL_bj= tlm(B_bj(:,2),mean(Y_bj)');
chk_g1_bj=mean(Emkt(W+1:end));
%vediamo come con BJS siamo riusciti ad andare a far rispettare gamma0=0 e
%gamma1=Rp-Rf
%%fama e macbeth (estensione ulteriore che è stata elaborata) ci dimostra
%%come aggiungendo gamma2 e gamma3 siano =0 e che quindi ci spiega il
%%modello solamente gamma1 diverso da 0 ossia B
%14.
X_fm=horzcat(B_bj(:,2),B_bj(:,2).^2,var(ep_bj)');
Y_fm=Rp-Rf(W+1:end);
g_fm= tlm(X_fm,mean(Y_fm,'omitnan'));
c_fm=corr(X_fm);
%14.a
X_fm_14a=horzcat(B_bj(:,2),B_bj(:,2).^2);
g_fm_14a= tlm(X_fm_14a,mean(Y_fm,'omitnan'));
%14.b
X_fm_14b=horzcat(B_bj(:,2),var(ep_bj)');
g_fm= tlm(X_fm_14b,mean(Y_fm,’omitnan'));
QUARTA ESERCITAZIONE
clc
%rng(1)
%Carichiamo le serie storiche Emkt, Rf e dei fattori SMB, HML
P = readmatrix("Dataset.xlsx",'Sheet','Stock Prices','Range','B2:SJ3274');
Emkt = readmatrix("Dataset.xlsx",'Sheet','Factors','Range',