Vì Sao Một Chiến Lược Trading Ngừng Hoạt Động?
· #regime-awareness #systematic-trading #research-method #risk-management #trading-psychology
Một chiến lược trading thường ngừng hoạt động vì điều kiện của nó đã thay đổi, chứ không phải vì logic của nó hỏng. Edge luôn có điều kiện. Nó sống trong những phiên, những trạng thái biến động và những regime chi phí nhất định, và cùng một đoạn code kiếm được tiền ở nơi này sẽ chảy máu ở nơi khác. Phần lớn chiến lược chưa bao giờ viết ra những điều kiện đó, nên không ai nhận ra ngày chúng hết hạn.
Dưới đây là cách mình học được việc coi điều kiện như một phần của edge, thay vì như một bộ lọc gắn thêm vào sau, gồm cả năm mà cấu hình của chính mình mất 67 phần trăm dù không làm gì khác đi.
Vì sao edge phụ thuộc vào điều kiện chứ không phải vào tín hiệu?
Bởi vì một tín hiệu chỉ mô tả điều đã xảy ra, còn điều kiện mới quyết định mô tả đó có tiếp tục đúng hay không.
Khi mới bắt đầu, mình đi tìm setup. Tìm mẫu hình, test mẫu hình, đưa mẫu hình vào bot. Điều làm thay đổi cách mình nghiên cứu là nhận ra rằng công việc không chỉ là tìm tín hiệu, mà là tìm những điều kiện nơi tín hiệu đó xứng đáng tồn tại. Xu hướng và đi ngang, nén và giãn, spread hẹp và spread rộng không phải là khác biệt bề ngoài. Chúng thay đổi chất lượng của quyết định nằm dưới một điểm vào y hệt nhau.
Vì vậy trong Dquants engine mình tự phát triển, mọi backtest đều được gắn thẻ theo phiên và trạng thái biến động. Một rule chỉ được ship nếu nó còn đúng trong regime mà nó được xây cho. Nếu bỏ qua việc gắn thẻ đó, mình không đang test một ý tưởng. Mình đang lấy trung bình một ý tưởng trên nhiều thị trường khác nhau rồi đọc con số trung bình như thể nó có ý nghĩa.
Bỏ qua regime thực sự tốn bao nhiêu?
Trong nghiên cứu của mình, sáu mươi bảy phần trăm chỉ trong một năm.
Cấu hình vàng của mình đạt Sharpe thường niên 3.78 với drawdown tối đa 19.7 phần trăm trong research engine, đo trên cửa sổ 2025 đến 2026. Lấy đúng cấu hình cố định đó, không đổi gì cả, rồi chạy qua năm 2024 trên fill thật của MetaTrader 5, kết quả là âm 67.1 phần trăm với drawdown tối đa 74.2 phần trăm. Năm 2024 spread chạy quanh mức 8.6 phần trăm của ATR, khoảng gấp đôi bình thường, và chiến lược cứ trả phí cho đến khi không còn gì để trả.
Trên toàn chu kỳ 2024 đến 2026, con số Sharpe trung thực là 1.77 chứ không phải 3.78. Cả hai đều mô tả cùng một đoạn code. Chỉ có vùng khí hậu là khác. Ghi chú nghiên cứu của mình có một câu thẳng thắn hơn: không có mức sizing nào đang ship sống sót qua một năm kiểu 2024. Đây là các con số backtest và chạy xác nhận từ scorecard vàng của chính mình, không phải một track record thật.
Kết quả đó là lý do mình thôi coi regime là thứ có cũng được. Chiến lược không suy giảm một cách êm ái. Nó gặp một điều kiện chưa từng được xây cho, và nó tệ đúng bằng mức mà phép tính đã báo trước.
Vì sao biết lúc nào không nên vào lệnh lại là một phần của edge?
Bởi vì đứng ngoài là một quyết định có kỳ vọng đo được, và trong kiểm định của mình thì kỳ vọng đó dương.
Bằng chứng rõ nhất mình có là một phép phản nghiệm. Cấu hình vàng của mình chỉ vào lệnh trong các khung phiên được định nghĩa rõ và chặn một số giờ chất lượng thấp, và mình muốn biết những cổng đó là thật hay chỉ là thói quen thừa kế. Nên mình gỡ chúng ra và test chạy suốt ngày đêm. Mọi giờ không bị chặn đều làm profit factor và drawdown xấu đi một cách đơn điệu. Không phải xấu đi trên trung bình, cũng không phải chỉ một lần. Là từng giờ một. Những cổng đó là một đòn bẩy edge đo được, và mình đã không thể biết điều đó nếu không thử gỡ chúng.
Hai cơ chế đứng ngoài khác đến từ cùng lối nghĩ. Một ngưỡng sàn về mức độ hoạt động giữ hệ thống ở ngoài khi thị trường quá lặng để nuôi được edge. Một bộ theo dõi chi phí đo spread so với mức biến động đang diễn ra, để một ngày đắt đỏ được nhận diện là một ngày đắt đỏ, thay vì bị cảm nhận như một chuỗi xui rủi. Cả hai đều mã hóa bài học 2024 thành một ràng buộc, thay vì để nó nằm trong trí nhớ.
Vì sao một chiến lược không thể chỉ đơn giản thích nghi theo kết quả gần đây?
Bởi vì kết quả gần đây chính là đầu vào thất bại một cách đều đặn nhất khi ra ngoài mẫu, và mình có một nghiên cứu bị bác bỏ để chứng minh điều đó.
Mình từng xây một cơ chế điều chỉnh khối lượng theo edge thực tế của giai đoạn gần nhất, hạ rủi ro sau một chuỗi yếu và nâng lên sau một chuỗi mạnh. Trong mẫu, nó trông tuyệt vời, với kết quả ròng tốt hơn và drawdown tối đa thấp hơn khoảng bốn mươi phần trăm. Walk-forward đã giết nó. Chọn dựa trên quá khứ tạo ra kết quả ngoài mẫu âm ở gần như mọi fold, vì các chuỗi thua có xu hướng hồi quy về trung bình. Kết quả gần đây không dự báo được kết quả phía trước.
Nghiên cứu đó cũng là lý do một phần hạ tầng cũ của chính mình vẫn đang tắt. Một codebase trước đây chứa một bộ tự động tinh chỉnh tham số dài tám trăm dòng, chạy theo tín hiệu win rate, và tín hiệu kích hoạt của nó đúng là tín hiệu mà walk-forward đã bác bỏ. Nó không bị xóa, nó bị tắt và được ghi lại rõ ràng. Cùng nguyên tắc đó đã loại bỏ reinforcement learning cho phần entry: ở mức khoảng một nghìn lệnh mỗi năm, mẫu dữ liệu thiếu tới vài bậc độ lớn so với thứ một mô hình như vậy cần, và kết quả của nó không thể được khử lạm phát một cách trung thực cho toàn bộ quá trình tìm kiếm đã sinh ra nó.
Cái bẫy mà điều này đóng lại là cái bẫy của chuỗi thắng gần đây. Một tuần đẹp làm chiến lược trông tốt hơn thực tế và làm mình thấy mình thông minh hơn mức dữ liệu cho phép. Điều kiện phải được định nghĩa trước, đi từ nguyên nhân, chứ không phải khớp ngược lại từ kết quả của tháng vừa rồi.
Vì sao việc định nghĩa điều kiện lại làm cho trading bình tĩnh hơn?
Bởi vì cuộc tranh luận chỉ diễn ra một lần, ở giai đoạn thiết kế, thay vì diễn ra vài phút một lần khi đang có lệnh mở.
Đây là phần khó giải thích nhất với người vẫn đang giao dịch bằng tay. Viết điều kiện ra không có cảm giác tự do, nó có cảm giác như đang từ bỏ một thứ gì đó. Trên thực tế, nó chuyển quyết định về đúng điểm mà mình đáng tin cậy và lấy quyết định ra khỏi điểm mà mình không đáng tin. Khi không có điều kiện hợp lệ, hệ thống nói không, và không còn gì để mặc cả.
Điều đó quan trọng về mặt tài chính chứ không chỉ về mặt cảm xúc. Trading theo cảm xúc đắt theo kiểu nhiều khoản nhỏ lặp đi lặp lại, chứ không phải theo kiểu một cú lớn. Mình vào sớm, thoát sớm, nới rủi ro sau một lệnh thua, và trả spread cho những lệnh vốn không đáng vào. Không khoản rò rỉ nào trông nghiêm trọng trên một lệnh đơn lẻ. Chúng cộng dồn qua một năm, và chúng đúng là loại rò rỉ mà một điều kiện viết thành code loại bỏ được mà không cần đến ý chí.
Phiên bản của mình còn thiếu sót ở đâu?
Ở ba chỗ mà mình muốn tự nói ra hơn là để người khác phát hiện.
Bộ bảo vệ chi phí phụ thuộc vào từng broker. Ngưỡng suy ra từ một feed sẽ khiến bộ bảo vệ bật vĩnh viễn trên các broker có spread rộng hơn, tức là bịt miệng hệ thống một cách âm thầm, nên nó ship ở trạng thái tắt và chỉ giữ bộ theo dõi chạy như telemetry. Bản thân điều kiện hóa ra cũng có điều kiện, điều này khiêm tốn nhưng đúng.
Mô hình chi phí của mình vẫn còn dễ dãi với mình. Spread được tính cho mọi lệnh, nhưng slippage, độ trễ và swap chưa được mô hình hóa, nên mình kỳ vọng kết quả live sẽ mỏng hơn backtest. Và sự tập trung bên trong chiến lược là có thật: nhánh breakout chiếm khoảng chín mươi sáu phần trăm số lệnh và gần như toàn bộ kết quả ròng, trong khi nhánh mean reversion mới chỉ tạo ra năm mươi mốt lệnh, thấp hơn nhiều so với cỡ mẫu mà mình đủ tự tin để gọi là có ý nghĩa.
Và vẫn chưa có track record thật. Toàn bộ những gì ở trên là nghiên cứu 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. Đó là một giả thuyết có bằng chứng đi kèm, không phải một kết quả.
Điều rút ra trung thực là gì?
Nếu bạn không gọi tên được những điều kiện mà chiến lược của mình cần, bạn không biết nó đang hoạt động hay chỉ là vùng khí hậu của nó chưa kịp đổi.
Viết những điều kiện đó ra là việc không hào nhoáng. Nó tạo ra ít lệnh hơn, một con số tiêu đề nhỏ hơn, và một hệ thống dành rất nhiều thời gian không làm gì cả. Nó cũng có nghĩa là khi hiệu suất thay đổi, mình có một chỗ cụ thể để nhìn vào, và câu hỏi trở thành điều kiện nào đã dịch chuyển, thay vì mình có còn giỏi nữa hay không.
Mình thà sở hữu một edge nhỏ hơn nhưng biết rõ vùng khí hậu của nó, còn hơn một edge lớn hơn với ngày hết hạn không ai biết.
Câu hỏi thường gặp
Vì sao các chiến lược trading ngừng hoạt động? Thường là vì những điều kiện thị trường mà chúng dựa vào đã thay đổi, chứ không phải vì logic sai. Trạng thái biến động, thanh khoản theo phiên và chi phí giao dịch đều dịch chuyển theo thời gian, và một rule được tinh chỉnh trong một tổ hợp điều kiện có thể lỗ trong tổ hợp khác mà không cần sửa một dòng nào. Trong nghiên cứu của mình, đúng một cấu hình vàng cố định cho Sharpe 3.78 trong regime thuận lợi và âm 67.1 phần trăm trong một năm chi phí cao.
Edge có điều kiện trong quant trading nghĩa là gì? Nghĩa là một tín hiệu chỉ mang kỳ vọng dương trong những hoàn cảnh cụ thể, nên hoàn cảnh là một phần của chiến lược chứ không phải bối cảnh bao quanh nó. Hệ quả thực tế là mọi backtest đều được gắn thẻ theo phiên và trạng thái biến động, và một rule chỉ được ship ở nơi nó đã được chứng minh là còn đúng. Không gắn thẻ như vậy thì bạn đang gộp nhiều thị trường khác nhau vào một con số.
Làm sao biết chiến lược của mình có phụ thuộc regime hay không? Hãy chia lịch sử theo điều kiện chứ không chỉ theo mốc thời gian, rồi xem kết quả có sống sót trong từng lát cắt hay không. Kiểm định trên các giả định chi phí khác nhau quan trọng ngang với kiểm định trên các năm khác nhau, vì regime chi phí dịch chuyển nhanh hơn nhiều người nghĩ. Một kết quả được gánh bởi đúng một trạng thái biến động là một phát hiện hẹp, dù metric tiêu đề có đẹp đến đâu.
Giao dịch ít có phải là điều xấu không? Không, và trong kiểm định của mình thì ngược lại. Khi mình gỡ các cổng phiên khỏi cấu hình vàng của mình và để nó chạy suốt ngày đêm, mọi giờ không bị chặn đều làm cả profit factor lẫn drawdown tệ đi. Thời gian đứng ngoài thị trường là một đóng góp đo được vào kết quả, không phải một chi phí cơ hội.
Có nên giảm rủi ro sau một chuỗi thua không? Nghe rất hiển nhiên nhưng nó đã trượt bài test walk-forward của mình. Việc điều chỉnh khối lượng theo edge thực tế gần nhất trông tuyệt vời trong mẫu, với drawdown tối đa thấp hơn khoảng bốn mươi phần trăm, rồi tạo ra kết quả ngoài mẫu âm ở gần như mọi fold, vì các chuỗi thua hồi quy về trung bình. Kết quả gần đây dự báo rất kém cho kết quả phía trước.
Nên chuẩn bị cho mức drawdown bao nhiêu? Hãy lấy phân vị khó chịu chứ đừng lấy mức trung bình. Ghi chú của mình nói nên tính cho một tài khoản vàng ở mức đỉnh 30 đến 40 phần trăm, vì phân phối mô phỏng đặt trung vị quanh 24 phần trăm và phân vị thứ 95 quanh 38 phần trăm, còn lần chạy xác nhận năm 2024 chạm 74.2 phần trăm. Chuẩn bị theo trung vị nghĩa là chuẩn bị để bị bất ngờ vào đúng thời điểm tệ nhất.
Mẫu lớn có làm một backtest đáng tin không? Nó loại bỏ đúng một cách sai, và đó là một tuyên bố nhỏ hơn nhiều so với cảm giác. Mẫu vàng đã kiểm định là 1.423 lệnh so với mức tối thiểu thống kê 192, tức khoảng bảy lần ngưỡng sàn, và điều đó vẫn không nói gì về việc regime kế tiếp có giống regime đã test hay không. Cỡ mẫu trả lời câu hỏi về may rủi, không trả lời câu hỏi về vùng khí hậu.
Master Volume Profile đã có track record thật chưa? Chưa, và mình sẽ không ám chỉ điều ngược lại. Mọi con số ở đây đều là backtest hoặc lần chạy xác nhận trên MetaTrader 5 với dữ liệu tick lịch sử, spread được mô hình hóa còn slippage, độ trễ và swap thì chưa, nên bạn nên kỳ vọng kết quả live mỏng hơn nghiên cứu. Trading luôn có rủi ro, bao gồm rủi ro thua lỗ.
Viết bởi 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 quantitative trading một cách công khai và công bố cả quá trình, gồm cả những lần bị bác bỏ.
Bài viết này được tổng hợp từ chuỗi build-log 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 track record thật. Hiệu suất quá khứ không đảm bảo kết quả tương lai.