Điều gì làm nên một hệ thống giao dịch bền?
· #systematic-trading #robustness #research-process #backtesting #risk-management
Một hệ thống giao dịch được coi là bền khi kết quả của nó sống sót qua những điều kiện mà nó chưa từng được tinh chỉnh cho: một chế độ chi phí khác, một khung giờ bị dịch đi, một điểm tham số lân cận, một năm mà mình không được chọn. Bền không có nghĩa là con số lớn hơn. Bền nghĩa là phụ thuộc vào may mắn ít hơn, và khác với hầu hết thứ trong trading, mức phụ thuộc đó đo được.
Dưới đây là bộ kiểm tra mà mình chạy trên chính công việc của mình, bao gồm cả những bài kiểm tra mà chiến lược của mình không vượt qua.
Vì sao quyết định chậm lại thì tốt hơn?
Vì tốc độ lấy mất của mình bước phát hiện ra mình sai khi chưa phải trả giá.
Lối nghĩ tức thời làm mọi setup thành khẩn cấp, mọi kết quả thành chung cuộc, và mọi khoản lỗ thành chuyện cá nhân. Phiên bản có hệ thống của cùng một quyết định thì chậm hơn và nhạt hơn: quan sát, đo lường, so sánh, rồi mới quyết. Vòng lặp đó chính là cách Dquants engine mình tự phát triển vận hành, và không có gì trong đó được quyết chỉ bằng một cái liếc vào một cửa sổ dữ liệu.
Đây là một ví dụ nhỏ cho thấy vòng lặp đó tự trả tiền cho nó. Có người hỏi mình rằng từ chối vào lệnh trong mười lăm phút cuối phiên thì có tốt hơn không. Nghe rất hợp lý. Mình đo thay vì đoán, và nó không mang lại giá trị nào nên không được đưa vào. Cũng trong đợt kiểm tra đó, việc đóng lệnh khi hết phiên gần như trung tính về tiền, còn việc đi phẳng vào mỗi tối thứ Sáu mới là thay đổi thật sự có ý nghĩa. Ba ý tưởng đều hợp lý, một ý tưởng xứng đáng ở lại. Mình đã không thể đoán trước là ý tưởng nào.
Chuyện gì xảy ra với một hệ thống không có điểm vô hiệu hóa?
Nó trở nên dính cảm xúc và bắt đầu tự bào chữa cho mình.
Một rule không biết mình sai ở đâu sẽ liên tục xin thêm không gian. Vì vậy trong Dquants engine, một rule chỉ được đưa vào khi điểm vô hiệu hóa đã được định trước, để mức giá nơi giả thuyết chết được quyết trước khi có tiền trên bàn, chứ không phải trong lúc đang có tiền.
Logic đó áp dụng cho cả những ý tưởng lớn, không riêng từng lệnh. Trong chương trình nghiên cứu, mình đã thử hàng chục biến thể và loại bỏ phần lớn trong số đó, kể cả vài biến thể trông có lãi cho tới khi thống kê deflated hoặc cửa sổ out-of-sample lộ ra rằng đó chỉ là may mắn. Đến giờ có hai edge sống sót qua mọi bài kiểm tra. Nghĩa địa mới là phần hồ sơ mà mình tin nhất.
Vì sao mình giữ logic gọn?
Vì mỗi thành phần mình thêm vào là thêm một thứ có thể bị fit vào nhiễu, và thêm một thứ mình phải debug vào đúng lúc tệ nhất.
Master Volume Profile là một bộ rule Volume Profile nhỏ chứ không phải một đống indicator chồng lên nhau, và đó là chuyện kiểm soát chứ không phải tối giản cho đẹp. Khi có gì trục trặc, mình muốn truy ngược về một input có tên.
Cắt bớt cũng là một phần của việc đó. Mình đã thử Kaufman Efficiency Ratio như một bộ lọc vào lệnh và nó không tạo ra cải thiện nào ngoài mẫu, nên nó không có mặt trong sản phẩm. Dù sao thì cũng không có công cụ đơn lẻ nào là edge cả: DuckDB, C++ và Python lo phần nghiên cứu, MQL5 lo phần thực thi, và không thứ nào tự nó có giá trị. Edge nằm ở cách chúng khớp vào nhau và ở những gì quy trình từ chối cho phép.
Giới hạn giờ giao dịch có thật sự giúp ích, hay chỉ là mê tín?
Đó là một câu hỏi công bằng, và nó có một bài kiểm tra trung thực.
Bộ lọc phiên rất dễ bị lạm dụng. Cứ siết giờ đủ chặt thì chiến lược nào cũng đẹp lên, bởi vì mình đã lặng lẽ chọn đúng những giờ ngẫu nhiên hoạt động tốt. Cho nên trên một cấu hình vàng, mình cố tình dịch khung giờ đi hai tới ba tiếng rồi chạy lại. Kết quả vẫn giữ. Điều đó nói với mình rằng edge không phải là một hiện tượng mong manh theo giờ, và đó là lý do duy nhất khiến mình thấy yên tâm khi để bộ lọc phiên trong sản phẩm.
Một kiểm tra liên quan trong cùng ngày thử nghiệm đó: cấu hình này được chọn trên dữ liệu của một broker rồi đem đánh giá trên dữ liệu của một broker khác, nên phần đánh giá không mang thiên lệch chọn mẫu trực tiếp từ quá trình tìm kiếm. Trạng thái trung thực của nó, đúng như cách mình gọi trong nội bộ, là ứng viên chứ chưa phải đã chứng nhận. Nó vẫn còn nợ một vùng plateau về độ nhạy tham số trên feed thứ hai, một walk-forward neo, và một đợt forward test trên demo.
Con số nào mình kiểm tra trước khi tin vào câu chuyện?
Expectancy, và hình dạng của phân phối nằm bên dưới nó.
Câu chuyện thì dễ bán, expectancy thì khó làm giả. Nếu kết quả trung bình mỗi lệnh yếu sau chi phí, chiến lược đang có vấn đề bất kể lời giải thích nghe hay đến đâu. Nếu con số trung bình đó được gánh bởi một nhúm lệnh may mắn hiếm hoi, chiến lược rất mong manh ngay cả khi tiêu đề trông ổn.
Cấu hình vàng mà mình kiểm định kỹ nhất chạy ở profit factor 1.42 trên 1,423 lệnh với dữ liệu tick thật, và lệnh thắng trung bình xấp xỉ bằng lệnh thua trung bình. Điều này quan trọng hơn vẻ ngoài của nó: edge đến từ một tỷ lệ thắng dương chứ không đến từ hình học payoff, vốn là một thứ hẹp hơn và dễ vỡ hơn để đặt cược vào, và cũng là lý do tốt để mình không trích một con số tỷ lệ thắng như thể đó là thành tích. Mọi con số ở đây là backtest và chạy xác nhận trên MetaTrader 5, ghi nhận tháng 7 năm 2026. Không con số nào là thành tích giao dịch thật.
Thống kê thật ra đang bảo vệ mình khỏi cái gì?
Chủ yếu là khỏi chính mình.
Thống kê không làm trading trở nên chắc chắn. Nó cho mình biết khi nào một kết quả quá nhỏ, quá nhiễu, quá tập trung hoặc quá mong manh để gánh sức nặng mà mình muốn đặt lên. Trên thực tế điều đó nghĩa là Deflated Sharpe, Probabilistic Sharpe và độ dài track record tối thiểu, tất cả đều được nạp đúng số cấu hình mà mình đã thật sự tìm kiếm chứ không phải một con số dễ chịu. Với cấu hình vàng, Deflated Sharpe đọc ra 1.000 so với ngưỡng 0.95, và cỡ mẫu tối thiểu cần thiết là 192 lệnh so với 1,423 lệnh mình đang có.
Điều hữu ích hơn mà bộ khung đó làm được là chỉ ra phần yếu trong chính chiến lược của mình. Chân mean-reversion bên trong Master Volume Profile chỉ có 51 lệnh phía sau, thấp hơn nhiều so với sàn 192 lệnh, và đóng góp khoảng 1.4 phần trăm lợi nhuận ròng. Mình vẫn bật nó vì nó dương và không tương quan với chân còn lại. Nhưng mình không mô tả nó như một nửa của cỗ máy, vì cỡ mẫu không đủ để đỡ câu đó.
Một hệ thống già đi tốt trông như thế nào?
Nhạt, và hơi kém hơn phiên bản đẹp nhất của chính nó.
Tín hiệu rõ nhất mà mình tìm được là việc tối ưu lại gây hại. Trên các bài walk-forward, cấu hình cố định đã khóa cho kết quả dương ở năm trên năm fold, trong khi tối ưu lại tham số cho từng fold chỉ đạt bốn trên năm. Phiên bản ít thích nghi hơn lại làm tốt hơn. Bên cạnh đó, profit factor ngoài mẫu đạt 1.327 so với 1.203 trong huấn luyện, và ngoài mẫu cao hơn trong mẫu là dấu hiệu ngược với chữ ký của curve-fitting.
Mình cũng chỉ chấp nhận những tham số nằm trên một plateau, nơi các điểm lân cận hành xử tương tự. Một kết quả chỉ chạy được ở đúng một điểm cài đặt là một quả mìn kèm ảnh chụp màn hình đẹp.
Không điều nào trong đó khiến hệ thống miễn nhiễm. Mười một trên mười hai tháng dương trong walk-forward, và tháng thứ mười hai thì không: tháng 8 năm 2025 cho profit factor 0.69 và âm 21.6 phần trăm. Đẩy cùng cấu hình cố định đó vào năm 2024, một năm có spread xấp xỉ gấp đôi bình thường so với biến động, thì nó trả về âm 67.1 phần trăm trên khớp lệnh thật của MetaTrader 5 với drawdown 74.2 phần trăm. Ghi chú nghiên cứu của mình nói thẳng: không có mức sizing nào đang ship sống sót qua một năm kiểu 2024. Già đi tốt là một khái niệm tương đối, và Sharpe trung thực cho cả chu kỳ vào khoảng 1.8, không phải 3.8 như cửa sổ đẹp cho thấy.
Vì sao nhiều trader giỏi vẫn mắc kẹt?
Vì họ tối ưu kết quả trong khi thứ sửa được là hành vi.
Muốn kết quả tốt hơn và cần quyết định tốt hơn là hai bài toán khác nhau, và chỉ một trong hai nằm ở thượng nguồn. Dự đoán là đầu ra. Quy trình mới là tài sản, và nó là phần duy nhất có thể soi được, đánh phiên bản được và cải thiện được. Khi thị trường đổi, một quy trình tốt cho mình biết cần nhìn vào đâu; một dự đoán tốt thì không cho mình biết gì cả.
Đó là lý do mình đưa ràng buộc vào code thay vì vào ý chí. Kiểm tra rule và giới hạn rủi ro trong code thì không có tuần nào tệ cả.
Việc tự xây dạy mình điều gì mà nghiên cứu không dạy được?
Rằng các giả định nằm ở tầng adapter.
Viết lớp thực thi bằng MQL5 mới là phần học thật. Những ý tưởng trông sạch sẽ trong nghiên cứu chỉ lộ ra khuyết điểm ở nơi chúng chạm vào một terminal thật: hành vi khớp lệnh, các trường hợp biên, khoảng cách giữa điều engine nghĩ đã xảy ra và điều broker thực sự làm. Vì vậy engine nghiên cứu và Expert Advisor được ship phải qua một cổng đối chiếu chính xác từng byte trên cùng một dòng tick. Nếu hai bên bất đồng thì một trong hai đang nói dối, và mình muốn phát hiện điều đó trên máy của mình.
Tự xây cũng là cách mình biết mô hình còn thiếu gì. Spread được tính cho mọi lệnh, nhưng slippage, độ trễ và swap thì chưa được mô hình hóa, nên mình luôn coi kết quả thật là mỏng hơn backtest chứ không dày hơn. Và cơ chế đứng ngoài trong những ngày đắt đỏ, khi chi phí đo được so với biến động lên quá cao, hiện mới chỉ được kiểm định trên dữ liệu của một broker. Trên các feed rộng hơn thì nó gần như bật thường trực, một thông tin hữu ích và không hề đẹp để đem đi khoe.
Mình vẫn quay lại cùng một kết luận. Độ bền không phải thứ được thêm vào ở cuối. Nó là kết quả tích lũy của từng ý tưởng mà mình đã sẵn lòng để nó thất bại sớm.
Câu hỏi thường gặp
Điều gì làm một chiến lược trở nên robust chứ không chỉ là có lãi? Robust nghĩa là ít nhạy với những lựa chọn mà mình đã đặt ra một cách tùy ý. Các bài kiểm tra thực tế là xem kết quả có giữ được khi dịch khung giờ, đổi sang một điểm tham số lân cận, đổi dữ liệu broker, hoặc chạy một năm khác hay không. Cấu hình vàng của mình sống sót qua việc dịch khung giờ hai tới ba tiếng và qua việc đổi feed, nhưng thất bại trước chế độ chi phí của năm 2024. Cả hai đều thuộc về cùng một bức tranh.
Tối ưu lại chiến lược định kỳ có phải ý hay không? Theo kiểm định của mình thì không. Trên các fold walk-forward, cấu hình cố định dương ở năm trên năm fold trong khi tối ưu lại từng fold chỉ đạt bốn trên năm. Tối ưu lại là đưa cho tham số một mớ nhiễu mới để fit vào. Có những chiến lược mà refit định kỳ là đúng, nhưng đó nên là một quyết định có đo đạc, không phải một thói quen mặc định.
Cần bao nhiêu lệnh thì một backtest mới có ý nghĩa? Điều đó phụ thuộc vào phân phối lợi nhuận của chính chiến lược, và đó là thứ mà phép tính độ dài track record tối thiểu ước lượng. Với cấu hình vàng của mình, sàn là 192 lệnh còn mẫu đã kiểm định là 1,423 lệnh. Một chiến lược nhiễu hơn cần mẫu lớn hơn để đưa ra cùng một khẳng định, nên không có con số chung cho mọi trường hợp.
Sao không bỏ luôn phần yếu trong chiến lược của mình? Chân mean-reversion vẫn dương và không tương quan với chân breakout, nên nó được giữ lại. Thứ nó không được nhận là một tuyên bố mà nó không đỡ nổi. Với 51 lệnh, nó nằm dưới ngưỡng ý nghĩa thống kê, và đóng góp khoảng 1.4 phần trăm lợi nhuận ròng. Giữ nó lại và mô tả nó đúng mức là hai quyết định tách rời nhau.
Bộ lọc theo giờ có thật sự cải thiện hệ thống không? Đôi khi có, và điều đó đáng được chứng minh thay vì mặc định tin. Kiểu hỏng thường gặp là chọn đúng những giờ tình cờ chạy tốt, việc này cải thiện mọi backtest và không cải thiện gì khác. Bài kiểm tra mình dùng là cố tình dịch khung giờ và xem kết quả có sống không. Trong cùng đợt thử nghiệm, một quy tắc theo giờ cải thiện được kết quả, một quy tắc trung tính, và một quy tắc không đem lại gì nên bị bỏ.
Profit factor cao có đủ để tin một chiến lược không? Không. Profit factor mô tả một mẫu và mang theo mọi giới hạn của cửa sổ mà nó được đo. Cùng một cấu hình cố định trong nghiên cứu của mình đọc ra rất đẹp trong chế độ thị trường thuận lợi, và trả về âm 67.1 phần trăm trên khớp lệnh thật trong năm 2024. Đó không phải hai chiến lược, đó là một chiến lược được đo trên một quãng lịch sử dài hơn và kém tử tế hơn.
Master Volume Profile đã có thành tích giao dịch thật chưa? Chưa, và mình sẽ không ám chỉ ngược lại. Mọi thứ công bố tới giờ đều là nghiên cứu: backtest trên khoảng 160 triệu tick thật từ broker cộng với các lần chạy xác nhận trên MetaTrader 5. Slippage, độ trễ và swap chưa được mô hình hóa, nên kết quả thật nên được kỳ vọng là mỏng hơn backtest. Hãy xem mọi con số như bằng chứng lịch sử về một giả thuyết, không phải một dự báo.
Những điều này có làm trading trở nên an toàn không? Không. Nó chỉ loại bỏ vài cách sai cụ thể, và đó là một khẳng định nhỏ hơn nhiều. Drawdown 20 tới 30 phần trăm là thực tế với cấu hình được mô tả ở đây, và mình lên kế hoạch cho một đỉnh drawdown 30 tới 40 phần trăm. Giao dịch luôn có rủi ro, bao gồm rủi ro thua lỗ, và không lượng kiểm định nào biến một giả thuyết thành điều chắc chắn.
Người viết: KenKem, một kỹ sư phần mềm và nhà sáng lập với hai mươi năm kinh nghiệm, đang học giao dịch định lượng một cách công khai và công bố lại toàn bộ quá trình, kể cả những lần bị loại bỏ.
Bài viết này được tổng hợp từ các bài 85 đến 96 trong chuỗi nhật ký xây dựng của KenKem. Chỉ nhằm mục đích giáo dục. Không phải lời khuyên đầu tư. Mọi con số được trích dẫn là kết quả backtest hoặc chạy xác nhận, không phải thành tích giao dịch thật. Hiệu suất quá khứ không đảm bảo kết quả tương lai.