MKZR:sandbox

Z Skrypty dla studentów Ekonofizyki UPGOW

(Różnice między wersjami)
(Utworzył nową stronę „=== Y ====''Cena godziwa ( fair price)''==== Jeśli mamy obligację, której emitent zobowiązuje się do płacenia odsetek regularnie raz do roku i zamierza zwróc…”)
(Obligacja ze stałym kuponem)
 
(Nie pokazano 37 wersji pomiędzy niniejszymi.)
Linia 1: Linia 1:
-
=== Y
 
-
====''Cena godziwa ( fair price)''====
+
===Obligacja ze stałym kuponem===
-
Jeśli 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, to godziwa cena  takiego instrumentu jest wynikiem zdyskontowanej wartości  bieżacej przepływów pieniężnych generowanych przez takie zobowiązanie. Stopa dyskontowa jest określana przez rynek.
+
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]]
<math>\ P_o=\sum\limits_{i=1}^n\frac{C}{(1+r)^i} +\frac{P_N}{(1+r)^n},</math>  
<math>\ P_o=\sum\limits_{i=1}^n\frac{C}{(1+r)^i} +\frac{P_N}{(1+r)^n},</math>  
-
gdzie
+
który możemy zaimplementować jako funkcję w matlabie:
-
C – odsetki (ang. coupon)
+
-
<math>P_o</math> – wartość obligacji
+
<source lang="matlab">
 +
function P0=Bond_Fair_Price(PN,r,C,n)
 +
  P0 = sum ( C./(1+r).^[1:n] ) + PN/(1+r)^n;
 +
endfunction
 +
</source>
-
<math>P_n</math> – wartość nominalna
+
[[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>
-
r - stopa dyskontowa
+
Proszę zwrócić uwagę na frangment:
 +
<source lang="matlab">
 +
  C./(1+r).^[1:(n-1)]
 +
</source>
 +
który tworzy wektor o elementach będących funkcją wskaźnika
 +
<math>\frac{C}{(1+r)^i} </math> dla <math>i=1..(n-1)</math>.
-
; Przykład: (obligacja ze stałym kuponem)
 
-
Jaka  jest wartość obligacji  o terminie wykupu przypadającym za dwa lata. Wartość
 
-
nominalna tej obligacji wynosi 100, oprocentowanie 6%, odsetki płacone są co rok.
 
-
Wymagana stopa dochodu określona przez inwestora wynosi 7% w skali roku.
 
-
Po podstawieniu do wzoru otrzymujemy:
+
Dysponując tą funkcją [[IRF:Analiza_i_wycena_instrument%C3%B3w#Cena_godziwa_.28fair_price.29|przykład]] ze skryptu Instrumenty Rynku można przeliczyć wywołując:
-
<math>\ P_o=\frac{6}{(1+0,07)^1} +\frac{106}{(1+0,07)^2}.</math>  
+
<source lang="matlab">
 +
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
 +
</source>
-
W naszym przypadku:
+
W przypadku [[IRF:Analiza_i_wycena_instrument%C3%B3w#Obligacja__zerokuponowa|m wypłat kuponu]] w jednym roku mamy
 +
<source lang="matlab">
 +
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
 +
</source>
-
<math>C=0,06x100 = 0,06</math>
+
a w przypadku [[IRF:Analiza_i_wycena_instrument%C3%B3w#Wycena_przy_kapitalizacji_ci.C4.85g.C5.82ej|kapitalizacji ciągłej]] mamy:
 +
<source lang="matlab">
 +
function P0=Bond_Fair_Price_cont(PN,r,C,t)
 +
  P0 = sum ( (C)*exp(-r*t) ) + PN*exp(-r*t(length(x))
 +
endfunction
 +
</source>
-
<math>R = 7% = 0,07.</math>
+
===Stopa zwrotu w terminie do wykupu (Yield to maturity)===
-
(Wartość nominalna wynosi 100 czyli w 2 roku nastąpi wpływ <math>\frac{100+6}{(1+0,07)^2} </math> )
+
 +
Mamy równanie na wartość obligacji po n latach z m okresami wypłaty kupona:
-
Dla naszego inwestora wartość tej obligacji wynosi 98,2 jednostek.
+
<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:
-
'''Stopa zwrotu w terminie do wykupu ( Yield to maturity)'''
+
<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:
-
Do tego momenty  mówiąc o cenie obligacji używając wzoru:
+
-
<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> \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>
-
Wyceniając ciąg płatności zakładaliśmy wartość stopy dyskontowej.
+
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 ];
-
Na rynku mamy sytuacje nieco inna  znamy  raczej bieżące, ceny rynkowe obligacji. Aby wiec wycenić jej stopę zwrotu  czyli stopę od chwili nabycia do końca życia  instrumentu powinno się za stronę lewą równania wstawić wartość rynkowa  obligacji i wyliczyć stopę zwrotu.
+
  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))
 +
# 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>
-
Tak wyliczona stopa zwrotu to jest  nic innego niż wewnętrzna stopa zwrotu ( IRR) z inwestycji.
+
Dla przykładu zbadajmy kilka podstawowych własności Duration:
-
Stopa zwrotu w terminie do dnia wykupu ( YTM)  liczona przy założeniu reinwestowania kuponów  po rentowności YTM.
+
Wiemy, że dla obligacji bezkuponowych duration jest równe czasowi wykupu. I rzeczywiście:
-
Wylicza się rozwiązując powyższe równanie względem r.
+
<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.
-
Łatwiej jest napisać  ''rozwiązując'' niż to zrobić. Nie znamy analitycznej postaci rozwiązania - stosuje się w tym przypadku metody przybliżone.
+
<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
Wykres zależności wartości obligacji od stopy procentowej
 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:

  1. 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))
  2. 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
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.

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)