Ana içeriğe geç
Kesit Power BI
İleri · Analiz

Finansal tablolar ve yatırım analizi: bilanço, nakit akışı, oranlar ve sermaye bütçelemesi

Bilanço ve muhasebe denklemi, hesap planını modellemek (hiyerarşi, işaret, sıralama), dolaylı yöntemle nakit akış tablosu, FAVÖK, likidite ve kârlılık oranları; geri ödeme, indirgenmiş geri ödeme, kârlılık endeksi, NBD profili ve iki boyutlu duyarlılık tablosu.

Uygulamada aç, 9 alıştırmayı çözÜcretsiz, hesap gerekmez, kurulum yok.

Bu sayfa dersin okuma sürümüdür. Metin bir kutuyu çalıştırmanı ya da adıma geçmeni söylüyorsa dersi uygulamada aç.

Finansal raporlama dersinde satış ve maliyet satırlarından bir gelir tablosu kurduk; bütçe sapmasını, FV/PV/PMT'yi, XNPV ve XIRR'ı gördük. Bu ders o dersin devamı: gelir tablosunun iki kardeşi olan bilanço ve nakit akış tablosu, bunlardan çıkan oranlar ve bir yatırımı seçerken kullanılan ek ölçütler.

Anadolu Market modelinde bilanço verisi yok. Bu yüzden kodların içinde DATATABLE ile küçük, varsayımsal bir şirket kuracağız. Gerçek bir projede bu satırlar muhasebe sisteminden gelen bir mizan ya da yevmiye tablosundan okunur.

Üç tablo, iki tür sayı

Bilanço ve muhasebe denklemi

Bilançonun sol tarafı (aktif) şirketin varlıklarını, sağ tarafı (pasif) bu varlıkların kaynağını gösterir. Kaynak ya borçtur (yükümlülük) ya da ortakların payıdır (özkaynak):

Varlıklar = Yükümlülükler + Özkaynak

Türkiye'deki Tekdüzen Hesap Planında hesap kodunun ilk hanesi sınıfı verir: 1 dönen varlıklar, 2 duran varlıklar, 3 kısa vadeli yabancı kaynaklar, 4 uzun vadeli yabancı kaynaklar, 5 özkaynaklar, 6 gelir tablosu hesapları. Bu kuralla denklemi yıl yıl kontrol edebiliriz:

EVALUATE
VAR Bilanco = DATATABLE("Yil", INTEGER, "Hesap", STRING, "Tutar", CURRENCY, {
    {2022, "102", 60000}, {2022, "120", 25000}, {2022, "153", 70000}, {2022, "253", 200000},
    {2022, "300", 40000}, {2022, "320", 55000}, {2022, "400", 100000},
    {2022, "500", 100000}, {2022, "570", 40000}, {2022, "590", 20000},
    {2023, "102", 85000}, {2023, "120", 40000}, {2023, "153", 95000}, {2023, "253", 230000},
    {2023, "300", 45000}, {2023, "320", 80000}, {2023, "400", 110000},
    {2023, "500", 100000}, {2023, "570", 60000}, {2023, "590", 55000},
    {2024, "102", 120000}, {2024, "120", 65000}, {2024, "153", 140000}, {2024, "253", 260000},
    {2024, "300", 55000}, {2024, "320", 120000}, {2024, "400", 120000},
    {2024, "500", 100000}, {2024, "570", 115000}, {2024, "590", 75000}})
RETURN ADDCOLUMNS(DISTINCT(SELECTCOLUMNS(Bilanco, "Yil", [Yil])),
    "Varlıklar", VAR Y = [Yil] RETURN SUMX(FILTER(Bilanco, [Yil] = Y && LEFT([Hesap], 1) IN {"1", "2"}), [Tutar]),
    "Yükümlülükler", VAR Y = [Yil] RETURN SUMX(FILTER(Bilanco, [Yil] = Y && LEFT([Hesap], 1) IN {"3", "4"}), [Tutar]),
    "Özkaynak", VAR Y = [Yil] RETURN SUMX(FILTER(Bilanco, [Yil] = Y && LEFT([Hesap], 1) = "5"), [Tutar]))
Yıl sonuVarlıklarYükümlülüklerÖzkaynak
2022355.000195.000160.000
2023450.000235.000215.000
2024585.000295.000290.000

Her yıl varlıklar, yükümlülük ile özkaynağın toplamına eşit. Raporda bu kontrolü bir ölçü olarak tut (Varlıklar − Yükümlülükler − Özkaynak) ve sıfırdan farklıysa kırmızı göster: veri yüklemesinde eksik hesap olduğunun en hızlı işaretidir. Hesaplar: 102 Bankalar, 120 Alıcılar, 153 Ticari mallar, 253 Tesis, makine ve cihazlar (net), 300 ve 400 Banka kredileri, 320 Satıcılar, 500 Sermaye, 570 Geçmiş yıllar kârları, 590 Dönem net kârı.

Hesap planını modellemek: hiyerarşi, işaret, sıralama

Muhasebe sisteminden gelen veride her satır bir hesabın borç ve alacak tutarıdır. Rapora çevirmek için üç karar gerekir:

  1. Hiyerarşi: Hesap planı tablosunda kodun ilk hanesi sınıf, ilk iki hanesi grup (60 Brüt satışlar, 61 Satış indirimleri, 62 Satışların maliyeti, 63 Faaliyet giderleri, 66 Finansman giderleri…), üç hanesi hesaptır. Bu sütunları Power Query'de ya da LEFT(HesapPlani[Hesap], 2) gibi hesaplanmış sütunlarla üret, sonra bir hiyerarşi kur (Hiyerarşiler dersi).
  2. İşaret: Gelir hesapları alacak, gider hesapları borç bakiyesi verir. Tutarı Alacak − Borç olarak alırsan gelir pozitif, gider negatif olur ve gelir tablosunun ara toplamları basit bir toplamla çıkar. Bilançoda ise aktif için Borç − Alacak, pasif için Alacak − Borç kullanılır; hesap planına bir İşaret sütunu (+1 / −1) eklemek kuralı tek yerde tutar.
  3. Sıralama: Rapor satırlarını tutan bir tablo (Sira, Satir, AraToplam) kur ve Satir sütununu “Sütuna göre sırala” ile Sira'ya bağla. Hesap planındaki her hesap bir rapor satırına eşlenir.

Ara toplam satırları (Net satışlar, Brüt kâr…) kendisinden önceki tüm satırların toplamıdır. Aşağıdaki sorgu 2024 mizanından gelir tablosunu bu kuralla kurar:

EVALUATE
VAR Mizan = DATATABLE("Hesap", STRING, "Ad", STRING, "Sira", INTEGER, "Borc", CURRENCY, "Alacak", CURRENCY, {
    {"600", "Yurt içi satışlar", 1, 0, 930000},
    {"610", "Satıştan iadeler", 2, 30000, 0},
    {"621", "Satılan ticari mallar maliyeti", 4, 560000, 0},
    {"631", "Pazarlama, satış ve dağıtım giderleri", 6, 120000, 0},
    {"632", "Genel yönetim giderleri", 6, 101250, 0},
    {"660", "Kısa vadeli borçlanma giderleri", 8, 25000, 0},
    {"691", "Dönem kârı vergi karşılığı", 10, 18750, 0}})
VAR Satirlar = DATATABLE("Sira", INTEGER, "Satir", STRING, "AraToplam", BOOLEAN, {
    {1, "Brüt satışlar", FALSE}, {2, "Satış indirimleri", FALSE}, {3, "Net satışlar", TRUE},
    {4, "Satışların maliyeti", FALSE}, {5, "Brüt kâr", TRUE}, {6, "Faaliyet giderleri", FALSE},
    {7, "Esas faaliyet kârı", TRUE}, {8, "Finansman giderleri", FALSE}, {9, "Vergi öncesi kâr", TRUE},
    {10, "Vergi", FALSE}, {11, "Dönem net kârı", TRUE}})
RETURN ADDCOLUMNS(Satirlar, "Tutar",
    VAR S = [Sira]
    VAR Ara = [AraToplam]
    RETURN IF(Ara,
        SUMX(FILTER(Mizan, [Sira] < S), [Alacak] - [Borc]),
        SUMX(FILTER(Mizan, [Sira] = S), [Alacak] - [Borc])))

Sonuç: brüt satışlar 930.000, satış indirimleri −30.000, net satışlar 900.000, satışların maliyeti −560.000, brüt kâr 340.000, faaliyet giderleri −221.250, esas faaliyet kârı 118.750, finansman giderleri −25.000, vergi öncesi kâr 93.750, vergi −18.750, dönem net kârı 75.000. Bu rakam bilançodaki 590 hesabının 2024 bakiyesiyle aynı; iki tablo birbirini doğruluyor.

Gerçek modelde aynı mantık bir ölçüdür. Yevmiye satırları hesap planına, hesap planı rapor satırlarına bağlıdır:

KZ Tutarı =
VAR Sira = SELECTEDVALUE ( RaporSatirlari[Sira] )
VAR Ara = SELECTEDVALUE ( RaporSatirlari[AraToplam] )
VAR Tutar = SUMX ( Yevmiye, Yevmiye[Alacak] - Yevmiye[Borc] )
RETURN
    IF ( Ara,
        CALCULATE ( SUMX ( Yevmiye, Yevmiye[Alacak] - Yevmiye[Borc] ),
            REMOVEFILTERS ( RaporSatirlari ), RaporSatirlari[Sira] < Sira ),
        Tutar )

Nakit akış tablosu: kâr neden kasada değil?

2024'te şirket 75.000 TL kâr etti ama bankadaki para 85.000'den 120.000'e, yani yalnızca 35.000 TL arttı. Dolaylı yöntem farkı açıklar: net kârdan başla, nakit çıkışı olmayan gideri (amortisman) geri ekle, işletme sermayesindeki değişimleri düzelt, sonra yatırım ve finansman akışlarını ekle.

EVALUATE
VAR Bilanco = DATATABLE("Yil", INTEGER, "Hesap", STRING, "Tutar", CURRENCY, {
    {2023, "102", 85000}, {2023, "120", 40000}, {2023, "153", 95000}, {2023, "253", 230000},
    {2023, "300", 45000}, {2023, "320", 80000}, {2023, "400", 110000}, {2023, "590", 55000},
    {2024, "102", 120000}, {2024, "120", 65000}, {2024, "153", 140000}, {2024, "253", 260000},
    {2024, "300", 55000}, {2024, "320", 120000}, {2024, "400", 120000}, {2024, "590", 75000}})
VAR Amortisman = 30000
VAR Fark = ADDCOLUMNS(DISTINCT(SELECTCOLUMNS(Bilanco, "Hesap", [Hesap])),
    "D", VAR H = [Hesap]
         RETURN SUMX(FILTER(Bilanco, [Hesap] = H), IF([Yil] = 2024, [Tutar], -[Tutar])))
VAR D = SELECTCOLUMNS(Fark, "Hesap", [Hesap], "D", [D])
VAR NetKar = SUMX(FILTER(Bilanco, [Hesap] = "590" && [Yil] = 2024), [Tutar])
VAR Akis = {
    ("İşletme", "Dönem net kârı", NetKar),
    ("İşletme", "Amortisman (nakit çıkışı yok)", Amortisman),
    ("İşletme", "Ticari alacak artışı", -SUMX(FILTER(D, [Hesap] = "120"), [D])),
    ("İşletme", "Stok artışı", -SUMX(FILTER(D, [Hesap] = "153"), [D])),
    ("İşletme", "Ticari borç artışı", SUMX(FILTER(D, [Hesap] = "320"), [D])),
    ("Yatırım", "Maddi duran varlık alımı", -(SUMX(FILTER(D, [Hesap] = "253"), [D]) + Amortisman)),
    ("Finansman", "Kredi değişimi (KV + UV)", SUMX(FILTER(D, [Hesap] IN {"300", "400"}), [D])) }
RETURN UNION(Akis,
    ROW("Bölüm", "Toplam", "Kalem", "Net nakit değişimi", "Tutar", SUMX(Akis, [Value3])),
    ROW("Bölüm", "Kontrol", "Kalem", "102 Bankalar değişimi", "Tutar", SUMX(FILTER(D, [Hesap] = "102"), [D])))
BölümKalem2024 (TL)
İşletmeDönem net kârı75.000
Amortisman (nakit çıkışı yok)30.000
Ticari alacak artışı−25.000
Stok artışı−45.000
Ticari borç artışı40.000
YatırımMaddi duran varlık alımı−60.000
FinansmanKredi değişimi (KV + UV)20.000
Net nakit değişimi35.000

İşletme faaliyetlerinden gelen nakit 75.000 TL; ama alacak ve stok artışı 70.000 TL nakit bağladı, tedarikçiler 40.000 TL kredi açtı. Net nakit değişimi bankadaki 35.000 TL artışla birebir aynı. Duran varlık alımı, net defter değerindeki artış (30.000) ile o yıl ayrılan amortismanın (30.000) toplamıdır.

FAVÖK ve kârlılık oranları

FAVÖK (EBITDA), esas faaliyet kârına amortismanı geri ekler; şirketin borç yapısından ve yatırım muhasebesinden bağımsız “nakit üretme gücüne” yakın bir göstergedir. Kârlılık oranları kârı farklı paydalara böler:

EVALUATE
VAR KZ = DATATABLE("Yil", INTEGER, "NetSatis", CURRENCY, "SMM", CURRENCY, "FaaliyetGideri", CURRENCY,
    "Amortisman", CURRENCY, "Faiz", CURRENCY, "Vergi", CURRENCY, "Varlik", CURRENCY, "Ozkaynak", CURRENCY, {
    {2022, 450000, 290000, 105000, 20000, 10000, 5000, 355000, 160000},
    {2023, 700000, 445000, 141250, 25000, 20000, 13750, 450000, 215000},
    {2024, 900000, 560000, 191250, 30000, 25000, 18750, 585000, 290000}})
RETURN SELECTCOLUMNS(KZ, "Yil", [Yil],
    "FAVÖK", [NetSatis] - [SMM] - [FaaliyetGideri],
    "FAVÖK marjı", DIVIDE([NetSatis] - [SMM] - [FaaliyetGideri], [NetSatis]),
    "Net kâr", [NetSatis] - [SMM] - [FaaliyetGideri] - [Amortisman] - [Faiz] - [Vergi],
    "Net marj", DIVIDE([NetSatis] - [SMM] - [FaaliyetGideri] - [Amortisman] - [Faiz] - [Vergi], [NetSatis]),
    "ROA", DIVIDE([NetSatis] - [SMM] - [FaaliyetGideri] - [Amortisman] - [Faiz] - [Vergi], [Varlik]),
    "ROE", DIVIDE([NetSatis] - [SMM] - [FaaliyetGideri] - [Amortisman] - [Faiz] - [Vergi], [Ozkaynak]))
YılFAVÖKFAVÖK marjıNet kârNet marjROAROE
202255.000%12,220.000%4,4%5,6%12,5
2023113.750%16,355.000%7,9%12,2%25,6
2024148.750%16,575.000%8,3%12,8%25,9

Likidite oranları

Likidite, kısa vadeli borçları zamanında ödeyebilme gücüdür.

EVALUATE
VAR Bilanco = DATATABLE("Yil", INTEGER, "Hesap", STRING, "Tutar", CURRENCY, {
    {2022, "102", 60000}, {2022, "120", 25000}, {2022, "153", 70000}, {2022, "300", 40000}, {2022, "320", 55000},
    {2023, "102", 85000}, {2023, "120", 40000}, {2023, "153", 95000}, {2023, "300", 45000}, {2023, "320", 80000},
    {2024, "102", 120000}, {2024, "120", 65000}, {2024, "153", 140000}, {2024, "300", 55000}, {2024, "320", 120000}})
RETURN ADDCOLUMNS(DISTINCT(SELECTCOLUMNS(Bilanco, "Yil", [Yil])),
    "Cari oran", VAR Y = [Yil] VAR B = FILTER(Bilanco, [Yil] = Y)
        RETURN DIVIDE(SUMX(FILTER(B, LEFT([Hesap], 1) = "1"), [Tutar]), SUMX(FILTER(B, LEFT([Hesap], 1) = "3"), [Tutar])),
    "Asit-test", VAR Y = [Yil] VAR B = FILTER(Bilanco, [Yil] = Y)
        RETURN DIVIDE(SUMX(FILTER(B, LEFT([Hesap], 1) = "1" && [Hesap] <> "153"), [Tutar]), SUMX(FILTER(B, LEFT([Hesap], 1) = "3"), [Tutar])))

Cari oran 2022'de 1,63, 2023'te 1,76, 2024'te 1,86; asit-test oranı sırasıyla 0,89, 1,00 ve 1,06. Cari oran iyileşirken artışın önemli kısmı stoktan geliyor (70.000 → 140.000); asit-test bu yüzden daha yavaş yükseliyor. Stokun ne kadar hızlı döndüğü de bir orandır ve bunu Anadolu Market modelinden hesaplayabiliriz:

Stok Devri (Yıl Sonu Stoğa Göre) = DIVIDE([Net Maliyet], [Stok Değeri])

2024'te net maliyet 458.504 TL, yıl sonu stok değeri 163.465 TL: stok yılda yaklaşık 2,80 kez dönüyor. Spor kategorisinde bu oran tüm dönem için 2,13 ile en düşük; Kitap'ta 8,36 ile en yüksek. Bu oranın ayrıntısı alıştırmalarda.

Sermaye bütçelemesi: geri ödeme, indirgenmiş geri ödeme, kârlılık endeksi

Şirket iki proje arasında seçim yapıyor. İkisi de bugün 200.000 TL yatırım istiyor, beş yıl nakit getiriyor; şirketin istediği getiri %15:

Yıl012345
Proje A (hızlı dönüş)−200.000110.00090.00060.00030.00010.000
Proje B (geç açılan)−200.00010.00030.00070.000130.000160.000
EVALUATE
VAR Proje = DATATABLE("Yil", INTEGER, "A", DOUBLE, "B", DOUBLE, {
    {0, -200000, -200000}, {1, 110000, 10000}, {2, 90000, 30000},
    {3, 60000, 70000}, {4, 30000, 130000}, {5, 10000, 160000}})
VAR Oran = 0.15
VAR K = ADDCOLUMNS(Proje,
    "A indirgenmiş", [A] / (1 + Oran) ^ [Yil],
    "A kümülatif", VAR Y = [Yil] RETURN SUMX(FILTER(Proje, [Yil] <= Y), [A] / (1 + Oran) ^ [Yil]))
VAR Ilk = MINX(FILTER(K, [A kümülatif] >= 0), [Yil])
VAR Onceki = MAXX(FILTER(K, [Yil] = Ilk - 1), [A kümülatif])
VAR OYil = MAXX(FILTER(K, [Yil] = Ilk), [A indirgenmiş])
RETURN ROW(
    "NBD A", SUMX(Proje, [A] / (1 + Oran) ^ [Yil]),
    "PI A", DIVIDE(SUMX(FILTER(Proje, [Yil] > 0), [A] / (1 + Oran) ^ [Yil]), 200000),
    "İndirgenmiş geri ödeme A", Ilk - 1 + DIVIDE(-Onceki, OYil))

%15 ile A'nın NBD'si 25.280 TL, kârlılık endeksi 1,13, indirgenmiş geri ödemesi 2,92 yıl. Aynı hesap B için NBD 31.282 TL, PI 1,16 ve indirgenmiş geri ödeme 4,61 yıl verir. Geri ödemeye bakan A'yı, NBD'ye bakan B'yi seçer. Hangisi doğru? Bunu tek bir oranla değil, oran aralığıyla görmek gerekir.

NBD profili: iki projeyi karşılaştırmak

NBD profili, NBD'yi bir dizi iskonto oranında çizer. GENERATESERIES oranları üretir; her oran için akışlar yıllık formülle indirgenir. (Finansal raporlama dersi tarihli akışlar için XNPV kullandı; yıllık, eşit aralıklı akışta Nakit / (1 + r)^yıl yeterli.)

EVALUATE
VAR Proje = DATATABLE("Yil", INTEGER, "A", DOUBLE, "B", DOUBLE, {
    {0, -200000, -200000}, {1, 110000, 10000}, {2, 90000, 30000},
    {3, 60000, 70000}, {4, 30000, 130000}, {5, 10000, 160000}})
RETURN ADDCOLUMNS(GENERATESERIES(0, 0.30, 0.05),
    "NBD A", VAR r = [Value] RETURN SUMX(Proje, [A] / (1 + r) ^ [Yil]),
    "NBD B", VAR r = [Value] RETURN SUMX(Proje, [B] / (1 + r) ^ [Yil]))
Oran%0%5%10%15%20%25%30
NBD A100.00070.74146.15925.2807.375−8.115−21.623
NBD B200.000129.51974.61531.282−3.331−31.283−54.085

B'nin nakdi geç geldiği için oran yükseldikçe NBD'si çok daha hızlı düşer. İki eğri yaklaşık %16,6'da kesişir (Fisher kesişimi). Bu oranın altında B, üstünde A daha değerlidir. Eğrilerin sıfırı kestiği yerler iç verim oranlarıdır: A yaklaşık %22,3, B yaklaşık %19,5. İVO'su yüksek olan A, %15'te NBD'si düşük olan projedir; birbirini dışlayan projelerde karar şirketin oranındaki NBD'ye göre verilir. Çizgi grafikte oranı eksene, iki NBD'yi değerlere koy; sıfır çizgisini sabit çizgi olarak ekle.

Duyarlılık tablosu: iki varsayımı birlikte oynatmak

NBD iki varsayıma bağlı: iskonto oranı ve nakit girişlerinin tutturulup tutturulamayacağı. CROSSJOIN ile iki seriyi çaprazlayıp her hücrede NBD hesaplayınca bir matris görselinde okunabilen bir duyarlılık tablosu çıkar:

EVALUATE
VAR Proje = DATATABLE("Yil", INTEGER, "A", DOUBLE, "B", DOUBLE, {
    {0, -200000, -200000}, {1, 110000, 10000}, {2, 90000, 30000},
    {3, 60000, 70000}, {4, 30000, 130000}, {5, 10000, 160000}})
RETURN ADDCOLUMNS(
    CROSSJOIN(
        SELECTCOLUMNS(GENERATESERIES(0.10, 0.20, 0.05), "Oran", [Value]),
        SELECTCOLUMNS(GENERATESERIES(-0.20, 0.20, 0.10), "Sapma", [Value])),
    "NBD B", VAR r = [Oran] VAR s = [Sapma]
        RETURN SUMX(Proje, IF([Yil] = 0, [B], [B] * (1 + s)) / (1 + r) ^ [Yil]))
Oran \ Girişlerde sapma−%20−%100+%10+%20
%1019.69247.15474.615102.077129.538
%15−14.9748.15431.28254.41077.538
%20−42.665−22.998−3.33116.33636.004

%15'te girişler %20 eksik gelirse B'nin NBD'si negatife döner; %10'luk bir sapma ise hâlâ tolere edilir. Raporda bu tabloyu ne olur parametreleriyle (oran ve sapma dilimleyicileri) etkileşimli yapabilirsin; kalıp Segmentasyon ve Finansal raporlama derslerindekiyle aynıdır. Koşullu biçimlendirmede negatif hücreleri kırmızı, sıfıra yakın olanları sarı yapmak kararın ne kadar kırılgan olduğunu bir bakışta gösterir.

Alıştırmalara geç (9)