Một cú drawdown 99,99% đã dạy tôi điều gì về việc xây dựng bot giao dịch
Con bot giao dịch đầu tiên mà tôi từng đưa lên một tài khoản thật đã mất gần như sạch vốn. Win rate: 25%. Max drawdown: 99,99%. Nó không cháy tài khoản vì thị trường tàn nhẫn. Nó cháy vì tôi đã xây dựng nó theo cách mà hầu hết mọi người xây dựng con bot đầu tiên của họ — như một prototype được chắp vá lại bằng chính những quan điểm chủ quan của tôi.
Đây là câu chuyện về lý do tôi đã xóa bỏ mọi quy tắc thủ công khỏi hệ thống ra đời sau đó, và về việc quyết định ấy đã dạy tôi điều gì về vị trí thực sự của phán đoán con người trong một chiến lược tự động.
Chỉ mang tính minh họa, không phải dữ liệu hiệu suất thật. Cú sụp đổ không phải đến từ một lệnh tồi — mà từ một nghìn quyết định nhỏ bé, đầy tự tin, và sai lầm.
Sai lầm dễ chịu
Khi mới bắt đầu, những quy tắc hard-code mang lại cảm giác kiểm soát. Stop-loss ở mức 3%. Take-profit ở một con số tròn trĩnh nào đó. Position sizing tính theo một công thức bạn đọc được trong một bài blog. Mỗi quy tắc khi đứng riêng lẻ đều có vẻ thận trọng. Gộp lại, chúng tạo thành một cỗ máy mong manh chưa bao giờ chứng kiến tình huống mà nó sắp phải đối mặt.
Hệ thống đầu tiên của tôi đầy rẫy những thứ như vậy. Nó còn xử lý số liệu trên CPU, bằng các vòng lặp, theo cái cách bạn viết một script dùng một lần. Tất cả những điều đó chẳng có gì quan trọng khi tôi backtest trên dữ liệu sạch sẽ, thân thiện. Nhưng tất cả lại trở nên hệ trọng ngay khoảnh khắc các điều kiện thực — fees, slippage, khả năng bị liquidation — xuất hiện. Một mức stop cứng 3% trông có vẻ kỷ luật trên giấy lại biến thành một cỗ máy bán ra theo từng nhiễu động nhỏ và không bao giờ cho một luận điểm cơ hội thở. Cú drawdown không phải là một lệnh thảm họa. Nó là một nghìn quyết định nhỏ bé, đầy tự tin, và sai lầm.
Bài học khó nuốt
Bài học không phải là “tinh chỉnh stop-loss cho khéo hơn.” Bài học là chính tôi mới là nút thắt cổ chai. Mỗi ngưỡng hard-code là tôi đông cứng một phỏng đoán vào hệ thống và buộc tương lai phải tuân theo nó.
Vậy nên ở hệ thống tiếp theo, tôi đặt ra một quy tắc về các quy tắc: bên trong phần mô hình thực sự học hỏi, hoàn toàn không có quy tắc thủ công nào. Không stop-loss, không take-profit, không position sizing, không leverage. Nếu một quyết định ảnh hưởng đến cách chiến lược hành xử, thì mô hình phải học nó từ hậu quả của hành động — chứ không kế thừa từ trực giác của tôi. (An toàn ở cấp hệ thống — giới hạn mức phơi nhiễm, một kill-switch — là một lớp riêng biệt, và nó được giữ lại. Cái bị loại bỏ là việc tôi tự tay viết ra lệnh giao dịch.)
Nghe thì cực đoan, và đúng là cực đoan thật. Nhưng nó cũng ép buộc một kỷ luật âm thầm xử lý được vài thất bại phổ biến của người mới:
- Không có prototype. Một prototype là lời hứa sẽ sửa sau, và “sau” chính là nơi những cú drawdown 99,99% trú ngụ. Mọi thứ đều được viết để là phiên bản thật ngay từ đầu.
- Không có magic number. Nếu một giá trị không được học, nó phải nằm trong một file config nơi tôi có thể nhìn thấy nó, đưa nó vào quản lý phiên bản, và bảo vệ được nó — chứ không bị chôn vùi trong code dưới dạng một con số mà tôi sẽ quên mất lý do tồn tại.
- Backtest phải làm ta đau. Fees, slippage và liquidation đều được mô hình hóa, bởi một backtest không thể mất tiền theo cái cách tài khoản thật có thể mất chỉ là một mô phỏng tâng bốc bản thân.
Nơi con người vẫn còn chỗ đứng
Loại bỏ các quy tắc thủ công không loại bỏ con người. Nó tái định vị con người. Tôi không còn quyết định mô hình làm gì trong một thời điểm cụ thể nữa. Tôi quyết định “tốt” nghĩa là gì — objective function mà nó được thưởng dựa trên đó, các điều kiện mà nó huấn luyện trong đó, các chi phí mà nó phải tôn trọng. Thiết kế objective function ấy là phần mang tính con người nhất trong toàn bộ công cuộc này, và làm sai nó còn nguy hiểm hơn nhiều so với bất kỳ một lệnh tồi đơn lẻ nào, bởi mô hình sẽ tối ưu hóa chính xác cái bạn yêu cầu, chứ không phải cái bạn thực sự muốn.
Đó là sự đánh đổi mà tôi sẽ chọn mọi lúc: ngừng giả vờ rằng tôi có thể tự tay viết ra quyết định cho mọi trạng thái tương lai, và thay vào đó dồn công sức ấy vào việc định nghĩa thế giới mà hệ thống sẽ học trong đó.
Điều rút ra
Một cú drawdown 99,99% là một người thầy đắt giá, nhưng rõ ràng. Con bot thất bại không phải vì nó thiếu quy tắc. Nó thất bại vì nó mang những quy tắc của tôi — cứng nhắc, chưa được kiểm chứng với thực tế, và thay thế cho việc học thay vì tạo điều kiện cho nó.
Nếu bạn đang xây dựng hệ thống đầu tiên của mình, thứ hữu ích nhất bạn có thể xóa bỏ chính là sự chắc chắn của bản thân bạn.
Đây là phần 1 trong một nhật ký ẩn danh đang được viết tiếp về quá trình xây dựng một hệ thống giao dịch dùng học tăng cường (reinforcement learning). Nó nói về phương pháp và sai lầm, không phải tín hiệu — không có gì ở đây là lời khuyên đầu tư, và không có chi tiết chiến lược nào được chia sẻ.