Logo FinLensFinLens Docs

Cập nhật FinLens MCP: trailing stop và walk-forward

Cập nhật nhóm công cụ phân tích kỹ thuật FinLens MCP: cắt lỗ theo đỉnh, giữ tối đa N phiên, kiểm định walk-forward và báo cáo tái cân bằng minh bạch.

⏱ Đọc 10 phút · 🟡 Trung bình · 🔧 Yêu cầu: FinLens Premium

Trang này ghi lại những thay đổi của nhóm công cụ báo cáo tài chính gốc, phân tích kỹ thuật, backtest và danh mục trong FinLens MCP. Mỗi mục được gắn một trong hai nhãn:

  • Tính năng mới — thứ trước đây không làm được, giờ làm được. Đọc để biết có gì thêm vào dùng.
  • Nâng cấp & sửa lỗi — thứ vẫn chạy như cũ nhưng nay cho ra số khác trước. Nếu bạn đã lưu kết quả cũ hoặc đã dựng kết luận trên đó, đọc mục này trước khi so sánh tiếp.

Bảng tóm tắt thay đổi

Thay đổiNhãnCông cụ
Cắt lỗ theo đỉnh: tsl_stop, tsl_thTính năng mớisignals_backtest
Giữ tối đa N phiên rồi thoát: td_stopTính năng mớisignals_backtest
Chọn mô hình khớp khi stop kích hoạt: stop_exit_priceTính năng mớisignals_backtest
Kiểm định walk-forward nhiều fold: walk_forwardTính năng mớisignals_optimize
Tối ưu tham số dưới chính sách rủi ro cố địnhTính năng mớisignals_optimize
Kết quả ghi lại đủ cấu hình đã chạyNâng cấpsignals_backtest, signals_optimize
Số lệnh và tỷ lệ thắng trong kết quả tối ưuSửa lỗisignals_optimize
Tối ưu và backtest cho số khớp nhauNâng cấpsignals_optimize
Nói rõ kỳ tái cân bằng nào bị bỏSửa lỗiportfolio_backtest
Đọc nguyên văn báo cáo tài chính và thuyết minhTính năng mới7 công cụ filings_*
Thẩm định trỏ sang đúng thuyết minh cần đọc: filing_checkTính năng mớifundamental_quality_scan

Tính năng mới

Đọc nguyên văn báo cáo tài chính và thuyết minh

Giờ AI đọc được chính báo cáo tài chính doanh nghiệp đã công bố, không chỉ số liệu đã chuẩn hoá: ba báo cáo chính, toàn bộ thuyết minh, báo cáo kiểm toán và thông tin chung, mỗi câu trả lời kèm mã, kỳ và số trang để mở ra kiểm lại. Đây là chỗ trả lời được những câu số liệu chuẩn hoá không có: vay ngân hàng nào, thế chấp tài sản gì, giao dịch với bên liên quan nào, kiểm toán viên kết luận ra sao.

Nhóm gồm 7 công cụ: filings_list_documents (mã nào, kỳ nào đã có), filings_list_sections (mục lục), filings_search (tìm theo câu hỏi), filings_topic_evidence (tìm theo 26 chủ đề phân tích, gồm 3 chủ đề riêng cho bảo hiểm), filings_read_section và filings_get_tables (đọc trọn một mục ở dạng văn bản hoặc bảng có cấu trúc), và filings_read_pages (đọc lại từng trang kèm cờ kiểm tra tự động). Tại thời điểm viết, kho có khoảng 600 mã.

💬 Vay ai, thế chấp gì

HPG đang vay những ngân hàng nào, lãi suất bao nhiêu và thế chấp tài sản gì? Trích dẫn số trang.

→ filings_topic_evidence(ticker="HPG", topics=["borrowings", "commitments_contingencies"])

Hướng dẫn đầy đủ, gồm cách đọc nhãn chất lượng và năm điều dễ đọc sai, ở bài Đọc nguyên văn báo cáo tài chính và thuyết minh.

Thẩm định chất lượng trỏ thẳng sang thuyết minh cần đọc

Công cụ fundamental_quality_scan nay trả thêm khối filing_check: báo cáo gốc của kỳ nào đã được số hoá, và một lời gọi filings_topic_evidence viết sẵn cho đúng các chủ đề đứng sau những mục đang có cảnh báo — luôn gồm ý kiến kiểm toán và bên liên quan. Điểm số và các mục thẩm định không đổi; khối mới chỉ là con trỏ, không chứa nội dung báo cáo. Người dùng gói Pro vẫn thấy khối này; đọc báo cáo gốc cần gói Premium.

💬 Từ cảnh báo sang báo cáo gốc

Thẩm định chất lượng tài chính MSN, rồi đọc báo cáo gốc cho những mục có cảnh báo.

→ fundamental_quality_scan(ticker="MSN") → chạy lời gọi trong filing_check

Cắt lỗ theo đỉnh — đo từ đỉnh đã đạt, không phải từ giá vào

Giờ bạn kiểm chứng được kiểu thoát "để lãi chạy nhưng không trả lại quá nhiều". Tham số tsl_stop thoát khi giá giảm bao nhiêu phần trăm khỏi đỉnh đạt được kể từ lúc mua — khác sl_stop vốn luôn đo từ giá vào. Đặt tsl_stop=0.08 nghĩa là thoát khi giá rời đỉnh 8%, và đỉnh được cập nhật theo giá cao trong phiên.

Tham số tsl_th là ngưỡng kích hoạt: chỉ bắt đầu trail sau khi đã lãi quá mức này. Ghép tsl_th=0.1 với tsl_stop=0.08 đọc đúng là "lãi 10% mới bắt đầu trail 8%" — trước khi đạt 10% thì trailing chưa có tác dụng. tsl_th chỉ dùng kèm tsl_stop.

💬 So cắt lỗ cố định với cắt lỗ theo đỉnh

Backtest MA20 cross trên HPG 5 năm theo hai cách: một là cắt lỗ 7% từ giá vào, hai là cắt lỗ theo đỉnh 8% — cách nào giữ được lợi nhuận tốt hơn và thoát sớm hơn?

→ 2 lần signals_backtest: sl_stop=0.07 so với tsl_stop=0.08, so tổng lợi nhuận và số lệnh

💬 Chỉ trail sau khi đã có lãi

Backtest HPG với chiến lược MA20 cross: lãi 10% mới bắt đầu trail 8% khỏi đỉnh — số lệnh và tỷ lệ thắng thay đổi thế nào so với trail ngay từ đầu?

→ signals_backtest: tsl_stop=0.08 kèm tsl_th=0.1, so với tsl_stop=0.08 không ngưỡng

Giữ tối đa bao nhiêu phiên rồi thoát bất kể lãi lỗ

Tham số td_stop trả lời câu hỏi rất thực tế: "nếu tôi không để một vị thế quá 20 phiên thì chiến lược này còn ăn không". Đặt td_stop=20 là thoát sau tối đa 20 phiên bất kể đang lãi hay lỗ.

Đếm theo phiên giao dịch, không phải ngày lịch — 20 phiên là khoảng một tháng dương lịch, không phải 20 ngày. Giá trị td_stop phải lớn hơn t_plus.

💬 Giới hạn thời gian nắm giữ

Backtest RSI(14) dưới 30 mua, trên 70 bán trên HPG 5 năm, nhưng giữ tối đa 20 phiên rồi thoát bất kể lãi lỗ — kết quả còn tốt không, và trung bình mỗi lệnh giữ bao lâu?

→ signals_backtest: td_stop=20, đọc thêm số ngày nắm giữ trung bình trong kết quả

Chọn mô hình khớp khi stop kích hoạt

Tham số stop_exit_price có hai giá trị, tả hai cách giao dịch khác nhau:

Giá trịNghĩa là bạn giao dịch thế nàoKhớp ở đâu
"stop" (mặc định)Có đặt lệnh stop chờ sẵn trên thị trườngKhớp ở mức stop khi bị xuyên trong phiên; khớp ở giá mở cửa nếu phiên mở gap qua mức đó
"close"Không có lệnh chờ, chỉ hành động theo giá đóng cửaThoát ở giá đóng cửa của phiên kích hoạt, nên tránh được cú nhúng trong phiên

Không chế độ nào thận trọng hơn chế độ nào

Hai chế độ mô tả hai kiểu đặt lệnh, không phải một kiểu lạc quan và một kiểu bảo thủ. Hãy chọn theo cách bạn giao dịch thật rồi giữ nguyên. Vì chúng cho kết quả lệch nhau đáng kể, đừng so sánh số của chế độ này với số của chế độ kia rồi kết luận chiến lược tốt lên hay xấu đi.

Đo trên một ví dụ để thấy độ lệch: HPG, mua khi giá cắt lên MA20 và bán khi cắt xuống, từ 02/01/2019 đến 10/11/2026, cắt lỗ 7% kèm trailing 8%, phí mặc định. Chế độ "stop" cho tổng lợi nhuận 91,74%, chế độ "close" cho 109,74% — cùng 111 lệnh, cùng tỷ lệ thắng 26,13%. Chênh 18 điểm phần trăm chỉ do mô hình khớp.

Kiểm định walk-forward — phép thử nghiêm hơn chia train/test một lần

Tham số walk_forward nhận số fold (2–6, mặc định tắt). Mỗi fold chọn lại tham số chỉ từ dữ liệu tính đến mốc của fold đó rồi đo trên đoạn ngay sau, nên không fold nào được biết trước tương lai của mình.

Nhờ vậy nó trả lời được câu "nếu tôi tái tối ưu định kỳ trong quá khứ thì kết quả ngoài mẫu ra sao", thay vì câu "tham số tốt nhất của một đoạn duy nhất là gì" — câu thứ hai gần như luôn cho ra số đẹp. Kết quả cho biết có bao nhiêu bộ tham số khác nhau từng thắng, bộ nào thắng nhiều fold nhất, và bao nhiêu fold có kết quả ngoài mẫu dương.

💬 Kiểm định walk-forward

Tối ưu tham số MA cho chiến lược cross trên HPG với lưới 10/20/50/100, dùng 15 năm dữ liệu và kiểm định walk-forward 4 fold — tham số có ổn định qua các fold không, và bao nhiêu fold dương ngoài mẫu?

→ signals_optimize: walk_forward=4, years=15 — đọc số bộ tham số từng thắng và số fold dương

Cách đọc kết quả, qua một ví dụ đo được. HPG, lưới MA 10/20/50/100, 15 năm dữ liệu, 4 fold, đo ngày 10/11/2026: window=50 thắng cả 4 fold — tham số rất ổn định. Nhưng kết quả ngoài mẫu của chính 4 fold đó trải từ +16,95% xuống −29,43%, và fold cuối có tỷ lệ thắng 0%.

Tức là tham số ổn định và chiến lược đáng tin là hai chuyện khác nhau. Cách chia train/test một lần không phân biệt được hai chuyện đó; walk-forward thì có.

Walk-forward cần lịch sử dài

Cùng lưới trên nhưng chỉ đưa 8 năm dữ liệu thì công cụ từ chối chạy walk-forward và nói rõ trong ghi chú rằng đoạn sau mốc chia không đủ số cửa sổ kiểm tra — nó không âm thầm bỏ qua rồi trả về như thường. Gặp trường hợp đó, kéo dài số năm, giảm tỷ lệ train hoặc giảm số fold.

Tối ưu tham số dưới chính sách rủi ro mình sẽ dùng thật

Nhóm sl_stop / tp_stop / tsl_stop / tsl_th / td_stop / stop_exit_price giờ dùng được trong signals_optimize, và áp y như nhau cho mọi tổ hợp trong lưới.

Các mức này không được tối ưu — chúng là chính sách rủi ro do bạn chọn, không phải biến để máy dò. Nếu để máy dò cả mức cắt lỗ, bạn sẽ nhận được mức cắt lỗ khớp hoàn hảo với quá khứ và vô dụng ở hiện tại.

Vì sao đáng dùng: cùng lưới MA 10/20/50/100 trên HPG 8 năm, đo ngày 10/11/2026. Khi không áp stop nào, window=50 đứng đầu. Khi áp cắt lỗ 7% kèm trailing 8% và giữ tối đa 25 phiên, window=10 lên đầu còn window=50 tụt xuống thứ ba. Tối ưu mà không áp chính sách rủi ro mình sẽ dùng thật thì chọn sai tham số — không phải sai một chút, mà chọn hẳn tổ hợp khác.

💬 Tối ưu dưới chính sách rủi ro cố định

Tối ưu tham số MA cho chiến lược cross trên HPG 8 năm với lưới 10/20/50/100, áp cho mọi tổ hợp: cắt lỗ 7%, trailing 8%, giữ tối đa 25 phiên — tổ hợp nào đứng đầu? So với khi không áp stop thì khác gì?

→ 2 lần signals_optimize: một lần trần, một lần với sl_stop=0.07 + tsl_stop=0.08 + td_stop=25

Nâng cấp & sửa lỗi

Nói rõ kỳ tái cân bằng nào bị bỏ

Đây là mục đổi số liệu, không phải đổi tính năng. Ở chế độ tái tối ưu định kỳ, portfolio_backtest trước đây âm thầm bỏ những kỳ tái cân bằng không giải ra được tỷ trọng: ngày đó danh mục không tái cân bằng, giữ nguyên tỷ trọng kỳ trước, và công cụ không hề nói ra. Bạn tưởng mình đã tái cân bằng đủ số kỳ, thực tế ít hơn.

Giờ kết quả ghi rõ ba thứ: số kỳ theo kế hoạch, số kỳ thực sự diễn ra, và ngày của từng kỳ bị bỏ, kèm một dòng ghi chú giải thích vì sao.

Đo trên một ví dụ: rổ 8 mã vốn hóa lớn, 5 năm, tái cân bằng hàng tháng theo Max Sharpe, đo ngày 10/11/2026 — 59 kỳ theo kế hoạch, 56 kỳ thực sự diễn ra, 3 kỳ bị bỏ. Lý do thường gặp là kỳ đó không mã nào có lợi suất kỳ vọng vượt lãi suất phi rủi ro, nên bài toán phân bổ không có nghiệm.

💬 Kiểm xem danh mục có thật sự tái cân bằng đủ kỳ

Backtest danh mục 8 mã theo Max Sharpe, 5 năm, tái cân bằng hàng tháng — có bao nhiêu kỳ theo kế hoạch, bao nhiêu kỳ thực sự tái cân bằng được, và những kỳ nào bị bỏ?

→ portfolio_backtest chế độ tái tối ưu — đọc số kỳ theo kế hoạch, số kỳ đã áp dụng và danh sách kỳ bị bỏ

Số lệnh và tỷ lệ thắng trong kết quả tối ưu

Trước đây signals_optimize luôn báo số lệnh bằng 0 và tỷ lệ thắng trống ở mọi tổ hợp. Hệ quả tệ hơn con số trống: cảnh báo quá khớp có một điều kiện là "số lệnh dưới 5", nên nó bật cho mọi dòng và thành vô nghĩa — nhìn đâu cũng thấy cảnh báo thì không còn là cảnh báo.

Giờ hai chỉ số đó có giá trị thật ở cả phần trong mẫu và ngoài mẫu, nên cảnh báo quá khớp mới đáng đọc. Nó cũng cho bạn thấy thứ trước đây bị che: trong ví dụ HPG 8 năm ở trên, tổ hợp window=50 có 37 lệnh trong mẫu với tỷ lệ thắng 32,43%, nhưng ngoài mẫu còn 30 lệnh với tỷ lệ thắng 3,33%. Một tổ hợp đứng đầu bảng vẫn có thể tệ như vậy ở đoạn chưa từng thấy.

Tối ưu và backtest giờ cho số khớp nhau

signals_optimize giờ đánh giá bằng đủ dữ liệu giá trong phiên như signals_backtest, nên các mức stop hoạt động giống nhau ở hai công cụ.

Hệ quả bạn thấy được: chạy tối ưu với lưới chỉ một giá trị, rồi chạy backtest cùng cấu hình trên cùng khoảng thời gian, giờ cho kết quả khớp nhau. Nhờ đó số của hai công cụ trích dẫn cạnh nhau được, và best_spec lấy từ tối ưu đưa sang backtest không còn lệch.

Kết quả ghi lại đủ cấu hình đã chạy

Kết quả của signals_backtest và signals_optimize giờ ghi lại đủ các mức đã áp dụng — sl_stop, tp_stop, tsl_stop, tsl_th, td_stop, stop_exit_price và t_plus. Nhìn kết quả là biết đã chạy với cấu hình nào, khỏi phải đoán khi xem lại sau hoặc khi so hai lần chạy.

Một chi tiết đáng biết nếu bạn bật t_plus: trong cửa sổ chưa về hàng, tín hiệu bán và mọi loại stop đều bị dời tới phiên hợp lệ đầu tiên, nhưng trailing vẫn tiếp tục bám đỉnh trong cửa sổ đó.

Mọi con số trên trang này là đo trên một ví dụ

Các số liệu ở đây đều kèm mã và khoảng thời gian cụ thể, và chỉ để minh họa một tham số làm kết quả thay đổi thế nào. Chúng không phải cam kết, không suy rộng cho mã khác hay giai đoạn khác, và sẽ khác đi khi bạn chạy lại ở thời điểm khác. Kết quả quá khứ không đảm bảo tương lai; đây là công cụ phân tích định lượng, không phải khuyến nghị đầu tư.

Bài liên quan

Câu hỏi thường gặp

Trailing stop khác cắt lỗ thường thế nào?

Cắt lỗ thường đo từ giá vào: mua ở 100 và cắt lỗ 7% thì thoát quanh 93, bất kể giá đã từng lên bao nhiêu. Trailing stop đo từ đỉnh đạt được kể từ lúc mua: mua ở 100, giá lên 130 rồi trailing 8% sẽ thoát quanh 119,6, tức là bảo vệ phần lãi đã có thay vì chỉ chặn lỗ ban đầu. Nhiều người ghép cả hai loại. Trong công cụ signals_backtest của FinLens MCP, hai mức đó là sl_stop và tsl_stop, dùng riêng hay kết hợp đều được, và tsl_th cho phép chỉ bắt đầu trail sau khi đã lãi quá một ngưỡng.

Kiểm định walk-forward là gì, vì sao nghiêm hơn chia train/test một lần?

Chia train/test một lần chọn tham số trên đoạn đầu rồi đo trên đoạn cuối, nên chỉ trả lời được câu tham số tốt nhất của một đoạn duy nhất là gì. Walk-forward chia dữ liệu thành nhiều fold, mỗi fold chọn lại tham số chỉ từ dữ liệu tính đến mốc của fold đó rồi đo trên đoạn ngay sau, nên không fold nào được biết trước tương lai của mình. Nhờ vậy nó trả lời đúng câu đáng hỏi hơn: nếu tái tối ưu định kỳ trong quá khứ thì kết quả ngoài mẫu ra sao. Trong FinLens MCP, bật bằng tham số walk_forward của signals_optimize với 2 đến 6 fold.

Tham số ổn định qua các fold có nghĩa là chiến lược tốt không?

Không. Đây là hai chuyện khác nhau và rất dễ lẫn. Một bộ tham số có thể thắng cả 4 fold walk-forward, tức là rất ổn định theo thời gian, trong khi kết quả ngoài mẫu của chính 4 fold đó vẫn trải từ dương sâu sang âm sâu. Trường hợp đó nghĩa là tham số ổn định mà chiến lược tệ đều, chứ không phải chiến lược đáng tin. Vì vậy phải đọc cả hai con số: số fold mà bộ tham số thắng, và số fold có kết quả ngoài mẫu dương. Cách chia train/test một lần không phân biệt được hai chuyện này.

Làm sao biết backtest danh mục có thật sự tái cân bằng đủ số kỳ?

Ở chế độ tái tối ưu định kỳ, có những kỳ bài toán phân bổ không giải ra được tỷ trọng, thường vì kỳ đó không mã nào có lợi suất kỳ vọng vượt lãi suất phi rủi ro. Những kỳ như vậy danh mục giữ nguyên tỷ trọng kỳ trước. Kết quả của portfolio_backtest trong FinLens MCP giờ ghi rõ ba thứ: số kỳ theo kế hoạch, số kỳ thực sự diễn ra, và ngày của từng kỳ bị bỏ. Hãy đọc ba con số đó trước khi kết luận chu kỳ tái cân bằng hàng tháng tốt hơn hay kém hơn hàng quý.

Nên chọn stop_exit_price là stop hay close khi backtest?

Chọn theo cách bạn giao dịch thật, không phải theo cái nào cho số đẹp hơn. Chế độ stop là mặc định và mô tả việc bạn có đặt lệnh stop chờ sẵn trên thị trường: khớp ở mức stop khi giá xuyên qua trong phiên, hoặc ở giá mở cửa nếu phiên mở gap qua mức đó. Chế độ close mô tả việc bạn không có lệnh chờ và chỉ hành động theo giá đóng cửa, nên thoát ở giá đóng cửa của phiên kích hoạt và tránh được cú nhúng trong phiên. Không chế độ nào thận trọng hơn chế độ nào, và hai chế độ cho kết quả lệch nhau đáng kể nên đừng so sánh số của chế độ này với số của chế độ kia.

Cập nhật lần cuối

Nội dung trang