Backtest là gì? 7 phép kiểm cho một backtest trung thực
Backtest là chạy lại chiến lược đầu tư trên dữ liệu quá khứ. Vì sao kết quả backtest hay đẹp hơn thực tế, và bảy phép kiểm giữ cho nó trung thực.
Backtest (kiểm định ngược) là chạy lại một chiến lược đầu tư trên dữ liệu giá và báo cáo trong quá khứ, để xem nó lẽ ra đã cho kết quả thế nào. Đó là cách duy nhất để biết đôi điều về một chiến lược trước khi bỏ tiền thật, và cũng là cách rất dễ để tự lừa mình: một lần backtest có thể sai mà vẫn chạy nhanh và in ra một bảng kết quả gọn gàng.
Bài này liệt kê bảy phép kiểm iWinStock áp cho mọi chiến lược đem ra kiểm định, kèm ví dụ thật của từng lỗi, trong đó có nhiều lỗi tìm thấy trong chính các lần làm trước của iWinStock. Bài nói về phương pháp, không giới thiệu chiến lược nào để đầu tư theo.
1. Chỉ dùng những gì đã biết vào ngày đó
Nhìn trộm tương lai là lỗi phổ biến nhất và tai hại nhất. Nó nghĩa là phép mô phỏng dùng thông tin chưa có vào ngày ra quyết định.
Nó hiếm khi trông giống gian lận. Nó nấp trong những dữ liệu rất bình thường:
- Ngày công bố báo cáo. Báo cáo quý không có sẵn ngay ngày hết quý. iWinStock coi mỗi báo cáo là đã biết khoảng 45 ngày sau khi quý kết thúc, mốc mà doanh nghiệp niêm yết thường đã công bố.
- Năm tài chính. Một số doanh nghiệp chốt sổ vào tháng khác tháng 12. Nếu quý của họ bị dán nhãn theo quý dương lịch, báo cáo của tháng 4 đến tháng 6 có thể trông như đã biết từ tháng 5. Ở một doanh nghiệp Việt Nam, lỗi này cho phép backtest thấy kết quả sớm 91 ngày.
- Giá đã điều chỉnh. Lịch sử giá được chia lại sau mỗi đợt chia tách và chia cổ tức bằng cổ phiếu. Lấy giá đã điều chỉnh chia cho lợi nhuận công bố khi đó làm P/E quá khứ thấp hơn thật rất nhiều, và mức sai phụ thuộc vào những đợt chia tách xảy ra về sau. Xếp hạng cổ phiếu theo con số đó là lặng lẽ ưu tiên những doanh nghiệp về sau chia thưởng nhiều nhất. Bài Chỉ số P/E là gì và đọc thế nào giải thích kỹ lỗi này.
- Danh sách của hôm nay. Chọn mã đem kiểm định theo thanh khoản hôm nay là chọn trước những mã sẽ trở nên thanh khoản, và bỏ sót những mã từng thanh khoản mà nay không còn. Cách sửa là kiểm trên rổ rộng nhất rồi xét thanh khoản theo từng phiên, chỉ dùng giao dịch của 20 phiên trước đó.
- Sàn niêm yết của hôm nay. Một mã đang ở HOSE có thể từng giao dịch ở UPCoM hay HNX, và nhiều mã từng ở HOSE nay đã rời sàn. Lọc "các mã HOSE" theo danh sách hôm nay rồi đọc giá của nhiều năm trước là vừa đưa vào những mã khi đó chưa ở HOSE, vừa bỏ sót những mã khi đó đang ở HOSE. Đo tháng 10/2026: 97 mã đang ở HOSE từng ở sàn khác, và 92 mã từng ở HOSE nay đã rời đi. Cách sửa là hỏi mỗi mã đang ở sàn nào vào đúng ngày của phiên đó.
2. Kiểm trên giai đoạn không dùng để thiết kế
Mọi ngưỡng trong một chiến lược đều được chỉnh trên một đoạn lịch sử nào đó. Kết quả trên chính đoạn đó chứng minh được rất ít. iWinStock chia lịch sử làm ba giai đoạn:
| Giai đoạn | Vai trò |
|---|---|
| 2007 đến 2015 | kiểm mù theo chiều lùi: cũ hơn dữ liệu dùng để thiết kế luật, và chứa cú sập 2008 |
| 2016 đến 2022 | giai đoạn thiết kế |
| 2023 đến nay | kiểm mù theo chiều tới: giai đoạn quyết định |
Chiến lược chỉ đẹp ở giai đoạn thiết kế thì nhiều khả năng đã học thuộc nhiễu của giai đoạn đó.
3. So với đúng mốc
Lãi 15% mỗi năm tự nó không nói lên gì. Mọi chiến lược chạy cạnh ba mốc so sánh:
- Mua và nắm giữ mọi mã trong rổ. Chiến lược không thắng được mốc này là làm nhiều hơn để được ít hơn.
- Vào lệnh ngẫu nhiên với cùng luật bán. Nếu tín hiệu mua không góp gì, chiến lược sẽ trông giống dòng này.
- Giữ tiền mặt. Khi thị trường giảm, mốc trung thực là không làm gì. Chiến lược lỗ trong đoạn giảm là đang thua cả việc ngồi im.
4. Trả đúng chi phí thật
Mỗi lệnh mô phỏng trong iWinStock trả đúng chi phí của nhà đầu tư Việt Nam: phí mua 0,15%, phí bán 0,15%, thuế bán 0,1%, và luật thanh toán T+2 không cho bán cổ phiếu trước khi nó về tài khoản. Lệnh khớp ở giá mở cửa phiên kế tiếp, sau khi tín hiệu xuất hiện trên một cây nến đã đóng. Khi giá mở cửa nhảy qua mốc cắt lỗ, lệnh thoát ở giá mở cửa đó chứ không phải ở mốc cắt lỗ.
5. Kiểm xem có giao dịch được thật không
Backtest mua bất kỳ mã nào ở giá mở cửa với khối lượng bất kỳ. Lệnh thật làm giá dịch chuyển, và mã ít giao dịch không hấp thụ nổi. iWinStock mô phỏng được điều này theo cỡ tài khoản: mỗi lệnh mua tối đa 10% giá trị khớp bình quân mỗi phiên của mã đó, chịu trượt giá tăng theo cỡ lệnh, và không mua được mã đang tăng trần trắng, tức không còn ai bán.
Nó đổi kết luận. Một chiến lược giá trị cho lãi kép trung vị 6,4% mỗi năm giai đoạn 2023 đến 2026 khi không tính trượt giá, và thắng mua và nắm giữ (7,3% mỗi năm) ở 40% số lần trong 500 lần xáo lại thứ tự lệnh. Với tài khoản 1 tỷ đồng, trung vị rơi còn âm 0,2%, và nó chỉ thắng mua và nắm giữ ở 3 trên 500 lần. Phần lớn lợi thế của nó đến từ mã nhỏ mà một tài khoản thật không mua được với khối lượng đáng kể.
Bản thân thanh khoản cũng phải đo bằng tiền thật đã giao dịch. Lấy giá lịch sử đã điều chỉnh nhân khối lượng thật làm giá trị giao dịch thấp đi ba đến tám lần ở giai đoạn 2007 đến 2012, nên bộ lọc thanh khoản dựng theo cách đó loại oan nhiều mã thực ra đang giao dịch sôi động vào thời điểm ấy.
6. Một lượt chạy là một lần rút thăm
Danh mục chỉ có năm chỗ, mà nhiều mã thường cùng báo mua trong một ngày và danh mục chỉ nhận được một phần. Thứ tự các lệnh xếp hàng quyết định mã nào được mua, và vì thế quyết định kết quả.
Mức ảnh hưởng làm chính chúng tôi bất ngờ. Cùng một danh sách lệnh của cùng một chiến lược, xếp theo hai thứ tự khác nhau nhưng đều tình cờ như nhau, cho lãi kép mỗi năm giai đoạn 2016 đến 2022 chênh nhau 5,7 điểm phần trăm. Ngoài thứ tự ra không có gì thay đổi. Nay iWinStock báo trung vị của 500 lượt chạy với thứ tự lệnh cùng ngày được xáo ngẫu nhiên, và tỷ lệ số lượt chiến lược thắng mua và nắm giữ. Một lượt chạy đơn lẻ chỉ là một tấm vé số.
Chúng tôi cũng đã thử xem một luật xếp hàng hợp lý có thay được may rủi không: ưu tiên mã thanh khoản cao nhất, hoặc doanh nghiệp vốn hóa lớn nhất. Không cách nào hơn xếp ngẫu nhiên một cách nhất quán.
7. Báo cả kết quả không đẹp
Các phép kiểm ở trên tồn tại để tìm ra thứ không chạy, và điều đó cũng phải được báo ra. Một ví dụ từ một luật chúng tôi đã kiểm, đo tháng 10/2026 bằng trung vị của 500 lượt xáo hàng đợi:
- Một luật kỹ thuật ngắn hạn, mua mã đang mạnh trên trung bình 50 phiên khi thị trường đang tăng và thoát theo một đường trailing, cho trung vị khoảng âm 3% mỗi năm giai đoạn 2023 đến 2026, so với 7,3% của mua và nắm giữ. Nó trông hấp dẫn ở các giai đoạn trước và trượt đúng ở giai đoạn không dùng để thiết kế ra nó.
Kết quả đó mang những giới hạn quen thuộc: rổ mã gồm mọi doanh nghiệp từng ở HOSE mà kho còn giữ dữ liệu giá, nên vài doanh nghiệp đã huỷ niêm yết mà nguồn không còn lưu vẫn vắng mặt; và kết quả quá khứ không bảo đảm kết quả tương lai.
Danh sách kiểm cho mọi lần backtest
- Mọi con số trong phép mô phỏng có phải là thứ đã biết vào ngày đó không?
- Kết quả có đứng được ở giai đoạn không dùng để chỉnh luật không?
- Có thắng mua và nắm giữ, vào lệnh ngẫu nhiên và giữ tiền mặt không?
- Đã tính phí, thuế và luật thanh toán chưa?
- Một tài khoản thật cỡ của bạn có khớp được các lệnh đó không?
- Kết quả là trung vị của nhiều lượt, hay một lần rút thăm may mắn?
- Báo cáo có nói cái gì không hiệu quả không?
Bạn có thể chạy chiến lược của riêng mình qua đúng bộ máy này, cùng chi phí, cùng mốc so sánh và cùng ba giai đoạn, trong công cụ backtest của iWinStock. Kết quả là phép tính trên luật và giả định do bạn chọn, không phải lời khuyên đầu tư.
Câu hỏi thường gặp
Backtest là gì? Là chạy lại một chiến lược đầu tư trên dữ liệu quá khứ, theo đúng luật mua bán của nó, để xem nó lẽ ra đã lãi lỗ thế nào. Backtest tốt mô phỏng cả chi phí, thời điểm công bố thông tin và giới hạn thanh khoản như ngoài đời.
Kết quả backtest có đáng tin không? Chỉ khi nó qua được các phép kiểm trong bài: không nhìn trộm tương lai, đứng được ở giai đoạn không dùng để thiết kế, tính đủ chi phí và trượt giá, và được báo bằng trung vị của nhiều lượt chạy. Ngay cả khi qua hết, kết quả quá khứ vẫn không bảo đảm kết quả tương lai.
Overfitting (khớp quá mức) là gì? Là khi các ngưỡng của chiến lược được chỉnh cho đến lúc nó đẹp trên đúng đoạn dữ liệu đem thử, tức nó học thuộc nhiễu của đoạn đó. Dấu hiệu dễ thấy nhất: kết quả rất tốt ở giai đoạn thiết kế rồi sụp ở giai đoạn kiểm mù.
Cần bao nhiêu năm dữ liệu để backtest? Đủ dài để chứa cả thị trường tăng, đi ngang và giảm. Với cổ phiếu Việt Nam, giai đoạn từ 2007 chứa cú sập 2008 và đợt giảm 2011 đến 2012, hai phép thử quan trọng mà dữ liệu chỉ vài năm gần đây không có.
Vì sao chiến lược lãi trên backtest nhưng lỗ khi làm thật? Thường vì một trong bốn lý do: dùng thông tin chưa có vào ngày đó, bỏ qua phí và trượt giá, mua những mã ít giao dịch mà tài khoản thật không khớp được, hoặc chỉ nhìn một lượt chạy may mắn.
Bài viết giải thích khái niệm và số liệu, không phải khuyến nghị đầu tư.