Logo FinLensFinLens Docs

Phân tích kỹ thuật & backtest chiến lược chứng khoán bằng AI

Hướng dẫn dùng AI đọc 141 chỉ báo kỹ thuật, quét tín hiệu trên 1.700 mã, nhận diện 61 mẫu nến và backtest chiến lược với mô phỏng T+2.5 Việt Nam.

⏱ Đọc 14 phút · 🔴 Nâng cao · 🔧 Yêu cầu: FinLens Premium

Đọc giá trị chỉ báo thực — đừng để AI đoán

Thay vì để AI ước tính RSI hay MACD từ kiến thức chung, dùng signals_indicator_values để lấy giá trị tính toán thực tế trên giá điều chỉnh với đủ warmup period:

💬 Đọc nhiều chỉ báo cùng lúc

Cho tôi giá trị RSI(14), MACD(12,26,9) và MFI(14) của HPG hiện tại — và 10 phiên gần nhất để thấy xu hướng

→ signals_indicator_values, N=10 — giá trị thực tính trên adjusted close, đủ warmup

💬 Chỉ báo khối lượng

OBV của FPT đang tăng hay giảm trong 20 phiên qua? Có xác nhận xu hướng giá không?

→ indicator_values OBV + so sánh với price action

Quét tín hiệu trên toàn thị trường

Công cụ signals_screen quét toàn bộ 1.700 mã theo rule bạn định nghĩa — có thể kết hợp điều kiện kỹ thuật với bộ lọc cơ bản:

💬 Quét cơ bản

Tìm tất cả cổ phiếu HOSE có RSI < 30 trong 3 phiên gần nhất và giá cắt lên MA20 — danh sách mã và chỉ báo kèm theo

→ screen: exchange=HOSE, rules=[RSI<30, price_cross_up_MA20], days=3

💬 Kết hợp điều kiện cơ bản

Quét mã có RSI vượt 50 từ bên dưới trong 5 phiên qua, lọc thêm ROE > 15% và P/E < 20 và thanh khoản > 10 tỷ/ngày — mã nào phù hợp nhất?

→ screen kỹ thuật + bộ lọc cơ bản đồng thời — tín hiệu kỹ thuật trên nền tảng tốt

💬 Tìm mã theo ngành

Trong ngành ngân hàng, mã nào đang có MACD golden cross trong 5 phiên gần nhất và volume tăng bất thường?

→ screen lọc sector + MACD cross + volume spike

Lọc thêm theo Sức mạnh tương đối (RS)

signals_screen có 4 bộ lọc RS: min_rs_rating (RS của mã), min_rs_vs_industry (leader trong ngành), min_industry_rs (breadth ngành) và min_sector_rs (momentum ngành) — kết quả trả kèm cả 4 giá trị. Ghép chúng để chỉ giữ mã mạnh trong ngành đang trend. Xem đầy đủ ở Bài 15 · Sức mạnh ngành (RS).

💬 Quét kèm bộ lọc RS

Tìm mã có RSI cắt lên 50 trong 5 phiên qua, RS của mã ≥ 80 và là leader trong ngành (RS nội bộ ngành ≥ 75), thanh khoản > 10 tỷ/ngày

→ screen: rule RSI + min_rs_rating=80 + min_rs_vs_industry=75 + min_avg_value_bil=10

Phát hiện mẫu hình giá

Công cụ signals_detect_patterns nhận dạng ~38 mẫu hình đặt tên sẵn (hoặc mẫu tùy ý bạn định nghĩa). Với hai/ba đỉnh-đáy, vai-đầu-vai, tam giác, nêm, chữ nhật, mẫu mở rộng, kim cương, các loại cờ, đáy tròn, cốc tay cầm và đỉnh tròn, công cụ xác định mẫu bằng luật trên giá và cho biết mẫu đang hình thành, đã xác nhận hay thất bại, kèm mức giá xác nhận. Nhóm mẫu theo nến gồm khoảng trống giá (kèm trạng thái đã lấp hay chưa), đáy/đỉnh đảo, đáy/đỉnh ống và sừng trên nến tuần, và cú sập rồi hồi. Ba mẫu còn lại (chữ V đáy, chữ V đỉnh, nền phẳng) trả độ khớp hình dáng 0–1. Mẫu "đang hình thành" chưa phải mẫu hoàn chỉnh; với tam giác, nêm, chữ nhật và đỉnh tròn, hướng của mẫu do phiên phá vỡ quyết định chứ không do tên mẫu.

💬 Tìm mẫu hình

HPG có đang hình thành mẫu hình 2 đáy (double bottom) không? Quét thêm các mẫu hình tích cực khác nếu có

→ detect_patterns: HPG, mẫu "double_bottom" + tất cả mẫu bullish

💬 Mẫu hình vai đầu vai

Kiểm tra xem VIC có mẫu hình vai-đầu-vai (head and shoulders) đang hình thành không — ngưỡng breakdown là đâu?

→ detect_patterns "head_shoulders" — trả trạng thái, mức xác nhận (viền cổ) + khoảng cách % tới mức đó

💬 Tam giác, kênh ngang, cờ

FPT có đang nằm trong tam giác hay kênh ngang nào không? Hai đường trên/dưới đang ở mức giá nào, đã phá vỡ chưa?

→ detect_patterns nhóm tam giác / nêm / chữ nhật — trả hai mức upper_level, lower_level và hướng phá vỡ nếu đã xảy ra

💬 Khoảng trống giá chưa lấp

MWG còn khoảng trống giá (gap) nào chưa được lấp không? Hai mép của khoảng trống ở mức giá nào?

→ detect_patterns "gap_up", "gap_down" — trả hai mép khoảng trống và trạng thái đã lấp hay chưa

Quét mẫu hình trên toàn thị trường

Với các mẫu xác định bằng luật, signals_screen nhận thẳng danh sách tên mẫu và trả các mã có mẫu vừa được xác nhận trong N phiên gần nhất hoặc đang hình thành, kèm mức xác nhận và khoảng cách % từ giá hiện tại tới mức đó. Kết hợp được với mọi bộ lọc sàn, ngành, thanh khoản, RS và cơ bản. Kết quả mô tả trạng thái tại phiên mới nhất, không dùng để backtest.

💬 Mã vừa xác nhận mẫu hình

Trong 5 phiên gần nhất, mã nào thanh khoản trên 20 tỷ/ngày vừa xác nhận mẫu 2 đáy, cốc tay cầm hoặc cờ tăng?

→ screen: patterns=["double_bottom","cup_handle","bull_flag"], pattern_states=["confirmed"], signal_within_days=5, min_avg_value_bil=20

💬 Mẫu đang hình thành, sát mức xác nhận

Ngành ngân hàng có mã nào đang hình thành tam giác tăng hoặc vai-đầu-vai ngược mà giá chỉ còn cách mức xác nhận dưới 3% không?

→ screen: icb_code ngân hàng, patterns=["ascending_triangle","inv_head_shoulders"], pattern_states=["forming"] — đọc distance_pct của từng mẫu

Mẫu nến Nhật — tín hiệu đảo chiều ngắn hạn

Công cụ signals_candle_patterns quét cả 61 mẫu nến TA-Lib, trả tên tiếng Việt + hướng bullish/bearish:

💬 Quét mẫu nến

VNM tuần này xuất hiện mẫu nến gì đáng chú ý? Có tín hiệu đảo chiều không?

→ candle_patterns: VNM, days=5 — danh sách mẫu có tín hiệu + tên tiếng Việt

💬 Mẫu nến cụ thể

FPT có xuất hiện mẫu Búa (Hammer) hoặc Nhấn chìm tăng (Bullish Engulfing) trong 10 phiên qua không?

→ lọc theo mẫu cụ thể + hướng bullish

Cấu trúc giá — Hỗ trợ & Kháng cự

💬 Hỗ trợ & kháng cự

Xu hướng hiện tại của HPG thế nào? Các mức hỗ trợ và kháng cự gần nhất ở đâu? Đang cách giá hiện tại bao nhiêu %?

→ market_structure: trend từ pivot, S/R levels kèm khoảng cách %, đỉnh/đáy 52 tuần

💬 Xác nhận breakout

FPT vừa phá vỡ kháng cự. Cấu trúc giá xác nhận breakout không? Mức kháng cự tiếp theo ở đâu?

→ market_structure — pivot points, % cách mức S/R tiếp theo, xu hướng trending/ranging

Thống kê sau tín hiệu — win rate thực tế

Công cụ signals_event_study tổng hợp mỗi lần tín hiệu xuất hiện trong lịch sử — 5, 10, 20 phiên sau giá thay đổi thế nào, so với baseline mua ngẫu nhiên:

💬 Win rate sau tín hiệu

Mỗi khi RSI của HPG chạm dưới 30 rồi vượt lên lại, 20 phiên sau giá thường tăng bao nhiêu %? Win rate là bao nhiêu? So với mua ngẫu nhiên?

→ event_study: mỗi event = RSI cross up 30, thống kê return 5/10/20 phiên + win rate + baseline

Backtest chiến lược — mô phỏng T+2.5 VN

Mô phỏng T+2.5 đặc thù thị trường Việt Nam

Tham số t_plus=2 mô phỏng quy tắc thanh toán T+2.5 VN — tín hiệu bán chỉ thực hiện được sau khi cổ phiếu đủ ngày nắm giữ. Backtest sẽ thực tế hơn nhiều so với bỏ qua yếu tố này.

Bốn cách đóng vị thế, dùng riêng hay kết hợp

Ngoài rule exit bạn tự mô tả, signals_backtest có bốn cơ chế thoát đặt sẵn:

Tham sốThoát khi nàoVí dụ
sl_stopGiá giảm bao nhiêu % từ giá vào0.07 = cắt lỗ 7%
tp_stopGiá tăng bao nhiêu % từ giá vào0.15 = chốt lời 15%
tsl_stop + tsl_thGiá rời đỉnh đạt được kể từ lúc mua bao nhiêu %, và chỉ bật sau khi đã lãi quá ngưỡngtsl_stop=0.08 kèm tsl_th=0.1 = lãi 10% mới bắt đầu trail 8%
td_stopĐã giữ đủ bao nhiêu phiên giao dịch, bất kể lãi lỗ20 = giữ tối đa 20 phiên

Thêm stop_exit_price chọn mô hình khớp khi stop kích hoạt: "stop" (mặc định) là có lệnh stop chờ sẵn trên thị trường, "close" là không có lệnh chờ nên chỉ hành động theo giá đóng cửa. 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ể — chọn theo cách bạn giao dịch thật rồi giữ nguyên. Ví dụ đo được ở Cập nhật tính năng.

💬 Kết hợp bốn cơ chế thoát

Backtest MA20 cross trên HPG 5 năm: cắt lỗ 7% từ giá vào, lãi 10% thì bắt đầu trail 8% khỏi đỉnh, và giữ tối đa 25 phiên — kết quả so với không đặt stop nào?

→ backtest: sl_stop=0.07, tsl_stop=0.08, tsl_th=0.1, td_stop=25

💬 Backtest đơn giản

Backtest chiến lược MA20/50 cross trên HPG trong 5 năm — so với mua-hold HPG, Sharpe và max drawdown là bao nhiêu?

→ backtest: HPG, rule=MA20 cross MA50, 5 năm, so buy-hold, kèm danh sách lệnh

💬 Backtest nhiều mã

Backtest RSI(14) < 30 → mua, > 70 → bán trên HPG, FPT và VNM trong 3 năm qua với t_plus=2 — mã nào chiến lược này hoạt động tốt nhất?

→ backtest 3 mã cùng rule, t_plus=2 mô phỏng T+2.5, so sánh Sharpe/Sortino/drawdown

Tối ưu tham số — tránh overfit

Cảnh báo overfit tự động

FinLens tự động chia dữ liệu train/test 70/30 và cảnh báo khi Sharpe in-sample cao nhưng out-of-sample thấp — dấu hiệu overfit rõ ràng. Luôn kiểm tra OOS metrics trước khi dùng tham số tối ưu.

Cảnh báo này còn xét số lệnh của từng tổ hợp, và số lệnh cùng tỷ lệ thắng trong kết quả tối ưu đã được sửa: trước đây hai chỉ số đó luôn trống nên cảnh báo bật cho mọi dòng và thành vô nghĩa. Xem Cập nhật tính năng.

💬 Tối ưu MA window

Tối ưu tham số MA short (5–30) × MA long (20–80) cho chiến lược cross trên FPT 3 năm — chia train/test 70/30, top 5 tổ hợp tốt nhất và cảnh báo overfit

→ optimize: grid search ≤200 combo, IS/OOS Sharpe side-by-side, best_spec để dùng ngay trong backtest

💬 Tối ưu RSI + MA kết hợp

Tối ưu chiến lược RSI(window 7–21) × MA(window 10–50) trên VCB trong 5 năm — tham số nào cho Sharpe OOS cao nhất?

→ optimize 2 tham số đồng thời, lấy best_spec OOS-first (không phải IS-first)

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

Chia train/test một lần chỉ trả lời câu "tham số tốt nhất của một đoạn duy nhất là gì" — câu đó gần như luôn cho ra số đẹp. Bật walk_forward (2–6 fold, mặc định tắt) để hỏi câu đáng hỏi hơn: "nếu tái tối ưu định kỳ trong quá khứ thì ngoài mẫu ra sao".

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. Kết quả cho biết bao nhiêu bộ tham số khác nhau từng thắng và bao nhiêu fold dương ngoài mẫu.

💬 Walk-forward 4 fold

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

→ optimize: walk_forward=4, years=15 — cần lịch sử dài, dữ liệu ngắn sẽ bị từ chối kèm ghi chú

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

Đây là hai chuyện khác nhau: một bộ tham số có thể thắng cả 4 fold mà 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. Hãy đọc cả hai con số — số fold mà bộ tham số thắng, và số fold dương ngoài mẫu. Ví dụ đo được ở Cập nhật tính năng.

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

signals_optimize nhận cả nhóm sl_stop / tp_stop / tsl_stop / tsl_th / td_stop / stop_exit_price, 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 bạn chọn, không phải biến để máy dò.

Việc này đổi kết quả thật sự: cùng một lưới MA trên cùng một mã và cùng khoảng thời gian, bảng xếp hạng khi không áp stop và khi áp cắt lỗ kèm trailing cho ra tổ hợp đứng đầu khác nhau. 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ố.

💬 Tối ưu kèm chính sách rủi ro

Tối ưu MA window 10/20/50/100 trên HPG 8 năm, á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, và có khác với khi không áp stop không?

→ optimize 2 lần: một lần trần, một lần với sl_stop/tsl_stop/td_stop — so bảng xếp hạng

Bài liên quan

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

Làm sao để backtest chiến lược chứng khoán Việt Nam bằng AI?

Công cụ signals_backtest của FinLens MCP chạy backtest long-only cho một hoặc nhiều mã theo rule do nhà đầu tư mô tả bằng ngôn ngữ tự nhiên, ví dụ MA20 cắt MA50 hoặc RSI(14) dưới 30 thì mua và trên 70 thì bán. Kết quả trả về so sánh với chiến lược mua và nắm giữ, kèm Sharpe, Sortino, max drawdown và danh sách lệnh đã khớp. Nhà đầu tư chỉ cần yêu cầu AI backtest chiến lược trên mã và khung thời gian mong muốn, không cần viết code.

Backtest của FinLens MCP có mô phỏng quy tắc T+2.5 của Việt Nam không?

Có. Tham số t_plus=2 trong signals_backtest mô phỏng quy tắc thanh toán T+2.5 của thị trường Việt Nam: tín hiệu bán chỉ được thực hiện sau khi cổ phiếu đủ ngày nắm giữ. Bật tham số này giúp kết quả backtest sát thực tế hơn nhiều so với việc bỏ qua độ trễ thanh toán, đặc biệt với các chiến lược giao dịch ngắn hạn.

Làm sao quét toàn thị trường tìm cổ phiếu có RSI dưới 30 hoặc MACD golden cross?

Công cụ signals_screen của FinLens MCP quét toàn bộ 1.700 mã theo rule kỹ thuật do người dùng định nghĩa, chẳng hạn RSI dưới 30 trong 3 phiên gần nhất, giá cắt lên MA20, hoặc MACD golden cross kèm volume tăng bất thường. Bộ lọc kỹ thuật có thể kết hợp đồng thời với tiêu chí cơ bản như ROE trên 15%, P/E dưới 20 và thanh khoản trên 10 tỷ đồng mỗi ngày. Ngoài ra còn có 4 bộ lọc sức mạnh tương đối là min_rs_rating, min_rs_vs_industry, min_industry_rs và min_sector_rs để chỉ giữ lại mã dẫn dắt trong ngành đang có xu hướng tăng.

Làm sao tránh overfit khi tối ưu tham số chiến lược giao dịch?

Công cụ signals_optimize của FinLens MCP chạy grid search tối đa 200 tổ hợp tham số và tự động chia dữ liệu train/test theo tỷ lệ 70/30, hiển thị Sharpe in-sample và out-of-sample cạnh nhau kèm cảnh báo khi out-of-sample kém xa in-sample. Phép kiểm nghiêm hơn là bật walk_forward từ 2 đến 6 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 biết trước tương lai của mình. Nguyên tắc an toàn là chọn best_spec theo kết quả out-of-sample thay vì in-sample, rồi đưa tham số đó vào signals_backtest để kiểm chứng lại.

Trailing stop là gì và backtest cắt lỗ theo đỉnh trên cổ phiếu Việt Nam thế nào?

Trailing stop là cắt lỗ đo từ đỉnh giá đã đạt được kể từ lúc mua, khác với cắt lỗ thường vốn đo từ giá vào. Trong signals_backtest của FinLens MCP, tham số tsl_stop nhận mức phần trăm rời đỉnh, ví dụ 0.08 là thoát khi giá giảm 8% khỏi đỉnh, và tsl_th là ngưỡng lãi để trailing bắt đầu có tác dụng, ví dụ 0.1 đọc là lãi 10% mới bắt đầu trail. Có thể kết hợp thêm td_stop để giữ tối đa một số phiên giao dịch rồi thoát bất kể lãi lỗ. Kết quả quá khứ không đảm bảo tương lai.

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

Nội dung trang