[{"content":"The brief: a retailer buried in spreadsheets Picture a mid-size multi-category retailer — electronics, furniture, clothing — selling across nineteen Indian states through five different payment channels. Every month, someone exports two flat files from the order system and is expected to answer, from memory or a pivot table: which category is actually profitable? Which states are carrying the business? And — the question that usually gets skipped — how many orders are we quietly losing money on?\nThat\u0026rsquo;s the brief this project answers: turn two disconnected transactional exports into a single, filterable Sales Performance Dashboard that a manager can open, glance at for ten seconds, and trust.\nDon\u0026rsquo;t want to dig through Power Query steps and DAX right now? This one-page overview covers what the dashboard does and what it found, with the report itself, in about two minutes.\nRead the 1-page project overview (PDF) Sales Performance Dashboard — Project Overview \u0026larr; 1 / … \u0026rarr; Download Loading document… The data: 500 orders, 1,500 line items, one dataset The source is a public two-table order export from Kaggle (\u0026ldquo;Online Sales Data\u0026rdquo;), split across two files that mirror a real order-management system:\nraw_sales_orders.csv (originally Orders.csv) — 500 rows, one per order: Order ID, Order Date, Customer Name, State, City. raw_order_line_items.csv (originally Details.csv) — 1,500 rows, one per product line: Order ID, Amount, Profit, Quantity, Category, Sub-Category, Payment Mode. The two files share an Order ID — an average of three line items per order — which is exactly the one-to-many relationship a proper data model needs to be built around, rather than flattened into one wide, repetitive table.\nFirst look: what the raw data actually looks like Before any cleaning, both files land in Power Query typed as plain ABC Text — including the amounts, the quantities, and the dates. Nothing is aggregatable and nothing is trustworthy yet.\nRaw Orders.csv and Details.csv previews, before any Power Query transformation Raw data as it lands in Power BI — every column typed as text, including numbers. Two issues are already visible: the Order Date format, and a stray trailing space on \u0026ldquo;Kerala \u0026ldquo;.\nA quick profiling pass on the raw files turned up:\nZero missing values across both files — a clean export, at least on that front. Zero exact duplicate rows — no line-item was accidentally exported twice. One quiet data-quality flaw: 16 of the 500 orders carry the state value \u0026quot;Kerala \u0026quot; — with a trailing space. It doesn\u0026rsquo;t fracture the reporting today (there\u0026rsquo;s no clean \u0026quot;Kerala\u0026quot; value competing with it), but it\u0026rsquo;s exactly the kind of invisible character that silently breaks a GROUP BY or a slicer match the moment a second, cleaner data source gets merged in. Flagged for the next data refresh. A landmine in the date column — covered in detail below, because it\u0026rsquo;s the most important fix in this entire project. The cleaning process: one fix that mattered more than all the others Most of the \u0026ldquo;cleaning\u0026rdquo; here wasn\u0026rsquo;t about missing values or duplicates — the raw export was already fairly disciplined. It was about correctly interpreting data that was typed correctly but read wrong.\n1. Promote headers, then type the numbers. Amount, Profit, and Quantity arrive as text and get cast to Currency and whole-number types respectively — a normal, low-risk step.\n2. The Order Date trap. Every date in Orders.csv is stored as plain text in DD-MM-YYYY format — e.g. \u0026quot;27-12-2018\u0026quot;. Power BI\u0026rsquo;s default locale for casting a text column to a date is en-US, which reads that same string as MM-DD-YYYY. Run the numbers on this dataset and the trap becomes obvious:\nUnder en-US (MM-DD-YYYY) Under fr-FR (DD-MM-YYYY) Dates where the day exceeds 12 (e.g. 27-12-2018) 307 of 500 rows (61.4%) throw a parsing error — there is no 27th month Parsed correctly as December 27 Remaining 193 rows (day ≤ 12, e.g. 10-03-2018) Parse silently — but as March 10 instead of the correct October 3 Parsed correctly as October 3 In other words: left on the default locale, six out of ten rows would have failed outright, and the other four would have been silently wrong — day and month swapped, with no error to catch it. The fix is a single, deliberate step in the M query: cast the column to type date under the fr-FR locale instead of the workbook default, since French date formatting also reads day-before-month.\nPower Query Editor — Applied Steps showing the locale-aware date cast The step that saves the dataset: \u0026ldquo;Changed Type with Locale — fr-FR,\u0026rdquo; applied only to Order Date, after headers are promoted and the other columns are typed.\nThat single step is the difference between a dashboard with a broken monthly trend line and one that can be trusted.\nModeling the data: building a star schema With both tables typed correctly, the next decision was not to merge them into one flat table. Keeping Orders (grain: one row per order) and Details (grain: one row per product line) as separate fact tables — joined on Order ID — avoids duplicating customer and location data across every line item, and keeps both grains available for the right kind of aggregation.\nA calculated Dim_Date table was added on top, spanning the full order date range, to unlock real time-intelligence: year, quarter, month name, a sortable Year-Month key, and weekend/current-period flags — none of which exist naturally in a raw date column.\nStar-schema data model — Orders and Details fact tables linked to a Date dimension, with the measures table The relationships: Details[Order ID] → Orders[Order ID] (many-to-one), and Orders[Order Date] → Dim_Date[Date] (many-to-one) — a small but genuine star schema.\nThe brains of the dashboard: eleven DAX measures All of the dashboard\u0026rsquo;s numbers are centralized in a dedicated _Measures table rather than scattered across visuals — a habit that pays off the moment a formula needs to change in one place instead of six. The core set:\nMeasure Logic Total Sales SUM(Details[Amount]) Total Profit SUM(Details[Profit]) Profit Margin % DIVIDE([Total Profit], [Total Sales]) Order Count DISTINCTCOUNT(Orders[Order ID]) Average Order Value DIVIDE([Total Sales], [Order Count]) Sales YTD / MTD TOTALYTD / TOTALMTD over Dim_Date[Date] Sales Same Period Last Year SAMEPERIODLASTYEAR YoY Growth % Current vs. same-period-last-year, as a % Loss-Making Orders Count DISTINCTCOUNT of orders where Profit \u0026lt; 0 That last measure is the one that turns the dashboard from a reporting tool into a diagnostic one — it\u0026rsquo;s what powers the flagged table at the bottom of the report.\nThe dashboard: Sales Performance Overview Everything above exists to feed a single page, designed to answer the brief\u0026rsquo;s questions in one screen, filterable by year and category.\nFull Sales Performance Overview dashboard — KPI row, monthly trend, category/state/payment breakdowns, and loss-making orders table The full report: five KPI cards, a monthly trend line, three breakdown charts, and a flagged transaction table — all responding live to the Year and Category slicers.\nKPI row. Five cards keep the headline numbers always visible, regardless of what\u0026rsquo;s filtered below: $437,771 in total sales, $36,963 in total profit, an 8.4% blended profit margin, 500 distinct orders, and an $876 average order value.\nFive KPI cards — Total Sales, Total Profit, Profit Margin %, Order Count, Average Order Value Sales trend by month. A full year (2018) of monthly sales, immediately showing the shape of demand: a strong Q1 open, a mid-year trough in July, and a rebound into Q4.\nSales Trend by Month line chart Category, state, and payment breakdowns. Three side-by-side visuals slice the same $437,771 three different ways — by product category, by geography, and by how customers pay.\nSales by Category and Sales by State bar charts Sales by Payment Mode donut chart Loss-making orders — needs review. The table every retailer\u0026rsquo;s finance team actually wants: every line item where Profit \u0026lt; 0, sorted for review, with a conditional red highlight so it can\u0026rsquo;t be scrolled past by accident.\nLoss-Making Orders table, filtered to Profit less than zero What the numbers actually say Pulling the dashboard\u0026rsquo;s own output together into a short read:\nElectronics leads on revenue ($166,267) but the margin story doesn\u0026rsquo;t stop there. Clothing ($144,323) and Furniture ($127,181) are close behind — this is not a business with one dominant category, it\u0026rsquo;s three roughly comparable ones, which matters for how inventory and marketing budget get split. Two states carry disproportionate weight. Maharashtra ($102,498) and Madhya Pradesh ($87,463) together account for 43% of total sales despite being 2 of 19 states — a concentration worth flagging to anyone planning regional expansion or logistics. Cash on Delivery still dominates, at 35.4% of sales — ahead of Credit Card (19.9%), EMI (17.8%), UPI (15.7%), and Debit Card (11.2%). For a business thinking about payment-processing costs or cash-flow timing, that\u0026rsquo;s a meaningfully different risk profile than a card-first customer base. The uncomfortable number: nearly half of all orders lose money on at least one line item. 529 of 1,500 line items (35.3%) — spread across 248 of the 500 distinct orders (49.6%) — carry negative profit. That\u0026rsquo;s the number the Total Profit KPI alone would never surface, and exactly why the Loss-Making Orders table exists as a standing fixture on the page rather than a one-off query. The verdict: what this project delivers The end result isn\u0026rsquo;t just a pretty report — it\u0026rsquo;s a data pipeline where every number on the page can be traced back to a specific, auditable transformation: a locale-aware date cast that prevented 61% of the dataset from silently corrupting, a star-schema model that keeps order-level and line-item-level analysis both possible, and a measures layer that turns \u0026ldquo;what\u0026rsquo;s our profit\u0026rdquo; into \u0026ldquo;which 248 orders should we actually be looking at.\u0026rdquo; That\u0026rsquo;s the difference between a dashboard that looks good in a screenshot and one a business can actually run on.\nStack: Power BI Desktop (PBIP source-controlled format) · Power Query (M) · DAX · Git for version control of the report definition.\nSource data: \u0026ldquo;Online Sales Data\u0026rdquo; (Kaggle) — two-table CSV export of retail orders and order line items.\n","permalink":"/posts/interactive-financial-dashboard/","summary":"Two raw CSVs, one silent date-parsing trap that would have corrupted 61% of the data, a star-schema model, and 11 DAX measures — the full build of a Power BI Sales Performance dashboard, end to end, with before/after evidence at every cleaning step.","title":"Sales Performance Dashboard: From Two Raw CSVs to a Boardroom-Ready Power BI Report"},{"content":"This project note is written in French — the source documents, the sell-side context, and the intended audience for this analysis are all Moroccan, so it felt more natural to keep the write-up in the language of the underlying research. An English executive summary is above; a full English version is available on request.\nValorisation d\u0026rsquo;Entreprise · DCF · Modèle Financier\nAkdital S.A. — Modèle à trois états financiers \u0026amp; Valorisation DCF Un modèle à trois états financiers entièrement lié (compte de résultat, bilan, tableau de flux de trésorerie) et une valorisation par actualisation des flux de trésorerie disponibles (DCF) d\u0026rsquo;Akdital S.A., premier groupe de santé privée coté au Maroc (Bourse de Casablanca : AKT) — construit sous Excel, avec chaque ligne projetée traçable jusqu\u0026rsquo;à une hypothèse documentée.\nCible — Akdital S.A. (AKT) Valorisation 1 852 MAD Cours de bourse 1 170 MAD Upside implicite \u0026#43;58,3 % CMPC6,78 %Horizon2023-2033 Un aperçu simple, avant le détail Pas envie d\u0026rsquo;ouvrir le modèle Excel tout de suite ? Cet aperçu visuel d\u0026rsquo;une page résume le projet en deux minutes : le contexte, les indicateurs clés et ce que fait le modèle.\nLire l\u0026#39;aperçu du projet (PDF, 1 page) Akdital — Aperçu du Projet \u0026larr; 1 / … \u0026rarr; Télécharger Chargement du document… Le rapport et le modèle Pour aller plus loin, deux documents accompagnent cette note : le rapport de synthèse (méthodologie, hypothèses, résultats et limites, en 1 page) et le modèle Excel complet (9 onglets liés, historique 2023-2025 à prolongation 2033). Le rapport se lit directement ci-dessous, page par page, sans quitter le site — le bouton Télécharger reste disponible pour une lecture hors ligne ou l\u0026rsquo;ouverture du modèle Excel.\nTélécharger le rapport (PDF) Télécharger le modèle (Excel) Rapport Akdital — Modèle \u0026amp; Valorisation DCF \u0026larr; 1 / … \u0026rarr; Télécharger Chargement du document… Pourquoi Akdital ? Akdital est un consolidateur de cliniques privées en pleine phase d\u0026rsquo;expansion structurelle : 41 établissements et 4 505 lits fin 2025, avec un objectif de 62 établissements et plus de 6 200 lits d\u0026rsquo;ici 2027, et un déploiement international naissant (Arabie saoudite, Émirats, Tunisie) censé porter l\u0026rsquo;international à environ 35 % du chiffre d\u0026rsquo;affaires consolidé d\u0026rsquo;ici 2030. Le CA est passé de 1,9 Md MAD en 2023 à 4,4 Md MAD en 2025 — un CAGR d\u0026rsquo;environ 52 % — financé par un capex représentant 50 à 90 % du CA certaines années.\nC\u0026rsquo;est exactement le profil — croissance hyper-rapide du CA, investissement massif en amont, rentabilité qui monte progressivement en régime — où un DCF prend tout son sens, et où une erreur sur le capex, le financement ou l\u0026rsquo;horizon de valeur terminale peut faire varier le résultat d\u0026rsquo;un ordre de grandeur.\n1. Les données historiques — la fondation du modèle Compte de résultat et bilan historiques 2023-2025 Avant de projeter quoi que ce soit, chaque poste du compte de résultat et du bilan 2023-2025 a été ressaisi depuis les rapports financiers annuels consolidés d\u0026rsquo;Akdital, colonne par colonne — jamais depuis une colonne comparative d\u0026rsquo;un rapport ultérieur, pour éviter les écarts de reclassement. Les cellules de contrôle (CR, Bilan, TFT) sont vérifiées à zéro : les trois états sont rigoureusement cohérents entre eux avant même de commencer à projeter. C\u0026rsquo;est cette discipline qui permet de faire confiance au DCF qui en découle huit onglets plus loin — un modèle est aussi solide que sa base historique.\n2. L\u0026rsquo;onglet Hypothèses — le tableau de pilotage Onglet Hypothèses — les 6 blocs qui pilotent le modèle Six blocs pilotent l\u0026rsquo;intégralité du modèle : croissance du CA, marge EBITDA cible, BFR en % du CA, capex en % du CA, taux d\u0026rsquo;imposition, et coût de la dette. Chaque bloc affiche l\u0026rsquo;historique (lien vert), l\u0026rsquo;hypothèse projetée (cellule bleue sur fond jaune, modifiable), et une note justificative citant sa source — par exemple la convergence du taux d\u0026rsquo;imposition marocain vers 33 % suit la Loi de Finances 2023, tandis que la trajectoire du capex a été révisée après audit pour refléter l\u0026rsquo;objectif de désendettement du management (levier net/EBITDA ≈ 0,7x visé en 2030). Modifier une seule cellule ici recalcule automatiquement tous les onglets en aval — c\u0026rsquo;est la seule source de vérité du modèle.\nZoom — croissance, marge et BFR :\nZoom sur les hypothèses de croissance du CA, marge EBITDA cible et BFR Zoom — capex, fiscalité et coût de la dette :\nZoom sur les hypothèses de capex, taux d\u0026rsquo;imposition et coût de la dette 3. Compte de résultat prévisionnel Compte de résultat prévisionnel 2026-2030 Le CA projeté découle mécaniquement de l\u0026rsquo;hypothèse de croissance ; les achats, charges de personnel et autres charges d\u0026rsquo;exploitation sont ventilés depuis la structure de charges observée en 2025 (ratios calculés en bas de l\u0026rsquo;onglet), plutôt que projetés indépendamment — ce qui évite l\u0026rsquo;erreur classique de faire dériver la marge EBIT du modèle par une accumulation d\u0026rsquo;hypothèses non coordonnées. La marge EBITDA converge de 27,5 % (2025) vers 30,5 % (2030), reflétant la maturation progressive du réseau et l\u0026rsquo;effet d\u0026rsquo;échelle.\n4. Bilan prévisionnel — le mécanisme de bouclage Bilan prévisionnel 2026-2030 C\u0026rsquo;est l\u0026rsquo;onglet le plus technique du modèle. La trésorerie n\u0026rsquo;est pas une hypothèse : elle est calculée à partir d\u0026rsquo;un flux de trésorerie simplifié (résultat net + dotations − variation du BFR − capex − dividendes). La dette de financement, elle, sert de variable d\u0026rsquo;ajustement (plug) qui absorbe l\u0026rsquo;écart résiduel nécessaire pour que Total Actif = Total Passif à chaque exercice — une simplification documentée, en l\u0026rsquo;absence d\u0026rsquo;un échéancier de remboursement explicite dans les hypothèses. Le modèle fait apparaître une trésorerie négative dès 2026, signal clair que le financement du programme de capex national nécessitera un tirage de dette qui n\u0026rsquo;est pas encore structuré poste par poste (obligataire, bancaire, etc.).\n5. Tableau de flux de trésorerie prévisionnel Tableau de flux de trésorerie prévisionnel 2026-2030 Le TFT prévisionnel n\u0026rsquo;est pas une projection indépendante : chaque ligne est un lien direct vers le Compte de résultat et le Bilan. La preuve de cohérence est explicite dans l\u0026rsquo;onglet : la trésorerie de clôture calculée ici correspond, à l\u0026rsquo;arrondi près, à la trésorerie du Bilan sur toute la période 2026-2030 — la démonstration que les trois états restent bien articulés après six onglets de formules en cascade.\n6. Construction du WACC et valorisation DCF Construction du WACC, FCFF et pont de valorisation Le FCFF (Free Cash Flow to Firm) part de l\u0026rsquo;EBIT, retire l\u0026rsquo;impôt théorique, réintègre les dotations, puis soustrait le capex et la variation du BFR — négatif en 2026-2027 tant que le programme national absorbe plus de cash que l\u0026rsquo;activité n\u0026rsquo;en génère, puis franchement positif à partir de 2028. Le WACC (6,78 %) combine un taux sans risque marocain à 10 ans (3,40 %), un bêta sectoriel santé relevé selon Hamada (0,63) à la structure de capital en valeur de marché — point crucial de l\u0026rsquo;audit, détaillé plus bas.\nZoom — FCFF et construction du WACC :\nZoom sur le calcul du FCFF et la construction du WACC Zoom — valeur terminale, actualisation, valorisation et sensibilité :\nZoom sur la valeur terminale, l\u0026rsquo;actualisation des FCFF, le pont de valorisation et la table de sensibilité 7. La prolongation explicite (fade) et l\u0026rsquo;audit du modèle Section de prolongation 2031-2033 et mémo de comparaison des scénarios La première version du DCF donnait 261,84 MAD/action, soit -77,6 % vs le cours de bourse — un écart si large qu\u0026rsquo;il a déclenché un audit méthodique plutôt qu\u0026rsquo;un simple ajustement du résultat. Trois corrections :\nCapex maintenu trop haut trop longtemps. La trajectoire initiale gardait un capex élevé jusqu\u0026rsquo;en 2030, incompatible avec la stabilisation anticipée par le sell-side (BKGR) à partir de 2026 et l\u0026rsquo;objectif de désendettement du management. Révisé pour redescendre à 12 % du CA dès 2030. WACC construit sur les capitaux propres comptables plutôt que la valeur de marché. Les capitaux propres comptables (~2,9 Md MAD) représentent moins d\u0026rsquo;un sixième de la capitalisation boursière réelle (~16,6 Md MAD) — sous-pondérant fortement le poids des fonds propres. Corrigé en valeur de marché : le WACC passe de 6,38 % à 6,78 %. Un horizon de 5 ans tronquait l\u0026rsquo;histoire de croissance. Appliquer un Gordon Growth de 2,5 % directement après 2030 ignorait qu\u0026rsquo;un consensus sell-side situe encore la croissance à ~24,5 % CAGR à cet horizon. Une prolongation explicite de 3 ans (2031-2033) a été ajoutée, avec une décélération progressive de 12 % à 5 % avant le calcul de la valeur terminale. Un quatrième point, plus fin, a été traité séparément de ces trois corrections : le pont valeur d\u0026rsquo;entreprise → capitaux propres était juste dans son principe dès la première version, mais la dette nette qui l\u0026rsquo;alimentait méritait d\u0026rsquo;être reconstruite avec plus de rigueur. Elle inclut désormais la trésorerie passif (concours bancaires court terme) en plus de la dette de financement long terme, et déduit les titres et valeurs de placement en quasi-liquidités — soit 3 371 MDH. Ce chiffre a ensuite été réconcilié avec l\u0026rsquo;endettement net consolidé publié par Akdital (4 268 MDH) : l\u0026rsquo;écart de 897 MDH s\u0026rsquo;explique par un périmètre publié plus large (dettes de loyers IFRS 16, autres dettes financières non classées en « dettes de financement », TVP non déduites). Par transparence méthodologique, le modèle présente les deux bases côte à côte : Base A — dette financière nette du modèle, retenue dans le résultat principal (1 852 MAD, +58,3 %) et Base B — endettement net publié (1 788 MAD, +52,8 %), qui partagent la même valeur d\u0026rsquo;entreprise. Ce n\u0026rsquo;est pas une quatrième erreur : l\u0026rsquo;estimation initiale de la dette nette était défendable, elle a simplement été rendue plus rigoureuse et plus transparente.\nAvec les trois corrections combinées et ce raffinement de la dette nette, le modèle converge vers 1 851,62 MAD/action (+58,3 %) — juste en-deçà de la cible la plus haussière du sell-side (Beltone Research, 1 870 MAD) et dans la fourchette du consensus (1 493-1 870 MAD).\n8. Tableau de bord — vision d\u0026rsquo;ensemble Tableau de bord — indicateurs clés, chiffre d\u0026rsquo;affaires et marge EBITDA 2023-2033 Le tableau de bord regroupe les indicateurs clés (valeur DCF, upside, WACC, EV) et deux graphiques liés par formule : la trajectoire du CA (historique réel 2023-2025 puis projection jusqu\u0026rsquo;en 2033) et la marge EBITDA (creux en 2025-2026 lié à la montée en charge des nouvelles cliniques, puis remontée avec l\u0026rsquo;effet d\u0026rsquo;échelle). Le FCFF par année et le pont de valorisation — bascule de négatif à positif en 2028, EV de 29,7 MMDH diminué de la dette nette et des intérêts minoritaires pour une valeur des capitaux propres de 26,2 MMDH — sont détaillés dans les tableaux de la section DCF ci-dessus plutôt que reproduits ici en graphique, la mise en page d\u0026rsquo;impression d\u0026rsquo;origine ne conservant pas ces deux graphiques lisibles à cette échelle.\nSensibilité — valeur par action (MAD) selon WACC et croissance terminale (g) WACC \\ g 1,5% 2,0% 2,5% 3,0% 3,5% 5,78% 1 998 2 279 2 646 3 144 3 860 6,28% 1 709 1 924 2 195 2 550 3 032 6,78% 1 475 1 644 1 852 2 115 2 458 7,28% 1 283 1 418 1 581 1 782 2 037 7,78% 1 122 1 232 1 363 1 521 1 715 Football Field — Fourchette de Valorisation (MAD/action) DCF (sensibilité g, WACC 6,78 %) 1 475 – 2 458 MAD Consensus Sell-Side 1 493 – 1 870 MAD Cours de Marché (AKT) 1 170 MAD Limites Le tirage de dette supplémentaire nécessaire pour financer le capex 2026-2029 n\u0026rsquo;est pas encore structuré explicitement (échéancier, taux, sûretés) — la dette de financement du bilan est une variable d\u0026rsquo;ajustement, pas un plan de financement détaillé. La prime de risque marché Maroc (6,5 %) est une estimation raisonnée, non extraite directement d\u0026rsquo;une base de données de référence type Damodaran. La prolongation 2031-2033 repose sur une hypothèse de décélération qui, si elle s\u0026rsquo;avère trop optimiste ou trop prudente, a un effet de levier important sur la valeur terminale (voir la table de sensibilité). Ce document ne constitue pas une recommandation d\u0026rsquo;investissement. Un écart résiduel avec le cours de marché peut rester légitime : le marché price aussi le risque d\u0026rsquo;exécution du plan d\u0026rsquo;expansion, la liquidité du titre et l\u0026rsquo;incertitude sur le financement de l\u0026rsquo;expansion internationale. Sources : rapports financiers annuels consolidés Akdital S.A. (2023-2025, Bourse de Casablanca / akdital.ma) ; communiqués de presse et conférence de résultats T4 2025 / mars 2026 ; notes sell-side citées dans le modèle (BKGR, CFG Bank, Beltone Research) ; Loi de Finances 2023 (convergence IS), Code Général des Impôts marocain.\n","permalink":"/posts/akdital-post/","summary":"Modèle à trois états financiers entièrement lié et valorisation DCF d\u0026rsquo;Akdital S.A., premier groupe de santé privée coté au Maroc — avec un audit documenté qui a corrigé les hypothèses de capex, la structure du WACC et l\u0026rsquo;horizon de valeur terminale.","title":"Akdital S.A. — Modèle à trois états financiers \u0026 Valorisation DCF"},{"content":"On July 28th, Grant Thornton Advisors — backed by New Mountain Capital — agreed to take CBIZ, Inc. (NYSE: CBZ) private for $55.00 a share, all cash, $5.0 billion of enterprise value. It\u0026rsquo;s the largest going-private transaction the accounting profession has seen in a generation: a partnership, not a public acquirer, taking a NYSE-listed, $5 billion accounting and advisory platform off the market entirely, funded the way private equity funds everything — with a term loan sized off EBITDA and an equity check sized to make the financing balance.\nThat\u0026rsquo;s the tell. There\u0026rsquo;s no combined-entity EPS to accrete or dilute, because there\u0026rsquo;s no public acquirer. Grant Thornton Advisors is a private partnership that New Mountain Capital has controlled since May 2024, funding this deal through a parent vehicle with New Mountain Partners VII equity and third-party debt. Strip away the merger-model instinct and what\u0026rsquo;s left is a much older question: does the sponsor\u0026rsquo;s return clear its hurdle? That\u0026rsquo;s a leveraged buyout question, and because the price is already public, it\u0026rsquo;s not the usual forward-looking exercise of solving for what a sponsor could pay. I held the entry fixed at $55.00 — as-announced — and built everything downstream of it: financing structure, operating case, debt paydown, exit, and a full decomposition of where the equity return actually comes from.\nThe deal in brief Target CBIZ, Inc. (NYSE: CBZ) — accounting, tax, advisory and benefits/insurance services Buyer Grant Thornton Advisors, backed by New Mountain Capital Structure All-cash take-private Offer price $55.00/share Enterprise value $5.0 billion Premium to 30-day VWAP 54.0% Premium to last undisturbed close 17.8% Committed financing $5.2 billion (equity + debt, per DEFA14A) Company termination fee $107.5 million Go-shop period Through August 27, 2026 Expected close Q4 2026 CBIZ carries this into the deal: $2,758.0 million of FY2025 revenue, $446.9 million of Adjusted EBITDA (16.2% margin), and $1,454.1 million of net debt (mostly the financing left over from CBIZ\u0026rsquo;s own November 2024 acquisition of Marcum\u0026rsquo;s non-attest practice). The model below is built entirely from that base — CBIZ\u0026rsquo;s 10-K, its Q4/FY2025 results, the merger 8-K, and the DEFA14A — with every financing, operating, and exit assumption clearly my own where the filings are silent.\nNot in the mood to open a full LBO model yet? This one-page overview covers the deal, the approach, and what the model found — a 2-minute read before the exhibits below.\nRead the 1-page project overview (PDF) CBIZ Take-Private LBO — Project Overview \u0026larr; 1 / … \u0026rarr; Download Loading document… Download the full LBO model (.xlsx) Entry: what $55.00 actually buys Bridge the announced $5.0 billion enterprise value against $1,454.1 million of net debt and the implied equity value is $3,545.9 million. Divide by $55.00 and you get roughly 64.5 million fully diluted shares — noticeably more than the ~50.1 million basic count on CBIZ\u0026rsquo;s 10-K cover page, or the ~54.4 million on its balance sheet. The gap is real, and it has a specific cause: CBIZ still owes stock to Marcum\u0026rsquo;s former partners, delivered monthly over a 36-month schedule tied to the 2024 acquisition. It\u0026rsquo;s the fully diluted figure — not the headline cover number — that actually reconciles to the deal, and it\u0026rsquo;s the kind of detail that quietly wrecks a model if you grab the first share count a search engine hands you.\nAt that share count, CBIZ is being bought for 1.8x FY2025 revenue and 11.2x FY2025 Adjusted EBITDA — full, but not outlandish for a recurring-revenue professional-services platform.\nExhibit 1 — Transaction Summary \u0026amp; Entry Valuation Exhibit 1: the EV-to-equity bridge, the share-count reconciliation, and entry multiples — all anchored to the announced $55.00 and $5.0bn EV.\nFinancing it: a bottom-up build that lands inside the committed envelope The 8-K discloses $5.2 billion of committed financing without breaking out the split, so I built the capital structure from first principles rather than taking it on faith. At 5.5x FY2025 Adjusted EBITDA — a leverage assumption I calibrated to 2024–2026 sponsor-deal averages in the leveraged-loan market, not a disclosed number — the new Term Loan B comes to $2,458.0 million. Layer on financing fees (2.5% of new funded debt) and advisory fees (1.5% of EV), and total uses come to $5,154.7 million. New Mountain\u0026rsquo;s sponsor equity check is the plug that makes sources equal uses: $2,696.8 million, or 52.3% of the capital structure.\nTotal modeled financing comes to $5,154.7 million against the $5.2 billion actually committed — within 0.87%. That\u0026rsquo;s not proof the leverage assumption is correct; I built the structure without seeing the commitment letters. But a bottom-up build landing inside 1% of a disclosed number I never touched is a decent sanity check.\nExhibit 2 — Sources \u0026amp; Uses Exhibit 2: new debt sized off leverage, sponsor equity as the balancing plug, reconciled to the $5.2bn committed financing — the meaningful test, since sources always equal uses by construction.\nThe Term Loan B prices at SOFR (4.00%) plus a 450 basis-point spread — 8.50% all-in — benchmarked to actual early-2026 B-rated vintage deals rather than disclosed terms. That\u0026rsquo;s a real cost: across the hold, total cash interest on this structure comes to roughly $796.8 million.\nThe operating case New Mountain is actually buying I modeled 5% annual organic revenue growth — no bolt-on M\u0026amp;A, deliberately, since that\u0026rsquo;s exactly the kind of upside a sponsor would want to keep separate from a base case rather than bake in. Revenue goes from $2,758.0 million to $3,520.0 million by FY2030. Adjusted EBITDA margin expands from 16.2% to 17.4% — 120 basis points over five years — pushing EBITDA to $612.5 million, an EBITDA CAGR of 6.5% that outgrows revenue on margin alone.\nThat margin ramp is New Mountain\u0026rsquo;s efficiency thesis, expressed as a spreadsheet: finishing the Marcum integration, offshoring back-office functions, AI-assisted workflow tools. It\u0026rsquo;s a believable, not heroic, read on that playbook — and it\u0026rsquo;s the only lever driving EBITDA growth here, since I held revenue growth flat and excluded acquisitive upside entirely. Working capital is built bottom-up off CBIZ\u0026rsquo;s actual FY2025 balance sheet (receivables on a 73.6-day DSO, payables and accrued personnel as a share of revenue) rather than an assumed percentage of revenue growth — it implies 10.1% of incremental revenue, a more conservative (and better-sourced) figure than the simpler plug it replaced.\nExhibit 3 — Operating Projections Exhibit 3: 5% organic growth and 120bps of margin expansion are the entire New Mountain operating thesis, FY2025A through the FY2030E exit year.\nDebt paydown: a cash sweep that isn\u0026rsquo;t what it looks like Here\u0026rsquo;s where this model earns its complexity. The Term Loan carries 1.0% scheduled amortization on original principal — a flat $24.6 million a year — plus a cash sweep that is not a flat 100%. It\u0026rsquo;s a leverage-based step-down, re-tested every year against that year\u0026rsquo;s opening net leverage: 50% of excess free cash flow is swept above 4.50x, 25% between 3.50x and 4.50x, and 0% below 3.50x. CBIZ enters at 5.46x net leverage, so the sweep runs hot early and shuts off almost entirely by FY2030E, when opening leverage has already fallen below 3.5x.\nThe consequence is not obvious from the entry-to-exit leverage numbers alone. Net leverage still de-levers cleanly, from 5.5x gross at entry to 2.37x at exit — but cumulative Term Loan paydown over the whole hold is only $292.4 million of the $2,458.0 million original principal. The rest of the deleveraging happens because cash builds up on the balance sheet — from $18.3 million retained at close to $715.3 million by FY2030E — not because the loan gets smaller. Gross debt, and therefore cash interest, stays higher for longer than a \u0026ldquo;100% sweep\u0026rdquo; story would suggest. It\u0026rsquo;s a more realistic mechanic than a flat sweep (real credit agreements almost always step down like this), but it means the headline deleveraging number is doing less work than it looks like.\nTwo more things this schedule gets right that a simpler model wouldn\u0026rsquo;t: cash interest is charged on the average of opening and closing balance (a deliberate circularity — closing balance depends on the sweep, the sweep depends on free cash flow, free cash flow depends on this interest line — resolved by Excel\u0026rsquo;s iterative calculation rather than sidestepped by charging interest on the opening balance alone; there\u0026rsquo;s a breaker switch that reverts to opening-balance interest if the iteration ever needs to be reset after a bad paste or a deleted row). And the growing cash balance isn\u0026rsquo;t just sitting there: it earns interest income at SOFR less a 50bp deposit spread, which feeds back into the §163(j) test below — business interest income raises the deduction cap dollar-for-dollar, so for as long as the cap binds, interest earned on the cash pile is effectively untaxed. By FY2030E that interest income offsets almost 11% of the year\u0026rsquo;s cash interest expense.\nCash taxes themselves are computed on §163(j)-limited taxable income, not book pre-tax income — the U.S. business-interest deduction caps at 30% of adjusted taxable income (≈EBIT, no D\u0026amp;A add-back post-2022), with disallowed interest carried forward indefinitely. On a 5.5x-levered structure, that cap binds every year of the hold, so a meaningful share of the cash interest actually paid earns no current tax shield at all; by FY2030E the disallowed-interest carryforward has built to $222.1 million, a tax attribute that transfers with the company at exit and isn\u0026rsquo;t valued anywhere in this model\u0026rsquo;s returns.\nExhibit 4 — Debt Schedule \u0026amp; Deleveraging Exhibit 4: the Term Loan rollforward, the leverage-triggered sweep step-down, and the resulting net leverage path — 5.50x at entry to 2.37x at exit, driven more by cash accumulation than by loan repayment.\nOne more mechanical point worth flagging because it changes the IRR math: the model assumes the sponsor\u0026rsquo;s equity funds on December 15, 2026 — a 16-day stub in FY2026E — against a FY2030E fiscal-year-end exit. That\u0026rsquo;s a 4.05-year calendar hold, not five fiscal years. Every flow in the stub year is scaled to the 16 days actually owned; the headline IRR (MOIC^(1/hold) − 1) and a dated XIRR on the actual cash flows reconcile to the same number to the fourth decimal. It\u0026rsquo;s a small thing, but crediting a sponsor with a full first year of deleveraging it didn\u0026rsquo;t own would flatter the IRR by a meaningful margin.\nExit and returns Exit is modeled multiple-neutral — 11.2x FY2030E Adjusted EBITDA, the same multiple CBIZ is being bought at, so nothing here assumes a friendlier buyer shows up later. That\u0026rsquo;s $6,859.7 million of exit enterprise value on $612.5 million of exit EBITDA. Less $1,450.3 million of exit net debt, gross exit equity is $5,409.5 million.\nThe sponsor doesn\u0026rsquo;t keep all of that. I modeled a 10% management incentive pool — appreciation-only, paid on value created above the sponsor\u0026rsquo;s entry cheque — which is a realistic feature of how these deals actually get structured, not a disclosed term. It takes $271.3 million, leaving sponsor-net exit equity of $5,138.2 million.\nAgainst the $2,696.8 million entry cheque: 1.91x MOIC, 17.3% net IRR. Before the management pool, gross MOIC is 2.01x and gross IRR is 18.8% — the pool costs the sponsor about 1.5 points of IRR.\nExhibit 5 — Returns Summary Exhibit 5: entry equity to exit equity, gross and net of the management pool, with the MOIC^(1/hold) IRR reconciled exactly against a dated XIRR.\nThe centerpiece: where the return actually comes from This is the number that matters more than the IRR itself. Decompose the $2,441.4 million of sponsor equity value created and it isn\u0026rsquo;t close:\nDriver $ millions % of total EBITDA growth (at entry multiple) +1,852.5 75.9% Multiple change +7.2 0.3% Debt paydown / deleveraging +989.4 40.5% Management incentive pool (271.3) (11.1%) Residual — transaction \u0026amp; financing fees (136.4) (5.6%) Total 2,441.4 100% Three-quarters of the return is organic EBITDA growth, valued at the entry multiple so it isn\u0026rsquo;t quietly co-mingled with any re-rating. Another 40% comes from deleveraging — which, per the debt schedule above, is mostly a growing cash balance rather than a shrinking loan. Multiple expansion contributes almost nothing, by design: the exit is multiple-neutral. That\u0026rsquo;s a specific, checkable claim, not a hand-wave — the fee bucket alone (financing fees plus advisory fees funded in Uses at close) accounts for the entire residual, to the dollar.\nExhibit 6 — Value-Creation Bridge Exhibit 6: the equity bridge from entry to exit. Growth and deleveraging do essentially all the work; the management pool and transaction fees are the only drags.\nWhat\u0026rsquo;s not in this bridge: the Benefits \u0026amp; Insurance carve-out that\u0026rsquo;s part of the actual announced transaction. CBIZ\u0026rsquo;s Benefits \u0026amp; Insurance segment does not appear anywhere in this model — not as a revenue line item split out, not as a divestiture, not as a source of proceeds. I built the operating case as if the sponsor owns and grows all of CBIZ through FY2030E. That cuts both ways, and I\u0026rsquo;ve split the two directions apart rather than blending them: it means a potential value-creation lever (carve-out proceeds) is missing from the upside case, discussed below — and it means the leverage and coverage figures earlier in this piece are almost certainly flattered, which is the first item in \u0026ldquo;Where I could be wrong.\u0026rdquo;\nSensitivities: what has to move, and by how much Hold the operating case fixed and flex exit multiple against exit-year EBITDA, and the base case sits almost exactly in the middle of a realistic range — 6.7% IRR in the worst corner (9.2x exit, -10% EBITDA) to 26.5% in the best (13.2x exit, +10% EBITDA).\nExhibit 7 — Returns Sensitivity Exhibit 7: sponsor-net IRR across exit multiple and exit-year EBITDA. The 17.3% base case sits at 11.2x / 0% shift — dead center, not an outlier assumption in either direction.\nSolved the other way — what exit multiple does New Mountain need for a given target IRR, holding the base operating case — the picture is specific: clearing 15% needs 10.5x, actually below the 11.2x entry. Clearing 20%, closer to a standard platform-deal hurdle, needs about 12.1x — roughly nine-tenths of a turn above entry. Clearing 25% needs about 13.9x, over two and a half turns of expansion. The floor — where the sponsor merely gets its money back, 1.0x MOIC — is 6.8x, a level that would require the kind of collapse professional-services multiples haven\u0026rsquo;t seen in this cycle.\nOne mechanical note on that grid, because it\u0026rsquo;s the kind of thing that\u0026rsquo;s easy to fake and worth checking: each EBITDA column re-derives its own exit net debt rather than holding it fixed at the base case. A -10% EBITDA column doesn\u0026rsquo;t just shrink the exit-equity numerator — it also scales down the cumulative cash sweep for that column (less free cash flow means less optional prepayment), so exit net debt in the worst corner is genuinely higher than in the base case, not held artificially low while only the multiple and EBITDA move.\nDownside and Stress: the scenario toggle, not just an exit-multiple flex Everything above is the base case — 5% annual revenue growth, margin expanding to 17.4% by FY2030E. The model doesn\u0026rsquo;t only run that one case: there\u0026rsquo;s a scenario toggle that swaps in an entirely different revenue and margin path, which cascades through the debt schedule (a different EBITDA path changes the leverage-sweep tier tested every year) and into the returns bridge, rather than just flexing the exit multiple around a fixed operating case the way the sensitivity grid above does.\nDownside holds revenue growth to 3% a year with margin flat at the FY2025A 16.2% — the read being that Marcum synergies fail to drop through and 3% growth doesn\u0026rsquo;t generate enough operating leverage to move the margin at all. Stress is harsher and asymmetric: revenue declines 3% in FY2026E — client attrition, lost advisory mandates — and never recovers, held flat through FY2030E, while margin compresses in a straight line from 16.2% to 14.0% on pricing pressure and negative operating leverage over a shrinking base.\nI ran both through the same debt schedule and returns bridge as the base case — same $55.00 entry, same 5.5x leverage, same 11.2x exit multiple, same 4.05-year hold, same 10% management pool:\nBase Downside Stress Revenue growth (FY2026E) 5.0% 3.0% (3.0%) FY2030E Adj. EBITDA $612.5M $518.0M $374.5M FY2030E Adj. EBITDA CAGR 6.5% 3.0% (3.5%) Exit net leverage 2.37x 3.13x 5.15x Cumulative Term Loan paydown $292.4M $357.6M $304.6M MOIC (sponsor net) 1.91x 1.49x 0.84x IRR (sponsor net) 17.3% 10.4% (4.2%) Downside still clears a real, positive return — 10.4% net isn\u0026rsquo;t 17.3%, but it\u0026rsquo;s not a loss, and it doesn\u0026rsquo;t require anything to go badly wrong, just softer growth with no margin capture. Stress is where the deal actually breaks: EBITDA shrinks in nominal dollars from $446.9 million to $374.5 million, and because EBITDA falls roughly as fast as debt gets paid down, opening net leverage never drops out of the top sweep tier — the leverage-based step-down never actually steps down in this case, and the sweep runs at 50% every single year of the hold, which still isn\u0026rsquo;t enough to outrun a shrinking EBITDA base. Exit net leverage lands at 5.15x, barely below the 5.46x the deal entered at. The sponsor loses money in nominal terms: 0.84x MOIC, a small negative IRR. One honest wrinkle worth naming: in Stress, the management incentive pool costs the sponsor nothing at all, because exit equity never clears the strike (the entry cheque) — gross and net returns are identical. An appreciation-only pool has no downside cost; it\u0026rsquo;s asymmetric by construction, which is exactly the point of structuring it that way.\nWhat I make of it Three things stand out once the model is built, and they don\u0026rsquo;t all point the same direction.\nThe return composition is unusually clean for a sponsor deal, and that\u0026rsquo;s both the strength and the ceiling. Most buyout returns lean on some combination of leverage, multiple arbitrage, and operating improvement. Here, multiple arbitrage is explicitly zero — the model doesn\u0026rsquo;t assume CBIZ gets a richer multiple on the way out than it got on the way in. That\u0026rsquo;s a defensible, credible assumption for a professional-services roll-up rather than a cyclical asset, and it means the 17.3% IRR isn\u0026rsquo;t contingent on the exit market being friendlier than the entry market. But it also means there\u0026rsquo;s no tailwind doing any of the work. Every point of that IRR has to come from the business actually growing EBITDA 6.5% a year and the balance sheet actually delevering — which is a higher bar to clear reliably than \u0026ldquo;buy low, hope the market pays more later.\u0026rdquo;\n17.3% is a real, respectable return — and it\u0026rsquo;s still below what most funds underwrite a new platform to. Buyout funds generally target 20–25% gross IRR on control platform investments; 17.3% net (18.8% gross) sits under that, even though 1.91x MOIC is a perfectly normal multiple of money on its own. New Mountain doesn\u0026rsquo;t need a bad thing to happen for this deal to underperform its own shop\u0026rsquo;s typical hurdle — it needs the base case, exactly as modeled, to play out. Getting to 20%+ requires something the base case doesn\u0026rsquo;t include: roughly a turn of multiple expansion, faster margin capture than the 120bps I modeled, bolt-on M\u0026amp;A, or — the more interesting possibility — the Benefits \u0026amp; Insurance carve-out generating proceeds or value this reconstruction simply doesn\u0026rsquo;t see. My read is that the real underwriting case inside New Mountain almost certainly leans on some blend of the last two, since a fund doesn\u0026rsquo;t sign for $5 billion on a platform it expects to merely clear a sub-hurdle return.\nThe financing structure is more conservative than it needs to be, and that has a real cost. The leverage-based sweep is realistic and credit-friendly — it\u0026rsquo;s exactly how real term loans amortize — but it produces a specific inefficiency: by FY2030E, the company is sitting on $715.3 million of cash earning roughly 3.5%, while the Term Loan it could have paid down instead costs 8.5%. That\u0026rsquo;s a negative carry of about 500 basis points on capital that, mechanically, the sweep formula chose not to deploy once leverage crossed below 3.5x. There\u0026rsquo;s a reasonable justification — liquidity buffer, dry powder for the bolt-on M\u0026amp;A the base case excludes, covenant headroom — but as modeled, it\u0026rsquo;s leaving return on the table relative to a more aggressive paydown path.\nWhere I could be wrong 1. This model levers a consolidated EBITDA base that the real transaction likely splits in two — and I can\u0026rsquo;t cleanly size the haircut. CBIZ\u0026rsquo;s FY2025 10-K breaks revenue into three practice groups: Financial Services ($2,301.5 million, 83.4% of revenue), Benefits \u0026amp; Insurance Services ($409.6 million, 14.9%), and National Practices ($46.9 million, 1.7%). The actual deal, per the merger 8-K, separates Benefits \u0026amp; Insurance into a distinct New Mountain-backed entity rather than folding it into the same capital structure as the core accounting and advisory business. This model doesn\u0026rsquo;t do that — it levers the full $446.9 million of consolidated FY2025A Adjusted EBITDA as if one company owns and grows all of CBIZ through FY2030E, and sizes a single $2,458.0 million term loan off that whole number.\nI tried to size the haircut properly before deciding I couldn\u0026rsquo;t. The 10-K\u0026rsquo;s segment footnote (Note 19, Segment Disclosures) discloses pre-tax segment income — $334.6 million for Financial Services, $76.1 million for Benefits \u0026amp; Insurance, $6.0 million for National Practices, summing to $416.7 million before $182.4 million of unallocated corporate costs (G\u0026amp;A, stock-based compensation, Marcum integration charges, interest) that the 10-K explicitly does not attribute to any segment. That\u0026rsquo;s real, sourced data — but it isn\u0026rsquo;t Adjusted EBITDA. Depreciation and amortization isn\u0026rsquo;t broken out by segment; it\u0026rsquo;s commingled inside a line the 10-K calls \u0026ldquo;other costs, gains, and losses, net.\u0026rdquo; And the non-GAAP addbacks that bridge $234.0 million of consolidated GAAP operating income up to $446.9 million of Adjusted EBITDA — stock comp, consolidation and integration charges, the Marcum-related items specifically — sit almost entirely inside that unallocated corporate bucket, not inside either segment. There\u0026rsquo;s no clean way to build a \u0026ldquo;Benefits \u0026amp; Insurance Adjusted EBITDA\u0026rdquo; number from what\u0026rsquo;s disclosed, so I didn\u0026rsquo;t invent one.\nThe one directional clue that is available cuts against the comfortable assumption that this is a small problem: on the segment income figures that are disclosed, Benefits \u0026amp; Insurance actually runs a higher pre-tax margin (18.6%) than Financial Services (14.5%). Financial Services\u0026rsquo; lower reported margin almost certainly reflects the Marcum acquisition\u0026rsquo;s intangible amortization, which sits overwhelmingly in that segment and depresses its GAAP income without depressing Benefits \u0026amp; Insurance\u0026rsquo;s the same way — which means a naive revenue-share haircut (14.9% of $446.9 million, leaving roughly $380 million behind) is a floor on what leaves with the carve-out, not a point estimate. What I can say plainly: the 5.5x entry leverage and ~2.2x FY2026E interest coverage in this model are both flattered relative to whatever capital structure actually gets levered against a Financial-Services-only entity. The bias runs one direction — less real EBITDA behind the debt than this model assumes — and it means the model\u0026rsquo;s returns are somewhat more fragile to rate and operating shocks than what\u0026rsquo;s shown above.\n2. The go-shop is a real, dated window, not a formality. It runs through August 27, 2026. Topping bids on announced take-privates with committed financing are the exception rather than the rule, but \u0026ldquo;exception\u0026rdquo; isn\u0026rsquo;t \u0026ldquo;never,\u0026rdquo; and this model takes the $55.00 entry as fixed.\n3. The margin-expansion thesis rests on an integration that\u0026rsquo;s still recent. The Marcum acquisition — the actual source of the 120bps of modeled margin expansion — closed less than two years before this deal was announced. The model assumes that integration finishes cleanly while an entirely new leveraged capital structure gets layered on top of it simultaneously.\n4. The financing terms are calibrated, not disclosed. 5.5x leverage and SOFR+450 are my own estimates, benchmarked to comparable 2026-vintage deals — not the actual commitment letters. Whenever the merger proxy files, the real terms could move entry leverage, the all-in rate, or both, and either would move the IRR more than any operating assumption in this model.\nWhere this goes next The go-shop window closes August 27th. The real test lands when the merger proxy — the PREM14A, then the DEFM14A — actually files: Goldman Sachs\u0026rsquo;s fairness opinion, the real financing commitment letters, and very likely CBIZ management\u0026rsquo;s own projections in place of the growth and margin assumptions I built here. Whether the Benefits \u0026amp; Insurance carve-out shows up as a distinct transaction, and at what value, is the single biggest open question this model can\u0026rsquo;t answer from public information alone. Once the proxy is out, I want to put my numbers next to the real ones and see how much of this survives contact.\nSources: CBIZ, Inc. Form 10-K for fiscal year 2025 (SEC EDGAR), including the practice-group results in Item 7 and the segment footnote (Note 19, Segment Disclosures) used in the Benefits \u0026amp; Insurance discussion above; CBIZ Q4 / full-year 2025 results release; the merger 8-K filed July 28, 2026; and the DEFA14A filed July 29, 2026. Filed documents can be located directly through the SEC\u0026rsquo;s EDGAR full-text search under CBIZ, Inc.\nThis is an educational analysis built from public filings and disclosures. It is not investment advice, and it is not affiliated with CBIZ, Grant Thornton Advisors, New Mountain Capital, or Goldman Sachs. Every financing, operating, and exit assumption beyond the announced $55.00 price, $5.0bn enterprise value, and disclosed premiums is my own and independent of any party to the transaction. All figures are subject to revision once the merger proxy (PREM14A/DEFM14A) and underlying financing commitment letters are filed.\n","permalink":"/posts/cbiz-grant-thornton-lbo/","summary":"A seven-exhibit LBO reconstruction of the announced Grant Thornton / New Mountain take-private of CBIZ (NYSE: CBZ) at $55.00/share, $5.0bn enterprise value. Base case: 1.91x MOIC, 17.3% sponsor-net IRR over a 4.05-year hold — three-quarters of it from EBITDA growth, 40% from deleveraging, next to nothing from multiple expansion. A three-case toggle also runs a Downside (10.4% IRR) and a Stress case where the deal loses money (0.84x MOIC). The Benefits \u0026amp; Insurance carve-out that\u0026rsquo;s part of the real deal isn\u0026rsquo;t in the model at all, and that gap — which the 10-K\u0026rsquo;s segment data suggests understates rather than overstates the problem — is the most interesting thing about it.","title":"The $5 Billion CBIZ Take-Private: A Full LBO Reconstruction"},{"content":"The problem this project answers Picture a buy-side M\u0026amp;A team a few weeks from signing. They have a target company\u0026rsquo;s confidentiality agreement in hand, a data room full of documents, and a due-diligence checklist that starts with the same question every deal starts with: is this company\u0026rsquo;s revenue, margin, and working capital actually what the seller says it is?\nAnswering that means an analyst needs to get into the general ledger — real revenue by month, real customer-by-customer concentration, real accounts-receivable aging. And that is exactly the moment where M\u0026amp;A deals run into a legal wall most outsiders never think about: before the deal closes, the buy-side team is often not allowed to see that data at all.\nThis project, ma-clean-room, is my answer to that wall — a self-hosted pipeline that lets analysts run real financial diligence on a target\u0026rsquo;s general ledger without a single person on the deal team ever seeing a raw name, account number, or IBAN. Everything below — every number, every screenshot — is real, unedited output from the tool itself, run against a synthetic target company. The repository is public: github.com/yirvisom/M-A-Clean-Room, and by the end of this post you\u0026rsquo;ll know exactly how to stand it up and run it against a deal of your own.\nNot ready to dig into tokenization mechanics and Postgres schemas yet? This one-page overview covers what the project does and why, in about two minutes.\nRead the 1-page project overview (PDF) M\u0026amp;A Clean Room — Project Overview \u0026larr; 1 / … \u0026rarr; Download Loading document… Why buy-side analysts can\u0026rsquo;t just open the target\u0026rsquo;s GL This is the part that surprises most people outside deal work, so it\u0026rsquo;s worth explaining properly before anything else.\n\u0026ldquo;Gun-jumping.\u0026rdquo; Under U.S. antitrust law (and equivalent regimes elsewhere), a buyer and a target that compete, or could compete, are not allowed to start coordinating or exchanging competitively sensitive information before the deal has cleared regulatory review and formally closed. Doing so — even informally, even with good intentions — is called \u0026ldquo;gun-jumping,\u0026rdquo; and it\u0026rsquo;s a real enforcement risk, not a theoretical one. A buy-side analyst poring over the target\u0026rsquo;s customer list, pricing, or margins pre-close can create exactly the appearance regulators are watching for.\nConfidentiality agreements. Separately from antitrust law, the non-disclosure and confidentiality agreements that govern the deal itself typically restrict who on the buy side can see what, and when. A target sharing its unredacted general ledger with the acquirer\u0026rsquo;s full deal team, weeks before signing, breaches the deal\u0026rsquo;s own confidentiality terms — regardless of antitrust exposure.\nThe standard industry fix. For decades, the answer to this has been to hire an outside firm to stand up a data clean room: a neutral, access-controlled environment where the target\u0026rsquo;s raw data is uploaded, redacted or aggregated by a third party, and only then exposed to a restricted set of buy-side analysts under strict rules. These engagements are widely described across the industry as expensive and slow to stand up. There\u0026rsquo;s no single public benchmark — cost varies with deal size, scope, and vendor — but a meaningful share of what gets paid for is the same commodity work, re-solved from scratch on every deal: tokenizing sensitive fields, wiring up access control, and producing an audit trail that proves nothing leaked.\nThat\u0026rsquo;s the gap this project closes. ma-clean-room is that same clean-room function — tokenization, access control, audit trail — built once as software, reused on every deal for the marginal cost of a container instead of a consulting invoice.\nWhat analysts actually get: the tear sheet Before the mechanics, the output. This is cleanroom.report\u0026rsquo;s Preliminary Diligence Findings tear sheet — a one-page, print-ready summary a deal team can hand around on day one of diligence. It\u0026rsquo;s rendered as both HTML and PDF, built entirely from the tokenized clean_db\u0026rsquo;s curated views, by a read-only analyst role that has never had access to a single raw value. Every screenshot below is a real, unedited crop of that same generated report.\nPreliminary Diligence Findings — report header and five headline KPI cards: revenue, adjusted EBITDA, net working capital, and customer/vendor concentration (HHI) The header block: period covered, when it was generated, and — importantly — the source line: \u0026ldquo;clean_db curated views, analyst role (read-only).\u0026rdquo; That line is the whole point of the project in one sentence.\nFive KPI tiles orient the reader immediately: the latest period\u0026rsquo;s revenue and adjusted EBITDA, net working capital and cash-conversion-cycle, and portfolio-wide customer and vendor concentration as an HHI score with a plain-language risk bucket next to it. No raw identifiers anywhere — a deal team could pass this exact page to outside counsel without a second thought.\nFinancial Statement Summary and Quality of Earnings — revenue and adjusted EBITDA trend line over 24 months, with a monthly detail table Revenue and Adjusted EBITDA plotted together over the full diligence window, with the last six periods broken out in a table underneath — gross margin, reported EBITDA, adjusted EBITDA, and adjusted margin, period by period.\nAdjusted EBITDA Bridge for the latest period, next to a Flags for Manual Review panel showing two out-of-balance periods flagged automatically Two panels side by side: the EBITDA bridge for the latest period, and — critically — a flags panel. This run surfaced two out-of-balance periods automatically, each a one-cent rounding artifact, both a cent below the tolerance that would actually block the pipeline. Flagged for a human to glance at, not swept under the rug.\nNet Working Capital and DSO/DPO/DIO trend chart over 24 months, with a monthly detail table below Days Sales Outstanding, Days Payable Outstanding, and Days Inventory Outstanding plotted together, with net working capital, its period-over-period change, and the cash conversion cycle broken out underneath.\nCustomer Concentration and Vendor Concentration top-10 bar charts, each with an HHI score and DOJ/FTC-style risk bucket Top-10 customers and top-10 vendors by revenue/spend, each with a portfolio-wide HHI score and risk bucket computed across the entire customer or vendor base — not just the top 10 shown.\nAccounts Receivable Aging and Accounts Payable Aging, bucketed into 0-30, 31-60, 61-90, and 90+ days AR and AP aged into the standard four buckets, with total transaction counts and dollar amounts — the first place a collections or liquidity problem shows up.\nThat single page is generated by one command, make report, reading nothing but clean_db\u0026rsquo;s curated views as the same low-privilege role a real analyst would use. Nothing about it is hand-assembled — it\u0026rsquo;s what the pipeline itself produces from a general ledger it has never let anyone see unredacted.\nThe finance, explained properly The tear sheet packs in a lot of due-diligence vocabulary. Here\u0026rsquo;s what each piece actually means, why a buy-side team cares about it, and how the pipeline computes it — with the real numbers from the screenshots above as a live worked example.\n1. The trial balance: the guardrail everything else stands on Before any ratio or trend means anything, the ledger itself has to be internally consistent — every debit needs a matching credit. That\u0026rsquo;s what a trial balance checks: sum every debit-side entry, sum every credit-side entry, and confirm the two totals match. If they don\u0026rsquo;t, something in the ledger is broken — a dropped row, a bad currency conversion, a genuine bookkeeping error — and nothing built on top of it (income statement, EBITDA, working capital) can be trusted.\ncleanroom.verify.check_trial_balance() runs this check on every load, independently for the whole ledger and period by period, and it\u0026rsquo;s a hard gate: if the whole-ledger totals don\u0026rsquo;t match within tolerance, the pipeline refuses to grant analyst access to anything, full stop. In the run behind this post, the ledger balanced — total debits equal total credits — with two single-period, single-cent discrepancies (visible in the \u0026ldquo;Flags for Manual Review\u0026rdquo; panel above) caused by independently rounding each side of a split multi-currency journal entry to the cent. That\u0026rsquo;s normal floating-point/rounding noise, not a bookkeeping error, and the pipeline is explicit about the distinction: those two cents are recorded and surfaced, but they don\u0026rsquo;t gate the pass/fail decision the way a real imbalance would.\n2. Reported EBITDA vs. Adjusted EBITDA — the bridge that drives the price EBITDA — Earnings Before Interest, Taxes, Depreciation, and Amortization — is the profitability measure most private-company M\u0026amp;A valuations are actually built on. Buyers typically pay a multiple of EBITDA (say, 5x, 8x, 12x depending on the industry and growth profile), so a $1 swing in EBITDA doesn\u0026rsquo;t move the price by $1 — it moves it by the multiple. Getting EBITDA right is one of the highest-leverage things diligence does.\nBut reported EBITDA — what\u0026rsquo;s literally in the ledger — is rarely the number a buyer should pay on. Sellers\u0026rsquo; books often carry one-off items that depress or inflate earnings in a way that won\u0026rsquo;t recur post-close: a one-time legal settlement, an owner\u0026rsquo;s personal expenses run through the business, a non-recurring rebrand campaign. Adjusted EBITDA starts from reported EBITDA and adds those items back — an EBITDA bridge, walking from the reported number to the adjusted one, one add-back at a time.\nThis is exactly what clean.ebitda_bridge computes, driven by an editable config table (clean.ebitda_addback_config) that a deal team can tune per engagement — which expense accounts count as add-backs is a judgment call, and the tool treats it as one: a starting point for deal-team review, not an authoritative quality-of-earnings adjustment, as the tear sheet itself says directly underneath the bridge. On the fiscal-year rollup for this synthetic target, the bridge looks like this:\nBridge line FY2024 amount (USD) Reported EBITDA $1,144,022.12 + Marketing Expense — one-time rebrand campaign $270,345.16 + Professional Fees — non-recurring transaction/legal costs $855,449.84 Adjusted EBITDA $2,269,817.12 Reported margin: 16.26%. Adjusted margin: 32.27%. The add-backs roughly double the EBITDA a buyer might be pricing the company on — which is precisely why this bridge, not the raw income statement, is one of the first things a buy-side analyst asks for, and precisely why it needs to be reproducible and auditable rather than a black box in someone\u0026rsquo;s spreadsheet.\n(A honest note on the tear sheet\u0026rsquo;s own \u0026ldquo;latest period\u0026rdquo; KPI tile above: it shows a single month, December 2024, with a negative adjusted EBITDA — because this specific synthetic dataset has a documented generator quirk that scatters a handful of stray entries into the tail end of its date range. It\u0026rsquo;s a known, disclosed artifact of the synthetic test data, not of the computation — and it\u0026rsquo;s a good demonstration of why a real diligence tool should show you the last-6-periods trend, not just a single headline tile, before you draw a conclusion.)\n3. Working capital, DSO, DPO, DIO, and the cash conversion cycle Net working capital (NWC) — current assets minus current liabilities, roughly: cash tied up in receivables and inventory, net of what\u0026rsquo;s owed to vendors — matters enormously in private M\u0026amp;A because most deals include a working-capital peg: the buyer and seller agree on a \u0026ldquo;normal\u0026rdquo; NWC level at signing, and the purchase price is adjusted dollar-for-dollar if the actual NWC at closing comes in above or below that peg. Getting the trend wrong in diligence means negotiating the peg on bad information — and losing real money at closing.\nThree ratios make the trend legible instead of just a balance:\nDSO (Days Sales Outstanding) — AR ÷ period revenue × days in period. How many days of sales are sitting uncollected in receivables. Rising DSO usually means collections are slipping. DPO (Days Payable Outstanding) — AP ÷ period COGS × days in period. How many days of purchases are sitting unpaid in payables. Rising DPO can mean better payment terms — or a company quietly stretching its vendors to manage cash. DIO (Days Inventory Outstanding) — inventory ÷ period COGS × days in period. How many days of inventory are sitting on the shelf. Put together: Cash Conversion Cycle (CCC) = DSO + DIO − DPO — the number of days between paying cash out for inputs and collecting cash in from customers. A shorter (or negative) CCC means the business is efficient at turning operations into cash; a lengthening CCC is an early, quantifiable warning sign that\u0026rsquo;s easy to miss just eyeballing a balance sheet.\nOn the early, undistorted part of this run\u0026rsquo;s data (before a known synthetic-data effect described below), the shape is exactly what this ratio set is built to catch:\nPeriod AR (USD) AP (USD) DSO (days) DPO (days) DIO (days) Cash conversion cycle (days) 2023-01 $1,312,026.95 $901,684.68 33.9 309.9 16.4 -259.6 2023-02 $2,420,048.23 $1,928,834.46 62.3 690.6 19.5 -608.8 2023-03 $3,849,273.38 $2,800,943.20 82.3 1,642.3 0.0 -1,560.0 2023-04 $5,007,487.75 $3,791,238.84 129.5 1,072.1 17.2 -925.4 4. Customer and vendor concentration — the HHI score A target that looks profitable can still be a bad acquisition if 80% of its revenue comes from two customers who could walk the day after closing. Diligence needs a way to quantify that risk, not just eyeball a top-10 list — which is exactly what the Herfindahl-Hirschman Index (HHI) does. It\u0026rsquo;s the same index U.S. antitrust regulators use to score market concentration, repurposed here to score revenue concentration:\nHHI = the sum of each customer\u0026rsquo;s revenue share, expressed as a percentage, squared. A company with 100 equal customers (1% each) scores 100 × 1² = 100. A company with two customers at 50% each scores 2 × 50² = 5,000. The pipeline buckets the result the same way DOJ/FTC guidance does: under 1,500 is \u0026ldquo;Low,\u0026rdquo; 1,500–2,500 is \u0026ldquo;Moderate,\u0026rdquo; over 2,500 is \u0026ldquo;High.\u0026rdquo;\nIn this run: customer HHI of 99 (Low — 119 customers, top 10 just 14.9% of $20.49M total revenue) and vendor HHI of 263 (Low — 50 vendors, top 10 at 38.5% of $19.45M total spend). Both computed on the entire customer/vendor base, not just the top 10 shown on the chart — a portfolio that looks concentrated in the visible top 10 but isn\u0026rsquo;t overall (or vice versa) is exactly the kind of thing a single bar chart can hide and the underlying HHI can\u0026rsquo;t.\n5. AR/AP aging — where a liquidity problem shows up first The last panel buckets every open receivable and payable into 0–30, 31–60, 61–90, and 90+ day buckets. In this run, AR shows 816 transactions totaling $20,489,928 — almost entirely sitting in the 90+ bucket — the single clearest, earliest signal of a collections problem diligence can surface, well before it shows up in a cash balance.\nHow the tokenization actually works — the part that makes this legal to use Everything above is computed from data an analyst is legally allowed to see. Here\u0026rsquo;s the mechanism that makes that true, in the order data actually moves through it.\nArchitecture: raw_db (air-gapped, highest trust) flows through the processor\u0026rsquo;s five-stage pipeline — ingest, anonymize, map-coa, load-clean, verify — into clean_db (medium trust), which grants a read-only analyst role only after verify passes Data flows one direction only, through one process. The mapping vault and the HMAC salt never leave the raw side — no code path on the clean side, and no analyst credential, can ever reach either.\n1. Tokenize, deterministically. As data lands in the isolated raw_db, cleanroom.anonymize replaces every vendor name, customer name, tax ID, IBAN, and email with HMAC-SHA256(salt, normalized_value) before anything crosses into clean_db. HMAC is a keyed hash — same input and same secret salt always produce the same token, but there\u0026rsquo;s no way to run the function backward without the salt. That determinism matters operationally: two ledger rows for the same real vendor — \u0026quot;ACME CORPORATION\u0026quot; and \u0026quot;Acme Corp.\u0026quot; — reconcile to the same token, so an analyst can still group and trend by counterparty over time, they just never see who the counterparty actually is.\nField Raw value What the analyst sees Mechanism vendor_name \u0026quot;ACME CORPORATION\u0026quot; / \u0026quot;Acme Corp.\u0026quot; VENDOR_3f9a2c1b8e4d7a10c2b5 (same token for both) HMAC token of the suffix-stripped core name tax_id \u0026quot;12-3456789\u0026quot; TAXID_9e1d4a7c0b3f6e82d5a1 HMAC token of the normalized tax ID iban \u0026quot;DE89 3704 0044 0532 0130 00\u0026quot; IBAN_7b2e5f8a1c4d9b60e3f7 HMAC token of the whitespace-stripped IBAN account_code (target\u0026rsquo;s own CoA) \u0026quot;AC-6010\u0026quot; standard_account_id = \u0026quot;6010\u0026quot; (Rent Expense) Deterministic crosswalk — not tokenized, since a chart-of-accounts code isn\u0026rsquo;t sensitive on its own phone, city, description present in raw ledger absent entirely Dropped by the clean-side column allowlist, not tokenized 2. Vault the mapping, and only the mapping. The original-to-token crosswalk — the one thing that could ever de-anonymize this data — is written to a single place: a LUKS-encrypted mapping vault, mounted only transiently during a pipeline run, never touched by anything on the clean side. It\u0026rsquo;s explicitly called out in the project\u0026rsquo;s threat model as the single highest-value target in the whole system, on the logic that anyone who steals that file collapses the entire clean-room boundary in one step — everything else in the design exists to keep that file isolated.\n3. Gate on two independent checks, and grant nothing until both pass. cleanroom.verify runs two hard checks before anyone gets access: the trial-balance check described above, and a leak scanner that reads every text cell of every clean-side table and checks it against every raw value the vault has ever recorded — not just this run\u0026rsquo;s, all of them. Either check failing blocks the entire grant; there\u0026rsquo;s no partial access. Every run — pass or fail — writes an append-only audit record: a PASS/FAIL status, the violation list (empty on a clean pass), and a SHA-256 hash of every clean table\u0026rsquo;s contents, so a second run against the same inputs can be diff-checked byte-for-byte against the first.\n4. Grant least privilege, only after a PASS. Only after that gate clears does the analyst role get SELECT on the curated views — the ones behind every screenshot above — and never on the raw per-row tables underneath them. A FAIL doesn\u0026rsquo;t just withhold a new grant; verify.py actively revokes any existing one, so a stale grant from an earlier passing run can never quietly outlive a later failure. That\u0026rsquo;s backed up at the infrastructure layer too: containers run read-only root filesystems with capabilities dropped, and the raw and clean database networks have no route between them at all — so even a full compromise of the clean side has nothing to pivot to.\nHow it was built, and why this shape The stack is deliberately boring where it needs to be reliable and precise where it needs to be defensible: Python for the ETL and analytics layer, PostgreSQL for both raw_db and clean_db (two entirely separate clusters, not schemas in one database — the air gap needed to be structural, not just a permissions setting), Docker Compose for the container topology and hardening, Ansible for provisioning the isolated hosts, WeasyPrint to render the tear sheet\u0026rsquo;s HTML into a print-ready PDF, and pytest with a full CI suite that runs the entire ingest → anonymize → map-coa → load-clean → verify pipeline against synthetic data on every push — so the leak-scanner gate and the trial-balance gate are exercised for real on every commit, not just described in a README.\nThe design choices that mattered most weren\u0026rsquo;t the obvious ones. Two are worth calling out because they came directly from taking the finance side as seriously as the engineering side:\nThe trial-balance tolerance had to be relative, not a fixed cent amount. An early, stricter version used a flat one-cent tolerance on the whole-ledger check — and it turned out a handful of legitimate runs failed the gate purely from independently rounding each side of a split multi-currency journal entry to the cent, not from any real imbalance. The fix scales the tolerance with entry count (sqrt(entry count), reflecting that these rounding errors partially cancel rather than accumulate linearly) rather than loosening it arbitrarily — tight enough to still catch a dropped row or a real FX bug, loose enough not to cry wolf on rounding noise a real audit would never chase. The EBITDA add-back list had to be config, not code. Which expenses count as one-time add-backs is a judgment call that changes deal to deal — baking it into application logic would mean a code change and a redeploy every time a deal team disagreed with a prior assumption. It lives instead in an editable, queryable config table, with the tool explicit that it\u0026rsquo;s a starting point for review, never an authoritative adjustment on its own. What this replaces Outside clean-room engagement ma-clean-room Cost Widely reported as expensive, deal-by-deal One-time setup; marginal cost per deal is just infrastructure Timeline Weeks — staffing, tooling, review cycles with a vendor Minutes to bring up the stack and run the pipeline once secrets exist Reuse across deals Re-scoped and re-negotiated with the vendor each time Same pipeline and controls every deal; a fresh encrypted vault per engagement Auditability Depends on the vendor\u0026rsquo;s own tooling Built in: an append-only audit record + table-hash manifest on every run The tokenization, access control, and audit trail are the expensive, hard-to-differentiate part of a bespoke clean-room engagement. This project is that work, done once, reviewed like any other code change, and reused instead of re-bought.\nBeing honest about the limits A diligence tool that hides its own edge cases isn\u0026rsquo;t one I\u0026rsquo;d trust, so the project documents its known limitations in detail rather than smoothing them over — and it\u0026rsquo;s worth repeating the headline ones here, since a couple of the numbers above are affected by them:\nThe synthetic test data behind every screenshot in this post has a generator quirk, not a computation bug: journals are only dated within an ~18-month window, but a documented, fixed rule for resolving ambiguous day/month date formats occasionally reparses a handful of entries into calendar months the generator barely touched — which is exactly why the tear sheet\u0026rsquo;s last few periods show a sharp, erratic revenue swing, and why the DSO/DPO/DIO trend drifts to implausible levels late in the window (the AP/AR journals also never book a later cash-settlement entry, so those balances only ever grow). On a real target\u0026rsquo;s ledger — where collections and payments actually get booked — this same computation is exactly what would catch a genuine deterioration; here, the mechanism is real and the specific late-period trend is a synthetic-data artifact, clearly labeled as such in the repository\u0026rsquo;s own documentation. The leak scanner does exact/case-insensitive substring matching against known vault values — a defense-in-depth layer behind the column allowlist and tokenization step, not a semantic scrubber. It will not catch a raw value that\u0026rsquo;s been paraphrased or split across cells; the allowlist and tokenization upstream are what actually prevent that class of leak. This has not had an independent third-party security review. The project\u0026rsquo;s THREAT_MODEL.md says so explicitly, and I\u0026rsquo;d say the same to anyone before pointing it at a real deal\u0026rsquo;s data. How to actually use this — and see it for yourself You don\u0026rsquo;t need to take any of the above on faith. Everything in this post is reproducible from the public repository in a few commands.\nIf you just want to see the output — no setup required — the full, real, unedited pipeline output (every CSV behind the numbers above, the audit record, and the HTML/PDF tear sheet) is committed in the repo at docs/sample_output/, with a full column-by-column reference at docs/data_dictionary.md.\nIf you want to run the pipeline yourself against a fresh synthetic target (this is genuinely the fastest way to feel what a diligence analyst\u0026rsquo;s experience looks like — clone it, run it, and open the tear sheet it produces):\ngit clone https://github.com/yirvisom/M-A-Clean-Room.git cd M-A-Clean-Room pip install -e . # CI-equivalent mode: skips LUKS encryption, fine for a local test run — # never use plain mode against a real target\u0026#39;s data. python -m cleanroom.gen_data --out-dir sample_data CLEANROOM_STORAGE_MODE=plain make storage-up secrets up docker compose exec -T clean_db psql -U postgres -d clean_db \u0026lt; sql/standard_coa.sql make pipeline # Render your own tear sheet — HTML and PDF, into docs/sample_output/ make report make pipeline runs the full ingest → anonymize → map-coa → load-clean → verify chain and prints a PASS/FAIL. If it fails — on purpose, try deleting a row from the synthetic CoA mapping first — you\u0026rsquo;ll see exactly what a real deal team would see: promotion to clean_db blocked, and the reason why, in plain text.\nIf you\u0026rsquo;re standing this up for a real engagement, drop the CLEANROOM_STORAGE_MODE=plain override entirely — the default luks mode formats and opens a genuine LUKS2-encrypted vault and prompts for a passphrase the first time. Read THREAT_MODEL.md\u0026rsquo;s non-goals first, and disable swap (or make sure it\u0026rsquo;s encrypted) before you do, since a plaintext swap device can leak the vault passphrase and the HMAC salt out of memory regardless of how well the vault itself is configured — it\u0026rsquo;s covered in the README\u0026rsquo;s \u0026ldquo;Storage vault\u0026rdquo; section in full.\nIf you\u0026rsquo;re an analyst who just wants to query the output — no pipeline run needed on your end — point any SQL client, Excel, or Power BI connection at clean_db as the read-only analyst role and query the curated views directly:\n-- Revenue, COGS, gross margin, and reported/adjusted EBITDA by month SELECT * FROM clean.income_statement_summary ORDER BY fiscal_year, fiscal_month; -- AR/AP/inventory balances, DSO/DPO/DIO, and cash conversion cycle by month SELECT * FROM clean.working_capital ORDER BY fiscal_year, fiscal_month; -- Top 10 customers by revenue, with Pareto cumulative % and portfolio HHI SELECT * FROM clean.customer_concentration WHERE is_top10 ORDER BY revenue_rank; That\u0026rsquo;s the whole point of the design: the report above isn\u0026rsquo;t a privileged export an analyst has to request and wait for — it\u0026rsquo;s exactly what any analyst can reproduce themselves with a SELECT, the moment verify says PASS.\nWhy I built this I work in financial modeling and valuation, not security engineering — which is precisely why this project mattered to me. The best diligence tools I\u0026rsquo;d want to hand a deal team don\u0026rsquo;t just compute the right ratios; they make it structurally impossible to accidentally break the rule that decides whether a deal team can even see the data in the first place. That\u0026rsquo;s a constraint most financial models never have to think about, and building a pipeline that treats \u0026ldquo;an analyst should never see a raw name\u0026rdquo; as an enforced invariant — not a policy someone has to remember — was the most useful thing I could learn by actually shipping it, end to end, rather than reading about it.\nIf you work in M\u0026amp;A, private equity diligence, or corporate development and any of this — the EBITDA bridge, the working-capital trend, the concentration scoring, or the access-control model itself — is something you\u0026rsquo;d want to poke at, adapt, or challenge, the repository is open and documented in full: github.com/yirvisom/M-A-Clean-Room. Issues, questions, and pull requests are genuinely welcome.\nStack: Python · PostgreSQL · Docker Compose · Ansible · WeasyPrint · pytest/CI.\n","permalink":"/posts/ma-clean-room/","summary":"Antitrust and confidentiality rules mean buy-side M\u0026amp;A analysts often can\u0026rsquo;t legally see a target\u0026rsquo;s raw financials before close — the standard fix is an expensive, slow outside clean-room engagement. This project replaces it: a self-hosted pipeline that tokenizes a target\u0026rsquo;s GL, gates analyst access behind a leak scan and a trial-balance check, and renders a one-page diligence tear sheet — EBITDA bridge, DSO/DPO/DIO, customer/vendor HHI — reproducible on the next deal for the cost of a server instead of a consulting engagement.","title":"M\u0026A Clean Room — Buy-Side Diligence Without Ever Touching the Target's Raw Data"},{"content":"This project note is written in French. The Casablanca Stock Exchange (BVC) operates in a French-speaking financial environment — the source data, the regulatory references, and the intended readers of this analysis are all Francophone, so the write-up follows the same language. An English executive summary is below; a full English version is available on request.\nEnglish summary. An investor allocated 1,000,000 MAD across the Casablanca Stock Exchange (BVC): 52.5% in Attijariwafa Bank (banking, the stability anchor), 17.5% in Akdital (private healthcare, the growth position), and 30% in Moroccan Treasury bills (the cushion). The framework answers two questions a portfolio manager actually asks: what\u0026rsquo;s the likely one-year trajectory of this portfolio, and how much could it realistically lose in a bad year? After a from-scratch fundamental analysis of both stocks (revenue growth, ROE, PER, PBR) and a technical read of their price charts, it runs a 1,000-path Monte Carlo simulation over a 252-trading-day horizon and computes a 95% Value-at-Risk from the resulting distribution — a standard risk-management approach applied here to a real allocation rather than a textbook example. It also keeps all sensitive market data off Git entirely, inside a LUKS-encrypted, XFS-formatted vault. Result: the simulation centers on a portfolio value near 1.05M MAD, with a 95% VaR of roughly 794,571 MAD — a statistically likely worst case of about a 20% drawdown. The full French write-up — fundamental thesis, technical charts, and the encrypted-storage architecture — continues below.\nFinance Quantitative · Analyse Fondamentale · Bourse de Casablanca · Sécurité des Systèmes Linux\nCasablanca Quant Framework (BVC) Un environnement de recherche quantitative pour la Bourse de Casablanca (BVC), qui combine un moteur de simulation de Monte-Carlo, un calcul de Value at Risk, un optimiseur de portefeuille — et un choix technique plus rare : les données financières sensibles ne sont jamais écrites en clair sur le disque, mais stockées dans un conteneur chiffré, isolé de Git par construction.\nLe projet a deux couches de lecture, volontairement séparées puis reliées : une thèse d\u0026rsquo;investissement — l\u0026rsquo;analyse fondamentale et technique des titres choisis, écrite et chiffrée comme le ferait un analyste actions — puis un moteur de simulation qui met cette thèse à l\u0026rsquo;épreuve statistiquement, en projetant des milliers de scénarios de marché plutôt qu\u0026rsquo;un seul.\nPas envie d\u0026rsquo;ouvrir la thèse complète (13 pages) tout de suite ? Cet aperçu visuel d\u0026rsquo;une page résume le projet en deux minutes : l\u0026rsquo;allocation, la simulation de Monte-Carlo et le résultat de la VaR.\nLire l\u0026#39;aperçu du projet (PDF, 1 page) Casablanca Quant Framework — Aperçu du Projet \u0026larr; 1 / … \u0026rarr; Télécharger Chargement du document… Voir le code source sur GitHub → Contexte et objectif Ce projet est né d\u0026rsquo;un exercice académique réalisé dans le cadre de mes études à l\u0026rsquo;ENCG Casablanca : simuler la gestion d\u0026rsquo;un portefeuille de 1 000 000 MAD sur la Bourse de Casablanca. (Le récit complet de cette première version, réalisée en équipe, est raconté dans un billet de blog séparé.) Le Casablanca Quant Framework en est le prolongement en solo : la même question de gestion de portefeuille, mais reconstruite comme un outil reproductible, versionné avec Git, et pensé pour un usage réel plutôt que pour une seule remise de devoir.\nLa problématique reste concrète : un investisseur a alloué 1 000 000 MAD entre deux valeurs cotées à la BVC — Attijariwafa Bank (52,5 %, le socle bancaire) et Akdital (17,5 %, la valeur de croissance dans la santé privée) — et une poche de Bons du Trésor (30 %, l\u0026rsquo;amortisseur obligataire). Trois questions se posent alors, et ce sont elles que le framework outille :\nQuelle est la trajectoire probable de ce portefeuille sur l\u0026rsquo;année à venir ? Dans le pire des cas raisonnable, combien peut-on perdre ? Comment garder les données de marché — souvent proches de secrets professionnels dans un cadre académique ou de conseil — hors de portée d\u0026rsquo;une fuite accidentelle vers GitHub ? L\u0026rsquo;allocation a été fixée à une date précise — le 15 avril 2026 — en tenant compte du contexte de marché du jour : l\u0026rsquo;indice MASI20 (l\u0026rsquo;indice qui regroupe les 20 plus grosses capitalisations de la Bourse de Casablanca, l\u0026rsquo;équivalent local du CAC 40 parisien) affichait alors 1 376,27 points, en hausse de 0,48 % sur la séance mais en retrait de 7,36 % sur un an. Concrètement, l\u0026rsquo;allocation cible s\u0026rsquo;est traduite par l\u0026rsquo;achat de 747 actions Attijariwafa Bank (703 MAD l\u0026rsquo;action, soit 525 141 MAD) et 142 actions Akdital (1 225 MAD l\u0026rsquo;action, soit 173 950 MAD) — un léger écart par rapport aux 525 000 MAD et 175 000 MAD visés au départ, dû au fait qu\u0026rsquo;on ne peut acheter que des actions entières.\nRécapitulatif de l\u0026rsquo;allocation au 15 avril 2026 : cours, nombre de titres achetés et montant total par position Le moteur est écrit pour être extensible à d\u0026rsquo;autres valeurs de la cote (TGCC, IAM, etc.), mais l\u0026rsquo;implémentation actuelle porte sur ces trois positions, alimentées par l\u0026rsquo;historique de cours d\u0026rsquo;Akdital et d\u0026rsquo;Attijariwafa Bank.\nAnalyse fondamentale : pourquoi Akdital et Attijariwafa Bank Avant de simuler quoi que ce soit, encore faut-il justifier le choix des actifs. Cette partie du travail — la plus « analyste financier » du projet — s\u0026rsquo;appuie sur la thèse d\u0026rsquo;investissement complète rédigée en avril 2026, dont le document original (13 pages) est consultable et téléchargeable ci-dessous, et dont les grandes lignes sont reprises et vulgarisées dans les sections qui suivent.\nTélécharger la thèse d\u0026#39;investissement complète (PDF) Portfolio Management Analysis — Bourse de Casablanca (avril 2026) \u0026larr; 1 / … \u0026rarr; Télécharger Chargement du document… Le secteur de la santé : un pari sur la réforme de l\u0026rsquo;Assurance Maladie Akdital est un groupe de cliniques privées coté à la Bourse de Casablanca. Pour comprendre pourquoi il pèse 17,5 % du portefeuille, il faut d\u0026rsquo;abord comprendre le contexte : le Maroc réforme en profondeur son système de santé, avec un budget public record de 42,3 milliards MAD prévu pour 2026 et une nouvelle loi-cadre (n° 06-22) qui facilite l\u0026rsquo;émergence de groupes privés structurés comme Akdital, notamment via des partenariats public-privé. L\u0026rsquo;objectif affiché est de créer 11 338 lits d\u0026rsquo;hôpital supplémentaires d\u0026rsquo;ici 2030 — Akdital est l\u0026rsquo;un des principaux véhicules privés de cette expansion.\nSur le terrain, ces chiffres se traduisent par une croissance quasi exponentielle du groupe entre 2023 et 2025 :\nChiffres clés consolidés d\u0026rsquo;Akdital, 2023-2025 : chiffre d\u0026rsquo;affaires, résultat d\u0026rsquo;exploitation et résultat net Le chiffre d\u0026rsquo;affaires passe de 1,8 à 4,4 milliards MAD (+144 % en deux ans), porté par l\u0026rsquo;ouverture de nouvelles cliniques (41 établissements et 4 505 lits fin 2025) et par la généralisation de l\u0026rsquo;AMO (l\u0026rsquo;Assurance Maladie Obligatoire, la couverture santé qui rembourse une partie des frais médicaux des Marocains assurés) : environ 80 % du chiffre d\u0026rsquo;affaires d\u0026rsquo;Akdital provient aujourd\u0026rsquo;hui de patients couverts par la CNSS ou une assurance privée. Le résultat d\u0026rsquo;exploitation triple sur la période (228 → 807 millions MAD), preuve que le groupe rentabilise de mieux en mieux ses coûts fixes à mesure qu\u0026rsquo;il grandit — un effet d\u0026rsquo;échelle classique : plus une clinique reçoit de patients, moins chaque patient supplémentaire coûte cher à traiter avec la même infrastructure et le même personnel.\nAu-delà des montants bruts, quatre ratios financiers permettent de juger la qualité de cette croissance — les mêmes que les analystes utilisent pour n\u0026rsquo;importe quelle action cotée en Bourse :\nPetit lexique des ratios financiers\nBPA (Bénéfice Par Action) — le profit net de l\u0026rsquo;entreprise divisé par le nombre d\u0026rsquo;actions en circulation. C\u0026rsquo;est la part du bénéfice qui revient, en théorie, à chaque action détenue. ROE (Return on Equity, rentabilité des fonds propres) — le bénéfice net rapporté à l\u0026rsquo;argent apporté par les actionnaires. Un ROE de 15 % signifie que chaque 100 MAD investi par les actionnaires génère 15 MAD de profit par an. PER (Price Earnings Ratio) — le cours de l\u0026rsquo;action divisé par le bénéfice par action. Un PER de 30 signifie que le marché est prêt à payer 30 fois le bénéfice annuel pour posséder l\u0026rsquo;action : plus il est élevé, plus le marché anticipe de croissance future. PBR (Price to Book Ratio) — le cours de l\u0026rsquo;action divisé par sa valeur comptable (les fonds propres divisés par le nombre d\u0026rsquo;actions). Un PBR de 5 signifie que l\u0026rsquo;action se paie 5 fois ce qu\u0026rsquo;elle vaudrait si l\u0026rsquo;entreprise était liquidée et son actif net redistribué aux actionnaires. Ratios financiers d\u0026rsquo;Akdital, 2023-2025 : BPA, ROE, PER et PBR Le BPA bondit de 15,62 à 34,91 MAD (+123 %) malgré une augmentation de capital en 2024 qui a créé de nouvelles actions — le bénéfice a crû plus vite que la dilution. Le ROE remonte à 16,90 % en 2025, un excellent niveau pour un secteur aussi gourmand en capital que la santé. Le PER, à 33,80, reste élevé — la moyenne du marché marocain tourne plutôt autour de 18-20 — signe que le marché continue de payer cher une croissance qu\u0026rsquo;il juge encore devant elle, même si ce multiple se détend par rapport aux 42,86 de 2024. En clair : Akdital est passé du statut de start-up de la santé à celui de machine à cash, mais reste valorisé par le marché comme une valeur de croissance, pas comme une valeur mature.\nLe secteur bancaire : la valeur refuge Attijariwafa Bank — 52,5 % du portefeuille, le socle — évolue dans un tout autre contexte : celui du secteur bancaire marocain, l\u0026rsquo;un des plus matures du continent africain. Il est dominé par trois acteurs — Attijariwafa Bank, BCP et Bank of Africa, surnommés les « Big Three » — qui contrôlent à eux seuls près de 80 % du PNB (le Produit Net Bancaire, l\u0026rsquo;équivalent du chiffre d\u0026rsquo;affaires pour une banque : la somme des marges d\u0026rsquo;intérêt et des commissions qu\u0026rsquo;elle facture). Casablanca est par ailleurs le premier centre financier d\u0026rsquo;Afrique : grâce au statut de Casablanca Finance City (CFC), plus de 220 entreprises internationales y pilotent leurs activités africaines.\nChiffres clés consolidés d\u0026rsquo;Attijariwafa Bank, 2022-2024 : chiffre d\u0026rsquo;affaires, résultat d\u0026rsquo;exploitation et résultat net Sur trois ans, le chiffre d\u0026rsquo;affaires (PNB) progresse de 28,3 à 34,5 milliards MAD (+22 %) et le résultat net bondit de 6 à 9,5 milliards MAD (+58 %) — porté par la hausse des taux d\u0026rsquo;intérêt, qui améliore la marge que la banque tire de la différence entre ce qu\u0026rsquo;elle prête et ce qu\u0026rsquo;elle emprunte. Les fonds propres atteignent 72,5 milliards MAD, largement au-dessus des exigences prudentielles de Bâle III (l\u0026rsquo;ensemble de règles internationales qui imposent aux banques de détenir un minimum de capital en réserve pour absorber d\u0026rsquo;éventuelles pertes). Signe de solidité supplémentaire : le nombre d\u0026rsquo;actions en circulation reste rigoureusement stable (215 140 839 titres) sur toute la période — contrairement à Akdital, ATW finance sa croissance sans diluer ses actionnaires.\nRatios financiers d\u0026rsquo;Attijariwafa Bank, 2022-2024 : BPA, ROE, PER et PBR Le BPA grimpe de 28,19 à 44,18 MAD (+57 %), un bénéfice supplémentaire entièrement absorbé par les actionnaires existants puisque le nombre de titres ne bouge pas. Le ROE progresse de 9,76 % à 13,11 %, un niveau qualifié de « classe mondiale » pour une banque de cette taille. Et contrairement à Akdital, le PER d\u0026rsquo;ATW baisse (de 13,90 à 12,00) alors même que les bénéfices augmentent : le cours de l\u0026rsquo;action ne suit pas la même pente que les profits, ce qui rend le titre statistiquement moins cher aujourd\u0026rsquo;hui qu\u0026rsquo;il y a deux ans, malgré des résultats records.\nPourquoi les deux ensemble ? Le duo Akdital / Attijariwafa Bank répond à deux logiques d\u0026rsquo;investissement complémentaires plutôt qu\u0026rsquo;à une seule : Akdital est le moteur de croissance — jeune, volatil, acheté pour la plus-value potentielle du cours ; Attijariwafa Bank est l\u0026rsquo;ancrage de stabilité — mature, régulier, moins cher à l\u0026rsquo;achat rapporté à ce qu\u0026rsquo;il génère. Le solde du portefeuille (30 %) va aux Bons du Trésor, des titres de dette émis par l\u0026rsquo;État marocain : en échange d\u0026rsquo;un prêt à l\u0026rsquo;État, l\u0026rsquo;investisseur touche un rendement fixe et garanti, quoi qu\u0026rsquo;il arrive à la Bourse. C\u0026rsquo;est l\u0026rsquo;amortisseur du portefeuille — l\u0026rsquo;équivalent d\u0026rsquo;une ceinture de sécurité qui ne rapporte pas grand-chose en soi, mais qui protège le reste du capital si le marché actions traverse une zone de turbulence, tout en restant assez liquide pour être remobilisé rapidement si une opportunité se présente sur l\u0026rsquo;un des deux titres.\nAnalyse technique : ce que racontent les graphiques boursiers Complément de l\u0026rsquo;analyse fondamentale, l\u0026rsquo;analyse technique ne s\u0026rsquo;intéresse plus à ce que vaut une entreprise, mais à la façon dont son cours s\u0026rsquo;est comporté en Bourse. Les graphiques ci-dessous sont des graphiques en chandeliers (ou candlesticks) : chaque « bougie » verticale résume une période de cotation avec quatre informations — le cours d\u0026rsquo;ouverture, le cours de clôture, le plus haut et le plus bas atteints sur la période. Une bougie verte signifie que le cours a clôturé plus haut qu\u0026rsquo;il n\u0026rsquo;avait ouvert (le marché a été acheteur), une bougie rouge l\u0026rsquo;inverse. La bande bleue en bas de chaque graphique indique le volume échangé — combien de MAD de titres ont changé de mains — un indicateur classique de l\u0026rsquo;intensité de l\u0026rsquo;intérêt des investisseurs à un instant donné.\nGraphique en chandeliers d\u0026rsquo;Attijariwafa Bank, avril 2025 - avril 2026 Sur la période avril 2025 - avril 2026, ATW progresse par paliers, avec des corps de chandeliers courts — signe d\u0026rsquo;une pression acheteuse régulière plutôt que spéculative. Le titre passe d\u0026rsquo;environ 630-650 MAD à près de 700 MAD, après une phase haussière (avril-octobre) qui l\u0026rsquo;a porté jusqu\u0026rsquo;à 800 MAD, suivie d\u0026rsquo;une consolidation qui vient retester le support des 700 MAD. Le pic de volume en décembre coïncide généralement avec des rebalancements de portefeuille de fin d\u0026rsquo;année ou des transactions de blocs institutionnels.\nGraphique en chandeliers d\u0026rsquo;Akdital, avril 2025 - avril 2026 Le graphique d\u0026rsquo;Akdital est nettement plus nerveux — des corps de bougies plus longs, davantage de rouge consécutif — ce qui reflète une valeur de croissance où les prises de bénéfices sont plus rapides. Le titre culmine au-dessus de 1 500 MAD avant de corriger fortement pour se stabiliser autour de 1 150-1 200 MAD en fin de période, avec un signal de retournement (succession de bougies vertes, hausse des volumes) tout en fin de période, sous les 1 100 MAD. Cette volatilité plus marquée est précisément ce que la simulation de Monte-Carlo, plus bas, vient quantifier statistiquement plutôt que de la décrire seulement visuellement.\nLa méthode : simuler mille avenirs plutôt que d\u0026rsquo;en prédire un seul Personne ne peut prédire avec certitude ce que vaudra une action dans un an. La simulation de Monte-Carlo part de ce constat et le retourne en avantage : au lieu de chercher la bonne prévision, elle en génère des milliers, chacune plausible, et regarde ce qu\u0026rsquo;elles ont en commun.\nUne image simple pour saisir le principe : imaginez que vous voulez connaître la superficie d\u0026rsquo;un lac à la forme irrégulière, sans en connaître la formule mathématique. Vous délimitez un grand terrain carré autour du lac et vous y lancez, au hasard, mille fléchettes. Si 700 d\u0026rsquo;entre elles tombent dans l\u0026rsquo;eau, vous pouvez raisonnablement en conclure que le lac occupe environ 70 % du terrain — sans jamais avoir calculé sa surface directement. La simulation de Monte-Carlo applique la même logique à un portefeuille boursier : au lieu de fléchettes, elle tire des milliers de trajectoires de marché plausibles, et regarde où elles atterrissent.\nConcrètement, pour chaque actif du portefeuille, le framework calcule sa volatilité historique (à quel point son cours a l\u0026rsquo;habitude de varier d\u0026rsquo;un jour à l\u0026rsquo;autre) à partir des deux dernières années de cotation. Il tire ensuite, au hasard mais selon cette même volatilité, une nouvelle trajectoire de rendements journaliers sur les 252 prochains jours de bourse — l\u0026rsquo;équivalent d\u0026rsquo;une année. Il répète l\u0026rsquo;opération 1000 fois. Le résultat est le graphique ci-dessous : un faisceau de 1000 trajectoires possibles pour la valeur totale du portefeuille, plutôt qu\u0026rsquo;une seule ligne optimiste ou pessimiste.\nMille scénarios est un compromis délibéré : suffisamment nombreux pour que la forme statistique de la distribution finale (sa moyenne, sa dispersion) se stabilise et cesse de dépendre du hasard d\u0026rsquo;un tirage particulier, sans pour autant demander un temps de calcul disproportionné pour un portefeuille de cette taille.\nValue at Risk (VaR) à 95 % — c\u0026rsquo;est la question que tout gestionnaire de portefeuille finit par poser : « Dans le pire des cas raisonnable, combien puis-je perdre ? » La VaR à 95 % y répond en cherchant, parmi les 1000 scénarios simulés, le seuil en-dessous duquel le portefeuille ne descend que dans les 5 % de scénarios les plus défavorables (soit 50 sur 1000). Autrement dit : il y a 95 % de chances statistiques que la valeur finale du portefeuille reste au-dessus de ce seuil. Le choix de 95 % — plutôt que 99 % ou 100 % — est un standard de l\u0026rsquo;industrie (repris des normes prudentielles de Bâle) : il écarte les scénarios catastrophes extrêmes (qu\u0026rsquo;aucun modèle statistique ne capture bien) pour se concentrer sur un risque réellement mesurable, sans jamais prétendre à une garantie absolue — qui n\u0026rsquo;existe pas en finance de marché.\nUn différenciateur technique : les données financières ne touchent jamais le disque en clair C\u0026rsquo;est la partie la moins habituelle de ce projet — et la plus révélatrice de sa double origine, à la croisée de la finance quantitative et de l\u0026rsquo;administration système Linux (Fedora/Red Hat).\nLes exports de cours boursiers et les bases de données qui en découlent sont, par nature, des données qu\u0026rsquo;on ne veut pas voir traîner en clair sur un poste de travail ni, pire, remonter par erreur vers un dépôt Git public. Le framework répond à ce risque par un design de stockage de confiance (trusted storage) plutôt que par une simple ligne dans .gitignore :\nChiffrement LUKS — les données vivent dans une image disque chiffrée (finance.img, 500 Mo), verrouillée par une phrase de passe. Tant que le coffre n\u0026rsquo;est pas explicitement déverrouillé (make vault_open), son contenu est illisible. Système de fichiers XFS — une fois le volume déchiffré et monté (via cryptsetup + dm-mapper), il est formaté en XFS, choisi pour sa robustesse sur les volumes de données à forte volumétrie — un choix cohérent avec les usages qu\u0026rsquo;on trouve côté infrastructure des salles de marché. Isolation Git par construction — le conteneur chiffré et son point de montage sont exclus du dépôt : même en cas d\u0026rsquo;erreur de manipulation, il n\u0026rsquo;y a rien d\u0026rsquo;exploitable à commiter, puisque les données n\u0026rsquo;existent en clair que dans un volume monté localement, jamais dans l\u0026rsquo;arborescence versionnée. Le workflow quotidien tient dans quatre commandes make, pilotées depuis un Makefile qui fait office de centre de contrôle du projet :\nmake vault_open # déverrouille et monte le coffre-fort chiffré make data_clean # nettoie les CSV bruts et les injecte dans une base SQLite, à l\u0026#39;intérieur du vault make run # lance Jupyter Lab pour l\u0026#39;analyse make vault_close # démonte le volume et referme le tunnel chiffré C\u0026rsquo;est une discipline empruntée à la sécurité système plus qu\u0026rsquo;à la data science classique — et c\u0026rsquo;est précisément ce qui distingue ce projet d\u0026rsquo;un notebook Jupyter isolé : la donnée sensible est traitée comme telle, du premier import jusqu\u0026rsquo;à la simulation.\nRésultats et interprétation Après l\u0026rsquo;analyse fondamentale et technique des deux titres, place aux résultats de la simulation proprement dite — la partie qui répond aux deux premières questions posées en introduction : quelle trajectoire probable, et quelle perte maximale statistiquement raisonnable.\nRépartition et évolution du capital — la référence historique\nRépartition et évolution du capital sur la période observée, en aires empilées Avant de simuler l\u0026rsquo;avenir, le framework rejoue le passé : ce graphique en aires empilées retrace comment les 1 000 000 MAD se seraient répartis et auraient évolué entre Attijariwafa Bank (gris), Akdital (orange) et les Bons du Trésor (vert), sur la période historique disponible. La ligne noire au sommet est la valeur totale du portefeuille. On y voit la fonction de chaque brique : la bande obligataire progresse en pente régulière, insensible aux à-coups du marché, tandis que les deux bandes actions absorbent l\u0026rsquo;essentiel de la volatilité visible sur la courbe totale. C\u0026rsquo;est cette trajectoire de référence — pas une hypothèse, mais un historique réellement observé — qui sert ensuite de point de départ statistique à la simulation de Monte-Carlo.\n1000 trajectoires simulées pour l\u0026rsquo;année à venir\n1000 trajectoires simulées par Monte-Carlo pour l\u0026rsquo;évolution du portefeuille Voici le cœur du framework. Chaque ligne grise est une trajectoire simulée parmi les 1000 générées ; la ligne rouge est leur moyenne. Deux lectures s\u0026rsquo;en dégagent immédiatement : d\u0026rsquo;abord, l\u0026rsquo;éventail s\u0026rsquo;élargit avec le temps — plus l\u0026rsquo;horizon de simulation s\u0026rsquo;allonge, plus l\u0026rsquo;incertitude cumulée sur la valeur finale augmente, ce qui est le comportement attendu d\u0026rsquo;une marche aléatoire. Ensuite, la pente de la moyenne rouge est légèrement ascendante, ce qui reflète un biais haussier hérité du comportement historique des deux actifs sur la période d\u0026rsquo;apprentissage — un signal utile, mais qui doit être lu comme une tendance statistique et non comme une promesse de rendement.\nDistribution des valeurs finales et seuil de VaR\nDistribution des rendements finaux de la simulation Monte-Carlo, avec seuil de VaR 95% Ce dernier graphique condense les 1000 scénarios en une seule distribution : chaque barre bleue représente combien de scénarios simulés ont abouti à telle valeur finale de portefeuille, et la courbe rouge est l\u0026rsquo;approximation par une loi normale (ici de moyenne μ ≈ 1 047 972 MAD et d\u0026rsquo;écart-type σ ≈ 156 108 MAD). La ligne pointillée verticale marque le seuil de VaR à 95 % : 794 571 MAD — dans cette exécution de la simulation, il y a 95 % de chances que le portefeuille termine au-dessus de ce montant, soit une perte maximale statistiquement probable d\u0026rsquo;environ 20 % du capital initial dans les scénarios défavorables (hors événement extrême).\nNote méthodologique : la simulation n\u0026rsquo;étant pas figée par une graine aléatoire fixe, deux exécutions successives produisent des chiffres légèrement différents — c\u0026rsquo;est une propriété attendue de la méthode (chaque tirage explore une combinaison différente de trajectoires plausibles), pas une incohérence entre les figures présentées ici. À titre d\u0026rsquo;illustration, une autre exécution de cette même simulation, documentée dans la thèse d\u0026rsquo;investissement d\u0026rsquo;origine, aboutissait à une valeur moyenne attendue de 1 114 632,55 MAD et une VaR 95 % de 906 115,62 MAD : des chiffres différents, mais qui racontent la même histoire — un portefeuille orienté à la hausse en moyenne, avec un plancher statistique compris, selon l\u0026rsquo;exécution, entre environ 79 % et 91 % du capital initial.\nStack technique Composant Rôle Python (NumPy, Pandas, Matplotlib, Seaborn) Moteur de calcul, nettoyage des données, simulation et visualisation Jupyter Lab Environnement d\u0026rsquo;analyse interactif (notebooks/presentation.ipynb) SQLite + SQLAlchemy Stockage structuré des cours historiques, à l\u0026rsquo;intérieur du vault chiffré Makefile Automatisation du workflow (installation, vault, nettoyage, exécution) LUKS + cryptsetup Chiffrement du conteneur de données au repos XFS Système de fichiers du volume déchiffré Fedora / Red Hat Linux Environnement cible pour le déploiement et le workflow sécurisé Limites Les rendements simulés supposent une loi normale et une volatilité future égale à celle observée sur la période historique — une simplification classique qui sous-estime généralement les événements extrêmes (queues de distribution plus épaisses en réalité). Les tirages aléatoires pour Akdital et Attijariwafa Bank sont générés indépendamment l\u0026rsquo;un de l\u0026rsquo;autre dans le moteur actuel ; une corrélation historique entre les deux titres (ou avec l\u0026rsquo;indice MASI) n\u0026rsquo;est pas encore modélisée, ce qui peut légèrement sous- ou sur-estimer la diversification réelle du portefeuille. La VaR à 95 % quantifie un risque statistique dans des conditions de marché « normales » — elle ne couvre pas les scénarios de crise systémique ou de rupture de liquidité, par construction. L\u0026rsquo;analyse fondamentale (ratios, contexte sectoriel) est une photographie prise à une date donnée (avril 2026) ; les chiffres d\u0026rsquo;Akdital et d\u0026rsquo;Attijariwafa Bank évoluent à chaque publication trimestrielle et devront être rafraîchis pour rester pertinents. Liens et références Le code source complet du framework — moteur de simulation, scripts de nettoyage des données, Makefile — est disponible sur GitHub. La thèse d\u0026rsquo;investissement qui sert de socle à l\u0026rsquo;analyse fondamentale de cette page est téléchargeable plus haut, et ce travail a également été partagé sur LinkedIn.\nVoir le code source sur GitHub → Voir le post sur LinkedIn → Conclusion et perspectives Ce framework transforme une thèse d\u0026rsquo;investissement — l\u0026rsquo;analyse fondamentale et technique d\u0026rsquo;Akdital et d\u0026rsquo;Attijariwafa Bank — en outil chiffré, reproductible et versionné : la même question — « combien puis-je perdre, et avec quelle probabilité ? » — peut désormais être reposée à chaque mise à jour des données de marché, en une seule commande (make run), sans jamais exposer les données sous-jacentes.\nLes prochaines étapes naturelles sont d\u0026rsquo;introduire la corrélation entre actifs dans le moteur de simulation (matrice de covariance plutôt que tirages indépendants), d\u0026rsquo;étendre l\u0026rsquo;univers d\u0026rsquo;actifs couverts (TGCC, IAM, et au-delà), et de faire du calcul de VaR un input direct d\u0026rsquo;un optimiseur de frontière efficiente — pour passer d\u0026rsquo;un portefeuille défini a priori à une allocation qui maximise le ratio de Sharpe sous une contrainte de VaR donnée. Une base technique déjà posée : le stockage sécurisé, l\u0026rsquo;automatisation via Makefile et la structure modulaire du dépôt sont conçus pour absorber cette montée en complexité sans refonte — tout comme l\u0026rsquo;analyse fondamentale, mise à jour à chaque publication trimestrielle, pourra continuer à nourrir le moteur de simulation en amont.\n","permalink":"/posts/casablanca-quant-framework/","summary":"Un environnement de recherche quantitative pour la Bourse de Casablanca : thèse d\u0026rsquo;investissement et analyse fondamentale d\u0026rsquo;Akdital et Attijariwafa Bank, simulation de Monte-Carlo (1000 trajectoires) et Value at Risk à 95 % sur une allocation multi-actifs réelle.","title":"Casablanca Quant Framework — Simulation Monte-Carlo \u0026 VaR pour la BVC"},{"content":"Ideologies → Wars → Politics → Economy → Finance → M\u0026amp;A\nThe biggest merger of the last century: Exxon × Mobil.\nFollow the chain backward and it holds together better than it has any right to. Arab nationalism and Zionism, and — after 1979 — the Shia revolutionary ideology of Ayatollah Khomeini\u0026rsquo;s Iran, produced the wars: the Yom Kippur War of October 1973 (\u0026ldquo;la guerre du Kippour,\u0026rdquo; named for the Jewish holy day it began on), the Iranian Revolution and the Iran-Iraq War that followed it, and the string of Middle East conflicts that kept the region unsettled for a generation. The wars produced the politics: OPEC\u0026rsquo;s 1973 embargo, and Saudi Arabia\u0026rsquo;s 1985 decision to fight for market share instead of defending price. The politics produced the economics: a quarter-century of oil-price whiplash. The economics produced the finance: a cost-cutting, balance-sheet-driven industry where it was cheaper to buy a barrel of oil on Wall Street than to go find one in the ground. And the finance produced the M\u0026amp;A: nine mega-mergers in three years, Exxon-Mobil the cleanest specimen of them all.\nFrom John D. Rockefeller\u0026rsquo;s Standard Oil to the 3 greats: Exxon, Mobil and Chevron. Dan Brown would have probably called them the \u0026ldquo;3 sénéchaux\u0026rdquo; — those who kind of inherited, in the 1911 breakup, the secret of abundance and massive production of oil in the USA. 3 sénéchaux who didn\u0026rsquo;t die as in Dan\u0026rsquo;s \u0026ldquo;The Da Vinci Code,\u0026rdquo; but rather survived a 25-year crisis, from the Yom Kippur War and the first oil shock of 1973 to the eve of the millennium\u0026rsquo;s turn, when crude fell within a whisker of $10 a barrel.\n(Above: the Lucas Gusher, the well that founded the American oil age at Spindletop, Texas, on January 10, 1901 — nine days of uncontrolled flow at a rate no one had ever measured before. Everything that follows, the empire, the breakup, the century of mergers, starts here.)\nAn empire cut into thirty-four pieces By 1911, Rockefeller\u0026rsquo;s Standard Oil didn\u0026rsquo;t compete in the American oil market — it was the American oil market, controlling something on the order of nine barrels in every ten refined in the country. The U.S. Supreme Court ended that with an antitrust order that split the trust into thirty-four separate companies. Most of them dissolved into irrelevance or got absorbed by rivals within a generation. Three did not: Standard Oil of New Jersey, which became Esso and then Exxon; Standard Oil of New York, which became Socony-Vacuum and then Mobil; and Standard Oil of California, which became Chevron. The sénéchaux kept their fiefdoms.\nThe Standard Oil monopoly caricatured as an octopus, its tentacles reaching Congress, statehouses, and the White House — Puck magazine, September 1904 \u0026ldquo;Next!\u0026rdquo; — Udo Keppler\u0026rsquo;s 1904 cartoon for Puck magazine, published seven years before the Supreme Court broke up the trust it depicts. Source: U.S. Library of Congress, Prints and Photographs Division. Public domain.\nWhat the breakup didn\u0026rsquo;t do was end the underlying logic that had built Standard Oil in the first place: scale lowers your cost per barrel, and in a commodity business, cost per barrel is close to the whole game. That logic went dormant for six decades of comfortable, regulated growth. Then 1973 woke it back up, violently, and kept it awake for twenty-five years.\n1973: the world tilts The Arab oil embargo of October 1973 didn\u0026rsquo;t just raise prices — it demonstrated, for the first time to a generation raised on cheap energy, that the ground under the entire industrial economy could move without warning. In barely a year, the real price of crude very nearly tripled. It kept climbing through the decade — a second shock in 1979, the Iranian revolution — until it peaked in 1981 at close to five times its level a decade earlier.\nThe response, on both sides, was entirely rational. OPEC, which controlled roughly 55% of the world\u0026rsquo;s oil at the start of the decade, discovered it could set the price. Consumers and industry discovered they could unlearn dependence: smaller cars, better insulation, factories re-engineered to burn something other than oil. Exploration that had been uneconomic for years suddenly wasn\u0026rsquo;t. Wells that had been capped came back online. By 1985, OPEC\u0026rsquo;s share of a market it once dominated had fallen below 30% — proof that a cartel\u0026rsquo;s pricing power, however real in the short run, has a ceiling the moment it makes alternatives to its product profitable.\nSaudi Arabia had spent those years playing the role no other member wanted: absorbing everyone else\u0026rsquo;s quota-cheating by cutting its own output, acting as the buffer that kept the cartel\u0026rsquo;s price target intact. In December 1985, it stopped. It chose to fight for market share instead of defending price. The result was less a decline than a collapse: crude fell from the low $30s to roughly $10 a barrel within months — a two-thirds drop in a matter of weeks, the kind of move that doesn\u0026rsquo;t get absorbed gently by an industry built on decade-long capital projects.\nU.S. crude oil prices, 1949-2000, in nominal and inflation-adjusted terms, showing the 1973 shock, the 1981 peak, the 1986 collapse, and the 1998 trough A quarter-century on a rollercoaster. Every inflection point on this chart forced a different generation of oil executives to rewrite their playbook. Source: chart built from U.S. Energy Information Administration / Bureau of Economic Analysis historical crude oil price data.\nThe 1980s: learning to bleed less What followed the 1986 crash was less a recovery than a long, grinding adjustment. The majors had built their cost structures for a world of $30-plus oil; they now had to survive on a third of that. Between 1980 and 1992, the eight biggest oil companies cut their combined workforce from roughly 800,000 to 300,000 — a reduction of well over half. Corporate headquarters, once bloated with layers of staff, were gutted just as hard: six major companies cut their combined HQ headcount from 3,000 to 800 people in the four years from 1988 to 1992 alone. Companies stopped owning tankers and started leasing them — trading fixed cost for variable cost, a hedge against the next price swing nobody could predict but everybody now assumed was coming.\nIt was also, not coincidentally, the decade of the corporate raider. With oil company shares trading at a fraction of the value of the reserves sitting on their balance sheets, it was cheaper to acquire a barrel of oil on Wall Street than to go find one in the ground. More than $60 billion of horizontal mergers rolled through the industry in the first half of the 1980s — Chevron\u0026rsquo;s takeover of Gulf Oil alone was worth over $13 billion, at the time the largest corporate acquisition in history. The message embedded in every one of those deals was the same: efficiency was no longer a nice-to-have. It was survival.\n1998: the floor gives way again By the mid-1990s, a decade and a half of cost-cutting and technology had pulled the industry\u0026rsquo;s breakeven cost down to somewhere around $16 to $18 a barrel — real progress, but still fragile. Then the 1997-98 Asian financial crisis hit global demand at exactly the moment non-OPEC supply was ample, and crude fell below $10 a barrel by late 1998. At that price, even the leanest of the majors were no longer comfortably earning their cost of capital on new investment. The math simply didn\u0026rsquo;t close.\nThe response was the same one the industry had reached for in the 1980s, only bigger. BP moved first, announcing its acquisition of Amoco on August 11, 1998, with roughly $2 billion in projected synergies — a number that put every other CEO in the sector on notice. Exxon and Mobil followed a few months later. Over the following three years, nine major mergers reshaped the top of the industry: BP-Amoco, Exxon-Mobil, Total\u0026rsquo;s acquisition of PetroFina followed by TotalFina\u0026rsquo;s hostile pursuit of Elf Aquitaine (forming TotalFinaElf), BP Amoco\u0026rsquo;s acquisition of Arco, Chevron\u0026rsquo;s takeover of Texaco, Phillips\u0026rsquo;s acquisition of Tosco, and finally the Phillips-Conoco \u0026ldquo;merger of equals\u0026rdquo; that created ConocoPhillips. Different boardrooms, different countries, the same target number: push the breakeven cost down toward $11 to $12 a barrel, low enough that even a bad year for oil still cleared the cost of capital.\nExxon-Mobil is simply the cleanest specimen of that species — the deal every finance textbook would pick if it had to pick one.\nThe deal: not \u0026ldquo;just paper\u0026rdquo; Exxon announced its acquisition of Mobil on December 1, 1998; the deal closed on November 30, 1999. It was, at signing, the largest corporate merger ever recorded, and structurally almost the reverse of what people picture when they hear \u0026ldquo;merger\u0026rdquo;: there was no cash. Exxon paid entirely in its own stock, at an exchange ratio of 1.32 Exxon shares for every Mobil share outstanding.\nExxon Mobil Pre-merger market value $175.0 billion $58.7 billion Share price (pre-announcement) $72.00 $75.25 Shares outstanding 2,431 million 780 million Post-merger ownership ~70.2% ~29.8% Total consideration came to roughly $74.2 billion — a premium of $15.5 billion, or 26.4%, over Mobil\u0026rsquo;s undisturbed market value (and, tellingly, close to 290% over Mobil\u0026rsquo;s book value, a reminder of how much of an oil major\u0026rsquo;s true worth was never on its balance sheet to begin with).\nHere is the point worth sitting with: people love to say that in a stock-for-stock deal \u0026ldquo;the terms don\u0026rsquo;t matter, you\u0026rsquo;re just swapping paper.\u0026rdquo; That is precisely backwards. The exchange ratio is the single number that decided how the combined company\u0026rsquo;s ownership got carved up — Mobil shareholders ended up with roughly three of every ten shares of the new ExxonMobil not because of some vague notion of fairness, but because 1.32 is the ratio Exxon\u0026rsquo;s board agreed to pay. Move that ratio by a tenth, and tens of billions of dollars of value shift silently from one set of shareholders to the other. Paper, in a deal this size, is never \u0026ldquo;just\u0026rdquo; anything.\nThe market\u0026rsquo;s initial verdict was clear and slightly lopsided: over the eleven trading days bracketing the announcement, Mobil\u0026rsquo;s industry-adjusted cumulative return was +14.8%; Exxon\u0026rsquo;s was -0.5%. Ten trading days after the announcement, Mobil was up 20.6%, Exxon up 3.1%. Both positive — the market believed the economic logic of the deal — but the seller, as usual, got to keep more of the applause.\nExxon corporate wordmark, in use since Raymond Loewy\u0026rsquo;s 1972 design Mobil\u0026rsquo;s red Pegasus mark, in use in some form since the 1930s The two marks that disappeared into \u0026ldquo;ExxonMobil\u0026rdquo; on November 30, 1999. Sources: Wikimedia Commons; both marks are too simple to meet the threshold of originality for copyright, though they remain protected trademarks of their respective owners.\nWhat the spreadsheet actually says Strip away the ticker symbols and a merger like this is a bet on a discounted cash flow model: forecast the free cash the combined company will throw off for the next decade or so, add a \u0026ldquo;terminal value\u0026rdquo; for everything beyond that, and discount the whole stream back to today at a rate that reflects how risky those cash flows are. That discount rate — the cost of capital — blends the return equity investors demand with the after-tax cost of the company\u0026rsquo;s debt, weighted by how much of each the firm actually uses.\nTwo things about oil majors\u0026rsquo; cost of capital are worth knowing, because they explain a lot of what happened next. First, both Exxon and Mobil carried a stock market \u0026ldquo;beta\u0026rdquo; below 1 — their share prices historically moved less than the overall market, not more, largely because global demand for oil is stickier than demand for most other things people buy. That kept their cost of equity relatively modest, in the 11% range, for companies running enormous, long-lived capital projects. Second, small changes in the assumptions — the revenue growth rate, the operating margin, how long the \u0026ldquo;competitive advantage\u0026rdquo; period lasts before growth fades to something ordinary — swing the estimated value of a company this size by tens of billions of dollars. That sensitivity is exactly why boards fight so hard over numbers that look, from the outside, like rounding errors: a percentage point on the margin assumption is worth more than most companies\u0026rsquo; entire market cap.\nNone of this is unique to Exxon-Mobil. It\u0026rsquo;s the same arithmetic every big-ticket acquisition runs on. What made this one instructive is how quickly the promised numbers turned into real ones.\nSynergies: the rare promise that outran the pitch At announcement, Exxon and Mobil projected roughly $2.8 billion a year in \u0026ldquo;synergies\u0026rdquo; — mostly (about two-thirds) from shutting duplicate facilities and stripping out excess capacity, the rest from combined purchasing power and sharing whichever company had the better process for a given task. Skeptics treat synergy numbers as the most reliably inflated line in any merger deck.\nThis one wasn\u0026rsquo;t. By August 2000 — about seven months after the deal closed — chairman Lee Raymond announced that realized synergies had already reached $4.6 billion, well ahead of the original schedule. Analysts, watching the integration unfold, were by late 2001 projecting the number would reach $7 billion by 2002 — two and a half times the original pitch. Whatever else you want to say about ExxonMobil, hubris in the boardroom doesn\u0026rsquo;t usually come paired with under-promising and over-delivering on cost cuts.\nFloor traders working the New York Stock Exchange, a scene that had changed remarkably little by the time it absorbed the news of the Exxon-Mobil deal in December 1998 NYSE floor traders, 1963 — the physical choreography of price discovery looked much the same three and a half decades later, the week the market repriced two of the world\u0026rsquo;s largest companies overnight. Source: Thomas J. O\u0026rsquo;Halloran, U.S. News \u0026amp; World Report collection, Library of Congress. Public domain.\nWhy the antitrust regulators shrugged Combining the world\u0026rsquo;s two largest oil companies sounds, on its face, like exactly the kind of deal antitrust regulators exist to stop. It wasn\u0026rsquo;t, and the reason is almost entirely a question of scale versus scale.\nRegulators lean on a concentration measure called the Herfindahl-Hirschman Index — square each competitor\u0026rsquo;s market share and add them up. A score under 1,000 draws essentially no scrutiny; above 1,800, a deal is likely to be challenged outright. The global petroleum industry had sat at an HHI of roughly 400 since the mid-1970s, an almost absurdly unconcentrated number for an industry full of household names. Run the arithmetic on all nine of the era\u0026rsquo;s mega-mergers together — not just Exxon-Mobil, all of them — and the industry-wide HHI rises from 389 to 583. An increase, certainly. But 583 is still nowhere near the 1,000-point line where regulators even start asking hard questions, let alone the 1,800-point line where a deal gets blocked.\nThe plain explanation is that the pond these fish swam in was almost incomprehensibly large. Even a company as vast as ExxonMobil was one competitor among thousands in a global industry measured in the trillions, competing against national oil companies, independents, and state producers who don\u0026rsquo;t show up neatly in a market-share table. Regulators did require some targeted fixes at the edges — ExxonMobil sold off overlapping wholesale distribution assets, BP Amoco divested Arco\u0026rsquo;s Alaskan crude holdings and its Cushing, Oklahoma operations — but nobody seriously argued the combination itself created monopoly power. There was, quite simply, too much ocean for one more big fish to change the tide.\nThe archetype Which is really the whole point. Exxon-Mobil wasn\u0026rsquo;t an outlier, a bet driven by ego or empire-building dressed up in a fairness opinion. It was the textbook case — the reason a finance professor would reach for this deal specifically, out of the nine, when explaining to a room of students what a merger is for. Two of Rockefeller\u0026rsquo;s own sénéchaux, forced back together not by nostalgia for the old trust but by twenty-five years of a brutal, unpredictable price environment that had made \u0026ldquo;smaller and independent\u0026rdquo; a luxury the industry could no longer afford.\nThe 1911 breakup had scattered the empire because it was too powerful for the market to bear. The 1998 remarriage put a piece of it back together because the market — twenty-five years of oil shocks, cartel overreach, and a price crash that came within a whisker of single digits — had made scale, once again, the only rational answer to survival. History doesn\u0026rsquo;t repeat, they say. But sometimes it does rhyme loudly enough that you can build a discounted cash flow model on the echo.\n","permalink":"/blog/exxon-mobil-merger/","summary":"From the 1911 breakup of Standard Oil to the $74 billion Exxon-Mobil stock swap of 1998: a quarter-century of oil shocks, a collapsing price floor, and the archetype merger that came out of it.","title":"Ideologies, Wars, Politics, Economy, Finance, M\u0026A: Exxon × Mobil"},{"content":"Yirviel Somé — FMVA® \u0026amp; BIDA® certified, MSc candidate in Finance.\nI build the models investment decisions are made on: DCFs, LBOs, and three-statement builds to American IB standards. Every assumption is sourced, every output defensible line by line.\nWACC 6.78% 1,852 MAD/share 2026 deal Monte Carlo simulation and VaR/CVaR The Akdital DCF values a BVC-listed operator off a rebuilt net-debt position and a dual-basis table (WACC 6.78%, 1,852 MAD/share). The CBIZ take-private runs a full LBO on a live 2026 deal. The Casablanca Quant Framework puts Monte Carlo simulation and VaR/CVaR against Casablanca Stock Exchange assets. The work is published, not described — open it and check the math.\nValuation and deal work is the core. Data analytics sits alongside it: Power BI on a star-schema/DAX foundation, Python for simulation and portfolio optimization — the tooling that turns a model into something a desk can actually run.\nBased in Casablanca. Looking for a full-time analyst seat to put this toward live deals.\nCertifications FMVA® Verified issuer Financial Modeling \u0026amp; Valuation Analyst\nCorporate Finance InstituteIssued June 4, 2026ID 184450903 Verify credential BIDA® Verified issuer Business Intelligence \u0026amp; Data Analyst\nCorporate Finance InstituteIssued July 15, 2026ID 188849309 Verify credential Skills Financial modeling \u0026amp; valuation (FMVA®) — three-statement modeling, DCF and comparable-company valuation, WACC build-up, sensitivity analysis, LBO structures.\nData \u0026amp; business intelligence (BIDA®) — Python (Pandas, NumPy, Matplotlib/Plotly), SQL, Power BI, DAX, Power Query, Excel/VBA, data cleaning and pipeline design.\nApplied quantitative analysis — Monte Carlo simulation and Value-at-Risk estimation, demonstrated on a real multi-asset portfolio in the Casablanca Quant Framework.\nSelected proof. A full three-statement and DCF valuation of Akdital S.A. (Bourse de Casablanca) is the clearest example of that discipline in practice: the first version of the model came in 77.6% below the market price, a gap large enough to trigger a documented audit rather than a quiet adjustment. The audit found and corrected three errors: capex assumptions held too high for too long, a WACC built on book equity instead of market equity, and a horizon that cut the growth story short. It converged on a defensible +58.8% implied upside, in line with sell-side analyst consensus. A boardroom-ready Power BI sales dashboard rounds out the range. Full case studies are in the Research section.\nTimeline MSc candidate in Finance — in progress CBIZ Take-Private — full LBO reconstruction, published August 1, 2026 M\u0026amp;A Clean Room — buy-side diligence, published July 26, 2026 Sales Performance Dashboard — Power BI, published July 18, 2026 BIDA®, Corporate Finance Institute — July 15, 2026 Casablanca Quant Framework — Monte Carlo \u0026amp; VaR, published July 15, 2026 Akdital S.A. — DCF Valuation — published July 14, 2026 FMVA®, Corporate Finance Institute — June 4, 2026 The Projects section walks through full case studies: real companies, documented assumptions, and the reasoning behind each modeling decision. The Blog is where I write about the concepts and tools behind the models.\nLet\u0026rsquo;s talk I\u0026rsquo;m looking for a full-time, analyst-track role in financial modeling, valuation, or data/quant analysis, where I can put this same rigor to work on a team\u0026rsquo;s deals instead of just my own. Reach out via the contact section on the homepage or the links in the footer. (Also open to select project-based work, if that\u0026rsquo;s what brings you here.)\n","permalink":"/about/","summary":"Yirviel Somé — FMVA® \u0026amp; BIDA® certified, MSc candidate in Finance.\nI build the models investment decisions are made on: DCFs, LBOs, and three-statement builds to American IB standards. Every assumption is sourced, every output defensible line by line.\nWACC 6.78% 1,852 MAD/share 2026 deal Monte Carlo simulation and VaR/CVaR The Akdital DCF values a BVC-listed operator off a rebuilt net-debt position and a dual-basis table (WACC 6.78%, 1,852 MAD/share). The CBIZ take-private runs a full LBO on a live 2026 deal.","title":"About"},{"content":"Mrs. Moudine read our numbers back to us — the VaR, the probability bands, the fan of a thousand possible futures for a portfolio that didn\u0026rsquo;t exist outside a spreadsheet — and singled out the Monte Carlo simulation as the best part of the submission. It should have felt like a finish line. Instead it itched. I could tell her what the model output. I was much less sure I could tell her what it did, or why doing that particular thing, a thousand times over, was supposed to tell anyone something true about risk.\nThe assignment The brief, for our financial markets class, was concrete enough: manage a simulated 1,000,000 MAD portfolio on the Casablanca Stock Exchange, using three years of historical data up to January 2nd. Pick positions, justify them, then answer the question every portfolio manager eventually has to answer — not \u0026ldquo;what will this be worth,\u0026rdquo; which nobody can honestly promise, but \u0026ldquo;how badly could this go, and how do I know.\u0026rdquo;\nMy team split the work the way teams do. Someone owned the fundamentals, someone owned the writeup, and the simulation — the part that took a spreadsheet of prices and turned it into a thousand imagined years — fell to whoever was willing to fight with the probability theory. We delivered something solid. Mrs. Moudine\u0026rsquo;s praise for the Monte Carlo piece specifically was, in hindsight, the moment the rest of this story starts from.\nA game of solitaire, not a spreadsheet It helps to know where the method actually comes from, because it isn\u0026rsquo;t finance at all — and knowing that made the discomfort I felt sharper, not softer.\nIn 1946, the mathematician Stanislaw Ulam was recovering from an illness and playing endless hands of Canfield solitaire, trying to work out his odds of winning by pure combinatorics. The card-by-card math was intractable. Then he had the insight that mattered: instead of calculating the probability exactly, he could lay out a large number of hands at random and simply count how many won. Enough random trials, and the count converges on the true probability — no closed-form solution required.\nUlam was at Los Alamos at the time, working alongside John von Neumann on the hydrogen bomb, where the same trick applied to a problem with real stakes: predicting how neutrons diffuse through fissile material, a process too chaotic to solve directly but perfectly suited to being simulated thousands of times over. The method needed a code name for classified work, and Ulam\u0026rsquo;s colleague Nicholas Metropolis picked one from Ulam\u0026rsquo;s uncle, who used to borrow money from relatives to gamble at the Monte Carlo casino in Monaco. The name stuck for the same reason the method works: it\u0026rsquo;s random trials standing in for an answer nobody can compute by hand.\nThat\u0026rsquo;s the part I hadn\u0026rsquo;t sat with. I\u0026rsquo;d used a technique invented to model nuclear chain reactions to price the downside of a bank stock and a hospital-chain stock — and I could run it, but I couldn\u0026rsquo;t yet explain why simulating a thousand solitaire hands tells you anything real about a thousand possible market years. Praise for output I couldn\u0026rsquo;t fully derive felt like credit I hadn\u0026rsquo;t earned.\nDeciding to earn it So I sat back down, alone, and rebuilt the model from scratch — not to produce a better grade, since the grade was already in, but to dissect the thing piece by piece until I could account for every number it produced. Historical volatility, estimated the same way a risk desk would. A random daily return drawn from that volatility, repeated across 252 trading days — a year of market sessions. The whole path repeated a thousand times, the same way Ulam repeated his solitaire deals, until the shape of the outcomes stopped depending on which particular thousand trials you happened to run. And then Value at Risk: not \u0026ldquo;what will happen,\u0026rdquo; but \u0026ldquo;below what threshold does only the worst 5% of these thousand imagined years fall\u0026rdquo; — the number a real portfolio manager actually needs on a Monday morning.\nNothing about the underlying finance was exotic. What changed was that every line now had to survive me asking \u0026ldquo;why this, and not something else\u0026rdquo; — the same discipline Mrs. Moudine\u0026rsquo;s comment had quietly demanded and that a team deadline hadn\u0026rsquo;t left room for the first time around.\nA small, stubborn detail: the typesetting One decision from that solo pass is worth admitting to, because it says something about what I was actually chasing. I wrote the final report in Typst instead of the usual Word-and-export pipeline — a markup-based typesetting tool built for exactly the kind of document where equations, tables, and figures need to sit on the page with the same precision the numbers inside them are supposed to have. It was a small thing, technically unnecessary, and it mattered to me anyway: if the point of the rebuild was to stop taking anything on faith, the document explaining it should look like it wasn\u0026rsquo;t either.\nWhat the itch actually led to The report below is that solo rebuild, in full — methodology, assumptions, results, and the limits of what a thousand simulated years can and can\u0026rsquo;t tell you. It\u0026rsquo;s also, as it turned out, not the end of the story. Understanding the model well enough to rebuild it once made it obvious the next step wasn\u0026rsquo;t a report at all: a real, versioned, reusable tool, extended with a full fundamental thesis on the two stocks involved and a Value-at-Risk engine that didn\u0026rsquo;t have to be re-derived by hand for the next allocation. That project — the Casablanca Quant Framework — is documented separately, here, with the encrypted data pipeline that came with treating market data like something worth protecting.\nNone of it would exist if a compliment had just felt earned the first time.\nDownload the full report (PDF) Casablanca Stock Exchange Portfolio — Monte Carlo Simulation \u0026amp; VaR \u0026larr; 1 / … \u0026rarr; Download Loading document… ","permalink":"/blog/my-first-quant-model/","summary":"Our team\u0026rsquo;s Monte Carlo simulation for a Casablanca Stock Exchange portfolio earned the professor\u0026rsquo;s praise. The problem: I couldn\u0026rsquo;t say, with a straight face, that I understood why it worked. This is the story of the solo rebuild that followed — and the 1946 card game that gave the method its name.","title":"My First Quant Model — What a Casino Taught a Finance Class About Risk"}]