Đi tới nội dung chính
Chuyển tới nội dung chính

Tối ưu và kiểm định độ vững

Chuyên nghiệp Một báo cáo backtest đẹp có thể đến từ một ý tưởng tốt — hoặc từ may mắn và từ việc chỉnh tham số cho khớp với quá khứ (quá khớp). Tab Độ vững của chiến lược giúp phân biệt hai trường hợp: Tối ưu tham số cho thấy cả vùng tham số chứ không chỉ một điểm đẹp, Kiểm định độ vững thử chiến lược trên dữ liệu nó chưa thấy, với chi phí cao hơn, khớp lệnh chậm hơn và trên hàng nghìn kịch bản giả định.

Ví dụ trong trang là mẫu Momentum 6-1 xoay vòng hàng tháng (ở thư viện mẫu: Mua 10 mã tăng mạnh nhất 6 tháng, đổi mỗi tháng), dữ liệu đến 15/10/2026.

Tab Độ vững trước khi chạy

① Mục tiêu của tối ưu — Tối đa Sharpe, Tối đa Lợi nhuận/năm, Tối đa Calmar, Tối đa Sortino.

② Tối ưu — chạy lưới tham số (sau lần đầu là Tối ưu lại).

③ Tham số quét (tối đa 2) — các tham số dạng số của chiến lược; mặc định chọn sẵn hai tham số đầu. Bấm để chọn / bỏ.

④ Kiểm định — chạy sáu phép kiểm tra độ vững (sau lần đầu là Chạy lại).

⑤ Số biến thể đã thử trong hội thoại — dùng để tính Deflated Sharpe.

Các phép thử chạy trong trình duyệt của bạn, song song trên tối đa 4 luồng (theo số nhân CPU của máy). Với dữ liệu đã tải, tối ưu 49 bộ tham số của Momentum 6-1 mất khoảng 4 giây, kiểm định khoảng 10 giây; chiến lược nặng hơn có thể mất vài phút (mỗi lượt tối đa 5 phút). Các lần chạy nội bộ của tối ưu, kiểm định không làm đổi kết quả đang xem và không tính vào số biến thể đã thử. Riêng khi chiến lược chưa có kết quả mới chạy (ví dụ vừa mở lại một kết quả đã lưu), Kiểm định chạy lại chiến lược một lần như bấm Chạy lại trước — lần đó được tính.

Tối ưu tham số​

  1. Chọn mục tiêu — thường là Sharpe (lợi nhuận trên rủi ro); Calmar khi bạn quan tâm nhất tới mức sụt giảm.
  2. Chọn tối đa 2 tham số cần quét. Chỉ tham số dạng số (số nguyên, số thực, phần trăm) quét được; các tham số khác giữ giá trị hiện tại.
  3. Bấm Tối ưu. Thanh tiến độ ghi Đã chạy n/N bộ tham số.

Studio chia đều khoảng giá trị khai báo của mỗi tham số (min–max trong code; không khai báo thì từ 0,5 tới 1,5 lần giá trị mặc định): 7 giá trị mỗi tham số khi quét hai tham số (49 bộ), 12 giá trị khi quét một tham số; tối đa 200 bộ. Bộ tốt nhất chỉ xét các bộ có từ 10 lệnh trở lên.

Kết quả tối ưu: chỉ số và bản đồ nhiệt

① Bộ tốt nhất — giá trị các tham số (theo thứ tự cột · hàng) và mục tiêu đạt được. Rê chuột để xem tên từng tham số.

② Deflated Sharpe — xác suất Sharpe của bộ tốt nhất thật sự lớn hơn 0 sau khi tính tới việc đã thử nhiều bộ: từ 95 % Khó là may mắn (xanh), 50–95 % Có thể do may mắn (vàng), dưới 50 % Nhiều khả năng do may mắn (đỏ).

③ Độ ổn định vùng tối ưu — mục tiêu trung bình của các ô kề ô tốt nhất ÷ mục tiêu của ô tốt nhất: từ 70 % là Vùng phẳng — bền (xanh); thấp hơn là Đỉnh nhọn — dễ quá khớp (vàng, dưới 40 % đỏ).

④ Đã thử — số bộ tham số, thời gian chạy (và số bộ lỗi, nếu có).

⑤ Ô tốt nhất — viền xanh.

⑥ Bản đồ nhiệt — mục tiêu theo tham số thứ nhất (cột) × tham số thứ hai (hàng); xanh là tốt hơn mức giữa của cả lưới, đỏ là kém hơn (mục tiêu Lợi nhuận/năm: xanh lãi, đỏ lỗ). Rê chuột lên ô để xem giá trị; bấm ô để áp dụng bộ tham số đó cho chiến lược (Studio chạy lại ngay).

Quét một tham số thì Studio vẽ biểu đồ đường mục tiêu theo giá trị tham số thay cho bản đồ nhiệt.

Mười bộ tham số tốt nhất

Bảng dưới bản đồ liệt kê 10 bộ tốt nhất theo mục tiêu, kèm LN/năm, Sharpe, Sụt giảm, Lệnh. ① Áp dụng — dùng bộ đó cho chiến lược (đổi tham số, không tạo phiên bản mới; bộ đang dùng ghi Đang dùng). Mỗi lần áp dụng là một lần chạy, được tính vào số biến thể đã thử.

Đọc kết quả tối ưu. Đừng hỏi "bộ nào tốt nhất?" mà hỏi "vùng nào tốt?". Ở Momentum 6-1, 49 bộ cho Sharpe từ 0,76 tới 1,13, phần lớn quanh 0,9–1,1: đà tăng đo bằng 92–188 phiên đều cho kết quả gần nhau, Độ ổn định vùng tối ưu 90 %. Bộ tốt nhất (124 phiên, bỏ 7 phiên gần nhất) chỉ nhỉnh hơn các ô bên cạnh — không đáng đổi khỏi tham số mặc định chỉ để lấy thêm 0,1 Sharpe. Một ô xanh đậm đứng giữa vùng đỏ thì ngược lại: kết quả đẹp nhiều khả năng là ngẫu nhiên.

Tối ưu cũng là một cách quá khớp

Chọn bộ tốt nhất trong 49 bộ luôn cho Sharpe cao hơn mức thật. Deflated Sharpe đã trừ phần đó; dù vậy, sau khi tối ưu hãy kiểm định độ vững với bộ đã chọn, và ưu tiên bộ nằm giữa vùng phẳng.

Chiến lược chưa có tham số số thì phần tối ưu ghi Chiến lược chưa khai báo tham số số (param.int / num / pct) — nhờ AI thêm tham số để tối ưu. Lỗi khi tối ưu hiện khung Không tối ưu được kèm lý do.

Kiểm định độ vững​

Bấm Kiểm định để chạy sáu phép thử với phiên bản mới nhất và tham số hiện tại: Ngoài mẫu 70/30 · walk-forward 4 đoạn · Monte Carlo 1.000 lần · phí ×2 · khớp trễ · theo xu hướng thị trường.

Kết quả kiểm định: điểm tổng, ngoài mẫu, độ nhạy chi phí

① Điểm tổng — số phép kiểm tra đạt / tổng số; vòng xanh khi đạt từ 80 %, vàng từ 50 %, đỏ khi thấp hơn.

② Từng phép kiểm tra — ✓ đạt, ✗ không đạt, ? không đủ dữ liệu để kết luận; dòng nhỏ là số liệu.

③ Nhờ Copilot nhận xét — gửi kết quả cho trợ lý Quant để nhận xét và đề xuất cách làm chiến lược bền hơn (xem Trợ lý Quant).

④ Trong mẫu / ngoài mẫu — xem bên dưới.

⑤ Độ nhạy chi phí & khớp lệnh — xem bên dưới.

Phép kiểm traĐạt khiTrả lời câu hỏi
Ngoài mẫu giữ được hiệu quảSharpe ngoài mẫu lớn hơn 0 và ít nhất bằng một nửa Sharpe trong mẫuÝ tưởng có còn hiệu quả ở giai đoạn sau không?
Walk-forward có lãi ổn địnhSharpe của đường vốn ghép các đoạn kiểm tra từ 0,5Nếu định kỳ chọn lại tham số mà không biết trước tương lai, có lãi không?
Chịu được phí gấp đôiLợi nhuận / năm vẫn dương khi phí giao dịch và trượt giá gấp đôiLãi có đủ dày để chịu chi phí thật cao hơn giả định?
Không phụ thuộc khớp lệnh sớmLợi nhuận / năm vẫn dương và ít nhất bằng một nửa bản gốc khi khớp trễ thêm 1 phiênLợi thế có biến mất khi bạn đặt lệnh chậm một nhịp?
Ít khả năng thua lỗ cả kỳDưới 20 % kịch bản Monte Carlo lỗ sau cả kỳKết quả có dựa vào đúng thứ tự các phiên may mắn?
Không chỉ là may mắnDeflated Sharpe từ 90 % với số biến thể đã thử trong hội thoạiKết quả có còn đứng vững khi tính tới số lần bạn đã thử?

Đạt cả sáu không có nghĩa chiến lược sẽ thắng trong tương lai; trượt một, hai phép là lý do để tìm hiểu, chưa phải để bỏ. Phần sau giải thích từng phép và cách đọc.

Trong mẫu / ngoài mẫu​

Studio chia kỳ kiểm tra tại phiên 70 %, chạy riêng phần đầu (Trong mẫu) và phần cuối (Ngoài mẫu) — mỗi phần bắt đầu từ tiền mặt — rồi so LN/năm, Sharpe, Sụt giảm, Lệnh.

Momentum 6-1 chia tại 19/07/2023: trong mẫu +18.7% mỗi năm, Sharpe 1.32; ngoài mẫu +6.3%, Sharpe 0.43 — vẫn lãi nhưng dưới một nửa, nên phép này không đạt. Ba năm gần đây khó hơn hẳn với chiến lược này; đó là thông tin quan trọng hơn mọi con số trung bình cả kỳ.

Ngoài mẫu chỉ thật sự là \"chưa thấy\" khi bạn xây chiến lược trên phần trong mẫu

Nếu bạn đã chỉnh điều kiện, tham số khi nhìn kết quả cả kỳ, phần ngoài mẫu đã gián tiếp ảnh hưởng tới lựa chọn của bạn. Khi đó hãy coi phép này là kiểm tra độ ổn định theo thời gian, và dựa nhiều hơn vào walk-forward.

Walk-forward​

Walk-forward mô phỏng cách bạn thật sự dùng một chiến lược: định kỳ chọn lại tham số bằng dữ liệu đã có, rồi giao dịch tiếp ở giai đoạn chưa biết.

  • 40 % đầu kỳ là dữ liệu chọn tham số ban đầu; phần còn lại chia thành 4 đoạn kiểm tra liền nhau.
  • Ở mỗi đoạn, Studio thử các bộ quanh tham số hiện tại — hai tham số số đầu, mỗi tham số × 0,7 / × 1 / × 1,3 (tối đa 9 bộ) — trên toàn bộ dữ liệu trước đoạn đó, chọn bộ có Sharpe cao nhất (ít nhất 5 lệnh), rồi chạy đoạn đó với bộ vừa chọn.
  • Ghép các đoạn kiểm tra thành một đường vốn: đó là kết quả bạn có được nếu làm đúng quy trình này mà không biết trước tương lai.
Monte Carlo và walk-forward

① Monte Carlo — xem bên dưới.

② Xác suất lỗ cả kỳ — tỷ lệ kịch bản Monte Carlo kết thúc dưới vốn ban đầu.

③ Walk-forward — đường vốn ghép các đoạn kiểm tra.

④ Tham số chọn — bộ tham số được chọn cho từng đoạn (tên tham số trong code), kèm LN/năm, Sharpe của đoạn đó.

Đọc walk-forward. Ở Momentum 6-1, đường vốn ghép có Sharpe 1.21, lợi nhuận +21.5% mỗi năm — nhưng đọc từng đoạn mới thấy rõ: đoạn 04/2020–12/2021 lãi +87.4% mỗi năm, hai đoạn giữa (12/2021–02/2025) gần như hoà, đoạn cuối +14.7%. Con số ghép đẹp chủ yếu nhờ một giai đoạn thị trường tăng mạnh. Điểm tốt: tham số được chọn gần như không đổi giữa các đoạn (lookback=126, skip 15–21) — tham số nhảy lung tung giữa các đoạn là dấu hiệu quá khớp.

Monte Carlo​

Studio lấy chuỗi lợi nhuận từng phiên của chiến lược, bốc ngẫu nhiên (có lặp lại) từng khối 20 phiên liền nhau rồi nối lại — giữ nhịp biến động ngắn hạn — để dựng 1.000 đường vốn giả định cùng độ dài, rồi đo phân bố kết quả. Cách bốc cố định nên chạy lại cho cùng kết quả.

Số đoNghĩa
LN/năm trung vị (dòng phụ 5%, 95%)Lợi nhuận mỗi năm của kịch bản giữa, kịch bản xấu (5 % kịch bản tệ hơn) và kịch bản tốt
Sụt giảm trung vị (dòng phụ Xấu (5%))Mức sụt giảm tối đa thường gặp, và mức bạn nên chuẩn bị tinh thần
Xác suất lỗ cả kỳXanh dưới 10 %, vàng 10–30 %, đỏ trên 30 %
Biểu đồTrung vị và Dải 5–95% của đường vốn qua thời gian

Momentum 6-1: lợi nhuận trung vị +14.7% mỗi năm (kịch bản xấu +6.0%), sụt giảm trung vị -27.4%, kịch bản xấu -43.7%, xác suất lỗ 0.4%. Nghĩa là mức sụt giảm -25.7% trong báo cáo chỉ là một kịch bản đã xảy ra — hãy chuẩn bị cho mức quanh -40 %. Monte Carlo chỉ xáo trộn những phiên đã có: nó không tạo ra tình huống thị trường chưa từng xảy ra, nên không thay được walk-forward.

Độ nhạy chi phí và khớp lệnh​

DòngChạy lại với
GốcGiả định của lần chạy (theo Cài đặt)
Phí & trượt giá ×2Phí giao dịch và trượt giá gấp đôi (thuế bán giữ nguyên)
Khớp trễ thêm 1 phiênLệnh khớp chậm thêm một phiên so với giả định (ví dụ giá mở cửa hai phiên sau tín hiệu)

Momentum 6-1 giảm từ +14.8% xuống +12.5% mỗi năm khi phí gấp đôi, và gần như không đổi khi khớp trễ (+15.0%): lợi thế nằm ở xu hướng nhiều tháng, không nằm ở việc khớp đúng phiên. Chiến lược giao dịch dày (vòng quay cao) nhạy với phí; chiến lược ăn biến động ngắn hạn nhạy với khớp trễ — kết quả sụt mạnh khi trễ một phiên nghĩa là ngoài đời rất khó đạt.

Theo xu hướng thị trường​

Hiệu quả theo xu hướng thị trường

Studio chia các phiên theo VNINDEX đang trên hay dưới đường trung bình 200 phiên (xác định bằng dữ liệu tới phiên trước, không nhìn trước), rồi tính Tỷ lệ thời gian, LN/năm chiến lược, LN/năm chỉ số và Sharpe cho từng trạng thái. Phép này không chấm đạt / không đạt mà cho biết chiến lược kiếm tiền khi nào: Momentum 6-1 lãi +23.5% mỗi năm khi thị trường trên MA200 (chỉ số +15.2%), và gần như đứng yên khi thị trường dưới MA200 (-1.6%, chỉ số -1.7%) — đúng như thiết kế nghỉ khi thị trường yếu.

Deflated Sharpe​

Thử càng nhiều biến thể rồi giữ bản đẹp nhất, Sharpe của bản đó càng bị thổi phồng — kể cả khi không biến thể nào thật sự có lợi thế. Deflated Sharpe (Bailey và López de Prado) là xác suất Sharpe thật sự lớn hơn mức Sharpe cao nhất bạn có thể gặp do may mắn sau N lần thử:

SR* = √V × ((1 − γ) × Φ⁻¹(1 − 1/N) + γ × Φ⁻¹(1 − 1/(N × e)))
Deflated Sharpe = PSR so với SR* (xem PSR ở Đọc báo cáo backtest)

N: số lần thử; V: phương sai của Sharpe giữa các lần thử (khi tối ưu) hoặc phương sai ước lượng của chính Sharpe (khi kiểm định);
γ ≈ 0,5772 (hằng số Euler–Mascheroni); Φ⁻¹: hàm ngược của phân phối chuẩn; Sharpe tính theo phiên
Ở đâuN là
Deflated Sharpe khi tối ưuSố bộ tham số đã thử (có từ 10 lệnh)
Phép Không chỉ là may mắn khi kiểm định; lý do Deflated Sharpe x% ở khung độ tin cậy của báo cáoSố biến thể đã thử trong hội thoại
Thẻ kết quả của trợ lý Quant (DSR · n lần thử)Như trên

Số biến thể đã thử là số lần chạy chiến lược trong cùng một hội thoại: mỗi lần bấm Chạy lại, kéo tham số, Áp dụng một bộ, hay trợ lý chạy một biến thể đều tính một lần; các lần chạy nội bộ của tối ưu, kiểm định không tính. Hội thoại mới bắt đầu đếm lại — nhưng mở hội thoại mới chỉ để "xoá" số lần thử là tự lừa mình: con số đó đo chính quá trình nghiên cứu của bạn.

Mốc đọc: từ 95 % là khó do may mắn; 50–95 % là có thể do may mắn; dưới 50 % là nhiều khả năng do may mắn. Phép kiểm định đạt từ 90 %. Xem thêm PSR.

Dấu hiệu quá khớp​

  • Sharpe trên 2–3, profit factor trên 3 với ít lệnh (xem mốc tham khảo).
  • Bản đồ nhiệt có một ô xanh đậm giữa vùng đỏ; Độ ổn định vùng tối ưu dưới 40 %.
  • Ngoài mẫu còn dưới một nửa trong mẫu; các đoạn walk-forward lỗ, hoặc tham số được chọn nhảy lung tung giữa các đoạn.
  • Lợi nhuận dồn vào một năm, vài mã (xem Lợi nhuận theo năm, Lệnh theo mã).
  • Kết quả sụt mạnh khi phí gấp đôi hay khớp trễ một phiên.
  • Nhiều điều kiện, nhiều tham số lẻ (RSI 27 thay vì 30, MA 43 thay vì 50) mà không có lý do kinh tế.
  • Deflated Sharpe thấp sau nhiều lần thử trong hội thoại.

Quy trình kiểm chứng một ý tưởng​

  1. Viết giả thuyết trước khi chạy — quy tắc rõ ràng và lý do nó nên hiệu quả ở thị trường Việt Nam (dòng tiền, hành vi nhà đầu tư, đặc điểm T+2, biên độ…).
  2. Chạy với tham số "tự nhiên" (số tròn, phổ biến) và đọc báo cáo theo sáu câu hỏi.
  3. Tối ưu 1–2 tham số chính để xem vùng; chọn bộ ở giữa vùng phẳng, không chọn ô đẹp nhất.
  4. Kiểm định độ vững với bộ đã chọn; đọc kỹ ngoài mẫu và từng đoạn walk-forward, không chỉ điểm tổng.
  5. So với phương án đơn giản — mua và giữ chỉ số cùng kỳ: chiến lược phức tạp hơn phải bù được công sức và rủi ro.
  6. Theo dõi trước khi dùng tiền — chạy lại sau mỗi tháng để xem kết quả mới có nằm trong vùng Monte Carlo dự kiến không.
  7. Đặt trước điều kiện dừng — ví dụ sụt giảm vượt mức xấu (5 %) của Monte Carlo thì dừng lại xem xét, thay vì quyết định giữa lúc đang lỗ.

Trợ lý Quant làm được các bước này ngay trong khung Copilot — "tối ưu ngưỡng RSI", "kiểm định độ vững chiến lược này" — xem Trợ lý Quant.

Gói hội viên​

Tối ưu và kiểm định độ vững cần gói Chuyên nghiệp trở lên. Ở gói Thiết yếu, tab Độ vững vẫn hiện nhưng thay bằng khung Tối ưu & kiểm định độ vững kèm nút Nâng cấp. Bảng đầy đủ ở Gói, giới hạn và hỏi đáp.