Vnstock Logo

Báo cáo tài chính và chỉ số cơ bản

Cộng đồng

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.

Python
from vnstock import Fundamental

fin = Fundamental().equity("FPT")
df = fin.income_statement(period="year")

Tóm tắt

HàmLàm gìCấp
income_statement()Báo cáo kết quả kinh doanhMọi cấp. Nguồn mas chỉ cho Tài trợ
balance_sheet()Bảng cân đối kế toánMọ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ínhTà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ảngTà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ả:

Python
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ínhCóCóCó
Số kỳ nhiều nhất mỗi lần gọi48Mọi kỳ nguồn trả về
Bộ chỉ tiêuRút gọn: chỉ chỉ tiêu cấp 1Rút gọn: chỉ chỉ tiêu cấp 1Đầy đủ
Nguồnvci, kbsvci, kbsvci, kbs, mas
ratio(), note(), financial_health()KhôngKhôngCó

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.

Luôn ghi rõ kỳ báo cáo

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

Python
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ểuMặc địnhÝ nghĩa
com_typestr hoặc NoneNoneLoạ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")
periodstr hoặc NoneNoneKỳ 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ý
langstr"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_emptyboolFalseBỏ chỉ tiêu không có số liệu khác 0 ở mọi kỳ
formatstr"long"Dạng bảng: "long", "wide" hoặc "time_series", xem mục Hình dạng bảng
sourcestr hoặc NoneNone (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ụ

Python
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ợ:

periodidnameorderlevelunitvalue
2025IS_REVENUEDOANH THU BÁN HÀNG VÀ CUNG CẤP DỊCH VỤ11VNĐ70207688944553
2025IS_REVENUE_DEDUCTIONSCác khoản giảm trừ doanh thu21VNĐ-94863843843
2025IS_NET_REVENUEDoanh thu thuần về bán hàng và cung cấp dịch vụ31VNĐ70112825100710

VCB, cùng lời gọi:

periodidnameorderlevelunitvalue
2025IS_NET_INTEREST_INCOMEThu nhập lãi thuần11VNĐ58771410000000
2025IS_INTEREST_INCOME_AND_SIMILAR_INCOME‣ Thu nhập lãi và các khoản thu nhập tương tự22VNĐ105216484000000
2025IS_INTEREST_AND_SIMILAR_EXPENSES‣ Chi phí lãi và các chi phí tương tự32VNĐ-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ấpGhi chú
vci (mặc định)Mọi cấpKhi 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ố
kbsMọi cấpTrả ít kỳ hơn: khi chạy thử với FPT, kỳ năm chỉ có 4 năm gần nhất
masTà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ộtKiểuÝ nghĩa
periodcategoryKỳ: "2025" với kỳ năm, "2025-Q4" với kỳ quý
idstringMã chỉ tiêu, cố định giữa các mã và các nguồn, ví dụ IS_NET_REVENUE
namestringTên chỉ tiêu, theo lang
orderintThứ tự trình bày trong báo cáo
levelcategoryCấp: 1 là chỉ tiêu chính, 2, 3 là chỉ tiêu con
off_balanceboolChỉ có ở bảng cân đối kế toán: chỉ tiêu ngoài bảng
unitcategoryĐơn vị, ví dụ VNĐ
valuefloatGiá 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):

iditemlevelorderunit202320242025
IS_REVENUEDOANH THU BÁN HÀNG VÀ CUNG CẤP DỊCH VỤ11VNĐ526251748613336296265213463570207688944553
IS_NET_REVENUEDoanh thu thuần về bán hàng và cung cấp dịch vụ13VNĐ526179008273856284879435136770112825100710
IS_GROSS_PROFITLỢI NHUẬN GỘP VỀ BÁN HÀNG VÀ CUNG CẤP DỊCH VỤ15VNĐ203195534446822369834836991625888529512413

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):

periodIS_NET_REVENUEIS_GROSS_PROFITIS_NET_PROFIT_AFTER_TAX
2025-Q42022544989288170472750861622994964817096
2026-Q11247999720677542448898906882476789833481
2026-Q21378850346119942797442802142570339099621

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()

Python
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, %…).

Python
from vnstock import Fundamental

r = Fundamental().equity("FPT").ratio(period="year")

FPT, chạy ngày 10/10/2026:

periodidnamelevelunitvalue
2025RT_CAT_INFO_VALUATIONĐỊNH GIÁ & THÔNG TIN DOANH NGHIỆP1NaN
2025RT_VALUE_PE‣ P/E cơ bản2lần10.5196
2025RT_VALUE_PB‣ P/B2lần2.7037

Thuyết minh: note()

Python
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_.

Python
from vnstock import Fundamental

notes = Fundamental().equity("FPT").note(period="year")

FPT, chạy ngày 10/10/2026:

periodidnamelevelunitvalue
2025NT_BS_CASH_AND_CASH_EQUIVALENTSTiền và tương đương tiền1VNĐ10522105729992
2025NT_BS_CASH_ON_HAND‣ Tiền mặt2VNĐ4255375565
2025NT_BS_CASH_IN_BANKS‣ Tiền gửi Ngân hàng2VNĐ8078385544605

Sức khoẻ tài chính: financial_health()

Python
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ểuMặc địnhÝ nghĩa
com_typestr"auto"Loại hình doanh nghiệp, như ở ba báo cáo chính
reportslist[str] hoặc NoneNoneBáo cáo dùng để lập bảng, trong income_statement, balance_sheet, cash_flow, ratio. None dùng cả bốn
scorecardstr"auto"Tên cũ của com_type. Khác "auto" thì được ưu tiên
periodstr hoặc NoneNone"year" hoặc "quarter"
langstr"vi"Ngôn ngữ tên chỉ tiêu
formatstr"wide"Mặc định dạng rộng, khác các hàm trên. Cũng nhận "long", "time_series"
limitint16Số kỳ gần nhất giữ lại. 0 giữ mọi kỳ
sourcestr hoặc NoneNone (dùng vci)Nguồn
Python
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):

iditemlevelorderunit2025-Q32025-Q42026-Q12026-Q2
IS_NET_INTEREST_INCOMEThu nhập lãi thuần10VNĐ14657240000000162668250000001765108300000019141761000000
IS_NET_FEE_AND_COMMISSION_INCOMELãi thuần từ hoạt động dịch vụ11VNĐ938335000000864624000000943415000000859682000000
IS_NET_GAIN_LOSS_FROM_INVESTMENT_SECURITIESLãi thuần từ mua bán chứng khoán đầu tư12VNĐ0002522000000

Ở 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ợ.

Python
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:

periodidnameunitvalue
2026total_revenueDoanh thu kế hoạchVNĐ58580000000000
2026net_revenueDoanh thu thuần kế hoạchVNĐNaN
2026total_profit_before_taxLợi nhuận trước thuế kế hoạchVNĐ11629000000000

Đã ngừng

TênTì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ặc orient="report").
  • Kỳ mặc định là mọi kỳ. Bản 4.x mặc định period="year". Ở thế hệ 5, bỏ trống period là lấy cả năm lẫn quý.
  • Tham số vị trí đầu tiên là com_type. Luôn ghi period= 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_en và các cột năm. Thế hệ 5 có thêm mã chỉ tiêu id, cấp level, thứ tự order, đơn vị unit, và tên tiếng Anh lấy bằng lang="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.