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