Analyzing Portfolio Growth Over Time Using Power BI
Analyzing portfolio growth over time Power BI là bước chuyển từ snapshot hiện tại sang câu chuyện dài hạn.
Biết AUM hôm nay là ₫2.4 tỷ chưa đủ. Portfolio Manager cần biết danh mục tăng trưởng bao nhiêu % mỗi năm.
Tốc độ đang chậm lại không? So với benchmark thì sao?
Bài viết hướng dẫn đầy đủ — từ CAGR, compound returns, growth rate DAX đến visualization thể hiện tăng trưởng dài hạn. Tham khảo thêm tại Microsoft DAX Function Reference.
📌 Đây là bài số 10 trong series Power BI Financial Analytics tại MCNA:
- Bài 7: Using DAX to Calculate Investment Returns
- Bài 8: Tracking Realized vs Unrealized Profit in Power BI
- Bài 9: Time Intelligence in Power BI for Financial Analysis
- Bài 10: Analyzing Portfolio Growth Over Time Power BI ← Bạn đang đọc
- Bài 11: Automated Reporting & Scheduled Refresh — sắp ra mắt
1. Tại Sao Growth Analysis Khác Performance Analysis?
Hai góc nhìn khác nhau về cùng một danh mục
Performance Analysis đo hiệu suất tại một kỳ cụ thể — tháng này, quý này, năm này.
Growth Analysis đo xu hướng tăng trưởng theo thời gian dài — 3 năm, 5 năm, từ ngày mở tài khoản.
Cần cả hai để đánh giá đầy đủ. Một danh mục có thể outperform tháng này nhưng underperform về mặt dài hạn.
Các câu hỏi Growth Analysis trả lời
| Câu hỏi | Metric | Timeframe |
|---|---|---|
| Tốc độ tăng trưởng kép hàng năm? | CAGR | Từ inception đến nay |
| AUM tăng bao nhiêu lần từ đầu? | Total Return Multiple | Toàn bộ thời gian nắm giữ |
| Tốc độ tăng đang tăng hay giảm? | Growth Rate Trend | So sánh các giai đoạn |
| AUM tăng do đầu tư mới hay lợi nhuận? | Growth Decomposition | Monthly / Quarterly |
| Khách hàng nào tăng trưởng nhanh nhất? | Cohort Growth | Theo ngày onboard |
💡 Nguyên tắc: Growth Analysis nhìn ra sau để hiểu xu hướng. Performance Analysis nhìn vào hiện tại để đánh giá hiệu quả.
Cả hai đều cần thiết trong cùng một dashboard.
2. CAGR — Compound Annual Growth Rate
CAGR là gì và tại sao quan trọng?
CAGR là tốc độ tăng trưởng kép hàng năm — mức tăng trưởng đều đặn giả định mỗi năm để đạt kết quả cuối.
Đây là chỉ số chuẩn nhất để so sánh tăng trưởng giữa các danh mục có thời gian đầu tư khác nhau.
DAX cho CAGR
-- CAGR = (End Value / Begin Value) ^ (1/Years) - 1
Portfolio CAGR % =
VAR BeginValue =
CALCULATE(
[Total Market Value],
FIRSTDATE(DimDate[Date])
)
VAR EndValue =
CALCULATE(
[Total Market Value],
LASTDATE(DimDate[Date])
)
VAR Years =
DATEDIFF(
FIRSTDATE(DimDate[Date]),
LASTDATE(DimDate[Date]),
YEAR
)
RETURN
IF(
Years > 0 && BeginValue > 0,
POWER(DIVIDE(EndValue, BeginValue), 1/Years) - 1,
BLANK()
)
-- CAGR với khoảng thời gian tùy chọn
CAGR Custom Period % =
VAR StartVal =
CALCULATE([Total Market Value],
FILTER(ALL(DimDate), DimDate[Date] = [Start Date]))
VAR EndVal = [Total Market Value]
VAR Days = DATEDIFF([Start Date], TODAY(), DAY)
RETURN
POWER(DIVIDE(EndVal, StartVal), 365/Days) - 1
CAGR Display theo từng giai đoạn
-- CAGR 1 năm, 3 năm, 5 năm — benchmark chuẩn fund reporting
CAGR 1Y % =
VAR StartVal =
CALCULATE([Total Market Value],
DATEADD(DimDate[Date], -1, YEAR))
RETURN POWER(DIVIDE([Total Market Value], StartVal), 1/1) - 1
CAGR 3Y % =
VAR StartVal =
CALCULATE([Total Market Value],
DATEADD(DimDate[Date], -3, YEAR))
RETURN POWER(DIVIDE([Total Market Value], StartVal), 1/3) - 1
CAGR 5Y % =
VAR StartVal =
CALCULATE([Total Market Value],
DATEADD(DimDate[Date], -5, YEAR))
RETURN POWER(DIVIDE([Total Market Value], StartVal), 1/5) - 1
✅ Best practice: Luôn hiển thị CAGR 1Y, 3Y, 5Y cạnh nhau.
Portfolio Manager cần thấy cả ngắn hạn lẫn dài hạn để đánh giá tính nhất quán.
3. Compound Returns và Rule of 72
Compound Returns khác Simple Returns thế nào?
Simple Return tính lãi trên vốn gốc ban đầu. Compound Return tính lãi trên cả vốn gốc lẫn lãi đã tích lũy.
Sự khác biệt càng lớn khi thời gian đầu tư càng dài.
DAX cho Compound Returns
-- Total Return Multiple (Danh mục tăng bao nhiêu lần)
Return Multiple =
DIVIDE(
[Total Market Value],
[Total Initial Investment]
)
-- Compounded Return % (đã gộp lãi)
Compound Return % =
[Return Multiple] - 1
-- Annualized Compound Return
Annualized Compound Return % =
VAR Days = DATEDIFF([Portfolio Start Date], TODAY(), DAY)
RETURN
POWER([Return Multiple], 365/Days) - 1
-- Disp: "₫1 tăng thành ₫X"
Growth of 1 Display =
"₫1 → ₫" & FORMAT([Return Multiple], "0.00")
Rule of 72 — ước tính thời gian tăng gấp đôi
-- Rule of 72: Years to double = 72 / CAGR%
Years to Double =
DIVIDE(72, [Portfolio CAGR %] * 100)
-- Display
Doubling Time =
FORMAT([Years to Double], "0.0") & " năm để tăng gấp đôi"
-- Ví dụ: CAGR 12% → 72/12 = 6 năm
4. Tốc Độ Tăng Trưởng Theo Giai Đoạn
Growth Rate khác CAGR ở điểm nào?
CAGR là một con số duy nhất cho toàn bộ giai đoạn.
Growth Rate theo giai đoạn cho thấy tốc độ tăng trưởng đang tăng nhanh, chậm lại hay đảo chiều.
DAX cho Growth Rate theo năm
-- Annual Growth Rate từng năm
Annual Growth Rate % =
VAR CurrentYear = [Total Market Value]
VAR PreviousYear =
CALCULATE([Total Market Value],
DATEADD(DimDate[Date], -1, YEAR))
RETURN DIVIDE(CurrentYear - PreviousYear, PreviousYear)
-- Growth Acceleration (tốc độ có đang tăng không?)
Growth Acceleration =
VAR CurrentGrowth = [Annual Growth Rate %]
VAR PreviousGrowth =
CALCULATE([Annual Growth Rate %],
DATEADD(DimDate[Date], -1, YEAR))
RETURN CurrentGrowth - PreviousGrowth
-- Growth Trend Label
Growth Trend =
SWITCH(TRUE(),
[Growth Acceleration] > 0.02, "🚀 Accelerating",
[Growth Acceleration] > 0, "📈 Growing",
[Growth Acceleration] > -0.02, "📉 Slowing",
"⚠️ Decelerating"
)
Growth Rate vs Target
-- So sánh growth rate thực tế với target
Growth vs Target =
VAR Actual = [Annual Growth Rate %]
VAR Target = 0.15 -- 15% annual target
RETURN
IF(Actual >= Target,
"✅ " & FORMAT(Actual - Target, "+0.0%") & " above target",
"❌ " & FORMAT(Target - Actual, "0.0%") & " below target"
)
5. AUM Growth Decomposition
AUM tăng do đâu?
AUM tăng từ hai nguồn khác nhau — lợi nhuận đầu tư và dòng tiền mới vào.
Phân biệt được hai nguồn này mới hiểu được thực sự chiến lược đầu tư đang hiệu quả đến đâu.
DAX cho Growth Decomposition
-- AUM Growth = Investment Return + Net New Money
AUM Growth Total =
[Total Market Value] - [Prior Period Market Value]
-- Phần do lợi nhuận đầu tư
Growth from Returns =
[Prior Period Market Value] * [Period Return %]
-- Phần do tiền mới vào
Growth from New Money =
[Net Cash Inflow] - [Net Cash Outflow]
-- Organic vs Inorganic Growth
Organic Growth % =
DIVIDE([Growth from Returns], [AUM Growth Total])
Inorganic Growth % =
DIVIDE([Growth from New Money], [AUM Growth Total])
-- Display cho Waterfall chart
Growth Waterfall =
SWITCH(
SELECTEDVALUE(GrowthType[Type]),
"Investment Return", [Growth from Returns],
"New Capital", [Growth from New Money],
"Total", [AUM Growth Total]
)
💡 Insight thực tế: Nếu Organic Growth % < 50% — tăng trưởng AUM đến chủ yếu từ tiền mới, không phải hiệu quả đầu tư.
Đây là tín hiệu quan trọng cần báo cáo cho management.
6. Visualization Cho Growth Analysis
Chọn đúng chart cho growth data
Growth over time cần chart thể hiện được xu hướng và momentum — không chỉ giá trị tại một điểm.
Area Chart là lựa chọn tốt nhất vì nó thể hiện được cả giá trị tuyệt đối lẫn tốc độ thay đổi.
Area Chart — thiết lập chuẩn
-- Field setup cho Area Chart:
-- X-axis: DimDate[Month] hoặc DimDate[Year]
-- Y-axis: [Total Market Value]
-- Legend: DimAsset[AssetClass]
-- Tooltip: [CAGR %], [Growth Rate %], [YoY Change]
-- Measure cho stacked area (theo asset class)
Asset Class AUM =
CALCULATE(
[Total Market Value],
VALUES(DimAsset[AssetClass])
)
-- Smooth curve option:
-- Format → Lines → Line style → Smooth
Log Scale — khi AUM chênh lệch lớn
-- Khi có client HNWI và Retail trong cùng chart
-- AUM chênh nhau 100x → Retail bị flatten hoàn toàn
-- Giải pháp: dùng Log scale hoặc tạo chart riêng theo segment
-- Hoặc chuẩn hóa về index = 100 tại điểm bắt đầu
Indexed AUM =
DIVIDE(
[Total Market Value],
CALCULATE(
[Total Market Value],
FIRSTDATE(DimDate[Date])
)
) * 100
-- Index 100 cho phép so sánh tất cả clients
-- bất kể quy mô tuyệt đối khác nhau
Small Multiples — growth chart theo segment
-- Dùng Small Multiples (Power BI) để tạo chart riêng
-- cho từng Client Segment hoặc Asset Class
-- Format → Small multiples → Field: DimClient[Segment]
-- Mỗi panel hiển thị cùng metric nhưng filtered riêng
-- Rất hiệu quả để so sánh growth pattern giữa các segment
7. So Sánh Growth Với Benchmark
Growth relative — quan trọng hơn absolute
Danh mục tăng 200% trong 5 năm nghe rất tốt.
Nhưng nếu VNINDEX tăng 350% cùng kỳ — đó là underperform nghiêm trọng.
DAX cho Benchmark Growth Comparison
-- Portfolio CAGR vs Benchmark CAGR
Benchmark CAGR % =
VAR BmStart =
CALCULATE(
FIRSTNONBLANK(FactBenchmark[CloseValue], 1),
FIRSTDATE(DimDate[Date])
)
VAR BmEnd =
CALCULATE(
LASTNONBLANK(FactBenchmark[CloseValue], 1),
LASTDATE(DimDate[Date])
)
VAR Years =
DATEDIFF(
FIRSTDATE(DimDate[Date]),
LASTDATE(DimDate[Date]),
YEAR
)
RETURN
POWER(DIVIDE(BmEnd, BmStart), 1/Years) - 1
-- CAGR Alpha (vượt trội CAGR so với benchmark)
CAGR Alpha % =
[Portfolio CAGR %] - [Benchmark CAGR %]
-- Growth Multiple vs Benchmark
Portfolio Multiple = DIVIDE([Total Market Value], [Initial Investment])
Benchmark Multiple =
DIVIDE([Benchmark Current Value], [Benchmark Initial Value])
Growth Multiple Delta =
[Portfolio Multiple] - [Benchmark Multiple]
Indexed Growth Chart — portfolio vs benchmark
-- Cả hai đều bắt đầu từ 100 để so sánh fair
Benchmark Indexed =
DIVIDE(
[Benchmark Current Value],
[Benchmark Initial Value]
) * 100
-- Chart: Line chart, 2 series
-- Series 1: [Indexed AUM] (portfolio)
-- Series 2: [Benchmark Indexed]
-- Khoảng cách giữa 2 line = Alpha tích lũy
8. Cohort Analysis Theo Ngày Onboard
Cohort Analysis trong portfolio management
Cohort Analysis nhóm khách hàng theo ngày họ bắt đầu đầu tư.
Câu hỏi quan trọng: Khách onboard năm 2020 tăng trưởng khác gì so với khách onboard năm 2022?
DAX cho Cohort Growth
-- Cohort year của từng client
Client Cohort Year =
YEAR(MIN(FactTrade[TradeDate]))
-- Months since onboard
Months Since Onboard =
DATEDIFF(
CALCULATE(MIN(FactTrade[TradeDate]),
ALL(DimDate)),
MAX(DimDate[Date]),
MONTH
)
-- Cohort Growth % (so với giá trị ban đầu của cohort)
Cohort Growth % =
VAR InitialValue =
CALCULATE(
[Total Market Value],
FILTER(ALL(DimDate),
DimDate[Date] = MIN(FactTrade[TradeDate]))
)
RETURN DIVIDE([Total Market Value] - InitialValue, InitialValue)
-- Matrix visual: Rows = Cohort Year, Columns = Months Since Onboard
-- Values = [Cohort Growth %]
-- Conditional formatting theo màu
💡 Insight từ Cohort: Nếu cohort 2020 tăng trưởng tốt hơn cohort 2022 ở cùng tháng thứ 6 — đó có thể do điều kiện thị trường.
Hoặc do chiến lược đầu tư đã thay đổi theo thời gian.
9. Growth Projection và Forecast
Forecast trong Power BI
Power BI có tính năng Forecast built-in trong Line Chart.
Nó dùng exponential smoothing để dự báo xu hướng. Phù hợp để thể hiện growth projection cho Portfolio Manager.
Bật Forecast trong Power BI
-- Bước 1: Dùng Line Chart (không phải Area Chart)
-- Bước 2: Analytics pane → Forecast → Turn on
-- Bước 3: Cấu hình:
-- Forecast length: 6-12 months
-- Confidence interval: 95%
-- Seasonality: Detect automatically
-- Kết quả: Đường dự báo + vùng confidence interval
DAX cho Manual Projection
-- Projection dựa trên CAGR hiện tại
Projected AUM 1Y =
[Total Market Value] * (1 + [Portfolio CAGR %])
Projected AUM 3Y =
[Total Market Value] * POWER(1 + [Portfolio CAGR %], 3)
Projected AUM 5Y =
[Total Market Value] * POWER(1 + [Portfolio CAGR %], 5)
-- Display trong KPI card
Projection Display =
"1Y: " & FORMAT([Projected AUM 1Y]/1000000000, "₫#,##0.0T")
& " | 3Y: " & FORMAT([Projected AUM 3Y]/1000000000, "₫#,##0.0T")
& " | 5Y: " & FORMAT([Projected AUM 5Y]/1000000000, "₫#,##0.0T")
⚠️ Lưu ý: Projection dựa trên CAGR lịch sử không phải dự báo tài chính.
Cần disclaimer rõ ràng: “Dựa trên tốc độ tăng trưởng lịch sử. Không phải cam kết lợi nhuận.”
10. Kết Luận
Growth over time — câu chuyện dài hạn của danh mục
Analyzing portfolio growth over time Power BI không dừng lại ở một con số CAGR.
Đó là việc hiểu được tốc độ tăng trưởng đang ở giai đoạn nào — tăng tốc, ổn định hay chậm lại.
Khi CAGR, growth decomposition và cohort analysis được tích hợp — Portfolio Manager có đủ dữ liệu để ra quyết định chiến lược dài hạn.
Ba điều cốt lõi cần nhớ
- Luôn hiển thị CAGR 1Y, 3Y, 5Y cạnh nhau. Một con số CAGR duy nhất không nói lên tính nhất quán của tăng trưởng.
- Phân biệt Organic Growth (từ lợi nhuận) và Inorganic Growth (từ tiền mới). Tỷ lệ này cho thấy thực chất hiệu quả đầu tư.
- Chuẩn hóa về Index = 100 khi so sánh nhiều danh mục. Chênh lệch quy mô tuyệt đối sẽ không làm distort kết quả so sánh.
Tài liệu tham khảo
- 📘 DAX Function Reference — Microsoft Docs
- 📘 Power BI Visualization Types — Microsoft Docs
- 📘 Portfolio Performance Evaluation — CFA Institute
- 📘 DAX Studio — debug và tối ưu measures
Bài viết liên quan tại MCNA
- 👉 Time Intelligence in Power BI for Financial Analysis
- 👉 Tracking Realized vs Unrealized Profit in Power BI
- 👉 Analyzing Portfolio Performance in Power BI
- 👉 Khóa học Power BI & Business Intelligence tại MCNA
- 👉 Blog Data Analytics MCNA
Về tác giả
Triều Đặng — Middle Data Analyst tại MCNA Technology School. Chuyên về financial data analytics, Power BI và automated reporting trong Wealth Management.
MCNA Technology School là đơn vị tiên phong đào tạo AI, Big Data, Business Intelligence tại Việt Nam.
Đối tác đào tạo của 300+ doanh nghiệp: Viettel Global, Masan Group, Techcombank, VPBank, Daikin.
- 🌐 mcna.vn
- 📘 facebook.com/mcnatechnologyschool
- ▶️ youtube.com/@mcna.technology.school
- 💼 linkedin.com/company/mcna-vn
- 📞 0939.866.825 (Mr. Minh Khang)
- 📍 30 Trung Liệt, Đống Đa, Hà Nội
- 📍 Liền kề 44B, TT2, Văn Quán, Hà Đông, Hà Nội
- 📍 The BIB Space, 50B Phan Tây Hồ, Cầu Kiệu, TPHCM

