OptiNod Academy
Quá tối ưu hóa - chỉ những thiết lập có vùng đỉnh phẳng mới trụ được khi giao dịch thực tế
Tham số tạo ra lợi nhuận cao nhất trong backtest thường chỉ là một đường cong được khớp với nhiễu của quá khứ. Chỉ những đường cong hiệu suất dạng cao nguyên, nơi các thiết lập lân cận cũng cho kết quả tốt, mới có khả năng trụ được khi giao dịch thực tế.
> Chỉ đường cong dạng cao nguyên, nơi *các thiết lập lân cận quanh đỉnh backtest cũng cho kết quả tốt*, mới ít bị sụp đổ khi đưa vào giao dịch thực tế.
Quá tối ưu hóa (Overfitting) là trạng thái các quy tắc và tham số của chiến lược được điều chỉnh quá mức để khớp với những biến động ngẫu nhiên trong dữ liệu quá khứ. Nếu chạy đủ nhiều tổ hợp trên cùng một bộ dữ liệu, gần như chiến lược nào cũng có thể tạo ra một đường cong backtest đẹp mắt. Cốt lõi của quá tối ưu hóa nằm ở chỗ: chỉ nhìn lợi nhuận backtest thì không thể phân biệt đường cong đó đang bắt được quy luật thật trong dữ liệu quá khứ, hay chỉ đang ghi nhớ nhiễu tình cờ đúng trong riêng giai đoạn đó.
Phần lớn trader dùng tối ưu hóa theo cách này: đặt một dải tham số rộng, chạy backtest hàng trăm lần, rồi chọn một tổ hợp có lợi nhuận cao nhất để đưa vào giao dịch thực tế. Họ so sánh đến từng chữ số thập phân của lợi nhuận backtest để tìm đỉnh, chẳng hạn RSI chu kỳ 14 tốt hơn hay 13 tốt hơn, đặt stop-loss 2% hay 2,3% tốt hơn. Giá trị tối ưu được chọn trong quá trình này đúng là thiết lập có lợi nhuận cao nhất trong giai đoạn quá khứ. Vấn đề là đỉnh đó thường lại là nơi sụp đổ đầu tiên trong thực chiến.
Điều bài viết này muốn nói rất đơn giản. Khi tối ưu hóa, thứ quan trọng nhất cần nhìn là hình dạng quanh đỉnh. Nếu chỉ dịch RSI từ 14 sang 13 hoặc 15 mà hiệu suất rơi như xuống vách đá, thì giá trị 14 chỉ là một giá trị tình cờ khớp chính xác với biến động đặc thù trong quá khứ. Ngược lại, nếu từ 12 đến 18 đều duy trì hiệu suất tương tự tốt, vùng đó là một khu vực vững chắc đã nắm bắt được cấu trúc thật của thị trường. Cùng nhìn vào lợi nhuận backtest, nhưng việc có nhìn cả các giá trị lân cận hay không sẽ quyết định kết quả khi giao dịch thực tế.

Đỉnh rất nguy hiểm khi nằm ở mép vách đá
Giả sử có hai tham số cùng tạo ra lợi nhuận backtest 200%. Một tham số là đỉnh nhọn, nơi các giá trị hai bên rơi xuống còn 50%. Tham số còn lại nằm giữa một vùng cao nguyên thoải, nơi hai bên vẫn giữ được 180%. Cách tối ưu hóa tiêu chuẩn thường xem hai kết quả này như nhau, vì đều là 200%. Nhưng khi giao dịch thực tế, kết quả của hai thiết lập sẽ đi theo hai hướng hoàn toàn trái ngược.
Lý do là dữ liệu tương lai luôn hơi khác dữ liệu quá khứ. Dù RSI chu kỳ 14 là đỉnh trong backtest, giá trong thực tế sẽ không di chuyển y hệt giai đoạn backtest. Nếu độ biến động tăng nhẹ hoặc tốc độ xu hướng thay đổi, giá trị tối ưu của quá khứ có thể dịch sang vị trí bên cạnh trong tương lai. Nếu bạn đang bám vào một đỉnh dạng vách đá, chỉ cần dịch một nấc là lợi nhuận 200% có thể rơi xuống 50%. Nếu bạn đang ở giữa cao nguyên, dịch một nấc vẫn còn nằm trong cao nguyên, nên hiệu suất được duy trì.
Các con số sau chỉ là ví dụ, nhưng khác biệt giữa dạng vách đá và dạng cao nguyên thường xuất hiện trong thực chiến theo cách này. Trong năm 2021, BTC bắt đầu quanh 29.000 USD và tăng lên khoảng 69.000 USD vào ngày 10 tháng 11. Nếu thu hẹp stop-loss và siết các tham số trend-following đến đúng đỉnh để khớp với một xu hướng tăng mạnh, backtest của giai đoạn đó sẽ rất đẹp. Nhưng sang năm 2022, thị trường sụp xuống vùng 17.000 USD vào tháng 6 sau chuỗi thanh lý Luna - 3AC, rồi tạo đáy khoảng 15.500 USD vào tháng 11 sau sự sụp đổ của FTX. Trong bối cảnh cả hướng xu hướng lẫn độ biến động đều đảo ngược, một thiết lập dạng vách đá được khớp với đỉnh của năm 2021 sẽ khiến lỗ lũy kế phình to chỉ sau vài tuần đầu. Đỉnh đó chỉ là đỉnh trong riêng trạng thái thị trường ấy.
Không được chọn thiết lập chỉ vì độ cao của đỉnh. Phải kiểm tra cả vùng quanh đỉnh đó phẳng đến mức nào.
Càng nhiều bậc tự do, chiến lược càng ghi nhớ nhiễu
Mỗi khi thêm một tham số hoặc một quy tắc vào chiến lược, số bậc tự do (Degrees of Freedom) tăng lên. Bậc tự do là số núm chỉnh mà chiến lược có thể dùng để tự điều chỉnh cho khớp với dữ liệu quá khứ. Càng nhiều núm chỉnh, chiến lược càng có thể được siết để khớp chính xác với gần như bất kỳ đường cong quá khứ nào; và cũng vì vậy, nó ghi nhớ cả quy luật thật lẫn nhiễu ngẫu nhiên mà không phân biệt được hai thứ đó.
Nguyên lý này giống nền tảng thống kê. Hai điểm có thể được nối chính xác bằng một đường thẳng; ba điểm có thể được nối chính xác bằng một đường cong bậc hai. Nếu tăng đủ nhiều tham số, bạn có thể vẽ một đường cong đi qua mọi giao dịch trong quá khứ, nhưng đường cong đó không giải thích được các điểm mới trong tương lai. Trong chiến lược, việc lần lượt thêm stop-loss, take-profit, bộ lọc vào lệnh, điều kiện khung giờ cũng giống như tăng bậc của đường cong. Càng nhiều quy tắc, hiệu suất in-sample thường càng đẹp hơn; nhưng trong phạm vi in-sample, không có cách nào xác định phần nào là quy luật thật và phần nào chỉ là nhiễu đã bị ghi nhớ.
Nếu một chiến lược có 5 quy tắc và một chiến lược có 15 quy tắc tạo ra cùng mức lợi nhuận trên cùng giai đoạn quá khứ, hãy chọn chiến lược 5 quy tắc. Cùng một hiệu suất nhưng được tạo ra với ít bậc tự do hơn nghĩa là chiến lược đó ít dựa vào may mắn hơn. Hiệu suất được xây bằng 15 quy tắc rất có khả năng chứa hơn một nửa là các phần thừa được khớp với nhiễu quá khứ. Đây là lý do chiến lược đơn giản thường sống lâu hơn trong giao dịch thực tế.
Đừng chỉ nhìn mỗi quy tắc mới thêm vào làm lợi nhuận in-sample tăng bao nhiêu. Trước hết hãy hỏi vì sao chiến lược nhất thiết phải có quy tắc đó.

Mẫu quá nhỏ thì chỉ chỉnh vài núm cũng đã quá tối ưu
Không thể đánh giá quá tối ưu chỉ bằng số lượng bậc tự do tuyệt đối. Phải nhìn cả tỷ lệ giữa số giao dịch mẫu và số tham số. Cùng là 5 tham số, một chiến lược có 1.000 giao dịch có thể vẫn chịu được, nhưng với chiến lược chỉ có 30 giao dịch, chỉ cần chỉnh 5 tham số đã rất dễ rơi thẳng vào quá tối ưu. Mẫu càng nhỏ, biến động ngẫu nhiên càng chiếm tỷ trọng lớn trong tổng hiệu suất, và càng dễ bị nhầm là tín hiệu thật.
Chiến lược có số giao dịch ít rất khó tin cậy về mặt thống kê. Điều này giống như không thể kết luận một đồng xu bị lệch về mặt ngửa chỉ vì tung 10 lần thì có 7 lần ra ngửa. Nếu 30 giao dịch cho ra tỷ lệ thắng 60%, khoảng tin cậy của mức 60% đó sẽ rộng xấp xỉ từ đầu ngưỡng 40% đến cuối ngưỡng 70%. Trong một khoảng rộng như vậy, chỉ cần thay đổi nhẹ tham số là tỷ lệ thắng có thể dao động mạnh; nếu chọn giá trị tối ưu theo dao động đó, 30 giao dịch tiếp theo sẽ không tái lập được kết quả.
Nếu backtest BTC trên khung ngày trong một năm, bạn chỉ có khoảng 365 nến. Với một chiến lược swing có thời gian nắm giữ trung bình 2 tuần, số giao dịch trong một năm chỉ quanh 20 lệnh. Nếu tối ưu đồng thời 5 tham số trên mẫu này, về thực chất bạn đang chỉnh một núm cho khoảng 4 giao dịch, nên việc xuất hiện ngẫu nhiên một thiết lập khớp chính xác với quá khứ là điều rất bình thường. Muốn tăng mẫu, hãy dùng giai đoạn quá khứ dài hơn, hoặc áp dụng cùng một chiến lược trên nhiều tài sản và cộng gộp số giao dịch. Nếu số giao dịch mẫu không lớn hơn số tham số hàng chục lần, đừng tin vào chính kết quả tối ưu hóa.
Trước khi chạy tối ưu hóa, hãy đếm xem có bao nhiêu giao dịch đã xảy ra.
In-sample càng đẹp càng phải nghi ngờ
Trái với trực giác, đường cong backtest càng mượt và càng đi lên đều, không có một lần sụt giảm đáng kể, chiến lược đó càng cần bị nghi ngờ. Thị trường thực luôn có những giai đoạn drawdown khó chịu. Nếu backtest vượt qua cả các đoạn drawdown đó một cách mượt mà, đây là tín hiệu rằng các quy tắc đã được khớp để né mọi giai đoạn giảm trong quá khứ. Vì các đợt giảm trong tương lai sẽ có hình dạng khác quá khứ, một thiết lập đã né được toàn bộ các cú giảm quá khứ có thể chịu tác động trực diện từ cú giảm đầu tiên trong tương lai.
Cái bẫy này thường hình thành trong quá trình liên tục thêm stop-loss, take-profit và bộ lọc để loại riêng các giao dịch lỗ trong quá khứ. Chạy backtest thấy một giao dịch lỗ khó chịu, bạn thêm một bộ lọc để né giao dịch đó; chạy lại, thấy một khoản lỗ khác, rồi thêm một điều kiện khác để né tiếp. Mỗi lần chạy lại, đường cong trở nên mượt hơn, nhưng phần lớn bộ lọc được thêm vào không có cơ sở nào ngoài mục tiêu né đúng một giao dịch quá khứ. Kết quả là chiến lược chỉ ghi nhớ danh sách những khoản lỗ từng xảy ra, trong khi vẫn không hiểu cấu trúc tạo ra thua lỗ.
Việc chạy hàng trăm tổ hợp trên cùng một bộ dữ liệu rồi chọn đỉnh cũng tạo ra kết quả tương tự. Nếu thử 1.000 tổ hợp, một vài tổ hợp trong số đó sẽ gần như đi qua giai đoạn quá khứ một cách hoàn hảo chỉ nhờ ngẫu nhiên. Chọn đỉnh trong nhóm đó chẳng khác nào chọn thiết lập may mắn nhất. Việc nhìn đi nhìn lại cùng một bộ dữ liệu để lọc ra đỉnh thường được gọi là data snooping; số tổ hợp được thử càng nhiều, xác suất xuất hiện một đỉnh ngẫu nhiên càng cao. Nếu đường cong đẹp đến mức phi thực tế, thường là vì bạn đã soi dữ liệu quá nhiều lần.
Một backtest không có drawdown không phải điều đáng khoe. Đó là điểm đầu tiên cần kiểm tra và nghi ngờ.

Dạng vách đá và dạng cao nguyên được phân biệt qua hiệu suất lân cận
Cách trực tiếp nhất để phân biệt một thiết lập vững chắc với một thiết lập quá tối ưu là nhìn cả các giá trị lân cận quanh giá trị tối ưu. Đừng chỉ ghi lợi nhuận của một giá trị tối ưu duy nhất; hãy lập bảng cả lợi nhuận của các giá trị hai bên để xem hình dạng. Nếu hình dạng là một đỉnh nhọn, đó là dạng vách đá; nếu là một ngọn đồi rộng, đó là dạng cao nguyên. Lặp lại quy trình này cho mọi tham số cốt lõi.
Lý do việc nhìn hiệu suất lân cận có hiệu quả là nó mô phỏng trước sự thay đổi trạng thái thị trường tương lai dưới dạng dịch chuyển trong không gian tham số. Một tương lai trong đó độ biến động tăng lên khiến tín hiệu RSI đến chậm một nhịp, khi nhìn qua backtest, sẽ tương tự việc giá trị tối ưu dịch từ chu kỳ 14 sang phía 16. Thiết lập dạng cao nguyên vẫn giữ hiệu suất ở chu kỳ 16 sẽ chịu được tương lai đó; thiết lập dạng vách đá, nơi hiệu suất tại chu kỳ 16 rơi xuống dưới một nửa, sẽ sụp đổ trong tương lai đó. Hiệu suất lân cận trở thành một chỉ báo thay thế để ước lượng độ bền vững trong tương lai mà không cần có dữ liệu tương lai.
Áp dụng các kiểm tra sau cho mọi tham số cốt lõi.
- [ ] Thiết lập vùng lân cận: Lấy giá trị tối ưu làm trung tâm, ghi lại hiệu suất backtest của tổng cộng 7 giá trị trên cùng giai đoạn, gồm 3 nấc mỗi bên. Ví dụ, nếu giá trị tối ưu là RSI chu kỳ 14, hãy xem hiệu suất của 11, 12, 13, 14, 15, 16, 17.
- [ ] Đánh giá cao nguyên: Nếu 5 giá trị ở giữa, gần giá trị tối ưu nhất trong 7 giá trị, tức 12-16, đều giữ được ít nhất 70% so với giá trị cao nhất, xem đó là dạng cao nguyên và có thể chọn.
- [ ] Loại bỏ vách đá: Nếu chỉ cần dịch một nấc khỏi giá trị tối ưu mà hiệu suất rơi xuống dưới một nửa giá trị cao nhất, hãy xem giá trị tối ưu đó là quá tối ưu và loại bỏ. Thay vào đó, chọn một giá trị khác nằm giữa cao nguyên.
- [ ] Kiểm tra đồng thời nhiều tham số: Nếu có từ hai tham số trở lên, đừng chỉ dịch chuyển một tham số. Hãy kiểm tra xem cao nguyên có còn duy trì trên lưới khi dịch chuyển đồng thời hai tham số hay không. Một dải đỉnh chỉ phẳng trên một trục thì không khác vách đá là mấy.
Hãy bỏ thói quen chỉ ghi lại đỉnh trong 7 giá trị. Phải ghi cả 7 giá trị để nhìn hình dạng.
Chia giai đoạn sẽ lọc ra những đường cong chỉ được ghi nhớ
Nếu hiệu suất lân cận là kiểm tra bằng cách dịch chuyển trong không gian tham số, thì chia giai đoạn là kiểm tra trên trục thời gian. Đừng tối ưu hóa toàn bộ dữ liệu quá khứ cùng một lúc. Hãy chọn tham số trên phần đầu, rồi kiểm chứng tham số đó trên phần sau. Phần đầu gọi là in-sample, phần sau gọi là out-of-sample. Nếu một thiết lập rất đẹp trong in-sample nhưng sụp đổ ở out-of-sample, thiết lập đó đã ghi nhớ dữ liệu phần đầu.
Cách chia này phát hiện quá tối ưu vì giai đoạn kiểm chứng được cách ly hoàn toàn khỏi quá trình tối ưu hóa. Nếu khi chọn tham số bạn chưa từng nhìn dữ liệu phần sau, hiệu suất ở phần sau sẽ cho thấy một cách trung thực tham số đó hoạt động ra sao trên dữ liệu lần đầu gặp. Nếu một lần chia chưa đủ, hãy mở rộng thành phân tích walk-forward, trong đó cửa sổ in-sample và out-of-sample được trượt dọc theo trục thời gian để kiểm chứng nhiều lần. Khi cộng dồn việc tham số chọn ở giai đoạn trước có còn dùng được ở giai đoạn tiếp theo hay không, bạn sẽ phân biệt được thiết lập chỉ tình cờ đúng một lần với thiết lập có tính nhất quán.
Thêm kiểm tra Monte Carlo sẽ giúp xác minh độ bền vững thêm một tầng nữa. Hãy xáo trộn ngẫu nhiên thứ tự các giao dịch trong backtest hàng nghìn lần, hoặc làm lệch ngẫu nhiên thời điểm vào lệnh vài ngày, rồi xem phân phối kết quả. Nếu chỉ đổi thứ tự giao dịch mà một số mô phỏng đã khiến tài khoản rơi vào mức drawdown khó chịu, đường cong mượt của backtest gốc đã dựa vào sự may mắn rằng các giao dịch xảy ra đúng theo một thứ tự thuận lợi. Nếu hiệu suất thay đổi mạnh khi thời điểm vào lệnh bị xê dịch vài ngày, chiến lược đó đang phụ thuộc quá mức vào một mức giá cụ thể trên một cây nến cụ thể. Với một chiến lược vững chắc, trung tâm của phân phối sẽ không dịch chuyển nhiều trước các nhiễu loạn ngẫu nhiên này.
Áp dụng ba kiểm tra theo thứ tự sau.
- [ ] Tỷ lệ chia giai đoạn: Dùng 70% đầu của toàn bộ giai đoạn quá khứ làm in-sample để chọn tham số, và 30% sau làm out-of-sample để kiểm chứng. Nếu hiệu suất out-of-sample rơi xuống dưới một nửa in-sample, xem đó là quá tối ưu và chọn lại tham số.
- [ ] Lặp walk-forward: Trượt cửa sổ in-sample và out-of-sample dọc theo trục thời gian ít nhất 5 lần, rồi kiểm tra liệu out-of-sample có tránh được thua lỗ trong 4 trên 5 giai đoạn hay không.
- [ ] Phân phối Monte Carlo: Xáo trộn ngẫu nhiên thứ tự giao dịch ít nhất 1.000 lần, rồi xem drawdown tại điểm xấu nhất 5% có nằm trong giới hạn tài khoản thực có thể chịu được hay không.
Kết quả tối ưu hóa toàn bộ dữ liệu một lần mà không chia giai đoạn không thể gọi là kiểm chứng. Nó gần giống tự chấm điểm bằng chính cùng một bộ dữ liệu. In-sample càng đẹp, càng phải kiểm định thêm bằng out-of-sample; chỉ những thiết lập chịu được cả hai mới nên được đưa vào giao dịch thực tế.
