Vnstock Logo

Báo cáo tài chính

Thử nghiệm

Mục lục

Bản thử nghiệm, chưa phát hành chính thức

Trang này viết cho vnstock v6.0.0rc2, bản thử nghiệm. Tên hàm, tham số và cột dữ liệu có thể còn đổi trước ngày phát hành; khi cài, ghi rõ số phiên bản như ở trang Cài đặt. Bản đang phát hành chính thức là v5.0.1, xem tài liệu bản đó.

Fundamental đọc ba báo cáo tài chính chính của một mã cổ phiếu: bảng cân đối kế toán, báo cáo kết quả kinh doanh và báo cáo lưu chuyển tiền tệ. Thư viện đưa số liệu về một bộ chỉ tiêu chung theo chuẩn mực kế toán Việt Nam (VAS). Mỗi chỉ tiêu có mã cố định (BS_TOTAL_ASSETS, IS_NET_REVENUE…), giữ nguyên như thế hệ 5, nên đoạn mã bạn viết cho một mã cổ phiếu dùng được cho mã khác cùng loại hình.

Python
from vnstock import Fundamental

fpt = Fundamental().equity("FPT")
df = fpt.income_statement(period="year", source="fhsc")
Bản nháp

Phần báo cáo tài chính đang ở mức thử nghiệm trong bản 6.0.0rc2. Mã chỉ tiêu giữ như thế hệ 5; tên tham số và các khoá trong df.attrs còn có thể đổi trước ngày phát hành.

Hàm có trong bản này

HàmChức năngNguồn
balance_sheet()Bảng cân đối kế toánfhsc
income_statement()Báo cáo kết quả kinh doanhfhsc
cash_flow()Báo cáo lưu chuyển tiền tệfhsc
ratio(), note(), financial_health(), filing()Chưa có ở thế hệ 6Gọi thì nhận UnsupportedError mã VNSTOCK_ROUTE_UNSUPPORTED

Chỉ số tài chính tính từ chính các báo cáo đã chuẩn hoá nằm ở vnstock_quant, không lấy bảng chỉ số do nguồn tự tính.

Cách gọi

Python
from vnstock import Fundamental

fun = Fundamental()

fun.equity("VCB").balance_sheet(period="year", source="fhsc")      # gắn mã trước
fun.equity.balance_sheet("VCB", period="year", source="fhsc")      # mã là tham số đầu
fun.equity("SSI").cash_flow(period="quarter", format="wide", source="fhsc")

Thế hệ 6 không có nguồn mặc định. Truyền source= cho từng lời gọi, hoặc đặt một lần cho cả nhóm:

Python
import vnstock
vnstock.sources.use("fhsc", route="fundamental.equity.*")

Thiếu nguồn thì nhận InputError mã VNSTOCK_INPUT_SOURCE. Xem Chọn nguồn.

Tham số

Python
balance_sheet(company_type=None, period=None, lang="vi", drop_empty=False, format="long", *, source=None, compat=None)
income_statement(...)   # cùng tham số
cash_flow(...)          # cùng tham số
Tham sốKiểuMặc địnhÝ nghĩa
company_typestr hoặc NoneNoneLoại hình doanh nghiệp. None hoặc "auto" để thư viện tự nhận theo dữ liệu nguồn gửi. Nhận "regular" (cũng viết "generic", "dn"), "bank" ("banking", "tctd"), "securities" ("ctck"), "insurance" ("dnpnt"). Tên cũ com_type vẫn nhận
periodstr hoặc NoneNone"year" (cũng viết "yearly", "annual", "y") hoặc "quarter" ("quarterly", "q"). None lấy cả năm và quý như thế hệ 5
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ố khác 0 ở mọi kỳ
formatstr"long""long", "wide" hoặc "time_series", xem Hình dạng bảng
sourcestrNguồn cho lời gọi này
compatstr"v5""v5": tên cột như thế hệ 5; "v6": tên cột chuẩn thế hệ 6

Ghi tên tham số khi gọi: income_statement(period="quarter"). Tham số đầu tiên theo vị trí là company_type, giống thế hệ 5.

period=None gửi hai lần gọi tới nguồn, một cho kỳ năm và một cho kỳ quý. Mỗi lần gọi lấy hết các trang mà nguồn có, nên một báo cáo theo quý có thể mất vài chục giây. Chỉ cần một loại kỳ thì truyền period= để đỡ một lần gọi.

Bốn mẫu biểu

Mỗi loại hình doanh nghiệp lập báo cáo theo một mẫu biểu riêng. Thư viện dùng đúng cây chỉ tiêu của mẫu biểu đó:

Mẫu biểucompany_typeVí dụ mãBảng cân đối bắt đầu bằng
Doanh nghiệp (DN)regularFPT, HPG, VNMTài sản ngắn hạn
Tổ chức tín dụng (TCTD)bankVCB, ACB, TCBTiền mặt, vàng bạc, đá quý
Công ty chứng khoán (CTCK)securitiesSSI, HCM, VNDTài sản tài chính ngắn hạn
Doanh nghiệp bảo hiểm (DNPNT)insuranceBVH, PVI, BMITài sản ngắn hạn, kèm các dòng riêng của bảo hiểm

Thường bạn không cần truyền company_type. Thư viện nhận mẫu biểu theo các trường mà nguồn gửi về, không đoán theo mã hay theo tên công ty. Truyền một loại hình khác với mẫu biểu nguồn trả thì nhận InputError mã VNSTOCK_INPUT_COMPANY_TYPE, kèm loại hình đúng. Thư viện không đọc báo cáo của mẫu biểu này lên cây của mẫu biểu khác. Mẫu biểu và loại hình đã dùng ghi ở df.attrs["template"], df.attrs["company_type"].

Bộ chỉ tiêu đầy đủ và rút gọn

Mỗi mẫu biểu có hai bộ chỉ tiêu:

Rút gọnĐầy đủ
Chỉ tiêuChỉ tiêu cấp 1 (ví dụ "Tài sản ngắn hạn", "Doanh thu thuần")Mọi cấp, tới chỉ tiêu chi tiết như "Tiền", "Các khoản tương đương tiền"
Dành choMáy chưa đăng nhập, hoặc khoá chưa có Gói quyền sử dụngKhoá có Gói quyền sử dụng còn hiệu lực
Lấy ở đâuCó sẵn trong thư việnThư viện tải từ vnstocks.com theo khoá đã đăng nhập, kiểm chữ ký rồi giữ trong bộ nhớ

Giá trị của chỉ tiêu cấp 1 như nhau ở hai bộ, vì thư viện đọc thẳng từ nguồn, không cộng từ chỉ tiêu con. Số kỳ không bị cắt ở bộ nào.

Bộ đầy đủ chỉ ở trong bộ nhớ của tiến trình, không ghi xuống đĩa. Thư viện tải lại sau vnstock login hoặc vnstock logout. Khi không dùng được bộ đầy đủ, thư viện dùng bộ rút gọn và cảnh báo một lần mỗi tiến trình bằng DataWarning:

Mã cảnh báoNghĩaCách xử lý
VNSTOCK_TAXONOMY_NO_KEYMáy chưa đăng nhập vnstockvnstock login
VNSTOCK_TAXONOMY_KEY_REJECTEDvnstocks.com từ chối khoávnstock status, rồi đăng nhập lại
VNSTOCK_TAXONOMY_UNAVAILABLEChưa tới được vnstocks.comThư viện tự thử lại sau một phút
VNSTOCK_TAXONOMY_MALFORMEDTài liệu nhận được không qua kiểm tra chữ kýBáo lỗi kèm df.attrs["taxonomy"]

Bộ đang dùng ghi ở df.attrs["taxonomy"]:

Python
df.attrs["taxonomy"]
# {'version': 'vas_v6.1', 'variant': 'full', 'origin': 'server', 'note': None}
# variant: 'full' hoặc 'reduced'; origin: 'server' (vnstocks.com) hoặc 'floor' (bản có sẵn trong thư viện)

Hình dạng bảng

Ba dạng chứa cùng số liệu. Chỉ mục luôn là RangeIndex.

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 trên mẫu biểu.

Cột (compat="v5")Cột (compat="v6")KiểuÝ nghĩa
periodreport_periodstrKỳ: "2025" với kỳ năm, "2025-Q4" với kỳ quý
iditem_idstrMã chỉ tiêu, ví dụ BS_TOTAL_ASSETS
nameitem_namestrTên chỉ tiêu theo lang
orderitem_orderintThứ tự trên mẫu biểu
levelitem_levelintCấp: 1 là chỉ tiêu chính, 2 và 3 là chỉ tiêu con
off_balanceoff_balanceboolChỉ ở bảng cân đối: True với chỉ tiêu ngoài bảng
unititem_unitstr"VNĐ" ở hồ sơ v5; "dong" hoặc "dong_per_share" (lãi trên cổ phiếu) ở hồ sơ v6
valueitem_valuefloatSố liệu, theo đồng như trên báo cáo
line_codeline_codestrMã số chỉ tiêu trên mẫu biểu ("270" là tổng cộng tài sản ở mẫu DN); trống khi chưa khai

Minh hoạ cấu trúc (số liệu giả định):

periodidnameorderlevelunitvalueline_code
2025BS_SHORT_TERM_ASSETSTÀI SẢN NGẮN HẠN11VNĐ1.0e+13100
2025BS_CASH_AND_PRECIOUS_METALSTiền và các khoản tương đương tiền22VNĐ2.0e+12110
2025BS_CASHTiền33VNĐ1.2e+12111

format="wide"

Mỗi dòng là một chỉ tiêu, mỗi kỳ là một cột. Kỳ cũ nhất bên trái như thế hệ 5. Ở hồ sơ v5, các cột đầu là id, item, order, level, unit, line_code.

format="time_series"

Mỗi dòng là một kỳ, mỗi chỉ tiêu là một cột đặt tên theo mã (IS_NET_REVENUE…). Cột đầu là kỳ báo cáo. Dạng này hợp để tính toán và vẽ chuỗi thời gian.

Dấu và đơn vị

  • Số tiền theo đồng, đúng như báo cáo in. Lãi trên cổ phiếu theo đồng trên cổ phiếu.
  • Các khoản mà mẫu biểu in thành số lớn hơn 0 rồi trừ đi (giá vốn, chi phí bán hàng, chi phí thuế…) mang dấu âm, như thế hệ 5. Vì vậy cộng các chỉ tiêu con là ra chỉ tiêu tổng, không cần đổi dấu.
  • Việc đổi dấu được khai sẵn cho từng dòng của từng mẫu biểu. Thư viện không đoán dấu theo tên chỉ tiêu.

Thông tin kèm kết quả

Khoá df.attrsÝ nghĩa
template, company_typeMẫu biểu (DN, TCTD, CTCK, DNPNT) và loại hình
statementbalance_sheet, income_statement hoặc cash_flow
taxonomy, taxonomy_versionBộ chỉ tiêu đã dùng, xem mục trên
report_periodsSố kỳ trong bảng
report_period_askedLoại kỳ đã gửi tới nguồn: ["year"], ["quarter"] hoặc cả hai
empty_periodsCác kỳ nguồn có liệt kê nhưng không gửi số nào. Thư viện bỏ các kỳ này khỏi bảng
identitiesKết quả kiểm đẳng thức của mẫu biểu, xem mục dưới
unmapped_keysTrường nguồn gửi mà bộ chỉ tiêu chưa có
format, language, drop_emptyTham số đã dùng
profile, schema_changesHồ sơ tên cột và các thay đổi so với thế hệ 5

Kiểm tra số liệu

Mỗi lời gọi chạy các đẳng thức của mẫu biểu trên mọi kỳ, ví dụ tổng cộng tài sản bằng tài sản ngắn hạn cộng tài sản dài hạn, hay lợi nhuận sau thuế bằng phần của công ty mẹ cộng phần của cổ đông không kiểm soát. Kết quả nằm ở df.attrs["identities"]:

Python
df.attrs["identities"]
# {'checked': 594, 'passed': 594, 'known_breaks': 0, 'failed': []}
  • failed liệt kê từng đẳng thức hỏng kèm kỳ, kèm cảnh báo DataWarning mã VNSTOCK_VAS_IDENTITY. Số trong bảng là số nguồn gửi; thư viện không sửa số để đẳng thức khớp.
  • known_breaks đếm những chỗ hỏng đã biết trước vì mẫu biểu đổi theo năm, ví dụ các năm trước khi thông tư hiện hành có hiệu lực. Những chỗ này không cảnh báo.
  • Trường nguồn gửi mà bộ chỉ tiêu chưa có thì không bị bỏ lặng lẽ: chúng nằm ở df.attrs["unmapped_keys"], kèm cảnh báo VNSTOCK_VAS_UNMAPPED.

Cách ánh xạ từng trường của nguồn về mã chỉ tiêu được kiểm bằng hai cách:

  • chạy các đẳng thức trên dữ liệu thật của nhiều công ty thuộc cả bốn mẫu biểu;
  • đối chiếu từng dòng theo mã số chỉ tiêu với báo cáo tài chính hợp nhất đã kiểm toán, đọc từ tệp PDF doanh nghiệp công bố.

Việc kiểm tra cho biết thư viện đọc đúng số nguồn gửi; nó không thay được việc bạn đối chiếu với báo cáo gốc khi cần ra quyết định.

Điều cần biết về dữ liệu nguồn

  • Lịch sử: với nhiều mã, nguồn có kỳ năm từ giữa thập niên 2000 và kỳ quý từ khoảng 2009–2013. Kỳ cũ có thể chỉ có một phần báo cáo; những kỳ không có số nào nằm ở df.attrs["empty_periods"].
  • Lãi trên cổ phiếu có ở kỳ năm, chưa có ở kỳ quý.
  • Phải thu về cho vay (mẫu DN, mã số 135 và 215): ở một số kỳ, nguồn cộng khoản này vào phải thu khác (mã số 136, 216) và để trống dòng phải thu về cho vay.
  • Chỉ tiêu ngoài bảng của ngân hàng và công ty chứng khoán (bảo lãnh, cam kết, tài sản nhận giữ hộ…) nguồn chưa gửi.
  • fhsc chỉ trả lời trong khoảng 06:00 tới 21:00 giờ Việt Nam. Ngoài giờ đó thư viện báo VNSTOCK_SOURCE_UNAVAILABLE.

Lỗi hay gặp

MãKhi nàoCách sửa
VNSTOCK_INPUT_SOURCEChưa chọn nguồnsource="<nguồn>" hoặc vnstock.sources.use("<nguồn>", route="fundamental.equity.*")
VNSTOCK_INPUT_REPORT_PERIODperiod không phải năm hay quýperiod="year", period="quarter", hoặc bỏ trống
VNSTOCK_INPUT_COMPANY_TYPEcompany_type không khớp mẫu biểu nguồn trảBỏ company_type, hoặc dùng loại hình ghi trong thông báo
VNSTOCK_INPUT_TABLE_FORMATformat không hợp lệlong, wide hoặc time_series
VNSTOCK_INPUT_PARAMTham số hàm không nhận, ví dụ orient= của thế hệ 5Dùng format=
VNSTOCK_VAS_TEMPLATE_UNSUPPORTEDMẫu biểu chưa có cây chỉ tiêuLấy dữ liệu thô bằng vnstock_oapi
VNSTOCK_ROUTE_UNSUPPORTEDratio(), note(), financial_health(), filing()Chưa có ở thế hệ 6

Thư viện không làm gì

  • Không tự tính hay bù số nguồn không gửi. Chỉ tiêu nguồn không có thì để trống.
  • Không sửa số để đẳng thức khớp. Chỗ lệch được ghi lại để bạn xem.
  • Không lưu báo cáo xuống đĩa. Muốn giữ thì tự ghi df ra tệp, hoặc dùng vnstock_pipeline.
  • Không đưa ra nhận định hay khuyến nghị dựa trên số liệu.