Vnstock Logo
Xây thuật toán chuẩn hoá dữ liệu phân tích báo cáo tài chính

Xây thuật toán chuẩn hoá dữ liệu phân tích báo cáo tài chính

Mục lục

Có một thời gian, mỗi lần bổ sung nguồn kết nối báo cáo tài chính cho Vnstock, mình lại mở rộng thêm một bộ ánh xạ. Nguồn A gọi một khoản mục theo cách này, nguồn B dùng một tên khác, còn nguồn C lại chia nó thành vài dòng nhỏ hơn.

Nếu chỉ nhìn vào đầu ra, cách giải quyết khá hiển nhiên: tạo một danh sách đổi tên đủ lớn rồi đưa tất cả về cùng một tên cột.

Đây không chỉ là vấn đề kỹ thuật. Trong phân tích báo cáo tài chính, nếu hai trường dữ liệu khác bản chất bị xem là cùng một khoản mục, mọi bước phía sau — từ so sánh tăng trưởng, tính tỷ trọng đến đánh giá doanh nghiệp cùng ngành — đều có thể cho ra một kết luận trông hợp lý nhưng sai từ đầu vào.

Nhưng danh sách ấy không trả lời được những câu hỏi quan trọng hơn:

  1. Bộ tiêu chí chuẩn phải có bao nhiêu khoản mục?
  2. Khoản mục nào là tổng, khoản mục nào là chi tiết?
  3. Trật tự trình bày được quyết định bởi nguồn dữ liệu hay bởi biểu mẫu kế toán?
  4. Khi hai tên gần giống nhau, căn cứ nào cho phép kết luận chúng cùng nghĩa?
  5. Nếu tên gọi thay đổi theo một chế độ kế toán mới, nên nối chuỗi lịch sử hay giữ thành hai khái niệm khác nhau?

Vấn đề không nằm ở việc bộ ánh xạ còn thiếu vài trăm trường. Vấn đề là nó chưa có một hệ quy chiếu độc lập với các nguồn kết nối dữ liệu.

Đó là điểm xuất phát của bộ máy phân loại và chuẩn hoá khoản mục trong vnstock_data 3.2.8. Trong code, lớp này được gọi là taxonomy engine — hiểu đơn giản là một hệ thống phân loại giúp dữ liệu từ nhiều nguồn quy về cùng một hệ quy chiếu.

Vì sao phân tích báo cáo tài chính có thể sai từ dữ liệu đầu vào?

Vnstock là thư viện giúp lập trình viên kết nối tới dữ liệu chứng khoán từ các công ty chứng khoán và nguồn công khai. Danh sách cùng vai trò của từng tuyến kết nối được trình bày tại trang Nguồn dữ liệu của vnstock_data.

Với giá, khối lượng và thời gian giao dịch, các nguồn thường mô tả cùng một loại sự kiện. Tên cột có thể khác, nhưng cấu trúc kinh tế phía sau khá ổn định: một mã chứng khoán, tại một thời điểm, có giá và khối lượng tương ứng.

Báo cáo tài chính không hoạt động như vậy.

Khía cạnhGiá và khối lượngBáo cáo tài chính
Cấu trúcTương đối phẳngNhiều tầng tổng – chi tiết – giảm trừ
Khác biệt giữa ngànhThấpLớn giữa doanh nghiệp, ngân hàng, chứng khoán và bảo hiểm
Tên gọiThường có thể đổi tên trực tiếpTên giống nhau vẫn có thể khác phạm vi hoặc khác bản chất
Thời gianLiên tục theo phiênTheo kỳ và có thể chịu tác động của phân loại lại, hồi tố
Điểm quy chiếuQuy ước thị trườngKhuôn khổ kế toán, cấu trúc báo cáo và bối cảnh công bố

Hai nguồn cùng có dòng “Các khoản phải thu” chưa chắc đang nói về cùng một phạm vi. Nếu chỉ đổi tên cho giống nhau, dữ liệu trông đồng nhất nhưng ý nghĩa kế toán có thể đã thay đổi.

Phân tích ngang, phân tích dọc, so sánh theo thời gian hay đối chiếu doanh nghiệp cùng ngành đều dựa trên một giả định chung: các giá trị đặt cạnh nhau phải cùng nghĩa, cùng đơn vị và cùng phạm vi báo cáo. Chuẩn hoá dữ liệu là lớp kiểm soát đứng trước các phép phân tích đó.

Bốn giai đoạn chuẩn hoá dữ liệu cho phân tích báo cáo tài chính

Cơ chế hiện tại không xuất hiện từ một bản thiết kế hoàn chỉnh ngay từ đầu. Nó hình thành qua nhiều lần nhận ra rằng một bảng dữ liệu “trông sạch” vẫn có thể khiến người dùng hiểu sai hoặc làm code phụ thuộc vào một nguồn cụ thể.

Một thành viên trong cộng đồng Vnstock dùng tên GentleFlower8860 từng đặt câu hỏi rất thực tế trong bài chia sẻ trên nhóm cộng đồng:

“Đằng nào cũng đi crawl về thì mình cứ bê nguyên tên của họ thôi mà nhỉ.”

Nếu dùng cá nhân, cố định một nguồn và chấp nhận toàn bộ quy ước của nguồn đó, giữ nguyên tên trường là lựa chọn hợp lý. Câu hỏi khó hơn xuất hiện khi người dùng muốn thay đổi nguồn mà không phải viết lại phần phân tích: Vnstock cần giữ lại điều gì để dữ liệu vẫn có cùng ý nghĩa?

Giai đoạn 1 — Sơ khai

Đưa dữ liệu từ API về dạng bảng

Mục tiêu ban đầu là giúp người dùng lấy được dữ liệu đã công khai qua API. JSON được làm phẳng thành bảng và tên khoản mục được giữ gần với phản hồi của nguồn. Cách làm này nhanh, nhưng bảng chưa tự giải thích rõ thứ tự, phân cấp, đơn vị hay một giá trị đang biểu thị tiền, phần trăm hoặc số lần. Người dùng thường phải mở giao diện của nguồn để đối chiếu.

Giai đoạn 2 — Cơ bản

Thống nhất cách viết tên trường

Tên cột được làm sạch và chuyển về một quy ước như snake_case. Code dễ đọc hơn, nhưng đây mới là chuẩn hoá hình thức. Cùng một khái niệm vẫn có thể sinh ra nhiều tên khác nhau giữa các nguồn; ngược lại, hai tên giống nhau chưa chắc cùng phạm vi kế toán.

Giai đoạn 3 — Cải tiến với phiên bản 3.1.3

Tạo bộ từ điển và khoá ổn định

Một bộ tiêu chí rút gọn cùng ID cố định giúp hạn chế việc code người dùng bị ảnh hưởng khi nguồn đổi tên trường. Đổi lại, Vnstock phải đối mặt với câu hỏi chưa có lời giải rõ ràng: danh mục chuẩn cần rộng đến đâu, khác biệt ngành được giữ ở mức nào và bao nhiêu chi tiết là đủ. Một bộ từ điển lớn hơn không tự động trở thành một tiêu chuẩn đáng tin cậy.

Giai đoạn 4 — Phiên bản 3.2.8

Chuyển sang một bộ khung có ngữ cảnh

Điểm xuất phát được chuyển từ tên trường của một API sang hiểu biết về ngành, khuôn khổ kế toán và cấu trúc báo cáo. Thách thức không còn là tạo thêm nhiều dòng ánh xạ, mà là giữ ý nghĩa ổn định khi hàng nghìn khoản mục được đối chiếu qua nhiều nguồn, nhiều nhóm doanh nghiệp và nhiều giai đoạn.

Bước tiến qua bốn giai đoạn có thể tóm lại bằng bốn lớp khác nhau: chuyển dữ liệu thành bảng, thống nhất cách viết, cố định định danh và chuẩn hoá ngữ nghĩa. Ba lớp đầu giúp dữ liệu tiện dùng hơn. Lớp cuối mới quyết định liệu hai giá trị có thực sự đặt cạnh nhau được hay không.

Vì vậy, bộ khung của Vnstock không thay thế dữ liệu gốc và cũng không phát minh lại chuẩn mực kế toán. Tên cùng mã nội bộ của nguồn vẫn được giữ cho mục đích truy vết; lớp định danh trung gian giúp code ít phụ thuộc hơn vào cách từng website đặt tên.

Cơ duyên đến từ góc phải của file báo cáo PDF

Ý tưởng về một hệ quy chiếu trung tâm hình thành sau nhiều lần mình xem báo cáo do doanh nghiệp công bố. Các mã khoản mục ban đầu gợi ra khả năng dùng một hệ mã làm điểm nối. Nhưng khi để ý tên biểu mẫu ở góc báo cáo và so sánh doanh nghiệp thuộc những ngành khác nhau, mình nhận ra không tồn tại một danh sách cột chung có thể áp vào mọi trường hợp.

Minh hoạ: Ý tưởng khoản mục kế toán trong BCTC công bố tại website UBCK có thể làm id trong cơ sở dữ liệu. Mã chứng khoán được chọn ngẫu nhiên làm ví dụ.Minh hoạ: Ý tưởng khoản mục kế toán trong BCTC công bố tại website UBCK có thể làm id trong cơ sở dữ liệu. Mã chứng khoán được chọn ngẫu nhiên làm ví dụ.

Quan sát đó làm thay đổi câu hỏi. Thay vì tìm website có nhiều cột nhất để dùng làm chuẩn, Vnstock phải hiểu doanh nghiệp đang trình bày báo cáo trong bối cảnh nào và vì sao các nhóm ngành có cấu trúc khác nhau.

Thông tin biểu mẫu BCTC được áp dụngThông tin biểu mẫu BCTC được áp dụng

Không có một file duy nhất trả lời mọi lớp vấn đề. Khuôn khổ kế toán giúp xác định cách hiểu chung; báo cáo doanh nghiệp cho biết con số và bối cảnh công bố; các website phân tích số hoá và công khai dữ liệu theo cách riêng. Vai trò của Vnstock là kết nối các lớp đó thành đầu ra thuận tiện cho lập trình, không chọn một website làm chuẩn tuyệt đối.

Chuẩn hoá không chỉ là đổi tên

Với người dùng, kết quả cần nhìn thấy là một giá trị có định danh ổn định, đơn vị rõ, đúng loại báo cáo và đủ ngữ cảnh để so sánh. Những quy tắc nhận diện cùng quy trình đối soát phía sau là năng lực nghiên cứu của dự án, không phải hướng dẫn để tái tạo một hệ thống độc lập.

Mốc 2016: khi một nhãn dữ liệu mở ra câu hỏi lớn hơn

Trong dữ liệu BCTC đã số hoá của VCI có những tiêu chí mang nhãn “trước năm 2016” hoặc “từ năm 2016”. Ban đầu, đây có thể trông giống một quy ước đặt tên riêng của nguồn.

Tiêu chí cũ trong BCTCTiêu chí cũ trong BCTC

Nhưng chính điểm chạm này khiến mình tìm hiểu sâu hơn. Đằng sau mốc thời gian là những thay đổi đáng kể trong chế độ kế toán và cách trình bày báo cáo của công ty chứng khoán. Một hậu tố tưởng như chỉ để phân biệt tên trường thực chất có thể báo hiệu điểm gãy về cấu trúc và khả năng so sánh dữ liệu lịch sử.

Điều quan trọng không phải thuộc số hiệu của văn bản nào. Insight có giá trị với người dùng là: tên trường cũng có lịch sử.

Vậy khi gặp một điểm gãy như vậy, đâu là khác biệt cần được bảo toàn và đâu chỉ là thay đổi cách trình bày?

Quyền lợi Sponsor còn là quyền tiếp cận kiến thức

Gói Sponsor là cách thành viên đồng hành với chi phí phát triển và duy trì dự án. Dữ liệu được truy cập qua thư viện vẫn xuất phát từ công ty chứng khoán và các nguồn công khai; quyền lợi tài trợ tập trung vào công cụ, vận hành, hỗ trợ và cộng đồng. Sponsor từ Bronze trở lên còn được đọc những phân tích sâu hơn về cách Vnstock nhận diện vấn đề, giới hạn cần kiểm soát và tác động của chúng tới việc sử dụng dữ liệu.

Báo cáo tài chính và tỷ lệ phân tích không cùng một tầng

Trên cùng một website, BCTC doanh nghiệp công bố và tỷ lệ do đơn vị phân tích tính thêm thường được đặt cạnh nhau. Nhưng vì sao chúng không thể được chuẩn hoá theo cùng một logic?

Phiên bản 3.2.8 không trích xuất lại hàng loạt PDF từ đầu

Đây là một ranh giới quan trọng của bài toán. Chuẩn hoá đầu ra BCTC trong vnstock_data 3.2.8 chủ yếu làm việc với dữ liệu đã được các website phân tích số hoá và chia sẻ công khai qua các tuyến kết nối. Thuật toán so khớp các khoản mục từ những nguồn này với bộ khung chung, sau đó tổ chức đầu ra để người dùng có thể chuyển đổi và so sánh chất lượng giữa các nguồn thuận tiện hơn.

Nếu đầu vào đã là JSON hoặc bảng, vì sao chuẩn hoá vẫn không đơn giản?

Phân tích báo cáo tài chính cần một tiêu chuẩn đáng tin cậy

Phiên bản 3.2.8 đưa báo cáo tài chính từ nhiều cấu trúc theo nguồn về một hệ phân loại trung tâm, bao phủ hơn 1.700 khoản mục thuộc các báo cáo chính, thuyết minh và tỷ lệ của bốn nhóm doanh nghiệp.

Nhưng bộ khung này không tự động quyết định cổ phiếu nào hấp dẫn. Giá trị của nó nằm ở việc người phân tích có một căn cứ ổn định hơn để theo dõi khoản mục qua thời gian, đặt cạnh doanh nghiệp cùng ngành, tính tỷ trọng và kiểm tra quan hệ với dòng tiền.

Thị trường không thiếu tài liệu hướng dẫn đọc chỉ số hay tính ROE, ROA và biên lợi nhuận. Phần ít được chia sẻ hơn là điều kiện để những phép tính đó có ý nghĩa: dữ liệu có cùng định nghĩa không, phạm vi báo cáo có khớp không và chuỗi lịch sử có bị thay đổi cách trình bày hay không. Đây chính là khoảng trống mà lớp chuẩn hoá của Vnstock và các chia sẻ kỹ thuật hướng tới giải quyết cho người sử dụng.

Khi cần quay lại tài liệu công bố, người dùng có thể tham khảo hướng dẫn tra cứu và tải báo cáo tài chính mới nhất. Bài tiếp theo sẽ tập trung vào các phương pháp phân tích có thể áp dụng trên định dạng dữ liệu báo cáo tài chính mới từ Vnstock và những bẫy vẫn có thể làm sai lệch kết luận đầu tư.

Bình luận

Đang tải bình luận...

Có thể bạn quan tâm