Lấy dữ liệu giá chứng khoán Việt Nam cho bot

Chứng khoán Việt NamCập nhật 13/09/2026

Bot tốt chạy trên dữ liệu bẩn vẫn cho kết quả sai. Đây là khối ít hào hứng nhất nhưng là nơi phát sinh nhiều lỗi âm thầm nhất.

Lấy dữ liệu giá chứng khoán Việt Nam là khối ít hào hứng nhất trong toàn bộ lộ trình, và cũng là nơi phát sinh nhiều lỗi âm thầm nhất. Một con bot viết hoàn hảo chạy trên dữ liệu bẩn vẫn cho kết quả sai — mà sai theo kiểu trông vẫn hợp lý, nên bạn tin vào nó.

Bài này đi qua ba việc: lấy từ đâu, kiểm thế nào, và lưu ra sao.

Ba nguồn và điểm yếu của từng nguồn

API công ty chứng khoán9/10Thư viện cộng đồng6/10Tự thu thập và lưu8/10Độ tin cậy — nhưng công sức bỏ ra cũng theo đúng thứ tự ngược lại

API công ty chứng khoán cho dữ liệu khớp với chính nơi bạn giao dịch — đó là ưu điểm quyết định, vì backtest và chạy thật dùng cùng một chuỗi giá. Nhược điểm: mỗi công ty một chuẩn, tài liệu không đồng đều, và có giới hạn tần suất gọi.

Thư viện cộng đồng của người Việt cho phép lấy giá lịch sử và báo cáo tài chính bằng vài dòng mã. Tiện nhất để bắt đầu. Nhược điểm là phụ thuộc nguồn phía sau: khi nguồn đổi cấu trúc, thư viện hỏng, và bot của bạn hỏng theo.

Tự thu thập nghĩa là chạy một tác vụ định kỳ lấy dữ liệu mỗi cuối phiên rồi lưu lại. Tốn công nhất nhưng là cách duy nhất có kho dữ liệu ổn định của riêng mình — và dữ liệu quá khứ thì không lấy lại được nếu hôm nay không lưu.

Khuyến nghị thực tế: dùng thư viện cộng đồng để nghiên cứu, đồng thời bắt đầu tự lưu ngay từ hôm nay. Sáu tháng sau bạn sẽ có kho riêng mà không mất thêm công gì.

Luồng dữ liệu nên đi qua mấy tầng

NguồnAPI, thư việnThôlưu nguyên trạngĐã sạchđiều chỉnh, kiểm traDùng chungnghiên cứu và botphát hiện lỗi thì sửa ở tầng làm sạch, không bao giờ sửa dữ liệu thô

Nguyên tắc quan trọng nhất nằm ở mũi tên phản hồi: không bao giờ sửa dữ liệu thô. Khi phát hiện lỗi, bạn sửa ở tầng làm sạch rồi chạy lại. Nhờ vậy mọi phép biến đổi lặp lại được, và bạn luôn truy được một con số đến từ đâu.

Tầng cuối phục vụ cả nghiên cứu lẫn bot chạy thật. Nếu bot đọc dữ liệu từ đường khác với đường backtest đã dùng, hai bên sẽ lệch và bạn mất rất nhiều thời gian mới tìm ra vì sao.

Giá điều chỉnh: cái bẫy số một

Khi doanh nghiệp chia cổ tức bằng tiền, chia cổ phiếu thưởng hay phát hành thêm, giá thị trường bị điều chỉnh xuống tương ứng vào ngày giao dịch không hưởng quyền.

Chuỗi giá không được điều chỉnh lại sẽ có những cú rơi mạnh không phản ánh biến động thật nào.

4045505560T2T5T3Khối lượng

Phiên thứ tư rơi một phần ba trong khi khối lượng hoàn toàn bình thường. Không sự kiện thị trường nào tạo ra hình dạng đó. Một chiến lược bám xu hướng chạy trên chuỗi này sẽ thấy tín hiệu bán giả ở mọi cổ phiếu trả cổ tức đều đặn — tức là ở phần lớn cổ phiếu tốt. Hình minh hoạ, không phải dữ liệu thật.

Với VN30F1M thì không có vấn đề này, nhưng lại có vấn đề khác: chuỗi giá dài hạn phải nối từ nhiều hợp đồng theo tháng, và cách nối ảnh hưởng lớn tới kết quả backtest.

Bốn phép kiểm chạy trên mọi bộ dữ liệu

Chạy bốn phép này trước khi tin vào bất kỳ dữ liệu nào. Chúng bắt được phần lớn vấn đề và mất vài phút.

Đủ số phiênso với lịch giao dịchthiếu phiên → dừng, lấy lạiGiá hợp lệcao nhất ≥ mở, đóng, thấp nhấtsai logic → dữ liệu hỏngBiến động trong biên độkhông vượt biên độ sàn cho phépvượt → chưa điều chỉnh giáKhối lượng khác khôngphiên không khớp thì bỏbằng không → giá tham chiếuDữ liệu dùng đượcghi sang tầng đã sạch

Phép kiểm thứ ba đáng chú ý nhất vì nó bắt được lỗi giá điều chỉnh một cách tự động: với HOSE, bất kỳ phiên nào biến động vượt biên độ cho phép đều không thể là biến động thật, nên đó chắc chắn là dấu vết của chia tách hay cổ tức chưa được xử lý.

Hình dạng dữ liệu sạch trông thế nào

Sau khi làm sạch, một cách kiểm nhanh là nhìn phân phối biến động ngày.

012345hoà vốn-5%-2.5%0%2.5%5%Biến động mỗi phiên

Phân phối lành mạnh tập trung quanh mức nhỏ, có đuôi ở cả hai phía và không có giá trị cực đoan đứng lẻ loi tách hẳn khỏi phần còn lại. Nếu thấy một cột đơn độc ở tận cùng bên trái, gần như chắc chắn đó là dữ liệu chưa điều chỉnh chứ không phải một phiên sập thật. Hình minh hoạ, không phải dữ liệu thật.

Khung thời gian và chuyện gộp nến

Một nguồn cho dữ liệu khung phút, bạn muốn khung mười lăm phút. Gộp lại nghe đơn giản nhưng có ba chỗ sai thường gặp.

Mốc bắt đầu phải khớp giờ phiên. Nếu gộp theo mốc tròn giờ trong khi phiên mở lúc 9h00, nến đầu tiên của bạn sẽ chứa cả khoảng trước giờ mở. Với thị trường Việt Nam, mốc gộp phải tính từ thời điểm mở cửa chứ không phải từ nửa đêm.

Nghỉ trưa không được tính là khoảng trống. Từ 11h30 tới 13h00 không có giao dịch. Nếu bộ gộp nến coi đó là thời gian bình thường, bạn sẽ có những nến rỗng hoặc nến kéo dài bất thường vắt qua giờ nghỉ, và mọi chỉ báo tính trên đó đều sai.

Nến cuối phiên thường không đủ độ dài. Phiên khớp liên tục buổi chiều kết thúc lúc 14h30, nên nến mười lăm phút cuối cùng chỉ có mười phút dữ liệu. Có hai cách xử lý: bỏ nến đó, hoặc giữ và đánh dấu là nến không đầy đủ. Cách nào cũng được, miễn là backtest và bot thật làm giống nhau.

Quy tắc chung: gộp nến một lần ở tầng làm sạch, rồi lưu lại, đừng gộp mỗi lần chạy. Gộp lại mỗi lần vừa chậm vừa dễ sinh ra kết quả khác nhau giữa nghiên cứu và chạy thật.

Lưu trữ

Giai đoạn đầu, tệp parquet trên đĩa là đủ: nhanh hơn CSV nhiều lần, gọn hơn, và giữ được kiểu dữ liệu nên không phải chuyển đổi mỗi lần đọc.

Cấu trúc thư mục theo đúng bốn tầng ở trên, khớp với cấu trúc dự án đã dựng ở bài trước. Chỉ chuyển sang cơ sở dữ liệu khi thật sự cần truy vấn phức tạp hoặc khi nhiều tiến trình cùng đọc ghi.

Một thói quen đáng tập: mỗi lần lấy dữ liệu, ghi kèm thời điểm lấy và nguồn. Khi hai bộ dữ liệu cho kết quả khác nhau, đó là thông tin đầu tiên bạn cần.

Bao nhiêu dữ liệu là đủ

Câu hỏi này hay được trả lời bằng số năm, nhưng số năm là thước đo sai.

Thứ cần đếm là số chu kỳ thị trường mà dữ liệu đi qua. Năm năm dữ liệu toàn giai đoạn tăng không nói lên gì về cách chiến lược cư xử khi thị trường giảm kéo dài — và giai đoạn giảm mới là lúc hệ thống bị thử thách thật.

Thứ cần đếm thứ hai là số lệnh chiến lược sinh ra. Ba mươi lệnh trong năm năm thì năm năm vẫn là quá ít về mặt thống kê; hai nghìn lệnh trong một năm lại là chuyện khác hẳn.

Với thị trường Việt Nam, dữ liệu từ khoảng mười năm gần đây phủ được vài chu kỳ rõ rệt, gồm cả những đợt giảm mạnh có bán giải chấp dây chuyền. Đó là mức tối thiểu hợp lý cho chiến lược khung ngày.

Trước khi sang bài sau

Nên làm được ba việc: lấy được chuỗi giá của một mã về máy và vẽ ra nhìn; chạy bốn phép kiểm và biết dữ liệu của mình có sạch không; và lưu được ra parquet rồi đọc lại đúng như lúc ghi.

Bài tiếp theo bắt đầu phần tín hiệu: biến một quy tắc giao dịch thành mã chạy được, với ranh giới rõ ràng giữa tín hiệu và tầng rủi ro.

Câu hỏi thường gặp

Dữ liệu miễn phí có đủ dùng không?
Đủ cho nghiên cứu khung ngày và khung giờ. Không đủ cho chiến lược trong phiên cần dữ liệu tick, và luôn phải tự kiểm tra chất lượng vì không ai bảo đảm.
Cần bao nhiêu năm dữ liệu?
Quan trọng hơn độ dài là số chu kỳ thị trường đi qua. Dữ liệu chỉ gồm giai đoạn tăng sẽ khiến mọi chiến lược mua vào trông đều tốt.
Lưu dữ liệu bằng định dạng gì?
Parquet nhanh và gọn hơn CSV nhiều lần với dữ liệu giá, lại giữ được kiểu dữ liệu. Chỉ chuyển sang cơ sở dữ liệu khi cần truy vấn phức tạp hoặc nhiều tiến trình cùng đọc ghi.
Có nên tin dữ liệu từ một nguồn duy nhất?
Với giai đoạn nghiên cứu thì được, nhưng trước khi chạy tiền thật nên đối chiếu vài mốc với bảng giá của công ty chứng khoán. Lệch giá đóng cửa một vài mã là dấu hiệu cần tìm hiểu kỹ.

Đọc tiếp