Thuật toán thực thi lệnh: đặt lệnh lớn mà không tự đẩy giá
Chiến lược quyết định mua gì, thực thi quyết định mua ở giá nào. Với thị trường thanh khoản mỏng như Việt Nam, khoảng cách giữa hai con số đó đủ để biến lãi thành hoà.
Chiến lược trả lời câu hỏi mua gì và khi nào. Thực thi lệnh trả lời một câu khác, ít được nói tới hơn nhưng quyết định không kém: mua ở giá nào.
Với người giao dịch khối lượng nhỏ, hai câu hỏi này gần như trùng nhau — bạn đặt lệnh và nó khớp ngay ở giá trên bảng. Khi khối lượng lớn dần lên, hoặc khi mã bạn giao dịch thanh khoản mỏng, chúng tách ra rất nhanh.
Vì sao lệnh lớn tự chống lại mình
Sổ lệnh tại một thời điểm chỉ có một lượng hữu hạn ở mỗi mức giá. Lệnh mua của bạn ăn hết lượng bán ở giá tốt nhất, rồi tràn lên mức giá cao hơn, rồi cao hơn nữa.
Kết quả: giá khớp trung bình của bạn tệ hơn giá bạn thấy lúc bấm nút. Hiệu số đó gọi là ảnh hưởng giá, và nó tăng nhanh hơn tuyến tính theo khối lượng.
Còn một hiệu ứng thứ hai khó chịu hơn. Khi lệnh lớn liên tục quét sổ, những người khác nhận ra có một bên đang gom. Họ rút lệnh bán ra hoặc nâng giá chào. Bạn không chỉ trả giá cao hơn cho phần còn lại, mà còn làm điều đó với một thị trường đã biết bạn muốn gì.
Đây là lý do mọi thuật toán thực thi đều xoay quanh cùng một mục tiêu: chia nhỏ và giấu ý định.
Ba cách chia lệnh cơ bản
TWAP chia đều theo thời gian. Cần mua 10.000 cổ phiếu trong hai giờ thì cứ mỗi phút đặt một phần bằng nhau. Ưu điểm là đơn giản và dễ kiểm chứng. Nhược điểm là nó đặt cùng một lượng vào lúc thị trường vắng lẫn lúc sôi động — phần đặt lúc vắng chịu ảnh hưởng giá nặng hơn nhiều.
VWAP chia theo tỷ trọng khối lượng dự kiến. Thị trường Việt Nam có hình chữ U rõ rệt: khối lượng lớn đầu phiên, giảm dần về trưa, tăng lại cuối phiên. VWAP đặt nhiều hơn vào những khoảng đó, nên mỗi phần lệnh chìm vào dòng chảy chung thay vì nổi bật.
Theo tỷ lệ tham gia giữ lệnh của bạn luôn chiếm một tỷ lệ cố định khối lượng đang giao dịch. Thị trường sôi động thì mua nhanh, thị trường vắng thì chậm lại. Cách này thích ứng tốt nhất nhưng không đảm bảo hoàn thành đúng hạn.
Với thị trường cơ sở Việt Nam, còn một ràng buộc riêng phải tính: chu kỳ thanh toán khiến bạn không bán lại được trong ngày, nên lệnh mua chia nhỏ qua nhiều phiên là chuyện bình thường chứ không phải ngoại lệ.
Độ trễ: từ tín hiệu tới khớp lệnh
Giữa lúc hệ thống quyết định và lúc lệnh thực sự nằm trên sổ có một chuỗi chặng, mỗi chặng ăn một ít thời gian.
Với chiến lược khung ngày, tổng độ trễ vài trăm mili giây không quan trọng. Với chiến lược trong phiên trên VN30F1M, nó bắt đầu có ý nghĩa — giá có thể đã đi một bước trước khi lệnh tới nơi.
Điều đáng làm không phải chạy đua giảm độ trễ, vì cuộc đua đó dành cho tổ chức có hạ tầng chuyên dụng. Điều đáng làm là đo nó: ghi lại dấu thời gian ở từng chặng, để biết chặng nào chậm và để biết chiến lược của bạn có phụ thuộc vào tốc độ hay không. Chiến lược mà lợi thế biến mất khi chậm thêm 200 mili giây là chiến lược không nên chạy bằng hạ tầng cá nhân.
Loại lệnh nào cho việc gì
Trước khi bàn tới thuật toán, có một lựa chọn cơ bản hơn mà nhiều bot làm sai: dùng loại lệnh nào.
Lệnh giới hạn ghi rõ giá bạn chấp nhận. Bạn kiểm soát được chi phí nhưng không chắc khớp — và lệnh không khớp cũng là một chi phí, gọi là chi phí cơ hội. Với chiến lược bám xu hướng, bỏ lỡ một nhịp lớn đắt hơn nhiều so với trả thêm một bước giá.
Lệnh thị trường khớp chắc chắn nhưng bạn nhận bất kỳ giá nào sổ lệnh đang có. Trên mã thanh khoản tốt, chênh lệch không đáng kể. Trên mã mỏng, đây là cách nhanh nhất để trả giá tệ.
Cách dung hoà mà nhiều hệ thống dùng: đặt lệnh giới hạn ở mức hơi nhích về phía bất lợi so với giá hiện tại — đủ để khớp trong điều kiện bình thường nhưng vẫn chặn được trường hợp giá nhảy đột ngột. Kèm theo đó là một quy tắc hết hạn: nếu lệnh không khớp sau một khoảng thời gian định trước, huỷ và đánh giá lại thay vì để nó treo vô thời hạn.
Quy tắc hết hạn này quan trọng hơn vẻ ngoài của nó. Một lệnh treo mà bot quên mất là nguồn gốc của vị thế lệch so với dự tính — bot nghĩ mình đang đứng ngoài, thực tế lệnh vẫn nằm trên sổ và có thể khớp bất cứ lúc nào.
Đo chi phí thực thi
Không đo thì không cải thiện được. Cách đo đơn giản nhất và đủ dùng: so giá khớp thật với giá tham chiếu tại thời điểm hệ thống ra quyết định.
Hiệu số đó gồm ba phần chồng lên nhau: khoảng cách giá mua bán trên sổ, ảnh hưởng giá do chính lệnh của bạn, và biến động thị trường trong lúc lệnh đang được thực thi.
Ghi lại con số này cho mọi lệnh, rồi nhìn phân phối của nó theo thời gian trong ngày, theo khối lượng, theo mức biến động. Bạn sẽ nhanh chóng thấy những mẫu rất cụ thể — ví dụ lệnh đặt trong 15 phút đầu phiên có chi phí cao hơn hẳn, hoặc lệnh vượt một ngưỡng khối lượng nào đó thì chi phí nhảy vọt.
Những con số này phải quay ngược vào backtest. Một chiến lược kiểm định với giả định khớp lệnh hoàn hảo rồi chạy thật với chi phí thực thi cao gấp ba lần giả định là chiến lược sẽ làm bạn thất vọng.
Phân phối chi phí nói lên điều gì
Nhìn chi phí thực thi trung bình là chưa đủ. Cái đáng nhìn là phân phối của nó.
Phần lớn lệnh tốn khoảng nửa bước giá — con số dễ chịu. Nhưng phần đuôi bên phải, nơi có những lệnh tốn gấp năm tới mười lần, mới là chỗ ăn mất lợi nhuận. Và những lệnh đuôi đó không phân bố ngẫu nhiên: chúng tập trung vào lúc biến động mạnh, lúc thanh khoản mỏng, và lúc bạn cần thoát gấp.
Đây là lý do chỉ số trung bình gây hiểu nhầm. Nếu bạn lấy chi phí trung bình đưa vào backtest, bạn đã bỏ qua đúng những tình huống mà chiến lược chịu áp lực nặng nhất. Cách trung thực hơn là dùng con số ở phân vị cao — ví dụ phân vị 90 — làm giả định. Hình minh hoạ hình dạng phân phối, không phải dữ liệu thật.
Thanh khoản mỏng: bài toán riêng của thị trường Việt Nam
Ngoài nhóm cổ phiếu lớn, phần lớn mã trên thị trường Việt Nam có thanh khoản khiêm tốn. Điều này tạo ra ba hệ quả thực tế.
Khoảng cách giá mua bán rộng. Với mã mỏng, chỉ riêng việc vào và ra một vị thế đã mất một khoản đáng kể trước khi bàn tới lãi lỗ.
Sổ lệnh mỏng ở các mức xa. Một lệnh khối lượng vừa phải cũng có thể quét qua nhiều bước giá.
Rủi ro không thoát được. Khi có tin xấu, mã mỏng có thể trắng bên mua nhiều phiên liên tiếp. Không thuật toán thực thi nào cứu được tình huống đó — chỉ có giới hạn khối lượng vị thế từ đầu.
Kết luận thực tế cho người làm một mình: đưa thanh khoản vào chính bộ lọc chọn mã, chứ đừng để nó thành vấn đề phải giải quyết ở khâu thực thi. Một chiến lược chỉ hoạt động trên mã bạn không thoát ra được thì chưa phải chiến lược dùng được.
Câu hỏi thường gặp
- TWAP và VWAP khác nhau thế nào?
- TWAP chia lệnh đều theo thời gian, không quan tâm khối lượng thị trường. VWAP chia theo tỷ trọng khối lượng dự kiến từng khoảng, nên đặt nhiều hơn vào lúc thị trường sôi động — thường ít bị lộ ý định hơn.
- Lệnh bao nhiêu thì gọi là lớn?
- Không có ngưỡng tuyệt đối, chỉ có tỷ lệ. Khi lệnh của bạn chiếm quá vài phần trăm khối lượng một phiên bình thường của mã đó, bạn bắt đầu là người đẩy giá chứ không phải người theo giá.
- Lệnh iceberg có dùng được ở Việt Nam không?
- Tính năng ẩn khối lượng phụ thuộc quy định của sở giao dịch và hỗ trợ của công ty chứng khoán. Khi không có sẵn, cách thay thế là tự chia nhỏ ở phía bot và rải theo thời gian.
- Đo chi phí thực thi bằng cách nào?
- So giá khớp thật với giá tham chiếu tại thời điểm ra quyết định. Hiệu số đó là chi phí thực thi, và nó phải được ghi lại cho mọi lệnh — nếu không bạn sẽ không bao giờ biết mình đang mất bao nhiêu.
Đọc tiếp
- Công cụ, dữ liệu & lập trìnhPython và dữ liệu thị trường Việt Nam: dựng bộ công cụ tối thiểu
- 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