Python và dữ liệu thị trường Việt Nam: dựng bộ công cụ tối thiểu
Phần lớn thời gian làm định lượng không dành cho mô hình mà dành cho dữ liệu. Bộ công cụ tối thiểu nhỏ hơn nhiều so với người mới tưởng, nhưng phần dữ liệu thì rắc rối hơn.
Có một sự thật ít được nói khi mới bắt đầu làm việc với Python và dữ liệu thị trường Việt Nam: phần lớn thời gian làm nghiên cứu định lượng không dành cho mô hình. Nó dành cho việc lấy dữ liệu, làm sạch dữ liệu, và phát hiện ra dữ liệu sai sau khi đã chạy xong mô hình.
Bộ công cụ thì nhỏ. Phần dữ liệu mới là chỗ tốn công.
Bộ thư viện tối thiểu
Danh sách ngắn hơn nhiều so với người mới tưởng. Bốn thứ đủ để đi rất xa.
pandas để thao tác bảng dữ liệu. Đây là thứ bạn dùng nhiều nhất, và đáng đầu tư thời gian học kỹ — đặc biệt là phần chỉ mục thời gian, gộp nhóm và cửa sổ trượt.
numpy cho tính toán số. Thường dùng gián tiếp qua pandas, nhưng cần khi viết các phép tính vector hoá.
matplotlib để nhìn dữ liệu. Vẽ ra nhìn là cách nhanh nhất phát hiện dữ liệu hỏng — một cú rơi 90% trên đồ thị thường không phải sự kiện thị trường mà là giá chưa điều chỉnh.
Một thư viện lấy dữ liệu. Cộng đồng Việt có thư viện nguồn mở cho phép lấy giá lịch sử, dữ liệu công ty và báo cáo tài chính của thị trường Việt Nam. Đây là điểm khởi đầu thuận tiện nhất.
Chưa cần tới thư viện backtest chuyên dụng ở giai đoạn đầu. Một vòng lặp viết tay trên pandas vừa đủ cho hầu hết ý tưởng, lại buộc bạn hiểu rõ từng bước — điều quan trọng khi đi tìm các lỗi khiến backtest vô nghĩa.
Ba nguồn dữ liệu và điểm yếu của từng nguồn
API công ty chứng khoán. Các công ty lớn tại Việt Nam đều có API ở mức độ khác nhau, từ lấy dữ liệu tới đặt lệnh. Ưu điểm là dữ liệu khớp với chính nơi bạn giao dịch. Nhược điểm là mỗi nơi một chuẩn, tài liệu không đồng đều, và thường có giới hạn tần suất gọi.
Thư viện cộng đồng. Tiện, miễn phí, đủ dùng cho nghiên cứu. Nhược điểm là phụ thuộc vào nguồn phía sau — khi nguồn đổi cấu trúc, thư viện hỏng.
Tự thu thập và lưu. 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ới ai định chạy bot lâu dài, việc này nên bắt đầu sớm — dữ liệu quá khứ không lấy lại được.
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.
Nếu chuỗi giá của bạn không được điều chỉnh lại, đồ thị sẽ có những cú rơi mạnh không phản ánh bất kỳ biến động thật nào. Một chiến lược bám xu hướng chạy trên chuỗi đó 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.
Cách kiểm tra nhanh: lọc ra mọi phiên có biến động vượt biên độ cho phép của sàn. Với HOSE, bất kỳ phiên nào giảm quá biên độ đều là dấu hiệu của dữ liệu chưa điều chỉnh, chứ không thể là biến động thật.
Đồ thị dưới đây cho thấy vấn đề trông như thế nào khi vẽ ra.
Phiên thứ tư giá rơi một phần ba trong khi khối lượng không có gì bất thường. Không sự kiện thị trường nào tạo ra hình dạng đó — đây là dấu vết của một lần chia tách chưa được điều chỉnh vào chuỗi giá. Hình minh hoạ, không phải dữ liệu thật.
Những kiểm tra nên chạy trên mọi bộ dữ liệu
Trước khi tin vào bất kỳ dữ liệu nào, chạy bốn phép kiểm này. Chúng bắt được phần lớn vấn đề và mất vài phút.
Thiếu phiên. So danh sách ngày trong dữ liệu với lịch giao dịch. Thiếu phiên làm lệch mọi phép tính cửa sổ trượt.
Giá phi lý. Giá cao nhất phải lớn hơn hoặc bằng giá mở, đóng và thấp nhất. Nghe hiển nhiên nhưng dữ liệu thật vi phạm điều này thường xuyên hơn bạn nghĩ.
Biến động vượt biên độ. Như đã nói ở trên, đây là dấu hiệu của giá chưa điều chỉnh.
Khối lượng bằng không. Phiên không có giao dịch nhưng vẫn có giá — thường là giá tham chiếu chứ không phải giá khớp thật, và không nên dùng để tính tín hiệu.
Cấu trúc thư mục để không rối về sau
Một bố cục đơn giản nhưng tách bạch rõ ràng, dùng được từ ngày đầu tới lúc chạy bot thật.
Thư mục lấy và làm sạch dữ liệu tách riêng khỏi thư mục chiến lược. Dữ liệu thô lưu nguyên trạng, không bao giờ sửa đè — mọi biến đổi ghi ra bản mới. Kết quả backtest lưu kèm tham số đã dùng và ngày chạy, vì sáu tháng sau bạn sẽ không nhớ con số nào đến từ phiên bản nào.
Về định dạng lưu, parquet nhanh hơn và gọn hơn CSV rất nhiều với dữ liệu giá. 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.
Luồng dữ liệu nên tách thành mấy tầng
Ngay cả khi làm một mình, việc tách luồng dữ liệu thành các tầng riêng giúp bạn không phải chạy lại mọi thứ từ đầu mỗi lần sửa một chỗ.
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 một 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 đều lặp lại được và bạn luôn truy được nguồn gốc của một con số.
Tầng cuối cùng phục vụ cả nghiên cứu lẫn bot chạy thật. Đây không phải chi tiết nhỏ — nếu bot đọc dữ liệu từ một đường khác với đường backtest đã dùng, hai bên sẽ lệch nhau và bạn mất rất nhiều thời gian mới tìm ra vì sao.
Đi từ nghiên cứu sang chạy thật
Có một khác biệt mà người mới hay vấp: mã nghiên cứu xử lý cả bảng dữ liệu một lúc, còn mã chạy thật xử lý từng điểm dữ liệu khi nó đến.
Nếu viết hai bản riêng, chúng sẽ lệch nhau, và bạn sẽ không hiểu vì sao bot thật cho kết quả khác backtest. Cách tránh: viết hàm tính tín hiệu sao cho nó nhận một cửa sổ dữ liệu và trả về quyết định, rồi dùng chính hàm đó ở cả hai nơi — backtest gọi nó lặp qua lịch sử, bot gọi nó mỗi khi có dữ liệu mới.
Nguyên tắc này nghe đơn giản nhưng cứu bạn khỏi cả một nhóm lỗi khó tìm, trong đó có lỗi để mô hình nhìn thấy tương lai — vì hàm chỉ nhận đúng những gì đã biết tại thời điểm đó.
Câu hỏi thường gặp
- Cần học Python tới mức nào?
- Đủ để đọc file, dùng pandas thao tác bảng dữ liệu, viết vòng lặp và hàm, gọi API. Không cần lập trình hướng đối tượng nâng cao hay đa luồng ở giai đoạn nghiên cứu.
- Lấy dữ liệu giá Việt Nam ở đâu?
- Ba nguồn chính: API của công ty chứng khoán bạn mở tài khoản, thư viện nguồn mở của cộng đồng Việt, và dữ liệu tự thu thập rồi lưu lại. Nguồn nào cũng cần kiểm tra chất lượng trước khi tin.
- Giá điều chỉnh là gì và vì sao quan trọng?
- Sau chia cổ tức hay chia tách, giá lịch sử phải được điều chỉnh lại để chuỗi giá liên tục. Dùng giá chưa điều chỉnh thì đồ thị có những cú rơi giả và mọi backtest đều sai.
- Nên lưu dữ liệu bằng gì?
- Giai đoạn đầu, file parquet trên đĩa là đủ và nhanh hơn nhiều so với CSV. Chỉ chuyển sang cơ sở dữ liệu khi cần truy vấn phức tạp hoặc khi nhiều tiến trình cùng đọc ghi.
Đọc tiếp
- Algo trading & thực thi lệnhThuật toán thực thi lệnh: đặt lệnh lớn mà không tự đẩy giá
- Chứng khoán cơ sở Việt NamChứng khoán cơ sở Việt Nam: bắt đầu từ đâu
- Phân tích kỹ thuật & price actionPrice action: đọc hành vi giá mà không cần chỉ báo
- Phái sinh VN30F1MPhái sinh VN30F1M là gì: hướng dẫn từ đầu cho người mới