Visualizing portfolio risk volatility Power BI là bước hoàn thiện cuối cùng của một Financial Analytics dashboard.
Return cao chưa đủ. Portfolio Manager cần biết mức return đó đến từ bao nhiêu rủi ro.
Bài viết hướng dẫn đầy đủ — từ Volatility DAX, VaR visualization, Correlation Matrix đến Risk Heatmap và Drawdown chart. Tham khảo thêm tại Microsoft DAX Statistical Functions.
📌 Đây là bài số 11 trong series Power BI Financial Analytics tại MCNA:
- 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 Using Power BI
- Bài 11: Visualizing Portfolio Risk Volatility Power BI ← Bạn đang đọc
- Bài 12: Automated Reporting & Scheduled Refresh — sắp ra mắt
1. Tại Sao Risk Visualization Quan Trọng?
Return không có ý nghĩa nếu không có context về risk
Hai danh mục cùng đạt YTD Return 18%.
Nhưng danh mục A có Volatility 8%, danh mục B có Volatility 24%.
Đây là hai kết quả hoàn toàn khác nhau về chất lượng quản lý rủi ro.
Các loại risk cần visualize
| Loại Risk | Metric | Visualization phù hợp |
|---|---|---|
| Market Risk | Volatility, Beta, VaR | Line chart, Gauge, KPI card |
| Drawdown Risk | Max Drawdown, Recovery Time | Area chart với underwater plot |
| Concentration Risk | Top 10 holding %, Herfindahl | Treemap, Bar chart |
| Correlation Risk | Correlation Matrix, R² | Matrix visual, Scatter plot |
| Tail Risk | CVaR, Skewness, Kurtosis | Histogram, Distribution chart |
💡 Nguyên tắc: Không có risk metric nào đủ một mình. Risk dashboard tốt cần ít nhất 3 góc nhìn khác nhau — market risk, drawdown risk và concentration risk.
2. Volatility — Độ Biến Động
Volatility đo lường điều gì?
Volatility là độ lệch chuẩn của daily returns. Nó đo mức độ dao động của danh mục.
Volatility cao = rủi ro cao = return có thể rất tốt hoặc rất tệ.
DAX cho Portfolio Volatility
-- Daily Return (cần trước khi tính volatility)
Daily Portfolio Return % =
VAR TodayValue =
CALCULATE([Total Market Value],
LASTDATE(DimDate[Date]))
VAR YesterdayValue =
CALCULATE([Total Market Value],
DATEADD(DimDate[Date], -1, DAY))
RETURN DIVIDE(TodayValue - YesterdayValue, YesterdayValue)
-- Annualized Volatility (252 ngày giao dịch)
Portfolio Volatility % =
VAR DailyReturns =
CALCULATETABLE(
ADDCOLUMNS(
DATESINPERIOD(DimDate[Date],
LASTDATE(DimDate[Date]), -252, DAY),
"DR", [Daily Portfolio Return %]
)
)
RETURN
STDEVX.P(DailyReturns, [DR]) * SQRT(252)
-- Rolling 30-day Volatility
Volatility 30D =
VAR DailyReturns =
CALCULATETABLE(
ADDCOLUMNS(
DATESINPERIOD(DimDate[Date],
LASTDATE(DimDate[Date]), -30, DAY),
"DR", [Daily Portfolio Return %]
)
)
RETURN STDEVX.P(DailyReturns, [DR]) * SQRT(252)
Volatility Gauge — visual trực quan nhất
-- Risk Level classification cho Gauge visual
Volatility Risk Level =
SWITCH(TRUE(),
[Portfolio Volatility %] < 0.08, "🟢 Low (< 8%)",
[Portfolio Volatility %] < 0.15, "🟡 Moderate (8-15%)",
[Portfolio Volatility %] < 0.25, "🟠 High (15-25%)",
"🔴 Very High (> 25%)"
)
-- Gauge target lines:
-- Min: 0% | Max: 40%
-- Warning: 15% | Critical: 25%
✅ Best practice: Dùng Gauge visual (Power BI built-in) cho Volatility. Đặt target line tại mức volatility tối đa cho phép theo Investment Policy Statement của tổ chức.
3. VaR Visualization
Từ con số VaR đến visual có ý nghĩa
VaR 95% = 2.3% nghĩa là: có 95% khả năng danh mục không mất quá 2.3% trong ngày mai.
Con số này cần được visualize rõ ràng. Portfolio Manager không đọc xác suất — họ đọc chart.
DAX cho VaR metrics
-- VaR 95% Daily (Parametric)
VaR 95% Daily =
VAR DailyReturns =
CALCULATETABLE(
ADDCOLUMNS(
DATESINPERIOD(DimDate[Date],
LASTDATE(DimDate[Date]), -252, DAY),
"DR", [Daily Portfolio Return %]
)
)
VAR MeanR = AVERAGEX(DailyReturns, [DR])
VAR StdR = STDEVX.P(DailyReturns, [DR])
RETURN ABS(MeanR - 1.645 * StdR)
-- VaR 99% Daily
VaR 99% Daily =
VAR DailyReturns =
CALCULATETABLE(
ADDCOLUMNS(
DATESINPERIOD(DimDate[Date],
LASTDATE(DimDate[Date]), -252, DAY),
"DR", [Daily Portfolio Return %]
)
)
VAR MeanR = AVERAGEX(DailyReturns, [DR])
VAR StdR = STDEVX.P(DailyReturns, [DR])
RETURN ABS(MeanR - 2.326 * StdR)
-- VaR Amount (₫)
VaR 95% Amount =
[Total Market Value] * [VaR 95% Daily]
-- Expected Shortfall (CVaR) — trung bình lỗ vượt VaR
CVaR 95% =
[VaR 95% Daily] * 1.25 -- Xấp xỉ với normal distribution
VaR Breakdown theo Asset Class
-- VaR contribution từng asset class
Asset Class VaR Contribution =
DIVIDE(
[Asset Class Volatility %] * [Asset Class Weight %],
[Portfolio Volatility %]
)
-- Bar chart: VaR contribution per Asset Class
-- Giúp xác định nguồn rủi ro lớn nhất
4. Drawdown Chart
Drawdown là gì?
Drawdown đo mức sụt giảm từ đỉnh cao nhất đến đáy thấp nhất.
Max Drawdown cho thấy điều tệ nhất có thể xảy ra trong lịch sử danh mục. Đây là chỉ số Portfolio Manager sợ nhất.
DAX cho Drawdown
-- Portfolio High Watermark (đỉnh cao nhất từ trước đến nay)
High Watermark =
CALCULATE(
MAXX(
FILTER(ALL(DimDate),
DimDate[Date] <= MAX(DimDate[Date])),
CALCULATE([Total Market Value])
)
)
-- Current Drawdown %
Current Drawdown % =
DIVIDE(
[Total Market Value] - [High Watermark],
[High Watermark]
)
-- Max Drawdown trong khoảng thời gian
Max Drawdown % =
MINX(
FILTER(ALL(DimDate),
DimDate[Date] <= MAX(DimDate[Date])),
CALCULATE([Current Drawdown %])
)
-- Drawdown Duration (ngày từ đỉnh đến đáy)
Drawdown Duration =
CALCULATE(
COUNTROWS(
FILTER(ALL(DimDate),
DimDate[Date] <= MAX(DimDate[Date])
&& CALCULATE([Current Drawdown %]) < 0)
)
)
Underwater Plot — visualize drawdown đúng cách
-- Underwater plot: Area chart với [Current Drawdown %]
-- Khi drawdown âm → vùng màu đỏ dưới đường 0
-- Khi recovery → vùng màu xanh trở lại đường 0
-- Conditional color cho Area chart:
Drawdown Color =
IF([Current Drawdown %] < -0.10, "#FF2244", -- Đỏ: severe
IF([Current Drawdown %] < -0.05, "#FF8844", -- Cam: moderate
IF([Current Drawdown %] < 0, "#FFCC44", -- Vàng: mild
"#00CC88"))) -- Xanh: recovery
⚠️ Lưu ý: Max Drawdown chỉ là lịch sử. Nó không dự báo drawdown tương lai. Kết hợp với VaR để có cái nhìn đầy đủ hơn về downside risk.
5. Beta và Market Sensitivity
Beta đo lường gì?
Beta = 1: danh mục di chuyển cùng chiều và cùng biên độ với thị trường.
Beta > 1: danh mục nhạy cảm hơn thị trường — tăng mạnh hơn nhưng cũng giảm mạnh hơn.
Beta < 1: danh mục ổn định hơn thị trường.
DAX cho Beta Visualization
-- Portfolio Beta (đã tính ở bài 7)
Portfolio Beta =
VAR N = 252
VAR PortReturns =
CALCULATETABLE(
ADDCOLUMNS(
DATESINPERIOD(DimDate[Date], LASTDATE(DimDate[Date]), -N, DAY),
"PR", [Daily Portfolio Return %]
)
)
VAR BmReturns =
CALCULATETABLE(
ADDCOLUMNS(
DATESINPERIOD(DimDate[Date], LASTDATE(DimDate[Date]), -N, DAY),
"BR", [Daily Benchmark Return %]
)
)
VAR AvgPR = AVERAGEX(PortReturns, [PR])
VAR AvgBR = AVERAGEX(BmReturns, [BR])
VAR Cov =
AVERAGEX(PortReturns,
([PR] - AvgPR) * CALCULATE(AVERAGEX(BmReturns, [BR] - AvgBR)))
VAR VarBm = VARX.P(BmReturns, [BR])
RETURN DIVIDE(Cov, VarBm)
-- Beta Label cho KPI card
Beta Label =
VAR B = [Portfolio Beta]
RETURN
SWITCH(TRUE(),
B > 1.3, "🔴 High Beta (" & FORMAT(B,"0.00") & ")",
B > 0.8, "🟡 Market Beta (" & FORMAT(B,"0.00") & ")",
B > 0.5, "🟢 Low Beta (" & FORMAT(B,"0.00") & ")",
"🔵 Defensive (" & FORMAT(B,"0.00") & ")"
)
Rolling Beta — Beta thay đổi theo thời gian
-- Rolling 60-day Beta (thể hiện beta đang tăng hay giảm)
Rolling Beta 60D =
-- Tính beta tương tự nhưng dùng DATESINPERIOD(-60, DAY)
-- Visualize bằng Line chart theo thời gian
-- Cho thấy portfolio đang trở nên rủi ro hơn hay phòng thủ hơn
6. Correlation Matrix
Tại sao Correlation Matrix quan trọng?
Diversification chỉ có tác dụng khi các tài sản không đi cùng chiều.
Correlation Matrix cho thấy mức độ tương quan giữa các tài sản. Nếu mọi thứ đều tương quan cao — danh mục không thực sự được đa dạng hóa.
Tính Correlation trong Power BI
-- Correlation giữa hai asset (Pearson)
-- Cần CORR() nhưng DAX không có — dùng công thức thay thế
Correlation Asset A vs B =
VAR N = 252
VAR ReturnsA =
CALCULATETABLE(
ADDCOLUMNS(
DATESINPERIOD(DimDate[Date], LASTDATE(DimDate[Date]), -N, DAY),
"RA", CALCULATE([Daily Return %],
DimAsset[AssetCode] = "VNM")
)
)
VAR AvgA = AVERAGEX(ReturnsA, [RA])
VAR AvgB = -- tương tự cho asset B
VAR Cov = AVERAGEX(ReturnsA, ([RA] - AvgA) * ([RB] - AvgB))
VAR StdA = STDEVX.P(ReturnsA, [RA])
VAR StdB = -- tương tự
RETURN DIVIDE(Cov, StdA * StdB)
Matrix Visual — cách visualize Correlation
-- Dùng Matrix visual trong Power BI:
-- Rows = Asset Code (từ DimAsset)
-- Columns = Asset Code (từ DimAsset copy)
-- Values = [Pairwise Correlation]
-- Conditional formatting theo màu:
-- +1.0 → Đỏ đậm (tương quan dương hoàn toàn)
-- 0.0 → Trắng (không tương quan)
-- -1.0 → Xanh đậm (tương quan âm hoàn toàn)
Correlation Color =
IF([Pairwise Correlation] > 0.7, "#CC2200",
IF([Pairwise Correlation] > 0.3, "#FF8866",
IF([Pairwise Correlation] > -0.3, "#FFFFFF",
IF([Pairwise Correlation] > -0.7, "#6688FF",
"#0022CC"))))
💡 Insight quan trọng: Correlation tăng cao trong thị trường khủng hoảng — đúng lúc bạn cần diversification nhất.
Đây là lý do cần kiểm tra correlation trong giai đoạn stress testing.
7. Risk Heatmap
Risk Heatmap thể hiện điều gì?
Risk Heatmap hiển thị mức độ rủi ro theo hai chiều — thường là Asset Class × Time Period.
Nhìn một lần là thấy ngay ô nào đang có rủi ro cao nhất.
Tạo Risk Heatmap bằng Matrix visual
-- Rows = DimAsset[AssetClass]
-- Columns = DimDate[Quarter] hoặc DimDate[Month]
-- Values = [Asset Class Volatility %]
-- Measure cho heatmap cell
Risk Heatmap Value =
CALCULATE(
[Portfolio Volatility %],
VALUES(DimAsset[AssetClass]),
VALUES(DimDate[Quarter])
)
-- Conditional formatting (background color):
Risk Cell Color =
SWITCH(TRUE(),
[Risk Heatmap Value] >= 0.30, "#CC0000", -- Đỏ: rất cao
[Risk Heatmap Value] >= 0.20, "#FF6600", -- Cam: cao
[Risk Heatmap Value] >= 0.12, "#FFCC00", -- Vàng: trung bình
[Risk Heatmap Value] >= 0.06, "#99CC00", -- Xanh lá: thấp
"#009900" -- Xanh đậm: rất thấp
)
Concentration Risk Heatmap
-- Herfindahl-Hirschman Index (HHI) — đo concentration
HHI =
SUMX(
VALUES(DimAsset[AssetCode]),
POWER([Asset Weight %], 2)
)
-- HHI = 1 → danh mục chỉ có 1 tài sản (cực kỳ concentrated)
-- HHI = 1/N → danh mục phân bổ đều N tài sản
HHI Status =
SWITCH(TRUE(),
[HHI] > 0.25, "🔴 Highly Concentrated",
[HHI] > 0.15, "🟡 Moderately Concentrated",
"🟢 Well Diversified"
)
8. Risk-Return Scatter Plot
Scatter Plot — nhìn toàn bộ danh mục trong 1 visual
Scatter Plot đặt mỗi tài sản lên một điểm. Trục X là Volatility (risk), trục Y là Return.
Tài sản lý tưởng nằm ở góc trên trái — return cao, risk thấp.
Cấu hình Scatter Plot chuẩn
-- X-axis: [Asset Volatility %]
-- Y-axis: [Asset HPR YTD %]
-- Size: [Total Market Value] -- bubble size = portfolio weight
-- Legend: DimAsset[AssetClass] -- màu theo loại tài sản
-- Details: DimAsset[AssetCode] -- mỗi điểm = 1 mã CK
-- Quadrant lines (Analytics pane):
-- Vertical constant line = [Benchmark Volatility %]
-- Horizontal constant line = [Benchmark Return %]
-- 4 quadrants:
-- ↖ Low Risk, High Return → IDEAL (outperform with less risk)
-- ↗ High Risk, High Return → Aggressive (justified risk-taking)
-- ↙ Low Risk, Low Return → Defensive (safe but underperform)
-- ↘ High Risk, Low Return → AVOID (worst risk-adjusted return)
Efficient Frontier — overlay lên Scatter Plot
-- Efficient Frontier line thể hiện risk-return tối ưu
-- Tính bằng Python visual hoặc R visual trong Power BI
-- (Power BI hỗ trợ Python/R script trong visuals)
-- Hoặc đơn giản hơn: vẽ reference line thủ công
-- thể hiện portfolio đang nằm trên hay dưới frontier
9. Risk Dashboard Layout
Cấu trúc dashboard risk chuẩn
Risk Dashboard phải trả lời ngay 3 câu hỏi khi mở lên.
Câu 1: Danh mục đang có mức risk tổng thể thế nào?
Câu 2: Rủi ro đến từ đâu?
Câu 3: Có tài sản nào đang có risk bất thường không?
Layout đề xuất
- Row 1 — KPI Cards: Volatility % | VaR 95% | Max Drawdown | Beta | Sharpe Ratio
- Row 2 trái — Gauge: Volatility vs Risk Budget
- Row 2 phải — Underwater Plot: Drawdown over time
- Row 3 trái — Scatter Plot: Risk-Return per asset
- Row 3 phải — Heatmap: Risk by Asset Class × Quarter
- Row 4 — Correlation Matrix: Pairwise correlation heatmap
DAX cho Risk Budget KPI
-- Risk Budget Utilization
Risk Budget Used % =
DIVIDE([Portfolio Volatility %], [Risk Budget Target])
Risk Budget Status =
SWITCH(TRUE(),
[Risk Budget Used %] > 1.0, "🔴 Over Budget",
[Risk Budget Used %] > 0.85, "🟡 Near Limit",
[Risk Budget Used %] > 0.5, "🟢 Within Budget",
"🔵 Under Utilized"
)
-- Daily P&L vs VaR (backtesting)
VaR Breach =
IF(
ABS([Daily Portfolio Return %]) > [VaR 95% Daily],
"⚠️ VaR Breach",
"OK"
)
⚠️ Production tip: Thêm alert khi VaR bị breach hoặc Drawdown vượt ngưỡng.
Power BI Service hỗ trợ Data Alerts gửi email tự động — không cần DA ngồi canh dashboard.
10. Kết Luận
Risk visualization hoàn thiện bức tranh portfolio
Visualizing portfolio risk volatility Power BI không phải là thêm chart cho đẹp.
Đó là cung cấp thông tin để Portfolio Manager quản lý rủi ro chủ động — không phải phản ứng sau khi thiệt hại đã xảy ra.
Khi Volatility, Drawdown, Correlation và Risk Heatmap được tích hợp trong một dashboard — risk management trở thành một phần của quy trình, không phải ngoại lệ.
Ba điều cốt lõi cần nhớ
- Luôn visualize ít nhất 3 loại risk khác nhau — market risk, drawdown risk và concentration risk. Một mình Volatility không đủ.
- Drawdown chart quan trọng hơn Volatility với nhà đầu tư. Họ không sợ biến động — họ sợ mất tiền thực sự.
- Correlation tăng trong khủng hoảng. Stress-test correlation matrix ở giai đoạn thị trường xấu để thấy diversification thực sự hoạt động không.
Tài liệu tham khảo
- 📘 DAX Statistical Functions — Microsoft Docs
- 📘 Scatter Chart in Power BI — Microsoft Docs
- 📘 Risk Management — CFA Institute
- 📘 DAX Studio — debug statistical measures
Bài viết liên quan tại MCNA
- 👉 Analyzing Portfolio Growth Over Time Using Power BI
- 👉 Using DAX to Calculate Investment Returns
- 👉 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

