OptiNod Academy

Trượt giá, phí và thanh khoản - Chi phí giao dịch bị backtest che khuất

Tính phí, spread và trượt giá trên đúng giá trị danh nghĩa, tránh cộng trùng và kiểm tra độ sâu sổ lệnh trước khi tin vào lợi thế sau chi phí.

Phí có thể tra trước, nhưng giá khớp còn phụ thuộc vào spread, độ sâu sổ lệnh và thời điểm giao dịch. Hãy đo tổng chi phí trên đúng quy mô lệnh trước khi tin vào lợi thế của backtest.


Chi phí giao dịch gồm phí trả cho sàn và chi phí thực thi như chênh lệch mua-bán (spread), tác động của lệnh lên giá và biến động giá trong khi chờ khớp. Thanh khoản là điều kiện ảnh hưởng đến các chi phí này, không phải một khoản phí riêng để cộng thêm. Trượt giá (slippage) là chênh lệch giữa giá khớp và giá tham chiếu được chọn; hãy ghi rõ tham chiếu là giá giữa bid-ask, giá tốt nhất hay giá lúc gửi lệnh để tránh cộng trùng spread.


Chỉ trừ phí khỏi backtest có thể bỏ sót chi phí thực thi. Trong các phép tính minh họa dưới đây, giả sử phí taker là 0,04% mỗi lượt, tức khoảng 0,08% cho một vòng vào-ra có cùng giá trị danh nghĩa ở hai phía. Đây không phải biểu phí chung: mức phí thật phụ thuộc sàn, sản phẩm, bậc tài khoản, loại lệnh và thời điểm. Trượt giá cần ước lượng theo dữ liệu khớp lệnh, quy mô và điều kiện thị trường cụ thể.


Chi phí thực thi có thể vượt phí sàn ở sổ lệnh mỏng hoặc khi thị trường biến động nhanh, nhưng không phải lúc nào cũng vậy. Lệnh thị trường lớn có thể phải khớp qua nhiều tầng giá, làm giá khớp bình quân xa hơn giá tốt nhất ban đầu. Trước khi áp dụng cùng một chiến lược cho hai thị trường, hãy so sánh độ sâu sổ lệnh và chi phí trên chính quy mô lệnh dự kiến, thay vì chỉ so biểu phí.


Phí và chi phí thực thi chịu ảnh hưởng của spread và thanh khoản
Phí và chi phí thực thi chịu ảnh hưởng của spread và thanh khoản

Chi phí trong hình gồm phí và chênh lệch giữa giá khớp với giá tham chiếu; thanh khoản ảnh hưởng đến chênh lệch giá này, không phải khoản phí riêng để cộng thêm.


Biểu phí có thể tra trước, còn chi phí thực thi phụ thuộc từng lệnh


Có thể tra trước biểu phí maker và taker, nhưng số tiền thực trả còn phụ thuộc giá trị khớp, cách lệnh được thực thi và quy định của sản phẩm. Không mặc định cùng một mức phí cho mọi mã. Với mức minh họa 0,04% mỗi lượt, cần cộng phí cả phía vào và phía ra; lệnh chốt từng phần cũng cần được tính theo các lần khớp tương ứng.


Với lệnh mua thị trường, khối lượng được lấy từ bên bán theo các mức giá sẵn có; lệnh bán lấy từ bên mua. Nếu khối lượng ở mức tốt nhất không đủ, giá bình quân sẽ khác giá tốt nhất lúc gửi lệnh. Giá còn có thể dịch chuyển trong thời gian truyền lệnh. Vì vậy, cùng kích thước lệnh nhưng thời điểm hoặc độ sâu khác nhau có thể tạo ra chi phí thực thi khác nhau.


Ví dụ giả định: lợi nhuận kỳ vọng trước chi phí là 0,15% trên cùng giá trị danh nghĩa của một vòng giao dịch. Trừ phí vòng vào-ra 0,08% còn 0,07%; trừ tiếp 0,10% chi phí thực thi chưa được tính trước đó còn −0,03%. Tất cả tỷ lệ cần dùng cùng mẫu số, và phần trượt giá bổ sung không được chứa spread đã phản ánh trong giá khớp.


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ị.


Xét sổ lệnh giả định A: mức ask tốt nhất là 100 USD với 2.000 đơn vị đang chờ bán. Nếu sổ lệnh đứng yên, lệnh mua 500 đơn vị khớp toàn bộ ở 100 USD, tổng giá trị 50.000 USD. Giá khớp bình quân bằng ask ban đầu nên không phát sinh tác động do đi qua nhiều tầng giá. Tuy nhiên, mua ở ask vẫn có chi phí so với giá giữa bid-ask; nhận định “trượt giá bằng 0” chỉ đúng với giá tham chiếu ask và giả định không có biến động trong lúc khớp.


Trong sổ lệnh giả định B, mức ask 100 USD có 100 đơn vị và mức kế tiếp 101 USD có 900 đơn vị. Cùng lệnh mua 500 đơn vị sẽ khớp 100 đơn vị ở 100 USD và 400 đơn vị ở 101 USD. Tổng giá trị là 100 × 100 + 400 × 101 = 50.400 USD; giá khớp bình quân là 50.400 / 500 = 100,80 USD. So với ask ban đầu 100 USD, chênh lệch là 0,80%, tương đương 80bp, chưa gồm phí. Chi phí trượt giá bằng 500 × (100,80 − 100) = 400 USD, cũng bằng 0,80% × 50.000 USD danh nghĩa tại giá tham chiếu, không phải 0,80% × 50.400 USD đã khớp. Nếu phí được tính theo phần trăm giá trị khớp, phần phí của lượt mua này dùng cơ sở 50.400 USD. Đây là ví dụ giả định, không phải số liệu hiện tại của một mã cụ thể. Muốn tính chi phí thật, cần ghi thời gian, từng mức giá và khối lượng rồi đối chiếu kết quả khớp; khối lượng nhìn thấy có thể bị hủy trước khi lệnh đến.


Lệnh thị trường ăn dần qua các tầng giá, đẩy giá khớp trung bình lên trên giá hiển thị
Lệnh thị trường ăn dần qua các tầng giá, đẩy giá khớp trung bình lên trên giá hiển...

Spread phải được đo cùng độ sâu và quy mô giao dịch


Spread mua-bán là chênh lệch giữa bid tốt nhất và ask tốt nhất, theo định nghĩa bid/ask của Investor.gov. Nó chịu ảnh hưởng của thanh khoản, biến động, bước giá và điều kiện từng sàn; giá trị giao dịch lớn không bảo đảm spread nhỏ. Nếu mua ở ask rồi bán ngay ở bid của cùng sổ lệnh không đổi, phần chênh lệch giá là một spread đầy đủ, chưa tính phí hoặc tác động của quy mô lệnh.


Ví dụ giả định: giá giữa bid-ask là 100,00, bid là 99,95 và ask là 100,05. Spread 0,10 tương đương 10bp so với giá giữa. Mua một đơn vị ở 100,05 rồi bán ở 99,95 mất 0,10, tức một spread, không phải 20bp. Nếu đã đo trượt giá mỗi phía so với giá giữa, hai nửa spread đã nằm trong phép đo; không cộng thêm một spread lần nữa. Sổ lệnh thay đổi và lệnh đi qua nhiều tầng có thể tạo thêm chi phí.


Khối lượng giao dịch là số đơn vị được trao tay; giá trị giao dịch là tổng giá trị danh nghĩa được trao tay. Giá trị giao dịch theo USDT hoặc USD thuận tiện hơn khi so sánh quy mô giữa các mã có đơn giá khác nhau. Tuy nhiên, cả hai đều là dòng giao dịch đã xảy ra, không phải khối lượng đang chờ ở các mức giá bạn cần khớp. Dùng chúng làm bộ lọc sơ bộ rồi đo spread và độ sâu tại thời điểm giao dịch.


Spread và độ sâu sổ lệnh cần được kiểm tra cùng quy mô lệnh
Spread và độ sâu sổ lệnh cần được kiểm tra cùng quy mô lệnh

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í cộng dồn phải được tính bằng tiền trước khi quy đổi thành phần trăm vốn. Với phí tính theo phần trăm, phí mỗi lần khớp bằng giá trị danh nghĩa thực tế đã khớp nhân với mức phí áp dụng. Với lệnh mua, chi phí trượt giá bằng khối lượng × (giá khớp − giá tham chiếu); với lệnh bán, đảo chiều hiệu số. Nếu dùng tỷ lệ trượt giá tính theo giá tham chiếu, phải nhân tỷ lệ đó với giá trị danh nghĩa tại giá tham chiếu, không phải danh nghĩa thực tế đã khớp. Cộng chi phí bằng tiền của từng lần khớp ở cả hai phía, tránh tính trùng spread. Chỉ sau khi mọi khoản được quy về cùng một danh nghĩa tham chiếu Nᵢ cho vòng i, mới có thể viết tổng chi phí là Σ(Nᵢ × cᵢ), trong đó cᵢ là tổng chi phí vòng đó chia cho Nᵢ. Chia tổng chi phí bằng tiền cho vốn ban đầu mới ra tỷ lệ chi phí trên vốn; không dùng ký quỹ thay cho giá trị khớp để tính phí.


Ví dụ giả định: 10 vòng mỗi ngày trong 22 ngày là 220 vòng mỗi tháng. Mỗi vòng có chi phí 0,1%. Chỉ khi giá trị danh nghĩa cố định của mỗi vòng bằng vốn ban đầu, không tái đầu tư và giữ cùng cơ sở chi phí, tổng chi phí mới bằng 22% vốn ban đầu. Nếu mỗi vòng chỉ có danh nghĩa bằng 10% vốn ban đầu, tổng chi phí là 2,2%. Với 2 vòng mỗi tháng và cùng danh nghĩa bằng vốn ban đầu, chi phí là 0,2%; 220 so với 2 là chênh lệch 110 lần, không phải 100 lần. Khi quy mô thay đổi theo vốn hoặc đòn bẩy, cần cộng chi phí thực tế từng lệnh.


Nếu backtest bỏ sót spread hoặc tác động thị trường, chi phí tích lũy sẽ bị đánh giá thiếu. Mức thiếu bao nhiêu cần đo từ dữ liệu, không thể mặc định rằng phí chỉ bằng một nửa tổng chi phí. Hãy so tổng danh nghĩa đã giao dịch, số lần khớp và chi phí bằng tiền giữa backtest với nhật ký thực thi để tìm nguyên nhân chênh lệch đường vốn.


Chi phí mỗi lệnh tích lũy theo tần suất, kéo đường vốn của chiến lược tần suất cao đi xuống
Chi phí mỗi lệnh tích lũy theo tần suất, kéo đường vốn của chiến lược tần suất cao...

Nếu lợi thế nhỏ hơn chi phí, kỳ vọng là âm


Lợi thế trước chi phí và tổng chi phí thực thi cần được đo trên cùng giá trị danh nghĩa. Khi chi phí kỳ vọng vượt lợi nhuận kỳ vọng trước chi phí, kỳ vọng ròng âm theo mô hình đang dùng. Đây là kết quả trung bình ước tính, không dự đoán chắc chắn một chuỗi giao dịch cụ thể.


Trong ví dụ giả định, tỷ lệ thắng 60%, lãi thực hiện trung bình 0,3% và lỗ thực hiện trung bình 0,3% cho kỳ vọng trước chi phí: 60% × 0,3% − 40% × 0,3% = 0,06%. Trừ phí vòng vào-ra 0,08% còn −0,02%; trừ thêm trượt giá vòng vào-ra 0,05% chưa nằm trong các khoản trên còn −0,07%. Nếu báo cáo vẫn có lãi sau phí với đúng các giả định này, hãy kiểm tra cách nhập phí, mẫu số của tỷ lệ, số lệnh và lãi/lỗ thực hiện. Trượt giá bằng 0 không giải thích được mâu thuẫn vì chỉ riêng phí đã làm kỳ vọng âm.


Một chiến lược có kỳ vọng trước chi phí 0,06% chỉ giữ kỳ vọng ròng dương trong mô hình khi tổng chi phí thấp hơn 0,06%. Không thể suy ra điều kiện này chỉ từ tên tài sản hoặc mức thanh khoản được cho là cao. Trong một ví dụ khác, lợi thế 3% và tổng chi phí 0,5% còn 2,5%, nhưng vẫn cần kiểm tra độ bất định của lợi thế, drawdown và khả năng khớp. Hãy so ngân sách chi phí với dữ liệu của từng sàn, sản phẩm và quy mô lệnh.


Thanh khoản có thể mỏng đi khi biến động tăng mạnh, nên cần kiểm tra riêng


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.


Xét một kịch bản căng thẳng giả định: giá giảm nhanh, nhiều lệnh chờ bị hủy hoặc khớp, và độ sâu quanh giá hiện tại giảm. Một lệnh bán cắt lỗ thị trường có thể khớp dưới mức kích hoạt vì không còn đủ khối lượng mua gần đó. Không thể chứng minh mức trượt giá bằng một cây nến ngày hoặc tổng giá trị giao dịch; cần dữ liệu sổ lệnh và thời gian khớp để đo. Giá trị giao dịch tăng cao vẫn có thể đi cùng độ sâu sẵn có thấp.


Giả định trượt giá của thời gian bình thường có thể không phù hợp giai đoạn biến động mạnh. Hãy tách số liệu theo biến động, phiên giao dịch và quy mô lệnh, rồi chạy thêm kịch bản bất lợi dựa trên các quan sát đã ghi nhận. Cuối tuần hay một khung giờ cụ thể không phải lúc nào cũng kém thanh khoản trên mọi thị trường; cần kiểm tra từng sản phẩm. Nếu chưa có dữ liệu, ghi rõ giả định và giới hạn của phép thử.


Dùng bộ lọc chi phí giao dịch để sàng lọc trước mã và chiến lược


Bộ lọc chi phí giúp xác định tổ hợp cần loại hoặc nghiên cứu thêm. Mức như 10 triệu USD giá trị giao dịch ngày hoặc spread 10bp chỉ có thể là giả định sàng lọc của một nghiên cứu, không phải chuẩn chất lượng chung hay bảo đảm khớp lệnh. Chọn ngưỡng từ quy mô lệnh, lợi thế và dữ liệu đã đo, rồi lưu cùng cấu hình backtest.


  • Dữ liệu cùng sàn và sản phẩm: Ghi thời gian, giá trị giao dịch, spread và độ sâu. Dùng giá trị giao dịch làm lọc sơ bộ, không thay cho sổ lệnh.
  • Ngân sách spread: Chọn giới hạn phù hợp lợi thế; nhớ rằng spread 10bp tương đương khoảng một spread cho vòng mua-ask/bán-bid tức thì trên sổ lệnh không đổi, chưa kể các chi phí khác.
  • Phí và giá tham chiếu: Tra biểu phí áp dụng cho tài khoản, tính hai phía và nêu rõ trượt giá đã bao gồm spread hay chưa.
  • Điểm hòa vốn: So tổng chi phí với kỳ vọng trước chi phí trên cùng danh nghĩa, đồng thời chạy kịch bản chi phí bất lợi.
  • Quy mô và thực thi: Đối chiếu lệnh với độ sâu có thể khớp. Giảm quy mô, chia lệnh hoặc dùng lệnh giới hạn có đánh đổi; lệnh giới hạn có thể không khớp, còn chia lệnh vẫn chịu thay đổi giá và thanh khoản.

Chiến lược có vòng quay lớn cần đặc biệt theo dõi tổng danh nghĩa và tổng chi phí, nhưng không có mức trượt giá tối thiểu chung như 0,05% hay 0,1% áp dụng cho mọi trường hợp. Một chiến lược swing có lợi thế trên mỗi lệnh lớn hơn cũng không được miễn kiểm tra thanh khoản. Trước mỗi lần tăng quy mô, cập nhật phép đo chi phí và đánh giá lại điểm hòa vốn.


Chạy lại backtest với giả định chi phí thực tế


Sau khi sàng lọc, hãy đối chiếu giả định khớp của backtest với cách lệnh thật được gửi. Báo cáo cần ghi phí, giá tham chiếu, quy mô, thời điểm gửi và các kịch bản chi phí. Trong tài liệu chiến lược Pine Script của TradingView, tham số slippage biểu diễn mức điều chỉnh cố định theo tick cho các loại lệnh được hỗ trợ. Đây là phép xấp xỉ để kiểm tra độ nhạy, không mô phỏng chính xác độ sâu sổ lệnh, độ trễ hoặc xác suất khớp.


Nếu engine giả định khớp tại giá đóng cửa của nến phát sinh tín hiệu, cần kiểm tra lệnh thực tế có thể được gửi và khớp vào thời điểm đó hay không. Một giá trên nến không cho biết có đủ khối lượng cho quy mô lệnh. Sai lệch có thể xảy ra cả ở thị trường thường được coi là thanh khoản cao. Hãy đối chiếu cấu hình thời điểm xử lý lệnh với nhật ký thực thi, thay vì mặc định giá đóng cửa là giá có thể giao dịch.


Trong ví dụ 220 vòng mỗi tháng, tăng tổng chi phí mỗi vòng từ 0,10% lên 0,15% làm chi phí từ 22% lên 33% vốn ban đầu chỉ khi danh nghĩa cố định mỗi vòng bằng vốn ban đầu, không tái đầu tư và cùng cơ sở tính toán. Với danh nghĩa bằng 10% vốn ban đầu, các mức tương ứng là 2,2% và 3,3%. Tham số trượt giá theo tick cũng không giữ nguyên tỷ lệ phần trăm khi giá thay đổi. Hãy chọn giả định từ dữ liệu, tránh cộng trùng và xem lợi thế còn tồn tại ở quy mô lệnh dự kiến hay không trước khi đưa kết quả backtest vào vận hành.

Kiểm tra backtest của bạn

Tải lên CSV kết quả tối ưu hóa hoặc danh sách giao dịch của chiến lược TradingView để xem các chỉ số hiệu suất cùng kết quả kiểm tra độ bền. Không cần đăng nhập để phân tích.

Phân tích tệp kết quả Xem báo cáo mẫu