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

Bài 11 — Tối ưu tham số và tránh quá khớp

Bạn sẽ học: dùng thẻ Tối ưu và Walk-forward để chọn tham số, đọc bản đồ nhiệt, độ phẳng, Deflated Sharpe, và các nguyên tắc để chiến lược không chỉ "đẹp trên quá khứ".

11.1. Quá khớp là gì​

Thử đủ nhiều tổ hợp tham số trên cùng một đoạn lịch sử, kiểu gì cũng có một tổ hợp cho kết quả rất đẹp — vì nó khớp với nhiễu của đúng đoạn đó, không phải vì nó nắm được quy luật. Sang dữ liệu mới, kết quả sụp đổ. Đó là quá khớp (overfitting).

Dấu hiệu:

  • Tham số tốt nhất là một "đỉnh nhọn": đổi EMA 23 thành 22 hay 25 là lợi nhuận mất hẳn.
  • Kết quả trong mẫu (đoạn dùng để chọn tham số) tốt hơn hẳn ngoài mẫu (đoạn chưa nhìn thấy).
  • Chiến lược có nhiều điều kiện, nhiều tham số, mà ít giao dịch.

11.2. Viết chiến lược để tối ưu được​

Thẻ Tối ưu quét các tham số số (param.int, param.num, param.pct) trong khoảng min–max của chúng. Chuẩn bị:

  • Chỉ để 1–3 tham số quan trọng là tham số; số còn lại để cố định trong mã.
  • Đặt min / max hợp lý theo ý nghĩa (EMA nhanh 5–40, không phải 1–500).
  • max cũng quyết định đoạn khởi động: mọi tổ hợp chấm trên cùng khoảng nến, bắt đầu sau đoạn khởi động của tổ hợp có chu kỳ dài nhất (EMA cần khoảng 20 × chu kỳ nến). EMA chậm tới 300 cần khoảng 6.000 nến — nhiều hơn cả lịch sử của phần lớn mã, nên gần như không còn nến để chấm. Giữ max vừa lịch sử của mã.
  • Hai tham số số đầu tiên được chọn sẵn làm hai trục — xếp chúng lên đầu params.
strategy({
name: "EMA nhanh / chậm để tối ưu",
params: {
fast: param.int(20, { min: 5, max: 40, label: "EMA nhanh" }),
slow: param.int(60, { min: 40, max: 160, label: "EMA chậm" }),
sl: param.pct(0.08, { min: 0.04, max: 0.15, label: "Dừng lỗ" }),
},
signals: (d, p) => {
const f = ta.ema(d.close, p.fast);
const s = ta.ema(d.close, p.slow);
return { entry: f.crossAbove(s), exit: f.crossBelow(s) };
},
risk: (p) => ({ stopLoss: p.sl }),
plot: (d, p) => ({
"EMA nhanh": line(ta.ema(d.close, p.fast), { color: "accent" }),
"EMA chậm": line(ta.ema(d.close, p.slow), { color: "ref" }),
}),
});

11.3. Chạy tối ưu và đọc bản đồ nhiệt​

  1. Thêm chiến lược vào biểu đồ và chạy kiểm thử chính trước (thẻ Tổng quan) — tối ưu chạy trên cùng nến của biểu đồ, cùng kỳ, phí, luật khớp với lần kiểm thử này.
  2. Thẻ Tối ưu › chọn Trục ngang, Trục dọc › Chạy tối ưu (theo Sharpe). Mỗi trục chia khoảng min–max thành 7 mức (một trục thì 12 mức), tối đa 49 tổ hợp.
  3. Đọc kết quả:

Bản đồ nhiệt Sharpe theo EMA nhanh × EMA chậm

Bạn thấyNghĩa
Vùng xanh rộng, liềnChiến lược ổn với nhiều tổ hợp — tốt
Một ô xanh lẻ giữa vùng đỏĐỉnh nhọn, gần như chắc chắn là may
Độ phẳng gần 1Các ô kề ô tốt nhất cũng tốt gần bằng — "cao nguyên" ổn định
Độ phẳng thấp (dưới 0,5)Ô tốt nhất đứng một mình — đừng chọn nó
Deflated Sharpe cao (trên 0,9)Sharpe dương vẫn đứng vững sau khi trừ hiệu ứng "thử nhiều tổ hợp"
Deflated Sharpe thấpKết quả tốt nhất có thể chỉ do thử nhiều

Nên chọn ô ở giữa vùng xanh rộng, không nhất thiết ô có Sharpe cao nhất. Bấm một ô để dùng tổ hợp đó, Áp dụng bộ tốt nhất, hoặc Áp dụng vùng ổn định (…) — ô có Sharpe trung bình các ô lân cận cao nhất, tức tâm của cao nguyên.

Số của Tối ưu có thể khác Tổng quan

Mọi tổ hợp chấm trên cùng khoảng nến, bắt đầu sau đoạn khởi động dài nhất của lưới, nên khoảng chấm có thể ngắn hơn thẻ Tổng quan; tối ưu cũng chưa dùng kính lúp nến 1 phút. So các tổ hợp với nhau trong thẻ Tối ưu; con số cuối cùng hãy đọc ở Tổng quan sau khi áp tham số và chạy lại kiểm thử.

11.4. Walk-forward và ngoài mẫu​

Thẻ Walk-forward › Chạy walk-forward: chia các phiên thành 4 đoạn kiểm (40 % đầu chỉ để huấn luyện). Ở mỗi bước, tối ưu trên toàn bộ phần trước (cùng lưới như thẻ Tối ưu), rồi kiểm trên đoạn ngay sau bằng tham số vừa chọn; nối các đoạn kiểm thành kết quả ngoài mẫu. Đây là mô phỏng gần nhất của việc "định kỳ chọn lại tham số rồi giao dịch tiếp".

Kết quảKết luận
Ngoài mẫu ghép lại có lãi, Hiệu quả walk-forward từ 0,6 (nhãn Quá khớp thấp)Chiến lược đáng theo dõi tiếp
Hiệu quả dưới 0,3 (Quá khớp cao): ngoài mẫu kém xa trong mẫuTham số quá khớp với đoạn đã tối ưu
Ngoài mẫu lỗ dù tối ưu đẹpChiến lược không có lợi thế thật
Tham số chọn ở các đoạn nhảy lung tungKhông có vùng tham số ổn định
Đoạn kiểm có rất ít LệnhMẫu quá nhỏ để kết luận

Hiệu quả walk-forward = CAGR ngoài mẫu bình quân ÷ CAGR trong mẫu bình quân của bộ đã chọn. Lịch sử quá ngắn so với đoạn khởi động thì thẻ báo Quá ít phiên cho walk-forward 4 đoạn (… phiên) — hạ max của tham số hoặc dùng khung có nhiều nến hơn.

Walk-forward của chiến lược ở 11.2 trên FPT: 4 đoạn kiểm ngoài mẫu

11.5. Mười nguyên tắc chống quá khớp​

  1. Có lý do trước khi có mã. Viết một câu vì sao chiến lược nên có lãi (xu hướng kéo dài, hồi về trung bình sau bán tháo…).
  2. Ít tham số. Mỗi tham số thêm vào là thêm một cách để khớp nhiễu.
  3. Chọn cao nguyên, không chọn đỉnh trên bản đồ nhiệt.
  4. Giữ lại dữ liệu chưa nhìn: luôn xem ngoài mẫu / walk-forward trước khi tin.
  5. Kiểm trên nhiều mã — một mã là một mẫu thử; cả rổ trong Quant AI Studio mới là bằng chứng.
  6. Kiểm trên nhiều giai đoạn: thị trường tăng, giảm, đi ngang.
  7. Đủ giao dịch (≥ 30, càng nhiều càng tốt).
  8. Phí và trượt giá thực tế, thậm chí cao hơn thực tế một chút.
  9. Đừng sửa chiến lược để "né" một khoản lỗ cụ thể trong quá khứ — đó là khớp theo nhiễu.
  10. Giao dịch thử bằng giấy (theo dõi tín hiệu thật trên biểu đồ, cảnh báo) một thời gian trước khi dùng tiền thật.

11.6. Khai báo tối ưu cho Quant AI Studio​

Khi chiến lược được mở sang Quant AI Studio, mục optimize của mã quy định cách tối ưu ở đó (mục tiêu, lưới, các phép kiểm độ vững). Bảng kiểm thử trên biểu đồ không đọc mục này — nó dùng min / max của tham số như trên.

strategy({
name: "Donchian bứt phá — khai báo tối ưu",
params: {
n: param.int(55, { min: 20, max: 120, label: "Đỉnh n phiên" }),
exitN: param.int(20, { min: 10, max: 60, label: "Đáy thoát" }),
},
signals: (d, p) => ({
entry: d.close.gt(d.high.highest(p.n).shift(1)),
exit: d.close.lt(d.low.lowest(p.exitN).shift(1)),
}),
risk: { stopLoss: 0.1 },
optimize: {
objective: "calmar",
grid: { n: [40, 55, 70, 90], exitN: [10, 20, 30] },
tests: ["oos", "walkforward", "costs"],
},
});

Chi tiết các phép kiểm độ vững của Studio: Tối ưu và kiểm định độ vững.

Tiếp theo: Bài 12 — Lọc cả thị trường và Quant AI Studio