Eesti pensionifondide valitsejate kulud (2025)¶

Allikad:

  • Iga fondivalitseja 2025. aasta majandusaasta aruanne (PDF) — Äriregistrist alla laetud. Kulud võetud kasumiaruandest ja kulude jaotust selgitavatest lisadest.
  • Pensionifondide netoväärtused 31.12.2025 — pensionikeskus.ee statistika.

Märkused klassifikatsiooni kohta:

  • Teenustasukulud on fondi tegevuse läbiviimisega seotud teenustasud (depootasu, järelevalve- ja garantiitasu, registripidaja tasud, vahendus-/litsentsi-/müügiteenuse tasud sh grupi-sisesed).
  • Iga fondivalitseja klassifitseerib veidi erinevalt. LHV puhul on tehtud ühtlustav ümberkategoriseerimine (vt allpool koodi kommentaare).
  • LHV andmed on konsolideeritud (AS LHV Varahaldus + tütar). Teised on standalone (üksuse) andmed.
  • Tulumaks ei ole tabelis — see ei ole tegevuskulu vaid kasumijaotusega seotud.
In [1]:
import io
from pathlib import Path

import pandas as pd
import requests
from dotenv import load_dotenv

load_dotenv('../../.env')

REPORT_YEAR = 2025
PDF_DIR = Path.home() / 'Downloads' / 'fund_manager_reports'

# Correct registry code → company name (verified against PDF page 1 of each report).
# NOTE: 11469303 is Luminor (not Tuleva), and 14118923 is Tuleva (not Luminor).
FUND_MANAGERS = {
    '10194399': 'Swedbank Investeerimisfondid',
    '10572453': 'LHV Varahaldus',
    '10035169': 'SEB Varahaldus',
    '11469303': 'Luminor Pensions Estonia',
    '14118923': 'Tuleva Fondid',
}

# Filename -> registry code. User downloaded files with my (incorrect) initial labels,
# so the Tuleva PDF is named 11469303_2025.pdf and the Luminor PDF is named 14118923_2025.pdf.
PDF_FILE = {
    '10194399': PDF_DIR / '10194399_2025.pdf',  # Swedbank
    '10572453': PDF_DIR / '10572453_2025.pdf',  # LHV
    '10035169': PDF_DIR / '10035169_2025.pdf',  # SEB
    '11469303': PDF_DIR / '14118923_2025.pdf',  # Luminor (filename labels swapped vs reg code)
    '14118923': PDF_DIR / '11469303_2025.pdf',  # Tuleva   (filename labels swapped vs reg code)
}

for code, path in PDF_FILE.items():
    assert path.exists(), f'Missing: {path}'
print('All 5 PDFs found')
All 5 PDFs found

1. Tegevuskulud kategooriate kaupa (2025)¶

Andmed iga ettevõtte kasumiaruandest ja kulude jaotust selgitavatest lisadest.

Kategooriad:

  • Depootasu — fondi varade hoidmise tasu depoopangale.
  • Muud teenustasud — kõik muud teenustasukulud: peamiselt müügi- ja vahendustasud emaettevõttele (pankadel vahendustasu, Tuleval litsentsitasu Ühistule), lisaks registripidaja tasud ja järelevalvetasu.
  • Tööjõukulud — palgakulu + sotsiaal-/töötuskindlustusmaksud + (optsioonikulud, kus rakendub)
  • Muud halduskulud — IT, õigusabi, audit, kontor, turundus, jne
  • Põhivara kulum — materiaalse ja immateriaalse põhivara kulum
  • Intressikulud — kus rakendub
  • Kapitaliseeritud kulud (memo) — kulutused, mis kanti bilanssi immateriaalseks põhivaraks selle aasta jooksul
  • Korrigeeritud KOKKU = KOKKU − Põhivara kulum + Kapitaliseeritud kulud (tegelikud aasta raha väljaminekud, sõltumata kapitaliseerimispoliitikast)

Kaks müügikulu definitsiooni:

Müük (lai) — hinnanguline kogumüük, valem:

0.5 × Tööjõukulud
+ Muud teenustasud (kogu, sh vahendustasu/litsentsitasu emaettevõttele)
+ Müügi-/turundusosa Muud halduskulud reast
+ Kapitaliseeritud müügikulud

Müük (kitsas) — ainult sõnaselgelt müügi-/turundus-/turustamis-/reklaami-/kliendisoetuskuluna kirjeldatud read aastaaruandes:

  • LHV: Müügiteenuse kulu + Turunduskulud + Reklaamikulud + Kapitaliseeritud müügikulud
  • Swedbank: Fondiosakute valitsemisteenuse vahendustasud (panga turustamise tasu) + reklaamikulu
  • SEB: Fondiosakute turustamine (panga turustamise tasu)
  • Luminor: Info- ja turunduskulud + Kapitaliseeritud kliendilepingute soetamise kulud
  • Tuleva: Kasvu- ja teavitustegevuskulud

Litsentsitasu Ühistule (Tuleva) ja Vahendustasud-väljaspool-fondiosakute-turustamist on välja jäetud kitsast definitsioonist, sest neid pole otse müügi/turunduse nimega märgistatud.

In [2]:
# Each company's 2025 expense breakdown, taken directly from the filed annual report.
# Values in EUR. Sign is positive (i.e., kulu absoluutväärtuses).

EXPENSES_2025 = {
    # === SWEDBANK INVESTEERIMISFONDID AS (10194399) ===
    # Lisa 6 Teenustasude aruanne lk 18:
    #   Vahendustasud (kohustuslike + vabatahtlike + väärtpaberiportfelli valitsemisteenuse) 8_587_957 — Swedbank Pangale fondi müümise eest
    #   Depootasud 1_476_020
    #   Registripidaja teenustasud + hooldustasud 333_491
    #   Muu teenustasukulu 277_096
    # Lisa 7 Mitmesugused tegevuskulud lk 19 — sh reklaamikulu 4_449
    '10194399': {
        'Depootasu':         1_476_020,
        'Muud teenustasud':  8_587_957 + 333_491 + 277_096,
        'Tööjõukulud':         996_080 + 311_748,
        'Muud halduskulud':  1_319_488 + 7_346,
        'Põhivara kulum':            0,
        'Intressikulud':             0,
        'Kapitaliseeritud kulud':    0,
        'Muud halduskulud — müük/turundus osa':  4_449,
        'Kapitaliseeritud — müük osa':                0,
        # Kitsas müük (sõnaselgelt müügi-/turundus-/distributsiooni-/reklaamikulu):
        #   Lisa 6: Fondiosakute valitsemisteenuse vahendustasud 8_587_957 (pangale fondi turustamise eest)
        #   Lisa 7: reklaamikulu 4_449
        'Müük (kitsas)': 8_587_957 + 4_449,
    },
    # === LHV VARAHALDUS AS (10572453) — KONSOLIDEERITUD ===
    # Lisa 13 Administratiiv- ja muud tegevuskulud lk 26 — Turunduskulud 234_734, Reklaamikulud 188_857, Müügiteenuse kulu 940_231
    '10572453': {
        'Depootasu':         587_409,
        'Muud teenustasud':  940_231 + 157_423 + 123_331 + 2_507,
        'Tööjõukulud':     2_644_130,
        'Muud halduskulud': (3_441_364 - (940_231 + 587_409 + 157_423 + 123_331 + 2_507)) + 34_826,
        'Põhivara kulum':  1_248_182,
        'Intressikulud':           0,
        'Kapitaliseeritud kulud': 422_009,
        'Muud halduskulud — müük/turundus osa': 234_734 + 188_857,
        'Kapitaliseeritud — müük osa':          422_009,
        # Kitsas müük:
        #   Lisa 13: Müügiteenuse kulu 940_231 + Turunduskulud 234_734 + Reklaamikulud 188_857
        #   Lisa 7:  Kapitaliseeritud müügikulud (kliendilepingute soetamiseks) 422_009
        'Müük (kitsas)': 940_231 + 234_734 + 188_857 + 422_009,
    },
    # === SEB VARAHALDUS AS (10035169) ===
    # Lisa 11 Teenustasukulu lk 18 (TUHANDETES eurodes):
    #   Fondiosakute turustamine 3_652 — SEB Pangale fondi müümise eest
    # Lisa 13: ei näita eraldi turundus/reklaam rida
    '10035169': {
        'Depootasu':           509_000,
        'Muud teenustasud':  3_652_000 + (521_000 - 509_000) + 143_000,
        'Tööjõukulud':         897_000,
        'Muud halduskulud':    587_000 + 3_000,
        'Põhivara kulum':       11_000,
        'Intressikulud':         1_000,
        'Kapitaliseeritud kulud':    0,
        'Muud halduskulud — müük/turundus osa':  0,
        'Kapitaliseeritud — müük osa':            0,
        # Kitsas müük:
        #   Lisa 11: Fondiosakute turustamine 3_652_000
        'Müük (kitsas)': 3_652_000,
    },
    # === LUMINOR PENSIONS ESTONIA AS (11469303) ===
    # Lisa 4 Mitmesugused tegevuskulud lk 18 — Info- ja turunduskulud 22_140
    # Lisa 8: Kapitaliseeritud kulud kliendilepingute soetamiseks 1_886_404
    '11469303': {
        'Depootasu':           303_589,
        'Muud teenustasud':    118 + 12_558 + 62_182 + 211_485,
        'Tööjõukulud':         502_417 + 143_051,
        'Muud halduskulud':    396_049,
        'Põhivara kulum':    1_877_940,
        'Intressikulud':         1_031,
        'Kapitaliseeritud kulud': 1_886_404,
        'Muud halduskulud — müük/turundus osa':  22_140,
        'Kapitaliseeritud — müük osa':        1_886_404,
        # Kitsas müük:
        #   Lisa 4: Info- ja turunduskulud 22_140
        #   Lisa 8: kliendilepingute soetamise kulud 1_886_404 (kapitaliseeritud)
        'Müük (kitsas)': 22_140 + 1_886_404,
    },
    # === TULEVA FONDID AS (14118923) ===
    # Lisa 13 Mitmesugused tegevuskulud lk 31 — Kasvu- ja teavitustegevuskulud 51_505
    # Tuleva kapitaliseeritud (252k) on arendus, mitte müük → EI loeta
    # Litsentsitasu Ühistule (595k) on litsentsitasu emaettevõttele, mitte sõnaselgelt müügikulu → EI loeta kitsasse definitsiooni
    '14118923': {
        'Depootasu':           209_659,
        'Muud teenustasud':    595_415 + 117_524 + 145_181,
        'Tööjõukulud':         908_884,
        'Muud halduskulud':    485_397,
        'Põhivara kulum':       63_035,
        'Intressikulud':             0,
        'Kapitaliseeritud kulud': 252_116,
        'Muud halduskulud — müük/turundus osa':  51_505,
        'Kapitaliseeritud — müük osa':                0,
        # Kitsas müük:
        #   Lisa 13: Kasvu- ja teavitustegevuskulud 51_505
        'Müük (kitsas)': 51_505,
    },
}

CATEGORIES = ['Depootasu', 'Muud teenustasud', 'Tööjõukulud', 'Muud halduskulud', 'Põhivara kulum', 'Intressikulud']

TOOJOU_MUUGI_OSA = 0.5

rows = []
for code, data in EXPENSES_2025.items():
    row = {'Fondivalitseja': FUND_MANAGERS[code]}
    for cat in CATEGORIES:
        row[cat] = data[cat]
    row['KOKKU'] = sum(data[c] for c in CATEGORIES)
    row['Kapitaliseeritud kulud'] = data['Kapitaliseeritud kulud']
    row['Korrigeeritud KOKKU'] = row['KOKKU'] - data['Põhivara kulum'] + data['Kapitaliseeritud kulud']
    row['Müük (lai)'] = (
        TOOJOU_MUUGI_OSA * data['Tööjõukulud']
        + data['Muud teenustasud']
        + data['Muud halduskulud — müük/turundus osa']
        + data['Kapitaliseeritud — müük osa']
    )
    row['Müük (kitsas)'] = data['Müük (kitsas)']
    rows.append(row)

expenses = pd.DataFrame(rows).set_index('Fondivalitseja').sort_values('Korrigeeritud KOKKU', ascending=False)
expenses = expenses.loc[:, expenses.sum(axis=0) > 0]

expenses_display = (expenses / 1000).round().astype(int)
expenses_display.columns = [f'{c} (€ tuh)' for c in expenses_display.columns]
expenses_display.style.format('{:,}'.format).set_caption(
    f'Fondivalitsejate tegevuskulud {REPORT_YEAR} (€ tuhandetes) — allikas: aastaaruanded'
)
Out[2]:
Fondivalitsejate tegevuskulud 2025 (€ tuhandetes) — allikas: aastaaruanded
  Depootasu (€ tuh) Muud teenustasud (€ tuh) Tööjõukulud (€ tuh) Muud halduskulud (€ tuh) Põhivara kulum (€ tuh) Intressikulud (€ tuh) KOKKU (€ tuh) Kapitaliseeritud kulud (€ tuh) Korrigeeritud KOKKU (€ tuh) Müük (lai) (€ tuh) Müük (kitsas) (€ tuh)
Fondivalitseja                      
Swedbank Investeerimisfondid 1,476 9,199 1,308 1,327 0 0 13,309 0 13,309 9,857 8,592
LHV Varahaldus 587 1,223 2,644 1,665 1,248 0 7,369 422 6,542 3,391 1,786
SEB Varahaldus 509 3,807 897 590 11 1 5,815 0 5,804 4,256 3,652
Luminor Pensions Estonia 304 286 645 396 1,878 1 3,510 1,886 3,519 2,518 1,909
Tuleva Fondid 210 858 909 485 63 0 2,525 252 2,714 1,364 52

2. Pensionifondide netoväärtus (AUM) 31.12.2025¶

Allikas: pensionikeskus.ee — avalik fondide netoväärtuse XLS eksport.

Märkused:

  • Tabel kajastab pensionikeskuses noteeritud II ja III samba fonde 31.12.2025 seisuga.
  • Tuleva Täiendav Kogumisfond (TKF) ei ole pensionikeskuse statistikas (eraldi fondikategooria) ja käivitus 02.02.2026 ehk pärast vaadeldavat perioodi.
In [3]:
II_FUND_IDS = [36,37,38,39,47,48,49,50,51,52,57,58,59,60,61,73,74,75,76,77,80,86,88,91]
III_FUND_IDS = [32,33,34,41,42,43,53,55,72,79,81,84,85,87,89,90,93]


def fetch_nav(pillar_path, fund_ids, date_from, date_to):
    """Download daily NAV data from pensionikeskus.ee."""
    params = '&'.join([f'f[{i}]={fid}' for i, fid in enumerate(fund_ids)])
    url = (f'https://www.pensionikeskus.ee/en/statistics/{pillar_path}'
           f'?download=xls&date_from={date_from}&date_to={date_to}&{params}')
    resp = requests.get(url, timeout=30)
    resp.raise_for_status()
    raw = pd.read_csv(io.BytesIO(resp.content), sep='\t', encoding='utf-16')
    raw['Fund'] = raw['Fund'].str.strip()
    raw = raw[~raw['Fund'].str.contains('Total|Kokku', case=False, na=False)]
    raw['Date'] = pd.to_datetime(raw['Date'])
    raw['Net assets'] = pd.to_numeric(
        raw['Net assets'].astype(str).str.replace(',', '').str.replace(' ', ''),
        errors='coerce')
    return raw


# Pull whole of 2025 — needed for annual-average AUM (denominator of expense ratio)
ii_nav = fetch_nav('ii-pillar/value-of-assets-of-funded-pension/', II_FUND_IDS, '2025-01-01', '2025-12-31')
iii_nav = fetch_nav('iii-pillar/value-of-assets-of-suppl-funded-pension/', III_FUND_IDS, '2025-01-01', '2025-12-31')

# End-of-year snapshot (for AUM table)
ii_eoy = ii_nav.sort_values('Date').groupby('Fund').tail(1)
iii_eoy = iii_nav.sort_values('Date').groupby('Fund').tail(1)

print(f"II pillar: {len(ii_eoy)} funds, {len(ii_nav):,} daily rows; ref date max {ii_eoy['Date'].max().date()}")
print(f"III pillar: {len(iii_eoy)} funds, {len(iii_nav):,} daily rows; ref date max {iii_eoy['Date'].max().date()}")
II pillar: 24 funds, 6,048 daily rows; ref date max 2025-12-31
III pillar: 17 funds, 4,053 daily rows; ref date max 2025-12-31
In [4]:
MANAGER_TOKENS = {
    'LHV Varahaldus':              'LHV',
    'Swedbank Investeerimisfondid':'Swedbank',
    'SEB Varahaldus':              'SEB',
    'Luminor Pensions Estonia':    'Luminor',
    'Tuleva Fondid':               'Tuleva',
}


def assign_manager(fund_name):
    for manager, token in MANAGER_TOKENS.items():
        if token.lower() in fund_name.lower():
            return manager
    return None


ii_eoy = ii_eoy.copy()
ii_eoy['Fondivalitseja'] = ii_eoy['Fund'].apply(assign_manager)
iii_eoy = iii_eoy.copy()
iii_eoy['Fondivalitseja'] = iii_eoy['Fund'].apply(assign_manager)

unmapped = pd.concat([ii_eoy[ii_eoy['Fondivalitseja'].isna()],
                      iii_eoy[iii_eoy['Fondivalitseja'].isna()]])
assert unmapped.empty, f"Unmapped funds: {unmapped['Fund'].tolist()}"

ii_by_mgr = ii_eoy.groupby('Fondivalitseja')['Net assets'].sum()
iii_by_mgr = iii_eoy.groupby('Fondivalitseja')['Net assets'].sum()

aum = pd.DataFrame({
    'II sammas (€)': ii_by_mgr,
    'III sammas (€)': iii_by_mgr,
}).reindex(list(MANAGER_TOKENS.keys())).fillna(0)
aum['KOKKU (€)'] = aum.sum(axis=1)
aum = aum.sort_values('KOKKU (€)', ascending=False)

aum_display = (aum / 1_000_000).round(1)
aum_display.columns = ['II sammas (mln €)', 'III sammas (mln €)', 'KOKKU (mln €)']
aum_display['Turuosa %'] = (aum['KOKKU (€)'] / aum['KOKKU (€)'].sum() * 100).round(1)

aum_display.style.format({
    'II sammas (mln €)':  '{:,.1f}',
    'III sammas (mln €)': '{:,.1f}',
    'KOKKU (mln €)':      '{:,.1f}',
    'Turuosa %':          '{:.1f}%',
}).set_caption('Pensionifondide netoväärtus 31.12.2025 — allikas: pensionikeskus.ee')
Out[4]:
Pensionifondide netoväärtus 31.12.2025 — allikas: pensionikeskus.ee
  II sammas (mln €) III sammas (mln €) KOKKU (mln €) Turuosa %
Fondivalitseja        
Swedbank Investeerimisfondid 2,682.3 362.5 3,044.8 38.4%
LHV Varahaldus 1,539.0 140.6 1,679.6 21.2%
Tuleva Fondid 918.8 461.7 1,380.5 17.4%
SEB Varahaldus 1,108.8 116.9 1,225.7 15.4%
Luminor Pensions Estonia 557.5 45.5 603.0 7.6%

3. Korrigeeritud kulu / keskmine AUM (2025)¶

Suhtarvuna: korrigeeritud aastane raha väljaminek (vt jaotis 1) jagatud keskmise AUM-iga 2025. aasta jooksul.

Keskmine AUM arvutatakse päevase netoväärtuse keskmisena 2025. aastal (II + III sammas kokku).

In [5]:
# Average AUM per fund (daily mean over 2025), summed by manager
ii_avg = ii_nav.groupby('Fund')['Net assets'].mean()
iii_avg = iii_nav.groupby('Fund')['Net assets'].mean()

ii_avg_df = ii_avg.reset_index()
iii_avg_df = iii_avg.reset_index()
ii_avg_df['Fondivalitseja'] = ii_avg_df['Fund'].apply(assign_manager)
iii_avg_df['Fondivalitseja'] = iii_avg_df['Fund'].apply(assign_manager)

avg_aum_by_mgr = pd.concat([ii_avg_df, iii_avg_df]).groupby('Fondivalitseja')['Net assets'].sum()

korr_kokku   = pd.Series({FUND_MANAGERS[code]: row['Korrigeeritud KOKKU'] for code, row in zip(EXPENSES_2025, rows)})
muugi_lai    = pd.Series({FUND_MANAGERS[code]: row['Müük (lai)']          for code, row in zip(EXPENSES_2025, rows)})
muugi_kitsas = pd.Series({FUND_MANAGERS[code]: row['Müük (kitsas)']       for code, row in zip(EXPENSES_2025, rows)})

ratio_df = pd.DataFrame({
    'Korr. KOKKU (€)':   korr_kokku,
    'Müük lai (€)':      muugi_lai,
    'Müük kitsas (€)':   muugi_kitsas,
    'Keskmine AUM (€)':  avg_aum_by_mgr,
})
ratio_df['Korr. kulu / AUM (bps)'] = ratio_df['Korr. KOKKU (€)']  / ratio_df['Keskmine AUM (€)'] * 10_000
ratio_df['Müük lai / AUM (bps)']    = ratio_df['Müük lai (€)']    / ratio_df['Keskmine AUM (€)'] * 10_000
ratio_df['Müük kitsas / AUM (bps)'] = ratio_df['Müük kitsas (€)'] / ratio_df['Keskmine AUM (€)'] * 10_000
ratio_df = ratio_df.sort_values('Korr. kulu / AUM (bps)', ascending=False)

ratio_display = ratio_df.copy()
ratio_display['Korr. KOKKU (mln €)']  = (ratio_display['Korr. KOKKU (€)']  / 1_000_000).round(2)
ratio_display['Müük lai (mln €)']     = (ratio_display['Müük lai (€)']     / 1_000_000).round(2)
ratio_display['Müük kitsas (mln €)']  = (ratio_display['Müük kitsas (€)']  / 1_000_000).round(2)
ratio_display['Keskmine AUM (mln €)'] = (ratio_display['Keskmine AUM (€)'] / 1_000_000).round(1)
ratio_display = ratio_display[['Korr. KOKKU (mln €)', 'Müük lai (mln €)', 'Müük kitsas (mln €)',
                                'Keskmine AUM (mln €)',
                                'Korr. kulu / AUM (bps)', 'Müük lai / AUM (bps)', 'Müük kitsas / AUM (bps)']]

ratio_display.style.format({
    'Korr. KOKKU (mln €)':       '{:,.2f}',
    'Müük lai (mln €)':          '{:,.2f}',
    'Müük kitsas (mln €)':       '{:,.2f}',
    'Keskmine AUM (mln €)':      '{:,.1f}',
    'Korr. kulu / AUM (bps)':    '{:.1f}',
    'Müük lai / AUM (bps)':      '{:.1f}',
    'Müük kitsas / AUM (bps)':   '{:.1f}',
}).set_caption('Korr. kulu ja müügikulud vs keskmine AUM 2025')
Out[5]:
Korr. kulu ja müügikulud vs keskmine AUM 2025
  Korr. KOKKU (mln €) Müük lai (mln €) Müük kitsas (mln €) Keskmine AUM (mln €) Korr. kulu / AUM (bps) Müük lai / AUM (bps) Müük kitsas / AUM (bps)
Luminor Pensions Estonia 3.52 2.52 1.91 529.8 66.4 47.5 36.0
SEB Varahaldus 5.80 4.26 3.65 1,111.8 52.2 38.3 32.8
Swedbank Investeerimisfondid 13.31 9.86 8.59 2,755.3 48.3 35.8 31.2
LHV Varahaldus 6.54 3.39 1.79 1,532.4 42.7 22.1 11.7
Tuleva Fondid 2.71 1.36 0.05 1,174.4 23.1 11.6 0.4

4. Hinnanguline kliendisoetuskulu (CAC) 2025¶

II samba fondide vahetuste põhjal (allikas: data/ii_pillar_switching.csv — pensionikeskuse fondide vahetuste statistika 2025. aasta 3 arvelduspäeva kohta: 2. jaanuar, 2. mai, 1. september 2025).

  • Sissevool / väljavool (arv): kõikidesse fondivalitseja fondidesse sissetulnud / väljaläinud isikute arv (II samba vahetused). Sisaldab ka grupisiseseid (fondivalitseja siseseid) liikumisi — need taanduvad netos välja.
  • Netovõit (arv): sissevool − väljavool. Negatiivne = fondivalitseja kaotab kokkuvõttes kliente.
  • Bruto-CAC = hinn. müük/turundus / sissevool (kulu klientide hankimise kohta, sõltumata sellest, kas nad jäid).
  • Neto-CAC = hinn. müük/turundus / netovõit. Pole tähenduslik, kui netovõit on negatiivne.

Märkused:

  • II samba uusi kogujaid (16-aastased + Eesti uusresidendid) see analüüs EI sisalda — need lähevad vaikimisi fondidesse jaotuse alusel ega ole fondivalitseja "müügitulemus".
  • III samba uusi kogujaid ka mitte. Eeldatakse et müük/turundus läheb proportsionaalselt II ja III samba peale.
In [6]:
# Fund → manager mapping (from ii_pillar_switching.ipynb)
SWITCH_FUND_MANAGER = {
    # Tuleva
    'EE3600109435': 'Tuleva Fondid', 'EE3600109443': 'Tuleva Fondid',
    # LHV
    'EE3600019832': 'LHV Varahaldus', 'EE3600109401': 'LHV Varahaldus',
    'EE3600019766': 'LHV Varahaldus', 'EE3600019782': 'LHV Varahaldus',
    'EE3600019774': 'LHV Varahaldus', 'EE3600109476': 'LHV Varahaldus',
    'EE3600019824': 'LHV Varahaldus', 'EE3600001723': 'LHV Varahaldus',
    # SEB
    'EE3600001699': 'SEB Varahaldus', 'EE3600019725': 'SEB Varahaldus',
    'EE3600098612': 'SEB Varahaldus', 'EE3600019717': 'SEB Varahaldus',
    'EE3600109427': 'SEB Varahaldus', 'EE3600103297': 'SEB Varahaldus',
    # Swedbank
    'EE3600001814': 'Swedbank Investeerimisfondid', 'EE3600019741': 'Swedbank Investeerimisfondid',
    'EE3600019758': 'Swedbank Investeerimisfondid', 'EE3600103248': 'Swedbank Investeerimisfondid',
    'EE3600001848': 'Swedbank Investeerimisfondid', 'EE3600109393': 'Swedbank Investeerimisfondid',
    'EE3600019733': 'Swedbank Investeerimisfondid',
    # Luminor
    'EE3600103503': 'Luminor Pensions Estonia', 'EE3600098430': 'Luminor Pensions Estonia',
    'EE3600098448': 'Luminor Pensions Estonia', 'EE3600098455': 'Luminor Pensions Estonia',
    'EE3600001806': 'Luminor Pensions Estonia',
}

switch = pd.read_csv('data/ii_pillar_switching.csv')
switch['Fondivalitseja'] = switch['isin'].map(SWITCH_FUND_MANAGER)
unmapped = switch[switch['Fondivalitseja'].isna()]['isin'].unique().tolist()
assert not unmapped, f'Unmapped ISINs: {unmapped}'

PERIODS_2025 = ['2025-01-02', '2025-05-02', '2025-09-01']
switch_2025 = switch[switch['period_date'].isin(PERIODS_2025)]

flows = switch_2025.groupby('Fondivalitseja').agg(
    Sissevool=('inflow_count', 'sum'),
    Väljavool=('outflow_count', 'sum'),
).assign(Netovõit=lambda d: d['Sissevool'] - d['Väljavool'])

muugi_lai = pd.Series({FUND_MANAGERS[code]: row['Müük (lai)']    for code, row in zip(EXPENSES_2025, rows)})
muugi_kitsas = pd.Series({FUND_MANAGERS[code]: row['Müük (kitsas)'] for code, row in zip(EXPENSES_2025, rows)})

cac = flows.copy()
cac['Müük lai (mln €)']    = (muugi_lai / 1_000_000).round(2)
cac['Müük kitsas (mln €)'] = (muugi_kitsas / 1_000_000).round(2)
cac['Bruto-CAC lai (€)']    = (muugi_lai    / cac['Sissevool']).round(0).astype(int)
cac['Bruto-CAC kitsas (€)'] = (muugi_kitsas / cac['Sissevool']).round(0).astype(int)
cac['Neto-CAC lai (€)']    = (muugi_lai    / cac['Netovõit'].where(cac['Netovõit'] > 0, pd.NA))
cac['Neto-CAC kitsas (€)'] = (muugi_kitsas / cac['Netovõit'].where(cac['Netovõit'] > 0, pd.NA))

cac = cac.sort_values('Netovõit', ascending=False)
display_cols = ['Sissevool', 'Väljavool', 'Netovõit',
                'Müük lai (mln €)',    'Bruto-CAC lai (€)',    'Neto-CAC lai (€)',
                'Müük kitsas (mln €)', 'Bruto-CAC kitsas (€)', 'Neto-CAC kitsas (€)']
cac_display = cac[display_cols]

cac_display.style.format({
    'Sissevool':              '{:,}',
    'Väljavool':              '{:,}',
    'Netovõit':               '{:+,}',
    'Müük lai (mln €)':       '{:,.2f}',
    'Müük kitsas (mln €)':    '{:,.2f}',
    'Bruto-CAC lai (€)':      '{:,}',
    'Bruto-CAC kitsas (€)':   '{:,}',
    'Neto-CAC lai (€)':       lambda v: '—' if pd.isna(v) else f'{v:,.0f}',
    'Neto-CAC kitsas (€)':    lambda v: '—' if pd.isna(v) else f'{v:,.0f}',
}).set_caption('Hinnanguline kliendisoetuskulu (CAC) 2025 — laia ja kitsa definitsiooniga')
Out[6]:
Hinnanguline kliendisoetuskulu (CAC) 2025 — laia ja kitsa definitsiooniga
  Sissevool Väljavool Netovõit Müük lai (mln €) Bruto-CAC lai (€) Neto-CAC lai (€) Müük kitsas (mln €) Bruto-CAC kitsas (€) Neto-CAC kitsas (€)
Fondivalitseja                  
Tuleva Fondid 6,688 1,430 +5,258 1.36 204 259 0.05 8 10
Luminor Pensions Estonia 12,054 8,480 +3,574 2.52 209 704 1.91 158 534
Swedbank Investeerimisfondid 16,347 14,096 +2,251 9.86 603 4,379 8.59 526 3,817
SEB Varahaldus 7,390 8,467 -1,077 4.26 576 — 3.65 494 —
LHV Varahaldus 12,056 22,062 -10,006 3.39 281 — 1.79 148 —

5. II samba "churn" 2025 (väljavool % AUM-ist)¶

Hinnanguline aastapõhine churn II sambas: kui suur osa fondivalitseja II samba varadest läks teistesse fondidesse vahetuste käigus.

  • Lugeja: 2025. aasta 3 vahetuspäeval (jaan, mai, sep) toimunud väljavoolu summa (€) fondivalitseja kõikidest II samba fondidest.
  • Nimetaja: II samba AUM 31.12.2024 (= 2025. aasta algusseis) ainult.

Märkused:

  • Bruto-väljavool sisaldab ka grupisiseseid liikumisi (nt LHV Ettevõtlikust → LHV Indeksisse). Selles mõttes on tegu pigem fondi tasandi churn'iga, mille summa fondivalitseja kõikide fondide üle. Tegelik fondivalitsejate vahel kaduvate varade osakaal on madalam (pole avalikult eraldatud).
  • Sisaldab ainult II sammast (uued kogujad, fondipension, surmajuhud jne ei kajastu).
In [7]:
# Start-of-2025 (= end-2024) II pillar AUM per fund
ii_nav_2024 = fetch_nav('ii-pillar/value-of-assets-of-funded-pension/', II_FUND_IDS, '2024-12-15', '2024-12-31')
ii_start = ii_nav_2024.sort_values('Date').groupby('Fund').tail(1)
ii_start = ii_start.copy()
ii_start['Fondivalitseja'] = ii_start['Fund'].apply(assign_manager)
ii_start_by_mgr = ii_start.groupby('Fondivalitseja')['Net assets'].sum()

# II pillar inflows and outflows during 2025 (€)
flows_eur_2025 = switch_2025.groupby('Fondivalitseja').agg(
    Sissevool_EUR=('inflow_amount', 'sum'),
    Väljavool_EUR=('outflow_amount', 'sum'),
)

churn_df = pd.DataFrame({
    'II AUM 31.12.2024 (€)':    ii_start_by_mgr,
    'Sissevool 2025 (€)':       flows_eur_2025['Sissevool_EUR'],
    'Väljavool 2025 (€)':       flows_eur_2025['Väljavool_EUR'],
})
churn_df['Sissevool %'] = churn_df['Sissevool 2025 (€)'] / churn_df['II AUM 31.12.2024 (€)']
churn_df['Churn %']     = churn_df['Väljavool 2025 (€)'] / churn_df['II AUM 31.12.2024 (€)']
churn_df['Neto %']      = churn_df['Sissevool %'] - churn_df['Churn %']
churn_df = churn_df.sort_values('Churn %', ascending=False)

churn_display = churn_df.copy()
churn_display['II AUM 31.12.2024 (mln €)'] = (churn_display['II AUM 31.12.2024 (€)'] / 1_000_000).round(0).astype(int)
churn_display['Sissevool 2025 (mln €)']    = (churn_display['Sissevool 2025 (€)']    / 1_000_000).round(1)
churn_display['Väljavool 2025 (mln €)']    = (churn_display['Väljavool 2025 (€)']    / 1_000_000).round(1)
churn_display = churn_display[['II AUM 31.12.2024 (mln €)', 'Sissevool 2025 (mln €)', 'Väljavool 2025 (mln €)',
                                'Sissevool %', 'Churn %', 'Neto %']]

churn_display.style.format({
    'II AUM 31.12.2024 (mln €)': '{:,}',
    'Sissevool 2025 (mln €)':    '{:,.1f}',
    'Väljavool 2025 (mln €)':    '{:,.1f}',
    'Sissevool %':               '{:.1%}',
    'Churn %':                   '{:.1%}',
    'Neto %':                    '{:+.1%}',
}).set_caption('II samba churn 2025 — väljavool % algusperioodi AUM-ist (allikas: pensionikeskus)')
Out[7]:
II samba churn 2025 — väljavool % algusperioodi AUM-ist (allikas: pensionikeskus)
  II AUM 31.12.2024 (mln €) Sissevool 2025 (mln €) Väljavool 2025 (mln €) Sissevool % Churn % Neto %
Fondivalitseja            
Luminor Pensions Estonia 443 154.0 85.2 34.7% 19.2% +15.5%
LHV Varahaldus 1,386 91.1 229.4 6.6% 16.6% -10.0%
SEB Varahaldus 992 71.4 77.4 7.2% 7.8% -0.6%
Swedbank Investeerimisfondid 2,377 143.9 137.1 6.1% 5.8% +0.3%
Tuleva Fondid 712 81.7 13.0 11.5% 1.8% +9.7%