Obbligazione Petrobras ai raggi X — il codice

La fame a volte porta ad azioni avventate.

Questo vale anche per i risparmiatori e la loro fame di rendimenti, causata dai bassi tassi d’interesse, sempre più spesso negativi.

In effetti, chi è cresciuto a BTP, CCT e BOT (cioè la maggioranza dei risparmiatori italiani tra i 35 anni in su) fatica oggi a raccapezzarsi e si guarda intorno alla famelica ricerca di obbligazioni con un rendimento accettabile. Nel far ciò, la superficialità può giocare brutti scherzi: sottovalutare i rischi è questione di un attimo.

Proprio questo è il tema dell’analisi, del tutto esemplificativa di queste situazioni, di un’obbligazione Petrobras , effettuata sul blog AdviseOnly. Per chi possiede rudimenti di statistica, finanza e programmazione, qui di seguito, come promesso a vari lettori del blog AdviseOnly, c’è il codice Matlab per replicare (ed estendere) analisi di questo tipo.

clear all
close all
clc
nScen = 5000; % n° simulazioni

Dati bond

yield2maturity = 0.0695; % yield to maturity, fonte EuroTLX al 7 aprile 2015
RecoveryRate = 0.45; % fonte Moody's (http://efinance.org.cn/cn/FEben/Corporate%20Default%20and%20Recovery%20Rates,1920-2010.pdf)
Hor = 5.75; % anni (scadenza)
p_1yr = 0.02; % fonte Bloomberg
ProbDefault = 1- (1-p_1yr)^Hor; % in base all'evoluzione della catena di Markov che governa il processo di default
% Dati FX
Spot_USD = 1.08; % cambio spot, fonte Bloomberg
Fwd_USD = 1.19; % cambio forward alla scadenza del bond (ie consensus), fonte Bloomberg
sigma = 0.095; % vola storica a lungo termine USD/EUR, fonte Bloomberg
mu = 0; % drift (nullo, perché la distribuzione di probabilità è già centrata sul forward)

Stima distribuzione a scadenza con bootstrap (stima errore di stima)

Ovvero:
yield to maturity e rendimento FX, se non fa default
(recovery rate -1) e rendimento FX, se fa default
% 1) Stima delle distribuzione di probabilità
% a) Default process - istante finale (processo binomiale)
Default_Event = logical(unifrnd(0,1,nScen,1)<=ProbDefault);
% b) Rendimento a scadenza (deterministico in assenza di default)
Rendimento_bond = yield2maturity*ones(nScen,1);
% c) Rendimento dell'USD (okkio, vanno usati i reciproci dei cambi
% specificati: passo da investimenti in USD a EUR)
% Ipotizzato lognormale a scadenza
pd = makedist('Lognormal','mu',mu,'sigma',sigma);
USD = random(pd, nScen, 1);
Rendimento_USD = Spot_USD./USD - 1;
% d) Totale, con randomizzazione (chiquadro, con educated guess) del recovery rate
Rendimento = (1+Rendimento_bond).*(1+Rendimento_USD) - 1;
Rendimento(logical(Default_Event)) = max(-1, (RecoveryRate - 1 - chi2rnd(1.5, sum(Default_Event), 1)/100));
% 2) Stima nonparametrica della densità, con bootstrap, per tenere conto
% dell'errore di stima
latt = min(Rendimento)*1.2:0.0025:max(Rendimento)*1.1; % griglia per grafico
myfun = @(X) ksdensity(X,latt);
pdfestimate = myfun(Rendimento);
%Bootstrap, per considerarel'errore di stima campionaria
B = bootstrp(200,myfun, Rendimento);
%Grafico
hold on
for i=1:size(B,1),
plot(100*latt,B(i,:),'c:')
end
plot(100*latt,pdfestimate);
xlabel('Rendimento a scadenza');ylabel('Probabilità')
% 3) Metriche di rischio
    VaR5 = prctile(Rendimento, 5);
MAR = 0;
ProbShortfall = lpm(Rendimento, MAR, 0);
MeanShortfall = -lpm(Rendimento, MAR, 1);
ProbUpside = lpm(-Rendimento, MAR, 0);
MeanUpside = lpm(-Rendimento, MAR, 1);
    Indicatore = {'VaR 5%';'Probabilità rendimenti negativi';'Media rendimenti negativi';...
'Probabilità rendimenti positivi';'Media rendimenti positivi'};
Valori = [100*VaR5; 100*ProbShortfall; 100*MeanShortfall; 100*ProbUpside; 100*MeanUpside];
IndicatoriExPost = table(Valori,'RowNames',Indicatore)
IndicatoriExPost = 
                                       Valori 
_______
    VaR 5%                             -56.076
Probabilità rendimenti negativi 16.3
Media rendimenti negativi -6.2843
Probabilità rendimenti positivi 83.7
Media rendimenti positivi 14.612
One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.