Báo cáo tài chính và chỉ số cơ bản
Mục lục
Lớp Fundamental() lấy số liệu báo cáo tài chính của một mã cổ phiếu: ba báo cáo chính, bộ chỉ số
tài chính, thuyết minh và bảng sức khoẻ tài chính. Mọi báo cáo dùng chung một bộ chỉ tiêu chuẩn theo
chuẩn mực kế toán Việt Nam, có mã chỉ tiêu cố định, nên mã bạn viết cho FPT chạy được cho mã khác cùng
loại hình mà không phải sửa tên cột.
from vnstock import Fundamental
fin = Fundamental().equity("FPT")
df = fin.income_statement(period="year")Tóm tắt
| Hàm | Làm gì | Cấp |
|---|---|---|
income_statement() | Báo cáo kết quả kinh doanh | Mọi cấp. Nguồn mas chỉ cho Tài trợ |
balance_sheet() | Bảng cân đối kế toán | Mọi cấp. Nguồn mas chỉ cho Tài trợ |
cash_flow() | Báo cáo lưu chuyển tiền tệ | Mọi cấp. Nguồn mas chỉ cho Tài trợ |
ratio() | Chỉ số tài chính: định giá, hiệu quả hoạt động, đòn bẩy… | Tài trợ |
note() | Thuyết minh báo cáo tài chính | Tài trợ |
financial_health() | Bảng sức khoẻ tài chính: các chỉ tiêu cần xem trước, gom vào một bảng | Tài trợ |
Ở cấp Khách và Cộng đồng, ba báo cáo chính trả về ở dạng rút gọn và giới hạn số kỳ, xem mục Quyền theo cấp bên dưới.
Kế hoạch kinh doanh năm (annual_plan) chưa có hàm trên Fundamental(). Bạn lấy nó qua lớp kiểu cũ
Finance, xem mục Kế hoạch kinh doanh năm ở cuối trang.
Hai cách gọi
Cả hai cách cho cùng kết quả:
from vnstock import Fundamental
fun = Fundamental()
# Gắn mã trước, rồi chọn báo cáo
fun.equity("VCB").balance_sheet(period="year")
# Chọn báo cáo trước, mã là tham số đầu tiên
fun.equity.balance_sheet("VCB", period="year")Mã cổ phiếu được tự chuyển sang chữ hoa.
Quyền theo cấp
| Khách (chưa có khoá) | Cộng đồng (có khoá) | Tài trợ | |
|---|---|---|---|
| Ba báo cáo chính | Có | Có | Có |
| Số kỳ nhiều nhất mỗi lần gọi | 4 | 8 | Mọi kỳ nguồn trả về |
| Bộ chỉ tiêu | Rút gọn: chỉ chỉ tiêu cấp 1 | Rút gọn: chỉ chỉ tiêu cấp 1 | Đầy đủ |
| Nguồn | vci, kbs | vci, kbs | vci, kbs, mas |
ratio(), note(), financial_health() | Không | Không | Có |
Số kỳ. Thư viện giữ các kỳ gần nhất và bỏ các kỳ cũ hơn. Nếu kết quả bị cắt,
df.attrs["tier_cap_periods"] cho biết số kỳ đã giữ. Phép cắt chạy trước khi xoay bảng, nên dạng
dài, dạng rộng và dạng chuỗi thời gian của cùng một lời gọi có cùng các kỳ.
Báo cáo rút gọn. Mỗi báo cáo có chỉ tiêu cấp 1 (ví dụ "Doanh thu thuần", "Lợi nhuận gộp") và
chỉ tiêu con nằm dưới chúng (ví dụ "Tiền" và "Các khoản tương đương tiền" dưới "Tiền và các khoản
tương đương tiền"). Ở cấp Khách và Cộng đồng, ba báo cáo chính chỉ giữ chỉ tiêu cấp 1. Giá trị của
chỉ tiêu cấp 1 không đổi: thư viện đọc nó thẳng từ nguồn, không cộng từ chỉ tiêu con. Khi kết quả bị
rút gọn, df.attrs["tier_cap_level"] bằng 1. Thuyết minh không có ở hai cấp này.
Gọi hàm ngoài cấp, hay chọn nguồn ngoài cấp, thì nhận EntitlementError với mã
VNSTOCK_TIER_ROUTE hoặc VNSTOCK_TIER_SOURCE, và thư viện không gửi truy vấn nào đi. Xem
Cấp quyền và giới hạn.
Bỏ trống period thì hàm trả cả kỳ năm lẫn kỳ quý trong một bảng. Ở cấp Khách và Cộng đồng, phép giữ các kỳ gần nhất khi đó thường chỉ còn kỳ quý. Truyền period="year" hoặc period="quarter" để nhận đúng loại kỳ bạn cần.
Ba báo cáo chính
income_statement(com_type=None, *, period=None, lang="vi", drop_empty=False, format="long", source=None)
balance_sheet(com_type=None, *, period=None, lang="vi", drop_empty=False, format="long", source=None)
cash_flow(com_type=None, *, period=None, lang="vi", drop_empty=False, format="long", source=None)Ba hàm có cùng tham số.
| Tham số | Kiểu | Mặc định | Ý nghĩa |
|---|---|---|---|
com_type | str hoặc None | None | Loại hình doanh nghiệp, quyết định bộ chỉ tiêu. None hoặc "auto" thì tự nhận. Nhận "regular" (cũng viết "generic", "dn"), "bank" ("banking", "tctd"), "securities" ("ctck"), "insurance" ("dnpnt") |
period | str hoặc None | None | Kỳ báo cáo: "year" (cũng viết "yearly", "Y") hoặc "quarter" ("quarterly", "Q"). None lấy mọi kỳ, cả năm và quý |
lang | str | "vi" | Ngôn ngữ tên chỉ tiêu: "vi" hoặc "en". Chỉ đổi cột tên, không đổi mã chỉ tiêu |
drop_empty | bool | False | Bỏ chỉ tiêu không có số liệu khác 0 ở mọi kỳ |
format | str | "long" | Dạng bảng: "long", "wide" hoặc "time_series", xem mục Hình dạng bảng |
source | str hoặc None | None (dùng vci) | Nguồn: vci, kbs, hoặc mas (chỉ cấp Tài trợ) |
com_type là tham số vị trí đầu tiên. Viết income_statement("quarter") như bản 4.x sẽ nhận
InputError mã VNSTOCK_INPUT_COMPANY_TYPE. Luôn ghi tên tham số: income_statement(period="quarter").
Thường bạn không cần truyền com_type. Thư viện tự nhận ngân hàng, công ty chứng khoán, bảo hiểm và
doanh nghiệp thường, rồi dùng đúng bộ chỉ tiêu. Chỉ truyền khi một mã bị nhận sai loại hình khiến chỉ
tiêu thiếu hay lệch.
Ví dụ
from vnstock import Fundamental
fpt = Fundamental().equity("FPT")
vcb = Fundamental().equity("VCB")
is_year = fpt.income_statement(period="year")
is_quarter = fpt.income_statement(period="quarter", format="wide")
bs_bank = vcb.balance_sheet(period="year")
cf_kbs = fpt.cash_flow(period="year", source="kbs")Doanh nghiệp thường và ngân hàng
Mỗi loại hình có bộ chỉ tiêu riêng theo mẫu báo cáo của loại hình đó. Báo cáo kết quả kinh doanh của FPT bắt đầu bằng doanh thu bán hàng, của VCB bắt đầu bằng thu nhập lãi thuần.
FPT, income_statement(period="year"), chạy ngày 10/10/2026, cấp Tài trợ:
| period | id | name | order | level | unit | value |
|---|---|---|---|---|---|---|
| 2025 | IS_REVENUE | DOANH THU BÁN HÀNG VÀ CUNG CẤP DỊCH VỤ | 1 | 1 | VNĐ | 70207688944553 |
| 2025 | IS_REVENUE_DEDUCTIONS | Các khoản giảm trừ doanh thu | 2 | 1 | VNĐ | -94863843843 |
| 2025 | IS_NET_REVENUE | Doanh thu thuần về bán hàng và cung cấp dịch vụ | 3 | 1 | VNĐ | 70112825100710 |
VCB, cùng lời gọi:
| period | id | name | order | level | unit | value |
|---|---|---|---|---|---|---|
| 2025 | IS_NET_INTEREST_INCOME | Thu nhập lãi thuần | 1 | 1 | VNĐ | 58771410000000 |
| 2025 | IS_INTEREST_INCOME_AND_SIMILAR_INCOME | ‣ Thu nhập lãi và các khoản thu nhập tương tự | 2 | 2 | VNĐ | 105216484000000 |
| 2025 | IS_INTEREST_AND_SIMILAR_EXPENSES | ‣ Chi phí lãi và các chi phí tương tự | 3 | 2 | VNĐ | -46445074000000 |
Chỉ tiêu con có ký tự ‣ ở đầu tên. Ở cấp Khách và Cộng đồng,
hai dòng cấp 2 của VCB không có trong kết quả.
Bảng cân đối kế toán có thêm cột off_balance (bool): True với các chỉ tiêu ngoài bảng, ví dụ
khoản bảo lãnh vay vốn của ngân hàng.
Nguồn
source= | Cấp | Ghi chú |
|---|---|---|
vci (mặc định) | Mọi cấp | Khi chạy thử với FPT và VCB, kỳ năm có từ 2018, kỳ quý tới quý gần nhất đã công bố |
kbs | Mọi cấp | Trả ít kỳ hơn: khi chạy thử với FPT, kỳ năm chỉ có 4 năm gần nhất |
mas | Tài trợ |
Mọi nguồn trả cùng bộ cột và cùng mã chỉ tiêu. Một chỉ tiêu nguồn không có thì giá trị là NaN.
Nguồn thực tế của một kết quả nằm ở df.attrs["source"].
Hình dạng bảng
Tham số format chọn cách xếp bảng. Cả ba dạng chứa cùng số liệu, và chỉ mục luôn là RangeIndex
(0, 1, 2…), không có cột report_time.
format="long" (mặc định)
Mỗi dòng là một chỉ tiêu của một kỳ. Kỳ mới nhất đứng đầu, trong mỗi kỳ chỉ tiêu xếp theo thứ tự trình bày trong báo cáo.
| Cột | Kiểu | Ý nghĩa |
|---|---|---|
period | category | Kỳ: "2025" với kỳ năm, "2025-Q4" với kỳ quý |
id | string | Mã chỉ tiêu, cố định giữa các mã và các nguồn, ví dụ IS_NET_REVENUE |
name | string | Tên chỉ tiêu, theo lang |
order | int | Thứ tự trình bày trong báo cáo |
level | category | Cấp: 1 là chỉ tiêu chính, 2, 3 là chỉ tiêu con |
off_balance | bool | Chỉ có ở bảng cân đối kế toán: chỉ tiêu ngoài bảng |
unit | category | Đơn vị, ví dụ VNĐ |
value | float | Giá trị, theo đơn vị ở cột unit. Số tiền tính bằng đồng |
format="wide"
Mỗi dòng là một chỉ tiêu, mỗi kỳ là một cột, kỳ cũ bên trái, kỳ mới bên phải. Đây là dạng giống
orient="report" của bản 4.x. Cột tên chỉ tiêu ở dạng này là item thay cho name.
FPT, income_statement(period="year", format="wide"), chạy ngày 10/10/2026 (chỉ hiện ba kỳ cuối):
| id | item | level | order | unit | 2023 | 2024 | 2025 |
|---|---|---|---|---|---|---|---|
| IS_REVENUE | DOANH THU BÁN HÀNG VÀ CUNG CẤP DỊCH VỤ | 1 | 1 | VNĐ | 52625174861333 | 62962652134635 | 70207688944553 |
| IS_NET_REVENUE | Doanh thu thuần về bán hàng và cung cấp dịch vụ | 1 | 3 | VNĐ | 52617900827385 | 62848794351367 | 70112825100710 |
| IS_GROSS_PROFIT | LỢI NHUẬN GỘP VỀ BÁN HÀNG VÀ CUNG CẤP DỊCH VỤ | 1 | 5 | VNĐ | 20319553444682 | 23698348369916 | 25888529512413 |
format="time_series"
Mỗi dòng là một kỳ, mỗi chỉ tiêu là một cột, kỳ cũ ở trên. Cột đầu là period, các cột còn lại là
mã chỉ tiêu (IS_NET_REVENUE…), không phải tên, nên không đổi theo lang. Dạng này hợp để vẽ biểu
đồ hay đưa vào mô hình. Đây là dạng giống orient="time_series" của bản 4.x.
FPT, income_statement(period="quarter", format="time_series"), chạy ngày 10/10/2026 (ba dòng cuối,
ba cột tiêu biểu):
| period | IS_NET_REVENUE | IS_GROSS_PROFIT | IS_NET_PROFIT_AFTER_TAX |
|---|---|---|---|
| 2025-Q4 | 20225449892881 | 7047275086162 | 2994964817096 |
| 2026-Q1 | 12479997206775 | 4244889890688 | 2476789833481 |
| 2026-Q2 | 13788503461199 | 4279744280214 | 2570339099621 |
Giá trị khác ba dạng trên thì nhận InputError mã VNSTOCK_INPUT_FINANCIAL_FORMAT.
Tham số orient của bản 4.x
Ba báo cáo chính và ratio() vẫn hiểu orient= của bản 4.x: orient="report" cho
format="wide", orient="time_series" cho format="time_series". Nếu bạn truyền cả format
khác "long", format được ưu tiên. Mã mới nên dùng format.
Thông tin đi kèm
df.attrs mang các khoá: source (nguồn), symbol, report (tên báo cáo), format, route,
length (số dòng), taxonomy_version (phiên bản bộ chỉ tiêu). Khi kết quả bị cắt theo cấp có thêm
tier_cap_periods và tier_cap_level.
Chỉ số tài chính: ratio()
ratio(com_type=None, *, period=None, lang="vi", drop_empty=False, format="long", source=None)Cấp: Tài trợ. Khách và Cộng đồng nhận EntitlementError mã VNSTOCK_TIER_ROUTE.
Tham số giống ba báo cáo chính. Nguồn nhận: vci (mặc định), kbs, mas.
Bảng có cùng cột với dạng dài ở trên. Chỉ số xếp theo nhóm: dòng cấp 1 là tên nhóm (định giá, hiệu quả
hoạt động…) và không có giá trị, các chỉ số nằm ở cấp 2. Cột unit cho biết đơn vị của từng chỉ số
(lần, %…).
from vnstock import Fundamental
r = Fundamental().equity("FPT").ratio(period="year")FPT, chạy ngày 10/10/2026:
| period | id | name | level | unit | value |
|---|---|---|---|---|---|
| 2025 | RT_CAT_INFO_VALUATION | ĐỊNH GIÁ & THÔNG TIN DOANH NGHIỆP | 1 | NaN | |
| 2025 | RT_VALUE_PE | ‣ P/E cơ bản | 2 | lần | 10.5196 |
| 2025 | RT_VALUE_PB | ‣ P/B | 2 | lần | 2.7037 |
Thuyết minh: note()
note(**kwargs)Cấp: Tài trợ. Nguồn: vci.
Nhận cùng tham số từ khoá như income_statement(): com_type, period, lang, format, source,
drop_empty. Bảng có cùng cột với dạng dài. Mã chỉ tiêu bắt đầu bằng NT_.
from vnstock import Fundamental
notes = Fundamental().equity("FPT").note(period="year")FPT, chạy ngày 10/10/2026:
| period | id | name | level | unit | value |
|---|---|---|---|---|---|
| 2025 | NT_BS_CASH_AND_CASH_EQUIVALENTS | Tiền và tương đương tiền | 1 | VNĐ | 10522105729992 |
| 2025 | NT_BS_CASH_ON_HAND | ‣ Tiền mặt | 2 | VNĐ | 4255375565 |
| 2025 | NT_BS_CASH_IN_BANKS | ‣ Tiền gửi Ngân hàng | 2 | VNĐ | 8078385544605 |
Sức khoẻ tài chính: financial_health()
financial_health(com_type="auto", reports=None, scorecard="auto", *, period=None, lang="vi",
format="wide", limit=16, source=None)Cấp: Tài trợ. Nguồn: vci.
Hàm gom vài chục chỉ tiêu người đọc thường xem trước tiên, lấy từ ba báo cáo chính và bộ chỉ số, vào một bảng. Bộ chỉ tiêu chọn theo loại hình doanh nghiệp: ngân hàng có nợ xấu, bao phủ nợ xấu, hệ số an toàn vốn; doanh nghiệp thường có doanh thu, giá vốn, lợi nhuận gộp…
| Tham số | Kiểu | Mặc định | Ý nghĩa |
|---|---|---|---|
com_type | str | "auto" | Loại hình doanh nghiệp, như ở ba báo cáo chính |
reports | list[str] hoặc None | None | Báo cáo dùng để lập bảng, trong income_statement, balance_sheet, cash_flow, ratio. None dùng cả bốn |
scorecard | str | "auto" | Tên cũ của com_type. Khác "auto" thì được ưu tiên |
period | str hoặc None | None | "year" hoặc "quarter" |
lang | str | "vi" | Ngôn ngữ tên chỉ tiêu |
format | str | "wide" | Mặc định dạng rộng, khác các hàm trên. Cũng nhận "long", "time_series" |
limit | int | 16 | Số kỳ gần nhất giữ lại. 0 giữ mọi kỳ |
source | str hoặc None | None (dùng vci) | Nguồn |
from vnstock import Fundamental
Fundamental().equity("VCB").financial_health(period="quarter", limit=4)VCB, chạy ngày 10/10/2026 (ba dòng đầu):
| id | item | level | order | unit | 2025-Q3 | 2025-Q4 | 2026-Q1 | 2026-Q2 |
|---|---|---|---|---|---|---|---|---|
| IS_NET_INTEREST_INCOME | Thu nhập lãi thuần | 1 | 0 | VNĐ | 14657240000000 | 16266825000000 | 17651083000000 | 19141761000000 |
| IS_NET_FEE_AND_COMMISSION_INCOME | Lãi thuần từ hoạt động dịch vụ | 1 | 1 | VNĐ | 938335000000 | 864624000000 | 943415000000 | 859682000000 |
| IS_NET_GAIN_LOSS_FROM_INVESTMENT_SECURITIES | Lãi thuần từ mua bán chứng khoán đầu tư | 1 | 2 | VNĐ | 0 | 0 | 0 | 2522000000 |
Ở bảng này level là số nguyên, mọi dòng ở cấp 1.
Kế hoạch kinh doanh năm
Fundamental() chưa có hàm cho kế hoạch kinh doanh năm. Lớp kiểu cũ Finance lấy được, chỉ với nguồn
mas, chỉ kỳ năm. Cấp: Tài trợ.
from vnstock.api import Finance
plan = Finance(source="mas", symbol="FPT").annual_plan()Bảng có cùng cột với dạng dài (period, id, name, order, level, unit, value). Mã chỉ tiêu ở đây viết
thường, ví dụ total_revenue, total_profit_before_tax.
FPT, chạy ngày 10/10/2026:
| period | id | name | unit | value |
|---|---|---|---|---|
| 2026 | total_revenue | Doanh thu kế hoạch | VNĐ | 58580000000000 |
| 2026 | net_revenue | Doanh thu thuần kế hoạch | VNĐ | NaN |
| 2026 | total_profit_before_tax | Lợi nhuận trước thuế kế hoạch | VNĐ | 11629000000000 |
Đã ngừng
| Tên | Tình trạng |
|---|---|
Fundamental().equity(symbol).filing() | Ngừng từ 5.0.0a3. Gọi là nhận UnsupportedError mã VNSTOCK_FEATURE_REMOVED. Tên hàm còn giữ để mã cũ không lỗi khi nạp. Không có hàm thay |
Khác bản cũ
- Dạng mặc định là dạng dài. Bản 4.x mặc định mỗi kỳ một cột. Muốn như cũ, truyền
format="wide"(hoặcorient="report"). - Kỳ mặc định là mọi kỳ. Bản 4.x mặc định
period="year". Ở thế hệ 5, bỏ trốngperiodlà lấy cả năm lẫn quý. - Tham số vị trí đầu tiên là
com_type. Luôn ghiperiod=bằng tên. - Nguồn mặc định là
vci. Bản 4.x dùng KBS. - Cột chuẩn hoá. Bản 4.x trả
item,item_envà các cột năm. Thế hệ 5 có thêm mã chỉ tiêuid, cấplevel, thứ tựorder, đơn vịunit, và tên tiếng Anh lấy bằnglang="en". ratio()cần cấp Tài trợ.
Xem thêm Chuyển đổi từ vnstock 4.x, Chuyển đổi từ vnstock_data 3.x và Nguồn dữ liệu.