Z Skrypty dla studentów Ekonofizyki UPGOW
m (→Obligacja ze stałym kuponem) |
(→Obligacja ze stałym kuponem) |
||
(Nie pokazano 27 wersji pomiędzy niniejszymi.) | |||
Linia 1: | Linia 1: | ||
- | + | ===Obligacja ze stałym kuponem=== | |
- | + | ||
Mamy obligację, której emitent zobowiązuje się do płacenia odsetek regularnie raz do roku i zamierza zwrócić zaciągnięte zobowiązanie (wartość nominalną) w chwili wykupu, na koniec życia zobowiązania. Wartość takie obligacji dane jest [[IRF:Analiza_i_wycena_instrument%C3%B3w#Cena_godziwa_.28fair_price.29|wzorem]] | Mamy obligację, której emitent zobowiązuje się do płacenia odsetek regularnie raz do roku i zamierza zwrócić zaciągnięte zobowiązanie (wartość nominalną) w chwili wykupu, na koniec życia zobowiązania. Wartość takie obligacji dane jest [[IRF:Analiza_i_wycena_instrument%C3%B3w#Cena_godziwa_.28fair_price.29|wzorem]] | ||
Linia 12: | Linia 11: | ||
<source lang="matlab"> | <source lang="matlab"> | ||
function P0=Bond_Fair_Price(PN,r,C,n) | function P0=Bond_Fair_Price(PN,r,C,n) | ||
- | P0 = sum ( C./(1+r).^[1: | + | P0 = sum ( C./(1+r).^[1:n] ) + PN/(1+r)^n; |
endfunction | endfunction | ||
+ | </source> | ||
+ | |||
+ | [[Plik:fair_price.png|thumb|360px|Wykres zależności wartości obligacji od stopy procentowej]] | ||
+ | <source lang="matlab"> | ||
+ | r=linspace(0.01,0.5,25) | ||
+ | for i=1:length(r) | ||
+ | p(i)=Bond_Fair_Price(100,r(i),7,25); | ||
+ | endfor | ||
+ | plot(r,p) | ||
</source> | </source> | ||
Linia 29: | Linia 37: | ||
<source lang="matlab"> | <source lang="matlab"> | ||
octave:157>P0=1 | octave:157>P0=1 | ||
- | octave:157>PN= | + | octave:157>PN=100 |
octave:157>r=0.07 | octave:157>r=0.07 | ||
octave:157>C=6 | octave:157>C=6 | ||
Linia 36: | Linia 44: | ||
</source> | </source> | ||
- | W przypadku [[IRF:Analiza_i_wycena_instrument%C3%B3w#Obligacja__zerokuponowa| m wypłat kuponu]] w jednym roku mamy | + | W przypadku [[IRF:Analiza_i_wycena_instrument%C3%B3w#Obligacja__zerokuponowa|m wypłat kuponu]] w jednym roku mamy |
<source lang="matlab"> | <source lang="matlab"> | ||
function P0=Bond_Fair_Price_multi(PN,r,C,n,m) | function P0=Bond_Fair_Price_multi(PN,r,C,n,m) | ||
- | P0 = sum ( (C/m)./(1+r/ | + | P0 = sum ( (C/m)./(1+r/m).^[1:n] ) + PN/(1+r/m)^n; |
endfunction | endfunction | ||
</source> | </source> | ||
Linia 50: | Linia 58: | ||
</source> | </source> | ||
- | === | + | ===Stopa zwrotu w terminie do wykupu (Yield to maturity)=== |
- | + | ||
- | + | ||
- | + | Mamy równanie na wartość obligacji po n latach z m okresami wypłaty kupona: | |
<math>\ P_o=\sum\limits_{i=1}^n\frac{C_i/m}{(1+r/m)^i} +\frac{P_N}{(1+r/m)^n}</math> | <math>\ P_o=\sum\limits_{i=1}^n\frac{C_i/m}{(1+r/m)^i} +\frac{P_N}{(1+r/m)^n}</math> | ||
- | + | i chcemy rozwiązać je na stopę r. | |
- | + | W tym celu przepiszmy do postaci: | |
- | + | ||
- | + | <math> P_0 (1+r/m)^n -\sum\limits_{i=1}^{n-1} \frac{C_{n-i}}{m}(1+r/m)^i + (-\frac{C_n}{m}-P_N) =0 | |
+ | </math> | ||
- | + | Czyli mamy wielomian stopnia n-tego na <math>(1+r/m)</math> o współczynnikach: | |
- | + | :<math> \displaystyle a_n=P_0</math> | |
+ | :<math> a_i=-\frac{C_{n-i}}{m}</math> dla i=2,3,...,n-1 | ||
+ | :<math> a_0=-\frac{C_n}{m}-P_N</math> | ||
- | + | Analitycznie nie ma ogólnych wzorów na pierwiastki wielomianu dowolnego stopnia, ale instnieją procedury numeryczne, które bardzo dobrze wykonują to zadanie. | |
+ | <source lang="matlab"> | ||
+ | function r=YTM(P0,PN,m,n,C) | ||
+ | a = [P0, -1/m*fliplr(C)(2:length(C)), -C(n)/m-PN ]; | ||
+ | myroots=roots(a); | ||
+ | r= ( max( myroots(find( imag(myroots)==0 )) ) - 1)*m; | ||
+ | endfunction | ||
+ | </source> | ||
+ | Proszę zwrócić uwagę na dwie techniki: | ||
- | === | + | # wektor współczynników wielomianu jest generowany stosując kod wektorowy a w tym między innymi funkcję fliplr odwracającą wektor (x(i)=x(-i)) |
- | Duration według Macaulay’a | + | # roots(a) wylicza pierwiastki wielomianu. Jest ich więcej niż potrzeba i część z nich jest zepspolona. Chodzi nam o największy pierwiastek rzeczywisty. W celu jego wybrania używamy funkcji find i max. |
+ | |||
+ | Dla przykładu policzmy stope 'r' dla pewnych zadanych wartości cen obligacji przy założeniu stałości kuponu (stąd C=5*ones(4)): | ||
+ | <source lang="matlab"> | ||
+ | octave:211> r=YTM(100,186,1,4,5*ones(4)) | ||
+ | r = 0.20831 | ||
+ | </source> | ||
+ | |||
+ | ===Duration według Macaulay’a === | ||
+ | |||
+ | Duration obligacji przy kapitalizacji dyskretnej jest średnią ważoną czasów transakcji z wagami proporcjonalnymi ich zdyskontowanej wielkości (PV). | ||
+ | Mamy więc wzór na wartość obligacji (fair price): | ||
+ | |||
+ | <math>P_0=\sum\limits_{i=1}^n\frac{C_i}{(1+r)^i} +\frac{P_N}{(1+r)^n}</math> | ||
+ | |||
+ | <math>D=(\sum\limits_{i=1}^n i\frac{C_i}{(1+r)^i} +n\frac{P_N}{(1+r)^n})/P_0</math> | ||
+ | |||
+ | |||
+ | Wzór ten można zaimplementować w następujący sposób jako funkcję w matlab/GNU Octave: | ||
+ | |||
+ | <source lang="matlab"> | ||
+ | function [Duration,P0]=Duration(PN,r,C,n) | ||
+ | |||
+ | P0 = sum ( C./(1+r).^[1:n] ) + PN/(1+r)^n; | ||
+ | Duration = (sum ( C./(1+r).^[1:n].*[1:n] ) + n*PN/(1+r)^n )/P0; | ||
+ | |||
+ | endfunction | ||
+ | </source> | ||
+ | |||
+ | Dla przykładu zbadajmy kilka podstawowych własności Duration: | ||
+ | |||
+ | Wiemy, że dla obligacji bezkuponowych duration jest równe czasowi wykupu. I rzeczywiście: | ||
+ | |||
+ | <source lang="matlab"> | ||
+ | Duration(100,0.1,0,7) | ||
+ | ans = 7 | ||
+ | </source> | ||
+ | [[Plik:duration.png|thumb|360px|Wykres zależności Duration od terminu lokaty (w latach) przy wyplatach kuponu raz do roku. Pięć krzywych odpowiada różnym wartościom stopy procentowej r=0.1,0.2,0.3,0.4,0.5]] | ||
+ | Zobaczmy jak zachowuje się Duration przy różnych wartościach stopy procentowej w zależności od terminu lokaty. | ||
+ | |||
+ | <source lang="matlab"> | ||
+ | r=linspace(0.1,0.5,5) | ||
+ | for j=1:length(r) | ||
+ | for i=1:20 | ||
+ | d(i,j)=Duration(100,r(j),6,i); | ||
+ | endfor | ||
+ | endfor | ||
+ | plot(1:20,d) | ||
+ | </source> |
Aktualna wersja na dzień 14:44, 8 cze 2010
Obligacja ze stałym kuponem
Mamy obligację, której emitent zobowiązuje się do płacenia odsetek regularnie raz do roku i zamierza zwrócić zaciągnięte zobowiązanie (wartość nominalną) w chwili wykupu, na koniec życia zobowiązania. Wartość takie obligacji dane jest wzorem
\(\ P_o=\sum\limits_{i=1}^n\frac{C}{(1+r)^i} +\frac{P_N}{(1+r)^n},\)
który możemy zaimplementować jako funkcję w matlabie:
function P0=Bond_Fair_Price(PN,r,C,n) P0 = sum ( C./(1+r).^[1:n] ) + PN/(1+r)^n; endfunction
r=linspace(0.01,0.5,25) for i=1:length(r) p(i)=Bond_Fair_Price(100,r(i),7,25); endfor plot(r,p)
Proszę zwrócić uwagę na frangment:
C./(1+r).^[1:(n-1)]
który tworzy wektor o elementach będących funkcją wskaźnika \(\frac{C}{(1+r)^i} \) dla \(i=1..(n-1)\).
Dysponując tą funkcją przykład ze skryptu Instrumenty Rynku można przeliczyć wywołując:
octave:157>P0=1 octave:157>PN=100 octave:157>r=0.07 octave:157>C=6 octave:157>Bond_Fair_Price(PN,r,C,2) ans = 98.192
W przypadku m wypłat kuponu w jednym roku mamy
function P0=Bond_Fair_Price_multi(PN,r,C,n,m) P0 = sum ( (C/m)./(1+r/m).^[1:n] ) + PN/(1+r/m)^n; endfunction
a w przypadku kapitalizacji ciągłej mamy:
function P0=Bond_Fair_Price_cont(PN,r,C,t) P0 = sum ( (C)*exp(-r*t) ) + PN*exp(-r*t(length(x)) endfunction
Stopa zwrotu w terminie do wykupu (Yield to maturity)
Mamy równanie na wartość obligacji po n latach z m okresami wypłaty kupona:
\(\ P_o=\sum\limits_{i=1}^n\frac{C_i/m}{(1+r/m)^i} +\frac{P_N}{(1+r/m)^n}\)
i chcemy rozwiązać je na stopę r.
W tym celu przepiszmy do postaci:
\( P_0 (1+r/m)^n -\sum\limits_{i=1}^{n-1} \frac{C_{n-i}}{m}(1+r/m)^i + (-\frac{C_n}{m}-P_N) =0 \)
Czyli mamy wielomian stopnia n-tego na \((1+r/m)\) o współczynnikach:
\[ \displaystyle a_n=P_0\] \[ a_i=-\frac{C_{n-i}}{m}\] dla i=2,3,...,n-1 \[ a_0=-\frac{C_n}{m}-P_N\]
Analitycznie nie ma ogólnych wzorów na pierwiastki wielomianu dowolnego stopnia, ale instnieją procedury numeryczne, które bardzo dobrze wykonują to zadanie.
function r=YTM(P0,PN,m,n,C) a = [P0, -1/m*fliplr(C)(2:length(C)), -C(n)/m-PN ]; myroots=roots(a); r= ( max( myroots(find( imag(myroots)==0 )) ) - 1)*m; endfunction
Proszę zwrócić uwagę na dwie techniki:
- wektor współczynników wielomianu jest generowany stosując kod wektorowy a w tym między innymi funkcję fliplr odwracającą wektor (x(i)=x(-i))
- roots(a) wylicza pierwiastki wielomianu. Jest ich więcej niż potrzeba i część z nich jest zepspolona. Chodzi nam o największy pierwiastek rzeczywisty. W celu jego wybrania używamy funkcji find i max.
Dla przykładu policzmy stope 'r' dla pewnych zadanych wartości cen obligacji przy założeniu stałości kuponu (stąd C=5*ones(4)):
octave:211> r=YTM(100,186,1,4,5*ones(4)) r = 0.20831
Duration według Macaulay’a
Duration obligacji przy kapitalizacji dyskretnej jest średnią ważoną czasów transakcji z wagami proporcjonalnymi ich zdyskontowanej wielkości (PV). Mamy więc wzór na wartość obligacji (fair price):
\(P_0=\sum\limits_{i=1}^n\frac{C_i}{(1+r)^i} +\frac{P_N}{(1+r)^n}\)
\(D=(\sum\limits_{i=1}^n i\frac{C_i}{(1+r)^i} +n\frac{P_N}{(1+r)^n})/P_0\)
Wzór ten można zaimplementować w następujący sposób jako funkcję w matlab/GNU Octave:
function [Duration,P0]=Duration(PN,r,C,n) P0 = sum ( C./(1+r).^[1:n] ) + PN/(1+r)^n; Duration = (sum ( C./(1+r).^[1:n].*[1:n] ) + n*PN/(1+r)^n )/P0; endfunction
Dla przykładu zbadajmy kilka podstawowych własności Duration:
Wiemy, że dla obligacji bezkuponowych duration jest równe czasowi wykupu. I rzeczywiście:
Duration(100,0.1,0,7) ans = 7
Zobaczmy jak zachowuje się Duration przy różnych wartościach stopy procentowej w zależności od terminu lokaty.
r=linspace(0.1,0.5,5) for j=1:length(r) for i=1:20 d(i,j)=Duration(100,r(j),6,i); endfor endfor plot(1:20,d)