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

Khái niệm cần biết

Trang này giải thích những khái niệm bạn gặp ở mọi màn của Quant AI Studio: backtest là gì, ba loại kết quả, rổ mã, vì sao kết quả không "nhìn trước" được tương lai, Studio mô phỏng sàn Việt Nam ra sao. Đọc một lần trước khi đọc báo cáo backtest. Chi tiết kỹ thuật về nguồn dữ liệu, giá điều chỉnh và luật khớp lệnh nằm ở Dữ liệu và mô phỏng khớp lệnh.

Backtest là gì​

Backtest là chạy thử một quy tắc mua bán trên dữ liệu quá khứ, như thể bạn đã giao dịch thật theo đúng quy tắc đó từng phiên: cuối mỗi phiên tính tín hiệu, phiên sau đặt lệnh, trả phí và thuế, chờ cổ phiếu về tài khoản, ghi lại tiền và danh mục. Kết quả là đường vốn (giá trị tài khoản theo thời gian) và các chỉ số lời lỗ, rủi ro.

Ví dụ với 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): đầu mỗi tháng, Studio xếp hạng cổ phiếu HOSE thanh khoản từ 10 tỷ đồng/phiên theo mức tăng 6 tháng (bỏ tháng gần nhất), mua đều 10 mã mạnh nhất, bán các mã rớt khỏi nhóm — lặp lại từ tháng 1/2016 đến nay.

Backtest trả lời câu hỏi "nếu đã làm vậy thì kết quả ra sao", không trả lời "sắp tới sẽ ra sao". Nó hữu ích nhất để loại bỏ ý tưởng không có cơ sở trước khi bạn xuống tiền: một quy tắc thua cả chỉ số trong 10 năm, kể cả khi đã tính đúng chi phí, hiếm khi đáng thử bằng tiền thật. Ngược lại, kết quả đẹp vẫn cần qua kiểm định độ vững vì có thể chỉ là may mắn hoặc quá khớp.

Ba loại kết quả: chiến lược, bộ lọc, phân tích​

Mọi thứ Studio tạo ra — từ mẫu, do trợ lý Quant viết hay do bạn tự viết — là một mục, nằm trong tab Của tôi của thanh bên, thuộc một trong ba loại:

LoạiTrả lời câu hỏiDữ liệu dùngKết quảVí dụ mẫu
Chiến lược"Nếu giao dịch theo quy tắc này nhiều năm thì lời lỗ, rủi ro ra sao?"Lịch sử đã chốt, mặc định 10 năm gần nhấtTab Báo cáo, Giao dịch, Danh mục, Độ vững, MãMomentum 6-1 xoay vòng hàng tháng; RSI hồi phục trong xu hướng tăng
Bộ lọc"Hôm nay những mã nào thỏa điều kiện?"Khoảng một năm gần nhất, gồm giá tạm của phiên đang giao dịchTab Kết quả (bảng mã), MãSức mạnh giá dẫn đầu (RS); Nền giá chặt gần đỉnh 52 tuần
Phân tích"Trong quá khứ, hiện tượng X diễn ra thế nào?"Tùy phân tíchTab Kết quả (số liệu, biểu đồ, bảng, nhận xét), MãMùa vụ theo tháng; Hồ sơ cổ phiếu

Bộ lọc của Studio khác Lọc realtime: Lọc realtime chọn điều kiện có sẵn và cập nhật liên tục theo giá; bộ lọc của Studio là công thức tự do (điều kiện nhiều kỳ, kết hợp BCTC, khối ngoại, xếp hạng…), tính lại mỗi lần bạn chạy.

Mỗi mục gồm:

  • Code viết bằng SDK của Studio — bạn không cần đọc code để dùng mẫu hay nhờ trợ lý.
  • Phiên bản — v1, v2, v3… Mỗi lần trợ lý sửa, bạn lưu code đã sửa, khôi phục bản cũ hoặc áp dụng đề xuất của trợ lý, mục có thêm một phiên bản, ghi người tạo (Mẫu, AI, Bạn). Xem Mục của bạn, phiên bản và chia sẻ.
  • Tham số — các ngưỡng code khai báo (số mã nắm giữ, chu kỳ RSI, mức cắt lỗ…) hiện thành thanh trượt, công tắc, ô chọn hay ô nhập mã ngay trên kết quả. Đổi tham số chỉ chạy lại, không tạo phiên bản mới. Xem Chạy mẫu và đổi tham số.
  • Kết quả chạy gần nhất — mở lại mục là thấy ngay kết quả lần trước, không phải chạy lại.

Mẫu là 99 chiến lược, bộ lọc, phân tích dựng sẵn trong Thư viện mẫu, đã kiểm tra chạy đúng trên dữ liệu thật: 31 phân tích, 33 chiến lược, 35 bộ lọc. Mỗi mẫu kèm kết quả kiểm chứng — kết quả một lần chạy trên dữ liệu thật với tham số mặc định — để bạn xem trước khi chạy, và được xếp theo Điểm Đề xuất (hiệu quả, dễ hiểu, hấp dẫn). 14 mẫu có tên là thuật ngữ hiện thêm một tên nói thẳng việc mẫu làm (xem Tên dễ hiểu của mẫu). Dùng một mẫu là tạo một mục mới của bạn từ mẫu đó. Xem Thư viện mẫu và Danh sách 99 mẫu.

Hội thoại là một chuỗi trao đổi với trợ lý Quant ở khung Copilot. Một hội thoại có thể tạo và sửa nhiều mục; mỗi lần chạy chiến lược trong hội thoại được đếm là một lần thử — con số dùng để tính Deflated Sharpe.

Rổ mã​

Chiến lược, bộ lọc và phân tích chạy trên một rổ mã. Rổ do code của mục khai báo; mẫu nào cho đổi rổ thì có tham số Nhóm hay ô Mã ngay trên kết quả, còn lại bạn nhờ trợ lý chạy trên rổ khác.

RổGồm
VN30, HNX30Thành phần hiện tại của chỉ số
VN100, VNMidcap, VNSmallcapDanh sách cũ của nguồn, nhiều mã đã hủy niêm yết hoặc chuyển sàn — không nên dùng để chọn mã (xem Những chỗ dữ liệu còn mỏng)
Cổ phiếu HOSE, Cổ phiếu HNX, Cổ phiếu UPCoMCổ phiếu trên từng sàn
Toàn bộ cổ phiếuCổ phiếu cả ba sàn
ETF, Chỉ số, Phái sinhQuỹ ETF; các chỉ số (gồm cả chỉ số thế giới); hợp đồng tương lai
Danh sách mãVí dụ FPT, HPG, MWG
NgànhTheo ngành ICB, ví dụ Ngân hàng
WatchlistMột watchlist của bạn, theo tên

Rổ thường kèm điều kiện, ghi ngay trong nhãn rổ ở đầu kết quả, ví dụ Cổ phiếu HOSE · GTGD ≥ 10 tỷ · top 240:

  • GTGD ≥ … — chỉ xét mã có giá trị giao dịch bình quân 20 phiên từ mức đó trở lên. Khi backtest, điều kiện này được xét tại từng phiên trong quá khứ: một mã chỉ được mua ở những phiên nó đủ thanh khoản.
  • top n — chỉ giữ n mã thanh khoản nhất.
  • Thêm hoặc loại trừ mã cụ thể, giá tối thiểu, lọc ngành.

Giới hạn số mã mỗi lần chạy theo gói: Thiết yếu 250 mã, Chuyên nghiệp và Cao cấp 2.000 mã. Rổ chung (tên rổ hoặc ngành) lớn hơn giới hạn thì Studio tự giữ các mã thanh khoản nhất và ghi chú ở cuối kết quả; danh sách mã tự chọn hoặc watchlist vượt giới hạn thì báo lỗi. Các mẫu đều chạy được trong giới hạn 250 mã. Xem Gói, giới hạn và hỏi đáp.

Rổ theo thời điểm và thiên lệch sống sót​

Nếu lấy danh sách cổ phiếu hôm nay để backtest cho 10 năm trước, bạn vô tình bỏ mất mọi mã đã hủy niêm yết hoặc đã chuyển sàn — thường là những mã làm ăn kém. Kết quả vì thế đẹp hơn thực tế. Hiện tượng này gọi là thiên lệch sống sót (survivorship bias).

Studio dựng rổ theo thời điểm cho backtest khi rổ là Toàn bộ cổ phiếu, Cổ phiếu HOSE hoặc một ngành:

  • Rổ gồm cả các mã đã hủy niêm yết trong kỳ kiểm tra; nhãn rổ ghi thêm "theo thời điểm, n mã đã hủy niêm yết".
  • Mỗi mã chỉ được mua trong khoảng thời gian nó thực sự thuộc rổ (ví dụ đang niêm yết ở HOSE).
  • Mã bị hủy niêm yết khi đang nắm giữ được bán hết ở phiên giao dịch cuối của nó (lý do bán Hủy niêm yết).
  • top n và thanh khoản được xếp theo dữ liệu trong kỳ, không theo thanh khoản hôm nay.
  • Lịch sử thuộc sàn HOSE được suy từ bước giá, có từ 12/09/2016; kỳ bắt đầu sớm hơn thì nhãn rổ ở dòng cuối báo cáo ghi "theo thời điểm từ 09/2016" (trước mốc đó chưa có các mã đã rời HOSE).

Các rổ còn lại — HNX, UPCoM, rổ theo chỉ số (VN30, HNX30, VN100…), danh sách mã, watchlist — dùng danh sách hiện tại cho cả quá khứ. Báo cáo của chiến lược chạy trên VN30, HNX30, VN100, VNMidcap, VNSmallcap bị hạ độ tin cậy kèm lý do "Rổ mã lấy theo danh sách hiện tại cho cả quá khứ (thiên lệch sống sót)"; với HNX, UPCoM, báo cáo ghi chú trong Ghi chú dữ liệu. Hãy coi kết quả dài hạn trên các rổ này là lạc quan hơn thực tế.

Bộ lọc và phân tích luôn dùng danh sách mã hiện tại (bộ lọc chỉ xét hôm nay nên không có thiên lệch này).

Không nhìn trước tương lai​

Lỗi phổ biến nhất của backtest là vô tình dùng thông tin chưa có tại thời điểm ra quyết định — ví dụ mua ở giá đóng cửa hôm nay theo tín hiệu tính từ chính giá đóng cửa đó, hay chuẩn hóa dữ liệu bằng trung bình của cả 10 năm. Studio chặn lỗi này theo ba cách:

  1. Tín hiệu cuối phiên, khớp phiên sau. Tín hiệu tính bằng dữ liệu đến hết phiên t; lệnh khớp ở phiên t+1 — mặc định giá mở cửa, hoặc giá ATC nếu bạn chọn trong Cài đặt.

    Phiên t Phiên t+1 Phiên t+2 Phiên t+3
    đóng cửa: tín hiệu ──► khớp mua ở giá mở cửa ──► cổ phiếu chưa về (T+2) ──► bán được từ giá mở cửa
  2. Tái cân bằng ở phiên đầu kỳ. Chiến lược xoay vòng hàng tháng đổi danh mục theo tín hiệu của phiên đầu tiên mỗi tháng, không phải phiên cuối tháng (muốn biết hôm nay là phiên cuối tháng phải biết lịch của ngày mai).

  3. Kiểm tra tự động mỗi lần chạy chiến lược. Studio tính lại tín hiệu trên dữ liệu bị cắt ngắn ở hai mốc (55 % và 80 % kỳ kiểm tra) rồi so với bản tính trên dữ liệu đầy đủ. Tín hiệu của một ngày thay đổi khi bỏ dữ liệu phía sau nghĩa là chiến lược đang dùng dữ liệu tương lai: báo cáo hiện khung đỏ Phát hiện dùng dữ liệu tương lai và độ tin cậy về thấp. Code đọc trực tiếp giá trị của phiên sau bị chặn ngay khi chạy (lỗi Dùng dữ liệu tương lai).

Dữ liệu báo cáo tài chính dùng theo ngày công bố, không theo ngày kết thúc kỳ — chiến lược không "biết" lợi nhuận quý trước khi doanh nghiệp công bố. Xem Dữ liệu và mô phỏng khớp lệnh.

Mô phỏng như sàn Việt Nam​

Studio khớp lệnh theo luật giao dịch cổ phiếu Việt Nam, nên kết quả gần với những gì bạn đạt được khi giao dịch thật:

Quy tắcTrong backtest
T+2Cổ phiếu mua ở phiên t về sau hai phiên: khớp giá mở cửa thì bán được sớm nhất ở giá mở cửa phiên t+3, khớp ATC thì ở ATC phiên t+2. Tín hiệu bán đến sớm hơn phải chờ
Biên độ trần / sànHOSE ±7 %, HNX ±10 %, UPCoM ±15 %. Phiên trắng bên (cả phiên một giá và đóng ở biên độ): mua ở giá trần không khớp, bán ở giá sàn không khớp — như khi không có người bán / người mua
Lô 100Khối lượng làm tròn xuống theo lô 100 cổ phiếu
Thanh khoảnMỗi lệnh mua không quá 10 % khối lượng giao dịch bình quân 20 phiên trước đó (lệnh bán không bị giới hạn)
Phí, thuế, trượt giáMặc định phí 0,15 % mỗi chiều, thuế bán 0,1 %, trượt giá 0,1 % cộng thêm phần trượt theo cỡ lệnh so với thanh khoản
Không bán khốngChỉ mua rồi bán cổ phiếu đang có
Hủy niêm yếtMã hủy niêm yết khi đang nắm giữ được bán hết ở phiên giao dịch cuối

Vốn ban đầu mặc định 1 tỷ đồng. Vốn, phí, thuế, trượt giá, lãi suất phi rủi ro và cách khớp đổi được trong Cài đặt; code của chiến lược có thể đặt giá trị riêng. Toàn bộ quy tắc và thống kê khớp lệnh của từng lần chạy: Dữ liệu và mô phỏng khớp lệnh.

Vì sao chi phí quan trọng

Một chiến lược xoay vòng 10 mã hằng tháng có thể thay gần hết danh mục vài lần mỗi năm. Với phí 0,15 % mỗi chiều cộng thuế bán 0,1 % và trượt giá, mỗi vòng mua bán tốn khoảng 0,6 % giá trị, chưa kể phần trượt theo cỡ lệnh — 5 vòng một năm là khoảng 3 %/năm. Báo cáo ghi rõ tổng Phí + thuế và Vòng quay để bạn thấy phần lợi nhuận bị chi phí ăn mất.

Hai kiểu chiến lược và tái cân bằng​

KiểuCách hoạt độngVí dụ mẫu
Theo tín hiệuMỗi mã vào khi có tín hiệu mua, ra khi có tín hiệu bán hoặc chạm quy tắc rủi ro (cắt lỗ, chốt lời, trailing stop, giữ tối đa n phiên). Nắm tối đa một số mã (mặc định 5), mỗi mã một phần vốn bằng nhau; nhiều tín hiệu hơn chỗ trống thì ưu tiên mã có điểm cao hơnRSI hồi phục trong xu hướng tăng
Theo xếp hạng / tỷ trọngĐịnh kỳ (tuần, tháng, quý, năm hoặc mỗi n phiên) xếp hạng cả rổ, chọn n mã đứng đầu, chia tỷ trọng (đều, theo điểm hoặc nghịch đảo biến động) rồi mua bán để danh mục khớp tỷ trọng mới — gọi là tái cân bằngMomentum 6-1 xoay vòng hàng tháng

Kiểu thứ hai có thể giữ một phần tiền mặt: Momentum 6-1 đặt mỗi mã tối đa 1/10 vốn, ít mã đủ điều kiện thì phần còn lại để tiền mặt; khi bật Chỉ mua khi VNINDEX > MA200, chiến lược đứng ngoài hoàn toàn lúc thị trường dưới đường trung bình 200 phiên.

Chỉ số chuẩn​

Mỗi chiến lược so với một chỉ số chuẩn (benchmark), mặc định VNINDEX, quy về cùng vốn ban đầu để so trực tiếp trên biểu đồ đường vốn. Các chỉ số Beta, Alpha trong báo cáo đo theo chỉ số chuẩn này.

So với VNINDEX cần lưu ý

Backtest dùng giá điều chỉnh — đã tính cổ tức tiền, cổ tức cổ phiếu, phát hành thêm — nên lợi nhuận của chiến lược đã gồm cổ tức. VNINDEX là chỉ số giá, không cộng cổ tức. Vì vậy chiến lược "chỉ cần mua và giữ cả rổ" cũng nhỉnh hơn VNINDEX một khoản gần bằng tỷ suất cổ tức của thị trường. Một chiến lược chỉ thắng VNINDEX 1–2 %/năm chưa chắc đã tốt hơn mua và giữ.

Lãi suất phi rủi ro​

Sharpe và Sortino đo phần lợi nhuận vượt lãi suất phi rủi ro trên mỗi đơn vị rủi ro. Mặc định Studio đặt lãi suất phi rủi ro bằng 0 %; muốn so với tiền gửi ngân hàng, đặt mức lãi suất (ví dụ 5 %/năm) trong Cài đặt — Sharpe sẽ thấp đi tương ứng.

Quá khớp​

Quá khớp (overfitting) là khi chiến lược — hoặc bộ tham số — được chỉnh cho vừa khít dữ liệu đã thấy, nên đẹp trên quá khứ nhưng thất bại khi thị trường đổi khác. Nó thường xảy ra khi bạn thử rất nhiều biến thể rồi giữ biến thể tốt nhất: thử đủ nhiều thì kiểu gì cũng có một biến thể đẹp nhờ may mắn.

Dấu hiệu thường gặp: ít lệnh, kết quả rất nhạy với một tham số (lệch một chút là hỏng), chỉ một hai năm gánh cả kỳ, quy tắc nhiều điều kiện "đặc thù". Studio giúp phát hiện bằng số lần thử trong hội thoại, Deflated Sharpe, độ ổn định vùng tối ưu, kiểm tra ngoài mẫu, walk-forward và Monte Carlo — xem Tối ưu và kiểm định độ vững.

Dữ liệu đã chốt và giá tạm​

Nến ngày của một phiên được coi là đã chốt sau 15:05; khối ngoại, tự doanh, số lệnh có sau 19:00. Trong giờ giao dịch, bộ lọc, phân tích và phép tính nhanh của trợ lý dùng thêm giá tạm của phiên đang diễn ra; backtest chỉ dùng dữ liệu đã chốt, nên chạy lại trong ngày vẫn ra cùng kết quả. Trạng thái này hiện ở đầu Studio.

Vùng chạy cách ly​

Code — dù là mẫu, do trợ lý hay bạn viết — chạy trong một vùng cách ly của trình duyệt: không truy cập mạng, không đọc được cookie, bộ nhớ hay nội dung của trang. Mỗi lần chạy dùng một tiến trình riêng và bị dừng nếu quá thời gian (2 phút cho một lần chạy chiến lược, bộ lọc hay phân tích, 5 phút cho một lượt tối ưu hay kiểm định, 1 phút cho phép tính nhanh của trợ lý), nên một vòng lặp vô tận cũng không làm treo FireAnt Terminal.