Chi phí giao dịch ăn mòn lợi nhuận thế nào
Trượt giá là lớp chi phí thứ ba mà backtest hay bỏ qua. Lưới bước giá đặt cho nó một cái sàn, và cái sàn ấy chênh nhau 5.5 lần giữa các mã Việt Nam.
FinLens37 phút đọc
Một người chạy backtest cho bốn chiến lược trên mười cổ phiếu, cửa sổ năm năm. Bốn mươi kết quả hiện ra. Người đó đọc bốn mươi con số ấy, và trong lúc đọc thì không nghĩ tới một ô nhập liệu đã bỏ qua từ đầu: ô trượt giá, đang để nguyên giá trị mặc định của phần mềm.
Sau đó ô ấy được sửa. Không phải sửa thành một con số đẹp hơn hay xấu hơn theo ý ai, mà sửa thành mức thấp nhất mà lưới bước giá của chính mã đó cho phép trượt giá nhận. Kết quả: cả bốn mươi cấu hình đều xấu đi, không cấu hình nào tốt lên.
Bài này nói về lớp chi phí đứng sau ô nhập liệu ấy. Nó không phải lớp đắt nhất, và trong nhiều trường hợp không phải lớp lớn nhất. Nó là lớp duy nhất trong ba lớp mà không ai thu, không có chứng từ, và vì thế phải được giả định bằng một con số do người chạy tự đặt.
Đây là bài thứ ba của chuỗi kiểm chứng một phương pháp. Hai bài trước nói về việc đọc kết quả backtest và về những sai lệch nằm trong chính dữ liệu. Bài này nói về một tham số duy nhất, và về việc một tham số duy nhất có thể làm gì với cả một bảng kết quả.
Sơ đồ ba lớp chi phí xếp chồng bám vào một vòng mua bán, hai lớp trên có hoá đơn còn lớp dưới cùng không ai thu nhưng vẫn lấy đi một phần vốn
Ba lớp chi phí, và lớp thứ ba là lớp bị bỏ quên
Một vòng mua bán trọn vẹn, mua rồi bán cùng số lượng, đi qua ba lớp chi phí có bản chất khác hẳn nhau.
Lớp thứ nhất: phí môi giới. Thu ở cả hai chiều, tính trên giá trị giao dịch. Trần theo quy định hiện hành là 0.5% mỗi lần, mức sàn đã bị bỏ nên phần dưới trần do thoả thuận trong hợp đồng mở tài khoản.
Lớp thứ hai: thuế thu nhập cá nhân 0.1% trên giá trị bán. Điểm đáng nhớ nhất của lớp này là mẫu số: nó tính trên số tiền bán được, không tính trên phần lãi. Một lệnh cắt lỗ vẫn phát sinh thuế đủ.
Lớp thứ ba: trượt giá. Là khoảng chênh giữa mức giá nhìn thấy trên bảng và mức giá thực sự khớp.
Cấu trúc đầy đủ của hai lớp đầu, kèm con số và căn cứ pháp lý của từng khoản, đã nằm trọn ở bài chi phí thật của một giao dịch. Bài này không dựng lại bảng phí đó. Nó lấy kết quả của bài kia làm đầu vào, cụ thể là con số này: với mức phí môi giới giả định 0.15% mỗi chiều, một vòng mua bán tiêu tốn 0.40% vốn khi giá không đổi.
Điều đáng nói là vì sao lớp thứ ba lại hay biến mất khỏi mọi phép tính.
Hai lớp đầu có hoá đơn. Chúng hiện thành một dòng trên bảng kê tài khoản, có số tiền cụ thể, cộng lại được, đối chiếu được. Không ai quên một khoản đã bị trừ trên sao kê.
Lớp thứ ba thì không. Không ai thu trượt giá của bạn. Không có dòng nào ghi "trượt giá: 12,000 đ". Nó không phải một khoản chi, nó là một khoảng cách giữa hai con số: con số bạn định giao dịch và con số bạn giao dịch thật. Khoảng cách ấy chỉ tồn tại nếu có ai đó đứng ra đo nó, và trong một backtest thì không có ai cả, chỉ có một ô nhập liệu.
Đó là lý do lớp thứ ba là lớp duy nhất phải được giả định. Và một con số phải giả định thì luôn có nguy cơ được giả định cho tiện.
Trượt giá không đo trực tiếp được, bài này chỉ có một cái sàn
Trước khi đi tiếp, cần nói thẳng một giới hạn, vì nó quyết định mức độ mạnh của mọi câu sau đó.
Bài này không đo được trượt giá thật. Bộ công cụ dùng để lấy số cho bài không trả về sổ lệnh, nên nó không cho biết ba thứ:
- Chênh lệch thật giữa giá chào mua tốt nhất và giá chào bán tốt nhất tại từng thời điểm.
- Lượng hàng đang chờ ở từng mức giá, tức độ dày của sổ lệnh.
- Mức trượt giá tăng thêm khi lệnh lớn hơn lượng hàng ở mức giá tốt nhất.
Thiếu cả ba thì không thể nói trượt giá thật của một mã là bao nhiêu phần trăm. Bất kỳ ai in ra một con số như vậy mà không có sổ lệnh trong tay đều đang ước lượng chứ không đang đo.
Cái duy nhất suy ra được, và suy ra được một cách chắc chắn, là một cận dưới. Lưới bước giá là quy tắc của Sở giao dịch, công khai, không phụ thuộc vào ai đang mua bán. Từ nó suy ra mức thấp nhất mà trượt giá có thể nhận, và mức đó không bao giờ bị vượt xuống dưới.
Toàn bộ phần còn lại của bài đứng trên chữ "sàn" đó. Đây cũng là lý do bài này không in bảng ngưỡng hoà vốn tới bốn chữ số thập phân. In bốn chữ số thập phân cho một đại lượng chưa được đo lần nào là gán cho nó một độ chính xác mà nó không có, và cách trình bày ấy tự nó đã là một khẳng định sai.
Sàn không phải ước lượng
Con số sàn trong bài trả lời câu "trượt giá không thể thấp hơn bao nhiêu", không trả lời câu "trượt giá là bao nhiêu". Hai câu đó khác nhau, và chỉ câu thứ nhất có đáp án ở đây. Dùng sàn thay cho giá trị thật là lạc quan có hệ thống, không phải bảo thủ.
Biên độ tạo thêm một lớp chi phí mà cái sàn này không đo
Cái sàn suy từ lưới bước giá chỉ đúng khi lệnh khớp được. Biên độ dao động cắt cụt cây nến ở hai đầu, và ở phiên chạm trần hoặc chạm sàn thì bên muốn giao dịch ngược chiều gần như không có đối ứng: lệnh không khớp, hoặc khớp một phần rất nhỏ. Cơ chế cắt cụt nằm ở bài đọc một cây nến.
Chi phí thật của những phiên đó không phải trượt giá, nó là chi phí của việc không thoát được, và nó không xuất hiện trong bất kỳ tham số nào của backtest. Bài này không đo được nó, và không có tham số nào trong công cụ đại diện cho nó.
Lưới bước giá đặt sàn, và cái sàn ấy khác nhau theo từng mã
Cơ chế nền của phần này đã được dựng ở hai bài trước trong chủ đề. Bài hỗ trợ và kháng cự bản chất là gì cho thấy lưới bước giá đặt sàn cho mọi ngưỡng vẽ trên đồ thị, và một "vùng" 1% ở mã này chứa tám mức giá còn ở mã khác chỉ chứa hai. Bài khối lượng giao dịch nói gì cho thấy vì sao bước giá là mức chênh lệch mua bán nhỏ nhất có thể tồn tại: hai lệnh chờ ở hai phía không thể sát nhau hơn một vạch lưới.
Phần dưới đây chỉ lấy hệ quả riêng cho chi phí, không giải thích lại cơ chế.
Một bước giá quy ra phần trăm
Công thức của sàn rất ngắn:
Sàn trượt giá một vòng = một bước giá ÷ giá đóng cửa
Cách đọc hai chiều mua và bán. Quy ước thông dụng của các bộ backtest là tính trượt giá cho từng chiều, và mức thường dùng là một nửa chênh lệch mua bán. Nếu chênh lệch hẹp nhất bằng đúng một bước giá thì mỗi chiều gánh nửa bước, và một vòng trọn vẹn gánh đúng một bước. Vì vậy cột "một vòng" trong bảng dưới là một bước giá quy ra phần trăm, còn cột "mỗi chiều" là một nửa con số đó.
Cần nhớ đây vẫn là kịch bản hẹp nhất. Người muốn khớp ngay thường phải đặt bằng giá bên kia đang chờ, tức chấp nhận vượt trọn một bước ở mỗi chiều, thành hai bước cho một vòng. Con số trong bảng vì thế là cận dưới của cận dưới.
Hai lưới, không phải một
Đây là chỗ thị trường Việt Nam khác hẳn giả định trong sách vở, và cũng là chỗ dễ tính sai nhất.
HOSE dùng lưới ba bậc theo mức giá: dưới 10,000 đ thì bước 10 đ, từ 10,000 đ tới 49,950 đ thì bước 50 đ, từ 50,000 đ trở lên thì bước 100 đ.
HNX dùng bước 100 đ đồng nhất ở mọi mức giá. Không có ba bậc. Một cổ phiếu HNX giá 13,200 đ và một cổ phiếu HNX giá 38,700 đ cùng nhảy theo bước 100 đ, dù cổ phiếu thứ hai đắt gần gấp ba.
Ghép hai điều đó lại thì ra một hệ quả không trực giác chút nào: mã có sàn trượt giá cao nhất không phải mã đắt nhất, cũng không phải mã rẻ nhất, mà là mã rơi vào ô xấu nhất của lưới nó đang đứng. Một cổ phiếu HNX ở vùng giá thấp gánh bước 100 đ trên một thị giá nhỏ, trong khi một cổ phiếu HOSE cùng vùng giá đó chỉ gánh bước 50 đ.
Hai trục giá thẳng đứng đặt cạnh nhau, trục bên trái chia làm ba đoạn có mật độ vạch khác nhau còn trục bên phải có các vạch cách đều nhau suốt chiều dài, một mũi tên ngắn bằng đúng một khoảng vạch được đặt ở cùng một mức giá trên cả hai trục nhưng dài ngắn khác nhau so với thị giá
| Mốc | Sàn một vòng (%) |
|---|---|
| CEO | 0.7576 |
| HQC | 0.463 |
| DIG | 0.4505 |
| SHB | 0.4149 |
| POW | 0.3891 |
| PVS | 0.2584 |
| HPG | 0.2304 |
| VNM | 0.1616 |
| FPT | 0.1374 |
| MWG | 0.1368 |
Sàn một vòng = một bước giá chia cho giá đóng cửa ngày 04/09/2026. Đây là cận dưới suy từ quy chế giao dịch, không phải trượt giá đo được. Thứ tự cột xếp theo độ lớn của sàn, một tính chất của lưới giá và mức giá, không phải một xếp hạng cổ phiếu: đổi sang mã khác cùng sàn và cùng mức giá thì con số không đổi. Các mã nêu tên chỉ để người đọc kiểm lại được từng phép chia. Nguồn: HOSE, HNX, FinLens tổng hợp.
Bảng số liệu đi kèm biểu đồ trên chỉ có một cột. Bốn cột dựng nên nó như sau:
| Mã | Sàn | Giá đóng cửa 04/09/2026 | Bước giá | Sàn mỗi chiều |
|---|---|---|---|---|
| CEO | HNX | 13,200 đ | 100 đ | 0.3788% |
| HQC | HOSE | 2,160 đ | 10 đ | 0.2315% |
| DIG | HOSE | 11,100 đ | 50 đ | 0.2252% |
| SHB | HOSE | 12,050 đ | 50 đ | 0.2075% |
| POW | HOSE | 12,850 đ | 50 đ | 0.1946% |
| PVS | HNX | 38,700 đ | 100 đ | 0.1292% |
| HPG | HOSE | 21,700 đ | 50 đ | 0.1152% |
| VNM | HOSE | 61,900 đ | 100 đ | 0.0808% |
| FPT | HOSE | 72,800 đ | 100 đ | 0.0687% |
| MWG | HOSE | 73,100 đ | 100 đ | 0.0684% |
Hai dòng đáng dừng lại.
CEO và PVS cùng nằm trên HNX, cùng bước 100 đ. Chênh lệch duy nhất giữa hai dòng là thị giá, 13,200 đ so với 38,700 đ, và riêng chênh lệch đó đẩy sàn từ 0.2584% lên 0.7576%, tức gấp gần ba lần. Không có gì liên quan tới doanh nghiệp trong phép tính này, chỉ có một phép chia.
DIG và CEO có thị giá gần nhau, 11,100 đ so với 13,200 đ, nhưng sàn chênh nhau 1.7 lần. Nguyên nhân nằm ở chỗ DIG trên HOSE gánh bước 50 đ còn CEO trên HNX gánh bước 100 đ. Cùng một vùng giá, hai lưới, hai cái sàn.
Biên độ giữa mã có sàn cao nhất và mã có sàn thấp nhất trong mười mã là 5.5 lần (0.7576% so với 0.1368%). Đó là con số cần nhớ cho toàn bộ phần sau.
Một tham số dùng chung, mười sai số khác nhau
Bây giờ đặt cái sàn ấy cạnh con số mà backtest thường dùng.
Lượt chạy đầu tiên của bộ dữ liệu này để nguyên mức mặc định của công cụ: 0.10% một vòng, dùng chung cho cả mười mã. Đây là mức mặc định rất phổ biến, và nó không phải một lựa chọn tuỳ tiện của riêng ai: 0.10% là con số tròn, dễ nhớ, và ở nhiều thị trường nước ngoài thì nó không hề nhỏ.
Ở Việt Nam thì nó nhỏ hơn sàn vật lý. Với cả mười mã.
| Mã | Sàn một vòng | Mức mặc định | Sàn cao hơn mặc định |
|---|---|---|---|
| CEO | 0.7576% | 0.10% | 7.6 lần |
| HQC | 0.4630% | 0.10% | 4.6 lần |
| DIG | 0.4505% | 0.10% | 4.5 lần |
| SHB | 0.4149% | 0.10% | 4.1 lần |
| POW | 0.3891% | 0.10% | 3.9 lần |
| PVS | 0.2584% | 0.10% | 2.6 lần |
| HPG | 0.2304% | 0.10% | 2.3 lần |
| VNM | 0.1616% | 0.10% | 1.6 lần |
| FPT | 0.1374% | 0.10% | 1.4 lần |
| MWG | 0.1368% | 0.10% | 1.4 lần |
Cột cuối là chỗ đáng chú ý, và nó nói một điều mạnh hơn "tham số mặc định hơi thấp".
Nếu tham số mặc định thấp hơn sàn đúng 1.4 lần ở mọi mã thì nó chỉ là một sai lệch mức. Sai lệch mức thì trừ đi được, và quan trọng hơn, nó không làm hỏng phép so sánh giữa các mã, vì mọi mã cùng chịu một lượng như nhau.
Nhưng cột cuối trải từ 1.4 tới 7.6 lần. Nghĩa là khi mười kết quả backtest được xếp cạnh nhau để so, mười con số ấy đang được đo bằng mười cái thước sai lệch khác nhau, và cái sai nhất sai gấp 5.5 lần cái đúng nhất. Mã nào có sàn cao thì được tha nhiều nhất, tức là được làm đẹp nhiều nhất.
Nói cách khác, một tham số trượt giá dùng chung không trung tính. Nó ưu ái có hệ thống nhóm mã thị giá thấp và nhóm mã trên lưới HNX, đúng là nhóm mà đặc điểm kỹ thuật của thị trường vốn đã bắt trả chi phí cao nhất.
Sơ đồ một đường kẻ ngang duy nhất biểu thị tham số dùng chung, phía trên là mười cột cao thấp khác nhau biểu thị sàn thật của từng mã, khoảng cách từ đường kẻ lên mỗi cột dài ngắn khác nhau
Chạy lại 40 cấu hình, và nói cho đúng mức độ
Lưới chạy lại gồm 4 chiến lược nhân 10 mã, cửa sổ 5 năm từ 06/09/2021 tới 04/09/2026, có ràng buộc T+2, phí giữ nguyên 0.15% mỗi chiều. Chỉ đúng một thứ thay đổi: tham số trượt giá, từ mức mặc định 0.10% dùng chung sang sàn của chính từng mã.
Trước khi đọc kết quả, cần đặt sẵn một cái mốc, vì thiếu nó thì mọi con số bên dưới dễ bị đọc quá lên. Ở trạng thái trước khi sửa tham số, tức trạng thái thuận lợi nhất cho các chiến lược:
- 22 trên 40 cấu hình có lợi nhuận dương, tức 18 trên 40 đã âm.
- 16 trên 40 cấu hình vượt mua-giữ chính mã đó, tức 24 trên 40 đã thua mua-giữ.
Đó là điểm xuất phát. Phần lớn lưới đã thua phép mua và giữ từ trước khi ai chạm vào ô trượt giá.
Kết quả sau khi thay tham số:
| Kết quả | Con số |
|---|---|
| Cấu hình xấu đi | 40 trên 40 |
| Cấu hình tốt lên | 0 |
| Lợi nhuận dương đổi dấu | 1 trên 22 |
| Từ vượt mua-giữ thành thua mua-giữ | 2 trên 16 |
Bây giờ tới phần khó nhất của cả bài, và cũng là phần dễ viết sai nhất.
Một câu sai và một câu đúng
Câu sai: "Đổi tham số trượt giá thì phần lớn cấu hình đổi dấu."
Câu đúng: một tham số nhỏ do người chạy tự đặt bào mòn toàn bộ lưới theo cùng một chiều, và đủ lật ba dòng vốn nằm sát ngưỡng.
Câu sai hấp dẫn hơn nhiều. Nó biến một phát hiện về đo lường thành một cú lật ngoạn mục. Nhưng số liệu không đỡ được nó: 1 trên 22 và 2 trên 16 không phải "phần lớn", và viết như vậy là làm chính cái việc mà cả chuỗi bài này đang cảnh báo, tức là kể một câu chuyện mạnh hơn dữ liệu.
Điều đáng nói là câu đúng lại là câu có ích hơn, vì hai lý do.
Thứ nhất, 40 trên 40 là phát hiện chắc chắn nhất của cả thí nghiệm. Không có ngoại lệ nào. Một sai lệch xuất hiện ở cả bốn mươi ô của một lưới, luôn theo cùng một hướng, không phải nhiễu ngẫu nhiên. Nhiễu ngẫu nhiên thì đẩy một số ô lên và một số ô xuống. Đây là sai lệch hệ thống, và sai lệch hệ thống là thứ nguy hiểm hơn nhiễu, vì nó không tự triệt tiêu khi lấy trung bình và không tự lộ ra khi tăng cỡ mẫu.
Thứ hai, ba dòng bị lật cho biết một điều về vị trí chứ không phải về độ lớn. Một tác động nhỏ chỉ lật được những dòng vốn đã đứng sát vạch. Nếu một dòng kết quả bị đảo dấu bởi một thay đổi cỡ vài phần mười phần trăm, thì thông tin thật nằm ở chỗ dòng ấy vốn dĩ đã nằm sát vạch tới mức đó, chứ không nằm ở chỗ tham số kia mạnh.
Sơ đồ một dãy chấm tròn xếp rải rác trên một trục ngang, mỗi chấm kèm một mũi tên ngắn cùng chiều sang trái, một vạch dọc cắt ngang trục và chỉ ba chấm vốn nằm sát vạch là vượt qua nó sau khi dịch
Ba dòng bị lật, và một dòng gần mất sạch biên
Bốn dòng dưới đây là bốn dòng đáng xem trong bốn mươi. Chúng không được xếp theo thứ tự đi lên, và dòng cuối bảng không phải dòng đẹp nhất.
| Cấu hình | Ngưỡng bị chạm | Vượt mua-giữ sau khi thay tham số |
|---|---|---|
| SHB · MACD | Lợi nhuận tổng đổi dấu, từ +1.55% xuống −12.56% | Không có trong bộ số chạy lại |
| HQC · RSI | Từ vượt mua-giữ rơi xuống thua mua-giữ | Thua |
| MWG · giá cắt MA20 | Từ vượt mua-giữ rơi xuống thua mua-giữ | Thua |
| HPG · MACD | Không lật, nhưng biên gần như bốc hơi | +0.33 đpt, trước đó là +5.30 đpt |
"đpt" viết tắt của điểm phần trăm, đơn vị của một hiệu giữa hai tỷ lệ phần trăm. Vượt mua-giữ +5.30 đpt nghĩa là chiến lược cho tổng lợi nhuận cao hơn phép mua và giữ đúng mã đó 5.30 điểm phần trăm trong cùng cửa sổ.
Đọc từng dòng.
SHB · MACD: dương chỉ vì thước đo bị đặt quá thấp
Đây là ca gọn nhất của cả bộ số, và nó gọn vì có thể phát biểu bằng một câu số học.
Cấu hình này có lợi nhuận dương ở tham số cũ. Sàn trượt giá của mã này là 0.4149%, còn tham số cũ là 0.10%. Tức tham số cũ thấp hơn sàn của chính mã đó 4.1 lần. Khi thay bằng sàn, kết quả chuyển từ +1.55% thành −12.56%.
Điều cần cẩn thận khi đọc dòng này: bộ số chạy lại không ghi lại cấu hình này nằm ở phía nào của phép so mua-giữ, nên không được đọc +1.55% như một lợi thế. Đó là lợi nhuận tổng của năm năm, và một con số như vậy chỉ có nghĩa khi đặt cạnh kết quả của việc mua rồi ngồi yên trên cùng mã, cùng cửa sổ. Ở đây không có cột đó, nên câu duy nhất rút ra được là câu về độ mong manh: dòng này dương chỉ vì thước đo bị đặt thấp hơn mức vật lý cho phép.
HQC · RSI và MWG · giá cắt MA20: hai dòng rời khỏi nhóm vượt
Hai cấu hình này trước đó nằm trong nhóm 16 dòng vượt mua-giữ. Sau khi thay tham số, cả hai rơi xuống dưới.
Chi tiết đáng chú ý là hai mã này nằm ở hai đầu đối lập của bảng sàn. HQC có sàn 0.4630%, gần đỉnh bảng. MWG có sàn 0.1368%, đúng đáy bảng, tức mã ít bị thay đổi nhất trong cả mười. Vậy mà cả hai đều rơi.
Điều đó nói rằng sàn cao không phải điều kiện cần để bị lật. Điều kiện thật là khoảng cách tới vạch, và một cấu hình đứng sát vạch thì một tác động nhỏ cỡ 0.0368 điểm phần trăm mỗi vòng cũng đủ đẩy nó qua bên kia.
HPG · MACD: bốc hơi 94% mà không bị lật
Dòng này không đổi dấu, không rời khỏi nhóm vượt mua-giữ, nên nếu chỉ đếm số dòng bị lật thì nó không xuất hiện ở đâu cả.
Nhưng biên vượt mua-giữ của nó đi từ +5.30 đpt xuống +0.33 đpt, tức mất 94% khoảng cách. Sàn của HPG là 0.2304%, chỉ cao hơn tham số cũ 2.3 lần, mức thay đổi vào loại nhỏ trong bảng.
Đây là lý do phép đếm "bao nhiêu dòng bị lật" là một phép đo thô. Một dòng còn +0.33 đpt sau năm năm và bốn mươi lăm tới năm mươi lệnh thì về mặt thực tế không phân biệt được với không, trong khi bảng đếm vẫn xếp nó vào cột "vẫn vượt". Cột đếm giữ nguyên, nội dung đằng sau thì gần như đã rỗng.
Không dòng nào ở trên đọc được thành ưu điểm
Bốn dòng trong bảng được chọn vì chúng minh hoạ một cách hỏng của phép đo, không vì chúng nói lên điều gì tốt về bốn chiến lược. Nhắc lại điểm xuất phát: 24 trên 40 cấu hình đã thua mua-giữ ngay cả ở tham số thuận lợi nhất, và toàn bộ đây là mô phỏng quá khứ với phí và trượt giá giả định, không phải kết quả giao dịch thật.
Ảnh hưởng tỷ lệ với tần suất, không tỷ lệ với chất lượng tín hiệu
Phần trên cho thấy tác động khác nhau giữa các dòng. Câu hỏi tiếp theo là khác nhau theo cái gì. Và câu trả lời không phải "theo chiến lược nào tốt hơn".
Bộ số cho hai nhóm rất tách bạch:
| Chiến lược | Số lệnh trong 5 năm | Số cấu hình đổi dấu | Bào mòn trung vị |
|---|---|---|---|
| MA20 cắt MA50 | 9 tới 15 | 0 trên 4 | 1.84 đpt |
| MACD 12/26/9 | 45 tới 50 | 1 | Lớn hơn nhiều |
Nhóm ít lệnh gần như không xi nhê. Nhóm nhiều lệnh chịu tác động lớn hơn hẳn.
Điều này không cần giải thích bằng bất cứ tính chất nào của tín hiệu, vì nó thuần tuý là số học. Chi phí một vòng là một tỷ lệ cố định c. Sau n vòng, phần vốn còn lại là (1 − c)^n. Số mũ là số lệnh, không phải chất lượng của lệnh.
Nói cách khác: một tham số chi phí sai nhân với số lệnh. Chiến lược nào chạm vào thị trường nhiều lần hơn thì khuếch đại sai số đó nhiều lần hơn, bất kể tín hiệu của nó hay dở ra sao.
Con số cụ thể của phép nhân đó
Lấy chi phí một vòng bằng 0.40% phí và thuế cộng với sàn trượt giá. Với mã có sàn cao nhất bảng, một vòng tốn 1.1576%. Với mã có sàn thấp nhất bảng, một vòng tốn 0.5368%.
Cho giá đứng yên tuyệt đối, chỉ để chi phí làm việc:
| Mốc | Chi phí một vòng 1.1576% (%) | Chi phí một vòng 0.5368% (%) |
|---|---|---|
| 10 vòng | 10.99 | 5.24 |
| 15 vòng | 16.02 | 7.76 |
| 25 vòng | 25.26 | 12.59 |
| 50 vòng | 44.12 | 23.6 |
| 82 vòng | 61.51 | 35.68 |
Chi phí một vòng = 0.40% phí và thuế (mức phí môi giới giả định 0.15% mỗi chiều) cộng sàn trượt giá suy từ lưới bước giá. Chuỗi thứ nhất dùng sàn cao nhất trong 10 mã (0.7576%), chuỗi thứ hai dùng sàn thấp nhất (0.1368%). Phép tính giả định giá bán bằng giá mua và mỗi vòng dùng trọn vốn. Đây là số học thuần tuý, không phải kết quả giao dịch. Nguồn: HOSE, HNX, FinLens tổng hợp.
Ba mốc trong biểu đồ có nguồn gốc cụ thể. Mốc 10 tới 15 vòng là khoảng số lệnh mà nhóm MA20 cắt MA50 tạo ra trong năm năm, tức khoảng hai tới ba vòng một năm. Mốc 50 vòng gần với số lệnh của nhóm MACD trong cùng năm năm. Mốc 82 vòng là trần cơ học trong một năm do chu kỳ T+2 đặt ra, con số này được dựng ở bài khung thời gian và tính nhất quán.
Điều đáng chú ý ở biểu đồ không phải độ cao của cột nào, mà là khoảng cách giữa hai chuỗi nở ra theo số vòng. Ở 10 vòng, hai chuỗi cách nhau 5.75 điểm phần trăm. Ở 82 vòng, chúng cách nhau 25.83 điểm phần trăm. Cùng một chênh lệch sàn 5.5 lần, nhưng hậu quả của nó phụ thuộc hoàn toàn vào số lần chạm vào thị trường.
Chỗ dễ rút ra một kết luận không có trong dữ liệu
Đoạn trên nói chi phí tỷ lệ với số lệnh. Nó không nói chiến lược ít lệnh cho kết quả tốt hơn, và bài này không có dữ liệu để nói điều đó.
Phân biệt cho rõ: (1 − c)^n là số hạng chi phí, và nó luôn giảm khi n giảm. Nhưng kết quả cuối cùng là số hạng chi phí nhân với số hạng lợi nhuận thô, mà giảm n cũng làm giảm số hạng thứ hai theo một cách không đoán trước được. Một chiến lược không giao dịch lần nào có chi phí bằng đúng không, và cũng không có kết quả nào.
Điều rút ra được chỉ là một mệnh đề về độ nhạy của phép đo: kết quả của một cấu hình nhiều lệnh phụ thuộc nhiều hơn vào một con số do người chạy tự đặt. Đó là lý do để kiểm tham số kỹ hơn ở những cấu hình như vậy, không phải lý do để chọn cấu hình khác.
Chu kỳ T+2 ràng buộc tần suất từ phía dưới
Số vòng trong một năm không phải một biến tự do. Ở thị trường cơ sở Việt Nam có một trần cứng, và nó không do ai chọn.
Chu kỳ thanh toán là T+2: tiền và chứng khoán về tài khoản chậm nhất 13:00 ngày T+2, nên cổ phiếu mua hôm nay sớm nhất bán được từ phiên chiều ngày T+2. Đường đi đầy đủ của một lệnh, từ lúc đặt tới lúc cổ phiếu về tài khoản, nằm ở bài một lệnh mua đi qua những khâu nào.
Hai hệ quả trực tiếp lên chuyện chi phí.
Một: một vòng mua bán cần tối thiểu ba phiên. Với khoảng 248 phiên một năm sau khi trừ các ngày lễ, trần cơ học rơi vào khoảng 82 vòng. Đó là cột cuối trong biểu đồ trên. Trần thật còn thấp hơn, vì lệnh mua vào thứ Năm và thứ Sáu phải chờ qua cuối tuần.
Hai: chiến lược trong ngày không thực hiện được ở thị trường cơ sở. Chưa có giao dịch trong ngày, chưa có bán khống. Nghĩa là một backtest cho phép vào và ra trong cùng một phiên đang mô phỏng một thị trường khác với thị trường mà người đọc sẽ đặt lệnh vào. Kết quả của nó không sai về số học, nó chỉ không có đối tượng để áp dụng.
Trần 82 vòng cũng là lý do cột cuối của biểu đồ đáng nhìn kỹ. Nó không phải một kịch bản cực đoan bịa ra cho ấn tượng: nó là mức giao dịch dày nhất mà quy chế cho phép, và ngay ở mức đó thì riêng chi phí đã lấy đi từ hơn một phần ba tới gần hai phần ba số vốn khi giá không nhúc nhích.
Kỳ nghỉ dài làm lệch cả hai vế của phép tính
Một biến dạng nữa ít được nhắc, và nó chạm vào cả chi phí lẫn tín hiệu.
Mọi chỉ báo kỹ thuật đếm phiên, không đếm thời gian. Một cửa sổ 20 phiên là 20 lần khớp lệnh liên tiếp, bất kể chúng nằm cách nhau bao nhiêu ngày lịch. Bình thường 20 phiên trải trên khoảng bốn tuần. Một cửa sổ 20 phiên vắt qua Tết Nguyên đán trải trên một khoảng dài hơn hẳn, vì ở giữa nó có một quãng nghỉ liền mạch.
Với chi phí, điều đó kéo theo hai thứ:
- Số phiên trong năm không cố định. Con số 248 phiên và trần 82 vòng thay đổi vài đơn vị theo từng năm, tuỳ ngày lễ rơi vào thứ mấy. Đó là lý do 82 nên đọc như một mốc trên dưới chứ không phải hằng số.
- Vốn bị khoá lâu hơn số phiên gợi ý. Một vị thế mở trước kỳ nghỉ dài chiếm chỗ trong danh mục nhiều ngày lịch hơn hẳn một vị thế cùng số phiên ở giữa năm, trong khi mọi phép tính theo phiên đối xử với hai vị thế đó như nhau.
Không có cách nào chỉnh cho đúng, vì lịch nghỉ không đều. Cái làm được là biết rằng trục hoành của mọi backtest không phải trục thời gian, và đừng quy đổi số phiên thành số ngày bằng một hệ số cố định.
Công cụ này mất tác dụng khi nào
Con số sàn trượt giá là một cận dưới có căn cứ, nhưng nó có tám chỗ hỏng. Mỗi mục dưới đây ứng với một cơ chế cụ thể chứ không phải một cảnh báo chung.
Khi lệnh lớn hơn lượng hàng đang chờ ở mức giá tốt nhất. Sàn được suy ra từ giả định lệnh nhỏ, khớp trọn ở một mức giá. Lệnh lớn hơn lượng đang chờ sẽ ăn tiếp sang mức kém hơn, rồi mức kém hơn nữa, và giá bình quân thực nhận xấu dần theo quy mô lệnh. Cơ chế đầy đủ nằm ở bài khối lượng giao dịch nói gì. Với lệnh lớn trên một sổ lệnh mỏng, sàn không còn là xấp xỉ mà chỉ còn là điểm khởi đầu.
Khi giá đi qua ngưỡng đổi bước giá của HOSE. Bảng sàn ở trên tính tại giá đóng cửa một ngày duy nhất, trong khi backtest chạy năm năm. Một mã đóng cửa 11,100 đ hôm nay gánh bước 50 đ, nhưng nếu trong năm năm đó có đoạn nó nằm dưới 10,000 đ thì đoạn ấy gánh bước 10 đ, và sàn thật của đoạn ấy khác hẳn. Mốc 50,000 đ cũng vậy. Sàn không phải một hằng số theo mã, nó là một hàm của mức giá.
Khi mã đổi nơi giao dịch. HNX đã ngừng nhận hồ sơ niêm yết cổ phiếu mới từ 01/07/2025 và toàn bộ cổ phiếu niêm yết trên HNX phải chuyển sang HOSE chậm nhất 31/12/2026. Một mã HNX ở vùng 13,000 đ đang gánh bước 100 đ; sau khi chuyển sàn, cùng mức giá đó gánh bước 50 đ. Sàn trượt giá của nó giảm một nửa trong đúng một đêm, và trên chuỗi giá không có gì đánh dấu chỗ chuyển.
Khi một phần lớn khối lượng của mã đi qua giao dịch thoả thuận. Khối hàng đổi chủ theo thoả thuận riêng không đi qua sổ lệnh, nên nó làm cột khối lượng vọt lên mà không hề làm sổ lệnh dày thêm. Một mã trông thanh khoản trên biểu đồ khối lượng vẫn có thể có sổ lệnh mỏng. Phép kiểm nhanh và cơ chế đầy đủ nằm ở bài khối lượng giao dịch nói gì.
Khi chuỗi giá chưa điều chỉnh và trong cửa sổ có ngày giao dịch không hưởng quyền. Đây là chỗ hai loại lỗi nhân với nhau. Bước nhảy hành chính do điều chỉnh giá tham chiếu tạo ra một khoảng trống giá giả, cơ chế nằm ở bài xu hướng và cấu trúc giá. Khoảng trống giả ấy sinh ra tín hiệu giả, tín hiệu giả sinh ra lệnh, và mỗi lệnh gánh đủ ba lớp chi phí. Backtest vẫn trừ chi phí một cách trung thực, chỉ có điều nó đang trừ chi phí cho những lệnh lẽ ra không tồn tại.
Khi chuỗi phiên bị gãy vì lý do hành chính. Mã vào diện cảnh báo, kiểm soát, hạn chế giao dịch hay bị đình chỉ thì số phiên giao dịch trong tuần thay đổi, và có những đoạn không ra vào được ở bất kỳ giá nào. Backtest thì luôn giả định lệnh khớp được. Chi tiết nằm ở bài diện cảnh báo, kiểm soát và hạn chế giao dịch.
Khi mức phí thực tế khác mức giả định. Toàn bộ số trong bài dùng 0.15% mỗi chiều, một mức giả định để có số mà tính. Trần quy định là 0.5% mỗi chiều, và phần dưới trần do thoả thuận. Ở mức kịch trần, riêng phí và thuế đã là 1.10% một vòng, tức lớn hơn cả sàn trượt giá cao nhất trong bảng mười mã.
Khi con số sàn bị đọc như một dự báo chi phí. Đây là cách hỏng dễ xảy ra nhất, vì nó không cần điều kiện gì bên ngoài. Sàn trả lời câu "không thể thấp hơn bao nhiêu". Dùng nó thay cho trượt giá thật là giả định rằng mọi lệnh đều khớp ở kịch bản thuận lợi nhất mà quy chế cho phép, và giả định đó chưa từng được kiểm chứng ở đây.
Những chỗ bài này cố ý không khẳng định
Danh sách dưới đây không phải khiêm tốn hình thức. Mỗi mục là một câu mà bài có thể viết cho mạnh hơn, và cố ý không viết, vì dữ liệu không đỡ nổi.
Không khẳng định trượt giá thật của bất kỳ mã nào. Không có sổ lệnh thì không có con số này. Toàn bộ bài chỉ có cận dưới.
Không khẳng định 0.10% là một tham số tệ nói chung. Nó là mức mặc định của một công cụ, và ở nhiều thị trường khác nó không hề nhỏ. Điều bài khẳng định hẹp hơn: ở mười mã Việt Nam được đo, nó nằm dưới sàn vật lý, và nằm dưới với những khoảng cách chênh nhau 5.5 lần.
Không khẳng định sàn tính tại một mức giá đúng cho cả cửa sổ năm năm. Bảng sàn chốt tại giá đóng cửa 04/09/2026. Giá thay đổi thì bậc lưới có thể thay đổi, và với những mã đi qua mốc 10,000 đ hoặc 50,000 đ thì sàn thật của từng đoạn khác nhau. Bài không tính lại sàn theo từng đoạn, và không tuyên bố kết quả sẽ giữ nguyên nếu tính lại như vậy.
Không khẳng định bốn mươi cấu hình đại diện cho thị trường. Bốn chiến lược, mười mã, một cửa sổ năm năm. Đó là một lưới nhỏ, chọn để chạy được chứ không phải để đại diện.
Không khẳng định chiến lược nào tốt hơn chiến lược nào. Bài không xếp hạng bốn chiến lược, và cũng không kết luận rằng ít lệnh thì hơn nhiều lệnh. Bảng số lệnh chỉ dùng để cho thấy chi phí nhân với số lệnh.
Không khẳng định cấu hình SHB · MACD nằm ở phía nào của phép so mua-giữ. Bộ số chạy lại không ghi lại thông tin đó, nên bài để trống ô ấy thay vì suy đoán.
Không khẳng định phần trăm bào mòn trong biểu đồ là con số người đọc sẽ gặp. Nó là phép tính với giá đứng yên tuyệt đối và mỗi vòng dùng trọn vốn. Trong thực tế giá có biến động, và hai tác động chồng lên nhau chứ không thay thế nhau.
Sáu câu hỏi trước khi tin một con số lợi nhuận backtest
Sáu câu dưới đây trả lời được bằng thông tin nằm ngay trong kết quả backtest và trong quy chế giao dịch. Không câu nào cần dự báo gì.
Một: tham số trượt giá là bao nhiêu, và ai đặt nó? Nếu câu trả lời là "không biết" hoặc "để mặc định" thì con số lợi nhuận đang phụ thuộc vào một lựa chọn chưa từng được xem xét. Đây là câu hỏi đầu tiên chứ không phải câu hỏi cuối cùng.
Hai: con số đó bằng mấy phần của một bước giá của chính mã? Phép chia rất nhanh: lấy bước giá chia thị giá ra sàn một vòng, rồi so với tham số đang dùng. Nếu tham số thấp hơn sàn thì kết quả đang được đo bằng một cái thước ngắn hơn thực tế, và mức độ ngắn thì tính được ra bằng số.
Ba: bao nhiêu lệnh trong bao nhiêu năm? Chi phí nhân với số lệnh, nên đây là hệ số khuếch đại của câu hỏi thứ hai. Một cấu hình mười lệnh và một cấu hình năm mươi lệnh chịu hậu quả rất khác nhau từ cùng một sai số tham số.
Bốn: kết quả có kèm cột vượt mua-giữ cho mọi dòng không? Lợi nhuận tổng đứng một mình không nói được gì, vì nó gộp cả phần thị trường đi lên. Cột so với phép mua và giữ đúng mã đó, cùng cửa sổ, là cột duy nhất tách được phần đóng góp của chiến lược ra khỏi phần đóng góp của thị trường. Thiếu cột đó cho mọi dòng, chứ không chỉ vài dòng tiện, thì bảng chưa đọc được.
Năm: nếu nhân đôi tham số chi phí thì dòng nào đổi dấu? Đây là phép thử độ mong manh, và nó rẻ vì chỉ tốn một lần chạy lại. Dòng nào đổi dấu vì một thay đổi cỡ vài phần mười phần trăm thì thông tin thật nằm ở chỗ nó vốn đã sát vạch, chứ không ở chỗ nó từng dương.
Sáu: chiến lược này có đòi hỏi thao tác nào mà quy chế không cho phép không? Vào và ra trong cùng phiên, bán khống, hoặc bán trước ngày T+2 đều là những thao tác chưa thực hiện được ở thị trường cơ sở. Một backtest chứa những thao tác đó cho ra một con số đúng về số học và không có đối tượng để áp dụng.
Đọc tiếp gì
Bài này thuộc chuỗi "Kiểm chứng một phương pháp". Bài mở đầu chuỗi, backtest là gì và đọc kết quả thế nào, dựng phần khung: một kết quả backtest gồm những gì và đâu là những con số không nói lên điều người đọc tưởng. Bài sai lệch sống sót và nhìn trước nói về những sai lệch nằm ngay trong dữ liệu đầu vào, tức lớp sai nằm trước cả lớp chi phí. Bài kỳ vọng toán học của một hệ thống lấy tỷ lệ thắng và tỷ lệ lãi trên lỗ để tính kỳ vọng của một chuỗi lệnh, và những con số sàn trong bài này là đầu vào cho phép tính đó.
Về phần nền, chi phí thật của một giao dịch có đầy đủ hai lớp chi phí có hoá đơn. Hỗ trợ và kháng cự bản chất là gì và khối lượng giao dịch nói gì dựng lưới bước giá và sổ lệnh, hai thứ mà cả bài này đứng lên. Khung thời gian và tính nhất quán có phần ràng buộc T+2 đặt lên tần suất.
Một câu tóm tắt: trong ba lớp chi phí bám vào một vòng mua bán, hai lớp đầu là những con số đã biết, còn lớp thứ ba là một con số do người chạy backtest tự đặt. Lưới bước giá không cho biết lớp thứ ba bằng bao nhiêu, nhưng nó cho biết lớp thứ ba không thể nhỏ hơn bao nhiêu, và riêng điều đó đã đủ làm cả bốn mươi ô của một lưới xấu đi cùng một lúc.
Nội dung trong bài mang tính chia sẻ kiến thức, không phải khuyến nghị mua bán chứng khoán và không phải tư vấn đầu tư. Các mã cổ phiếu được nêu chỉ để người đọc kiểm lại được từng phép chia giữa bước giá và thị giá; đổi sang mã khác cùng sàn và cùng mức giá thì mọi con số giữ nguyên. Mức phí môi giới 0.15% mỗi chiều là mức giả định để có số mà tính, không phải biểu phí của công ty chứng khoán nào. Toàn bộ kết quả backtest nêu trong bài là mô phỏng trên dữ liệu quá khứ với phí và trượt giá giả định, không phải kết quả giao dịch thật, và kết quả quá khứ không bảo đảm cho kết quả tương lai. Quy tắc về bước giá, biên độ và chu kỳ thanh toán trích từ quy định hiện hành của HOSE, HNX và VSDC.
Câu hỏi thường gặp
Trượt giá là gì và vì sao backtest hay bỏ qua nó?
Trượt giá là khoảng chênh giữa mức giá nhìn thấy trên bảng và mức giá thực sự khớp. Backtest hay bỏ qua nó vì nó không có hoá đơn: phí môi giới và thuế đều hiện thành một dòng trên bảng kê, còn trượt giá thì không ai thu và không có chứng từ nào ghi lại. Phần mềm backtest thường đặt sẵn một tham số trượt giá mặc định, người chạy để nguyên, và con số ấy đi thẳng vào kết quả mà ít khi bị đặt câu hỏi.
Vì sao lưới bước giá đặt một cái sàn cho trượt giá?
Vì giá cổ phiếu chỉ nhận những giá trị nằm trên một lưới. Giá chào mua tốt nhất và giá chào bán tốt nhất không thể sát nhau hơn một bước giá, nên một bước giá là khoảng chênh lệch mua bán nhỏ nhất có thể tồn tại. Không có sổ lệnh nào hẹp hơn thế. Chia một bước giá cho thị giá thì ra tỷ lệ phần trăm nhỏ nhất mà trượt giá có thể nhận, và đó là một cận dưới chứ không phải một ước lượng.
Vì sao sàn trượt giá lại khác nhau nhiều giữa các mã Việt Nam?
Vì hai lưới bước giá không giống nhau. HOSE chia ba bậc theo mức giá, còn HNX dùng bước 100 đ đồng nhất ở mọi mức giá. Ghép với việc thị giá các mã chênh nhau hàng chục lần, tỷ lệ một bước giá trên thị giá trải rất rộng. Đo trên 10 mã chốt ngày 04/09/2026, mã có sàn cao nhất và mã có sàn thấp nhất chênh nhau 5.5 lần.
Đổi tham số trượt giá thì kết quả backtest đổi bao nhiêu?
Trên lưới 40 cấu hình được chạy lại, cả 40 đều xấu đi và không cấu hình nào tốt lên. Nhưng mức độ thì phải nói cho đúng: chỉ 1 trong 22 cấu hình đang có lợi nhuận dương bị đổi dấu, và chỉ 2 trong 16 cấu hình đang vượt mua-giữ bị rơi xuống dưới. Câu đúng là một tham số nhỏ do người chạy tự đặt bào mòn toàn bộ lưới theo cùng một chiều, và đủ lật ba dòng vốn nằm sát ngưỡng.
Chiến lược ít lệnh có tốt hơn chiến lược nhiều lệnh không?
Bài này không kết luận như vậy và không có dữ liệu để kết luận như vậy. Điều đo được hẹp hơn nhiều: chi phí tỷ lệ với số lệnh chứ không tỷ lệ với chất lượng tín hiệu, nên một chiến lược ít lệnh chịu ít tác động hơn khi tham số chi phí thay đổi. Đó là một mệnh đề về độ nhạy của phép đo, không phải một mệnh đề về việc chiến lược nào cho kết quả tốt hơn. Một chiến lược không giao dịch lần nào có chi phí bằng không và cũng không có kết quả nào.
Cập nhật lần cuối:
Đọc tiếp
Nội dung trong bài mang tính chia sẻ kiến thức, không phải khuyến nghị mua bán. Mọi quyết định đầu tư và rủi ro đi kèm thuộc về người đọc.