import numpy as np
import pyval.procjena as procjena # private package
= 0.3
discount_rate = np.arange(100, 1000, 100)
cf
cf
array([100, 200, 300, 400, 500, 600, 700, 800, 900])
Josip Kovač
March 14, 2022
Osnovni DCF model (kako je prezentiran u teoriji) zahtijeva izračun sadašnje vrijednosti očekivanih novčanih tijekova, kroz sljedeću jednadžbu:
\[ PV = \sum_{i=1}^{n} \frac{CF_{i}}{(1 + r)^{i}} \]
To jest (pustimo na stranu Gordonov model, for now):
\[ PV = \frac{CF_{1}}{(1 + r)^{1}} + \frac{CF_{2}}{(1 + r)^{2}} + \ldots{} + \frac{CF_{n}}{(1 + r)^{n}} \]
Gdje je: * \(PV\) = sadašnja vrijednost. * \(CF\) = novčani tijek (FCFF ili FCFE). * \(n\) = zadnje razdoblje za koje se očekuje slobodan novčani tijek. * \(r\) = zahtijevani povrat. * \(i\) = razdoblje, gdje u proširenoj jednadžbi poprima vrijednosti 1, 2, …, n.
Predmetna formula je valjana, pod pretpostavkom da se očekuju novčani tijekovi striktno krajem svake godine.
No, za društva s ograničenom odgovornošću (sve poznato u praksi pod terminom closely held company), takva pretpostavka nije realna. Korištenjem end-year konvencije diskontiranja, kako je prikazano gore, u biti podcjenjuje vrijednost samog društva.
U stvarnosti, novčani tijekovi dostupni su vlasnicima za isplatu kroz godinu (stoga je i moguća isplata prije kraja godine). Kako bi to odrazili, koristimo mid-year konveciju diskontiranja, gdje svaki eskponent u nazivniku proširene jednaždbe umanjujemo za 0.5.
\[ PV = \frac{CF_{1}}{(1 + r)^{1 - 0.5}} + \frac{CF_{2}}{(1 + r)^{2 - 0.5}} + \ldots{} + \frac{CF_{n}}{(1 + r)^{n - 0.5}} \]
U nastavku je i Python primjer koji pokazuje razliku između end-year i mid-year diskontiranja:
import numpy as np
import pyval.procjena as procjena # private package
discount_rate = 0.3
cf = np.arange(100, 1000, 100)
cf
array([100, 200, 300, 400, 500, 600, 700, 800, 900])
Relativna razlika sadašnjih vrijednosti trebala bi biti \(\sqrt{1 + r}\). Idemo provjeriti:
for end, mid, time in zip(discount_end, discount_mid, time_index):
message = f"Godina {time}: END = {end:.2f}, MID = {mid:.2f}, MID / END = {mid/end:.5f}"
print(message)
Godina 1: END = 0.77, MID = 0.88, MID / END = 1.14018
Godina 2: END = 0.59, MID = 0.67, MID / END = 1.14018
Godina 3: END = 0.46, MID = 0.52, MID / END = 1.14018
Godina 4: END = 0.35, MID = 0.40, MID / END = 1.14018
Godina 5: END = 0.27, MID = 0.31, MID / END = 1.14018
Godina 6: END = 0.21, MID = 0.24, MID / END = 1.14018
Godina 7: END = 0.16, MID = 0.18, MID / END = 1.14018
Godina 8: END = 0.12, MID = 0.14, MID / END = 1.14018
Godina 9: END = 0.09, MID = 0.11, MID / END = 1.14018
Dakle, relativna razlika je konstantna. Drugim riječima, pod pretpostavkom da smo ispravno procijenili rizičnost društva (\(r = 30\\%\)), korištenjem end-year konvencije umjesto mid-year konvencije podcijenili bi društvo za 12.30%1 u odnosu na mid-year vrijednost.
Idemo provjeriti osnovanost naših zaključaka kroz izračun sadašnje vrijednosti ovog društva:
pv_end = np.sum(cf * discount_end)
pv_mid = np.sum(cf * discount_mid)
def print_res(convention: str, pv_vector: np.array) -> None:
total = np.sum(pv_vector)
message = f"PV with {convention}-year convention: {total:,.2f}"
print(message)
_data = {"end": pv_end, "mid": pv_mid}
for key, value in _data.items():
print_res(key, value)
PV with end-year convention: 1,025.34
PV with mid-year convention: 1,169.06
Dakle, i ovaj izračun pokazuje da bi podcijenili društvo za 12.30% kada bi koristili end-year umjesto mid-year konvenciju.
Procjena vrijednosti društva zahtijeva poznavanje ne samo gore prezentirane matematike, već i razloge zbog čega su formule sastavljene na način kako je prikazano. Koliko god je sam postupak procjene diskontiranja u samoj svojoj biti jednostavan, za sobom povlači određeni set pretpostavki koji možda u pojedinim slučajevima nisu primjenjivi.
\(1 - (\frac{1}{1.140175}).\)↩︎