OptiNod Academy
Trượt giá, phí và thanh khoản - Chi phí giao dịch bị backtest che khuất
Cách tính cho rằng chỉ cần trừ phí là ra lợi nhuận thực tế mới chỉ nhìn thấy một phần của chi phí giao dịch. Trượt giá và thanh khoản thường bào mòn hiệu suất mạnh hơn.
> Phí được sàn hiển thị *sẵn* trên màn hình, nhưng trượt giá và thanh khoản, những yếu tố thường bào mòn hiệu suất thực tế lớn hơn, chỉ được xác định tại thời điểm bạn đặt lệnh.
Chi phí giao dịch gồm ba phần: phí trả cho sàn (Fees), trượt giá (Slippage), tức chênh lệch giữa giá hiển thị và giá khớp thực tế, và thanh khoản (Liquidity) của sổ lệnh, yếu tố quyết định mức độ trượt giá. Phí được niêm yết rõ trên màn hình sàn, chẳng hạn maker 0.02%, taker 0.04%, nên ai cũng có thể tính trước. Hai phần còn lại chỉ được xác định khi lệnh được đưa vào thị trường, và không có nơi nào hiển thị sẵn chính xác từ trước.
Phần lớn trader ước tính kỳ vọng thực tế bằng cách chỉ trừ phí khỏi kết quả backtest. Họ cho rằng trừ 0.04% cho một lượt, 0.08% cho một vòng vào-ra là đủ thực tế. Nhưng cách tính này chỉ phản ánh một mảnh nhỏ của chi phí giao dịch. Phí sàn thường cố định trong khoảng 0.02% đến 0.1% mỗi lượt, trong khi trượt giá có thể dao động từ 0bp đến hàng trăm bp tùy theo mã, kích thước lệnh và trạng thái thị trường.
Điểm cốt lõi rất đơn giản. Trượt giá và thanh khoản bào mòn hiệu suất mạnh hơn phí, và ở các mã có khối lượng giao dịch nhỏ hoặc các chiến lược giao dịch với tần suất cao, chi phí này tích lũy đủ lớn để biến kỳ vọng thành âm. Đặc biệt, vào lệnh thị trường sẽ ăn dần độ sâu của sổ lệnh, nên lệnh càng lớn thì giá hiển thị càng lệch xa so với giá khớp trung bình. Khi chạy cùng một chiến lược trên BTC và trên một altcoin chỉ có vài triệu USD giá trị giao dịch mỗi ngày, phí có thể giống nhau, nhưng trượt giá có thể khác nhau hàng chục lần.

Phí cố định, còn trượt giá biến động
Phí là chi phí giao dịch duy nhất có thể tính trước. Sàn công bố mức phí maker và taker, và khi bậc khối lượng giao dịch đã được xác định, chi phí mỗi lượt cũng được xác định. Theo mặt bằng phổ biến trong ngành, một lượt taker khoảng 0.04%, tương đương khoảng 0.08% cho một vòng vào-ra. Con số này giống nhau dù mã đó là BTC hay một altcoin vốn hóa nhỏ.
Trượt giá thì khác. Giá hiển thị là mức giá tốt nhất ở đầu sổ lệnh, nhưng lệnh thị trường chỉ khớp được phần khối lượng có sẵn tại mức giá đó, phần còn lại sẽ tiếp tục khớp ở các mức giá cao hơn. Lệnh càng lớn thì càng ăn lên các tầng giá cao hơn, khiến giá khớp trung bình cao hơn giá hiển thị. Chênh lệch này là trượt giá, và sổ lệnh càng mỏng thì cùng một kích thước lệnh cũng tạo ra trượt giá càng lớn.
So sánh về quy mô sẽ thấy khác biệt rất rõ. Phí sàn thường dừng quanh 8bp cho một vòng vào-ra, nhưng trượt giá có thể từ 0bp đến hơn 100bp tùy mã và kích thước lệnh. Giả sử một chiến lược ngắn hạn có lãi/lỗ trung bình 0.15% mỗi giao dịch. Sau khi trừ phí vào-ra 0.08%, phần lợi thế còn lại là 0.07%. Chỉ cần thêm trượt giá 0.1% mỗi giao dịch, kỳ vọng đã chuyển sang âm. Đây chính là điểm khiến phép tính lợi nhuận chỉ nhìn vào phí bị lệch khỏi thực tế.
Lệnh thị trường ăn vào độ sâu sổ lệnh
Sổ lệnh là danh sách các lệnh mua và bán đang chờ tại từng mức giá. Lệnh mua thị trường sẽ bắt đầu từ giá bán thấp nhất rồi khớp dần lên trên cho đến khi đủ khối lượng cần mua. Nếu khối lượng ở mức giá tốt nhất nhỏ hơn kích thước lệnh, lệnh sẽ chuyển sang mức giá kế tiếp, và giá khớp trung bình sẽ được xác định cao hơn giá hiển thị.
Nếu nhìn vào sổ lệnh BTCUSDT ở thời điểm hiện tại, độ sâu rất dày. Chỉ riêng một dòng giá bán tốt nhất đã có khoảng 2.18 BTC, tương đương 160.000 USD, gần như tại cùng một mức giá. Trong trường hợp này, một lệnh mua thị trường 50.000 USD sẽ được khớp toàn bộ ngay trong mức giá đầu tiên, nên trượt giá gần 0bp. Giá hiển thị và giá khớp thực tế gần như giống nhau.
Sổ lệnh của một altcoin nhỏ ở cùng thời điểm có hình dạng khác hẳn. Với ZILUSDT, mã có giá trị giao dịch hằng ngày khoảng 200.000 USD, khối lượng ở mức giá tốt nhất chỉ khoảng 5.800 USD. Nếu đặt lệnh mua thị trường 25.000 USD, lệnh sẽ ăn qua nhiều tầng giá trong sổ lệnh và giá khớp trung bình sẽ cao hơn giá hiển thị 130bp, tức 1.3%. Nếu đặt 100.000 USD, lệnh sẽ vét hết 20 dòng đầu của sổ lệnh mà vẫn chỉ khớp được khoảng 30.000 USD. Cùng kích thước lệnh, cùng cách vào bằng lệnh thị trường, nhưng trên BTC là 0bp còn trên ZIL là 130bp. Chênh lệch này áp đảo mức phí 8bp.

Khối lượng càng nhỏ, spread càng rộng
Spread mua-bán là chênh lệch giữa giá mua tốt nhất và giá bán tốt nhất. Chênh lệch này phụ thuộc vào mức độ dày đặc của các lệnh chờ trên mã đó: giao dịch càng nhiều thì spread càng hẹp, giao dịch càng ít thì spread càng rộng. Mỗi lần vào lệnh thị trường, spread sẽ trở thành một khoản chi phí. Nếu mua xong bán ngay, vị thế đã bắt đầu trong trạng thái lỗ đúng bằng phần spread.
Khi đối chiếu spread của các mã theo sổ lệnh hiện tại, mối quan hệ với giá trị giao dịch hiện ra rất rõ. BTCUSDT, với giá trị giao dịch hằng ngày khoảng 1 tỷ USD, có spread gần như 0bp; ETHUSDT, khoảng 500 triệu USD, cũng quanh 0.05bp. Ngược lại, ALGOUSDT với giá trị giao dịch hằng ngày dưới 2 triệu USD có spread 9bp, còn ZILUSDT ở mức khoảng 200.000 USD có spread lên tới 25bp. Nếu mua ZIL bằng lệnh thị trường rồi bán ngay bằng lệnh thị trường, chỉ riêng vào và thoát lệnh đã phát sinh trước hơn 50bp chi phí do spread và trượt giá cộng lại.
Cần phân biệt khối lượng giao dịch và giá trị giao dịch. Khối lượng giao dịch là số lượng coin được trao tay, còn giá trị giao dịch là số lượng đó nhân với giá. Yếu tố chi phối độ sâu sổ lệnh và trượt giá là giá trị giao dịch. Một mã có khối lượng tính theo số coin trông rất lớn, lên tới hàng trăm triệu coin, nhưng nếu đơn giá chỉ là 0.004 USD thì giá trị giao dịch thực tế nhiều khi chỉ ở mức vài trăm nghìn USD. Đây là lý do khi chọn mã, ta nhìn vào giá trị giao dịch tính theo USDT. Khối lượng tính theo số coin dễ gây nhầm lẫn.

Nhân chi phí mỗi lượt với tần suất giao dịch sẽ ra chi phí tích lũy
Chi phí giao dịch nhìn theo từng lượt có vẻ nhỏ. Một vòng vào-ra 0.1% có thể xem là không đáng kể nếu chỉ xảy ra một lần. Nhưng kỳ vọng của chiến lược được quyết định sau khi các giao dịch tích lũy lại. Tổng chi phí bằng chi phí mỗi lượt nhân với tần suất giao dịch, và tần suất càng cao thì tích số này phình ra càng nhanh.
Hãy giả định một chiến lược scalping giao dịch 10 lần mỗi ngày. Nếu chi phí vào-ra là 0.1%, một ngày mất 1%, và với 22 ngày giao dịch trong một tháng, khoảng 22% sẽ bị rút khỏi tài khoản dưới dạng chi phí giao dịch. Với cùng giả định chi phí, một chiến lược swing chỉ giao dịch hai lần mỗi tháng thì chi phí cả tháng chỉ là 0.2%. Dù chi phí mỗi lượt giống nhau, nếu tần suất khác nhau 100 lần thì chi phí tích lũy cũng khác nhau 100 lần. Lý do các chiến lược tần suất cao rơi xuống dưới điểm hòa vốn trước tiên là vì chi phí tích lũy tỷ lệ thuận với tần suất, độc lập với chất lượng tín hiệu.
Phép nhân này là phần thường bị bỏ sót nhất trong backtest. Một backtest đặt trượt giá bằng 0 và chỉ phản ánh phí thực chất đang giả định chi phí mỗi lượt thấp hơn rất nhiều so với thực tế, thậm chí chưa tới một nửa. Sai số này có thể nhỏ trên từng giao dịch, nhưng với chiến lược tần suất cao, nó tích lũy đủ lớn để đảo ngược toàn bộ độ dốc của đường vốn. Một chiến lược tần suất cao tăng mạnh trong backtest có thể chuyển thành tài khoản giảm dần trong thực chiến, và nguyên nhân chính là chi phí tích lũy này.

Nếu lợi thế nhỏ hơn chi phí, kỳ vọng là âm
Giá trị của một chiến lược được đánh giá bằng chi phí giao dịch hòa vốn. Kỳ vọng bằng lãi/lỗ trung bình của một giao dịch trừ đi chi phí giao dịch vào-ra, và chiến lược chỉ kiếm tiền khi giá trị này dương. Ngay khi chi phí giao dịch vượt quá lãi/lỗ trung bình, kỳ vọng chuyển sang âm; dù tín hiệu có chính xác đến đâu, tài khoản vẫn sẽ giảm.
Hãy nhìn bằng con số cụ thể. Một chiến lược có tỷ lệ thắng 60%, với chốt lời và cắt lỗ trung bình đều là 0.3%, có lãi/lỗ trung bình mỗi giao dịch là 0.06%. Chỉ cần trừ phí vào-ra 0.08% là kết quả đã âm. Nếu backtest chỉ phản ánh phí mà chiến lược này vẫn dương, kết quả đó có được nhờ giả định trượt giá bằng 0. Trong thực chiến, chỉ cần trượt giá 0.05% mỗi giao dịch, kỳ vọng sẽ rơi sâu hơn vào vùng âm. Một chiến lược có lãi/lỗ trung bình 0.06% mỗi giao dịch chỉ có ý nghĩa ở các mã và điều kiện thị trường có chi phí giao dịch thấp hơn con số đó.
Nếu tính trước chi phí giao dịch hòa vốn, bạn có thể đánh giá chiến lược nào còn kỳ vọng dương trên mã nào. Một chiến lược scalping có lãi/lỗ trung bình 0.06% mỗi giao dịch chỉ nên được xem là ứng viên trên các mã thanh khoản cao như BTC hoặc ETH, nơi chi phí vào-ra dưới 0.06%. Nếu áp dụng cùng chiến lược đó cho một altcoin nhỏ có chi phí vào-ra 50bp, kỳ vọng sẽ âm bất kể tín hiệu chính xác đến đâu. Ngược lại, một chiến lược swing có lãi/lỗ trung bình 3% mỗi giao dịch vẫn còn dư địa sau khi trừ chi phí vào-ra 50bp, nên có thể là ứng viên ngay cả trên altcoin nhỏ. Độ lớn của lợi thế trong chiến lược quyết định ngưỡng thanh khoản tối thiểu của các mã có thể giao dịch.
Khi biến động thay đổi đột ngột, trượt giá tăng và thanh khoản biến mất
Ngay cả những mã thường có sổ lệnh dày cũng có thể mất nhanh khối lượng chờ trong các giai đoạn biến động tăng đột ngột. Khi giá di chuyển mạnh theo một hướng, các lệnh giới hạn đã đặt sẵn trong sổ lệnh sẽ bị khớp hoặc bị hủy, trong khi tốc độ lấp lại sổ lệnh không theo kịp tốc độ lệnh bị rút đi. Vào lúc này, một lệnh thị trường cùng kích thước sẽ ăn sâu vào các tầng giá hơn nhiều so với bình thường, khiến trượt giá tăng mạnh.
Đợt giảm mạnh của BTC ngày 5 tháng 8 năm 2024 cho thấy tình huống này. Nến ngày BTCUSDT mở cửa ở 58.161 USD và giảm xuống 49.000 USD. Mức giảm trong ngày khoảng 16%. Cùng ngày, giá trị giao dịch đạt 8.58 tỷ USD, cao hơn bốn lần so với 1.87 tỷ USD của ngày 4 tháng 8 ngay trước đó. Giá trị giao dịch tăng vọt nghĩa là các lệnh thị trường đã nhanh chóng tiêu hao sổ lệnh và đẩy giá đi xuống. Trong những đoạn như vậy, nếu đặt cắt lỗ bằng lệnh thị trường, lệnh sẽ được khớp thấp hơn khá xa so với mức cắt lỗ đã hiển thị.
Không thể dùng giả định thông thường để ước lượng trượt giá trong giai đoạn biến động đột biến. BTC thường có trượt giá 0bp nhưng giữa một cú giảm mạnh có thể giãn ra hàng chục bp; những mã thường có spread hẹp cũng có thể rỗng sổ lệnh, khiến lệnh thị trường khớp ở mức giá ngoài dự kiến. Chiến lược càng giao dịch trong các giai đoạn biến động lớn thì giả định trượt giá trong backtest càng phải bảo thủ hơn nhiều lần so với bình thường mới không lệch khỏi thực chiến. Các mã thường xuất hiện gap, hoặc các khung thời gian thanh khoản mỏng như cuối tuần và rạng sáng, cũng có trượt giá lớn hơn vì cùng lý do.
Dùng bộ lọc chi phí giao dịch để sàng lọc trước mã và chiến lược
Khi chọn mã và chiến lược, nếu đưa bộ lọc chi phí giao dịch lên trước, bạn có thể loại bỏ các tổ hợp có kỳ vọng âm trước khi vào lệnh. Chỉ cần đặt rõ bằng con số các ngưỡng như giá trị giao dịch hằng ngày tối thiểu, spread tối đa và giả định chi phí mỗi giao dịch, bạn sẽ loại trước những mã mà trượt giá có thể ăn hết lợi thế.
- [ ] Ngưỡng giá trị giao dịch: Kiểm tra xem mã định giao dịch có giá trị giao dịch hằng ngày theo USDT từ 10 triệu USD trở lên hay không. Hãy nhìn vào giá trị giao dịch tính theo USDT. Khối lượng tính theo số coin dễ gây nhầm lẫn.
- [ ] Giới hạn spread: Kiểm tra spread của sổ lệnh ngay trước khi vào lệnh có từ 10bp trở xuống hay không. Nếu vượt 10bp, chỉ riêng vào và thoát lệnh đã tạo ra hơn 20bp chi phí.
- [ ] Giả định chi phí mỗi giao dịch: Trong backtest, phản ánh chi phí gồm phí vào-ra 0.08% cộng thêm ít nhất 0.05% trượt giá. Với chiến lược tần suất cao, hãy giả định trượt giá từ 0.1% trở lên.
- [ ] Kiểm tra điểm hòa vốn: Xác nhận lãi/lỗ trung bình mỗi giao dịch của chiến lược có lớn hơn chi phí vào-ra đã giả định ở trên hay không. Nếu lãi/lỗ trung bình nhỏ hơn chi phí, không vào lệnh trên mã đó.
- [ ] Kiểm tra kích thước lệnh: Xác nhận kích thước lệnh vào có vượt khối lượng ở mức giá tốt nhất hay không. Nếu vượt, hãy chia nhỏ để vào bằng lệnh giới hạn, hoặc giảm quy mô.
Chiến lược càng giao dịch với tần suất cao thì các tiêu chuẩn trong bộ lọc này càng cần nghiêm ngặt. Chiến lược giao dịch nhiều lần mỗi ngày phải nâng giả định chi phí mỗi giao dịch và tăng ngưỡng giá trị giao dịch tối thiểu để chi phí tích lũy không vượt quá lợi thế. Với chiến lược swing có lợi thế lớn hơn trên mỗi giao dịch, có thể hạ nhẹ ngưỡng giá trị giao dịch, nhưng ngay cả khi đó vẫn bắt buộc phải kiểm tra kích thước lệnh có vượt độ sâu sổ lệnh hay không.
Chạy lại backtest với giả định chi phí thực tế
Ngay cả khi chiến lược đã vượt qua bộ lọc chi phí giao dịch, vẫn cần kiểm tra lại xem giả định chi phí trong backtest có khớp với thực tế không. Backtest đặt trượt giá bằng 0, giả định khớp tại giá đóng cửa trên altcoin nhỏ, hoặc kiểm chứng một chiến lược có vòng quay cao mà không tính chi phí đều sẽ đánh giá quá cao kỳ vọng thực chiến. Khi chạy lại cùng chiến lược với giả định chi phí bảo thủ, bạn sẽ thấy trước đường lợi nhuận sụp ở đâu.
Cách dùng sai phổ biến nhất là giả định khớp tại giá đóng cửa. Nếu engine backtest giả định lệnh được khớp chính xác tại giá đóng cửa của cây nến phát sinh tín hiệu, nó đã bỏ qua khối lượng thực tế có trong sổ lệnh tại mức giá đóng cửa đó. Với các mã có sổ lệnh dày như BTC, sai số này nhỏ; nhưng với altcoin chỉ có vài triệu USD giá trị giao dịch mỗi ngày, nhiều khi không hề có đủ khối lượng tại giá đóng cửa để khớp kích thước lệnh đó. Lợi nhuận backtest của chiến lược altcoin được kiểm chứng bằng giả định khớp giá đóng cửa sẽ không được tái lập trong thực chiến.
Với chiến lược có vòng quay cao, chỉ một giả định chi phí cũng có thể thay đổi toàn bộ kết quả. Chỉ cần nâng trượt giá từ 0 lên 0.05%, một chiến lược giao dịch 10 lần mỗi ngày sẽ có chi phí tháng tăng từ 22% lên 33%, và đường vốn đi lên trong backtest có thể gãy xuống trong thực chiến. Muốn tin được backtest, không thể tin vào kết quả đặt trượt giá bằng 0. Bạn cần xem kết quả đã được kiểm chứng bằng giả định chi phí bảo thủ, có phản ánh độ sâu sổ lệnh thực tế của mã định giao dịch và các giai đoạn biến động đột biến. Kỳ vọng chỉ trừ phí mới chỉ nhìn thấy một mảnh của chi phí giao dịch; hai mảnh còn lại mới là thứ quyết định tài khoản trong thực chiến.