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

Dữ liệu và mô phỏng khớp lệnh

Mọi kết quả của Quant AI Studio — backtest, bộ lọc, phân tích — chạy trên một kho dữ liệu chung của FireAnt, và mọi backtest khớp lệnh theo luật sàn Việt Nam (T+2, lô 100, trần / sàn, phí, thuế, thanh khoản). Trang này là tài liệu tra cứu: dữ liệu gồm gì, có từ khi nào, cập nhật lúc nào, được dùng "theo thời điểm" ra sao để backtest không nhìn trước, và từng bước mô phỏng một lệnh — kèm những giả định khiến kết quả thật có thể khác.

Số liệu trong trang

Mốc "có từ" đo trên kho dữ liệu ngày 14/10/2026 (vĩ mô: ngày 19/10/2026); số mã và các lần chạy ví dụ đo ngày 19/10/2026, dữ liệu tới phiên 16/10/2026. Kho được bổ sung liên tục nên con số có thể thay đổi; bản đồ dữ liệu đầy đủ cho người viết code ở Dữ liệu và Panel.

Kho dữ liệu của Studio​

  • Một nguồn cho mọi lần chạy. Dữ liệu lịch sử nằm trong các tệp QDF toàn thị trường do máy chủ FireAnt dựng sẵn theo năm, tháng. Trình duyệt tải tệp cần dùng một lần rồi giữ lại; lần sau chỉ tải phần mới. Mọi người dùng, mọi lần chạy đọc cùng một bộ tệp nên kết quả nhất quán.
  • Chỉ tải phần code cần. Trước khi nạp dữ liệu, Studio chạy thử code để biết code đọc những trường nào: chiến lược chỉ dùng giá thì không tải khối ngoại, BCTC. Ví dụ backtest giá 10 năm toàn thị trường tải khoảng 35 MB ở lần đầu; thêm khối ngoại khoảng 14 MB, thêm BCTC khoảng 21 MB.
  • Bảng giá realtime chỉ bổ sung những gì tệp không có: lịch phiên, giá tạm của phiên đang giao dịch, danh sách mã hiện tại (sàn, ngành, GTGD bình quân 20 phiên) và nến của mã ngoài thị trường Việt Nam (chỉ số thế giới).
  • Không tự đổi nguồn. Máy chủ chưa trả được dữ liệu thì lần chạy báo lỗi Không chạy được: chưa tải được dữ liệu lịch sử từ máy chủ… — thử lại sau ít phút. Studio không lấy dữ liệu từ nguồn khác để chạy "tạm", vì kết quả sẽ khác mà bạn không biết.

Xem tình trạng dữ liệu​

Chip ở góc phải đầu Studio, ví dụ Đã đóng cửa · Dữ liệu đến 16/10, cho biết phiên cuối đã có giá chốt. Rê chuột lên chip để xem khối ngoại, tự doanh đã có tới phiên nào; bấm chip để mở Cài đặt đúng phần Dữ liệu & bộ nhớ đệm: nguồn tệp có đang tải được không, bộ nhớ đang dùng, nút Xoá bộ nhớ đệm dữ liệu. Cách đọc chip và từng dòng: Giao diện Studio, Cài đặt.

Có những dữ liệu gì​

NhómGồmCó từ
Giá, khối lượng ngàyGiá mở cửa, cao, thấp, đóng cửa đã điều chỉnh theo cổ tức, chia tách; KL khớp lệnh (gốc, chưa điều chỉnh)Phiên đầu của HOSE 28/07/2000; mỗi mã từ khi niêm yết. Chứng quyền từ 2019, HĐTL chỉ số từ 08/2017
Giá gốc và giao dịch chi tiếtGiá đóng cửa gốc, giá tham chiếu, giá bình quân, GT khớp, KL / GT thỏa thuận, hệ số điều chỉnhNhư giá ngày
Khối ngoạiKL, GT mua / bán của nhà đầu tư nước ngoài, room còn lạiTừ 2003 (giao dịch khối ngoại sớm nhất ghi nhận 09/2003)
Tự doanhGT mua ròng của tự doanh công ty chứng khoánTừ 12/2019; năm 2020 mới có khoảng một nửa số phiên, đủ hơn từ 2021
Số lệnhSố lệnh, KL đặt mua / đặt bánTừ 07/2007
BCTC theo ngày công bố72 chỉ tiêu quý, năm: kết quả kinh doanh, cân đối, lưu chuyển tiền, hiệu quả, đòn bẩy, tăng trưởng, F-Score, Z-ScoreTừ 2003 — xem BCTC theo ngày công bố
Cổ tức, sự kiện quyền, trần / sànCổ tức tiền ở ngày GDKHQ; phiên có điều chỉnh giá; giá trần, sàn; đóng cửa ở trần / sànCổ tức từ 2003; trần / sàn từ 04/2002
Giao dịch nội bộKL đăng ký, đã thực hiện của lãnh đạo, người liên quan (cá nhân) và cổ đông lớn là tổ chứcTừ 2006–2007
Cổ đông lớn (hiện tại)Tỷ lệ sở hữu nhà nước, cổ đông lớn nước ngoài, sáng lập, tổng tỷ lệ được công bốChỉ là ảnh chụp hiện tại, có từ ngày danh sách cổ đông của mã được cập nhật gần nhất
Tin tức, cộng đồngSố tin gắn mã; số bài viết cộng đồng FireAnt nhắc mã, người viết, lượt thích, trả lời, cảm xúc người đăngTừ 28/01/2021; số liệu đầy đủ hơn từ giữa năm 2021
Vĩ mô108 chuỗi: GDP, CPI, sản xuất, bán lẻ, xuất nhập khẩu, FDI, lãi suất liên ngân hàng, thị trường mở, tín dụng, tỷ giá, giá xăng dầu, IMF WEO…Tùy chuỗi — xem Vĩ mô
Chỉ số Việt NamVNINDEX, VN30, HNX-Index, HNX30, UPCoM-Index, VN100, VNMidcap, VNSmallcap, VNAllshareVNINDEX 07/2000; HNX-Index 05/2006; UPCoM-Index 06/2009; HNX30 01/2012; VN30 02/2012; VN100, VNMidcap, VNSmallcap, VNAllshare 02/2014 – 24/01/2025
Chỉ số thế giớiS&P 500, Dow Jones, Nasdaq, NYSE Composite, Russell 2000, FTSE 100, DAX, CAC 40, Nikkei 225, Hang Seng, Thượng Hải, KOSPIPhần lớn từ 12/11/2018; căn theo lịch phiên Việt Nam
Danh mục mã, rổSàn, ngành ICB, số cổ phiếu lưu hành; thành phần VN30, HNX30; mã đã hủy niêm yết và thời gian ở HOSE (cho rổ theo thời điểm)Danh mục hiện tại; giai đoạn ở HOSE từ 12/09/2016

Ở thư viện mẫu, lọc Dữ liệu của Tất cả mẫu chia mẫu theo dữ liệu dùng: Chỉ giá, khối lượng; BCTC, vĩ mô, sự kiện (BCTC, cổ tức, vĩ mô, cộng đồng, giao dịch nội bộ); Khối ngoại, tự doanh. Ở tab Mẫu của thanh bên, biểu tượng cơ sở dữ liệu / quả địa cầu cạnh tên mẫu cho biết điều tương tự (xem Danh sách 99 mẫu).

Những chỗ dữ liệu còn mỏng
  • Chỉ số VN100, VNMidcap, VNSmallcap, VNAllshare chỉ có giá tới 24/01/2025 (nguồn ngừng cập nhật). Dùng các chỉ số này sau ngày đó (ví dụ làm chỉ số so sánh), kết quả có ghi chú dạng VNALL: nguồn dữ liệu ngừng cập nhật từ sau 24/01/2025.
  • Thành phần VN100, VNMidcap, VNSmallcap là danh sách cũ của nguồn: nhiều mã đã hủy niêm yết hoặc chuyển sàn. Đừng dùng các rổ này để chọn mã.
  • Cổ đông lớn không có lịch sử: backtest dùng các trường này có ghi chú và chỉ có số từ ngày cập nhật gần nhất.

Dữ liệu cập nhật khi nào​

Studio dùng giờ Việt Nam theo đồng hồ máy chủ (không theo múi giờ máy bạn); ngày nghỉ lễ nhận ra từ việc VNINDEX không có phiên.

Dữ liệuCó khi nào
Giá tạm của phiên đang giao dịchTrong giờ giao dịch, lấy từ bảng giá realtime ngay lúc chạy
Nến ngày đã chốt (giá, KL, giá gốc, thỏa thuận)Studio coi là chốt sau 15:05; máy chủ dựng tệp lúc khoảng 15:20. Trong lúc chờ, bộ lọc và phân tích dùng nến của phiên vừa đóng như nến tạm; backtest dừng ở phiên trước
Khối ngoại, tự doanh, số lệnhSau 19:00 (máy chủ dựng lại lúc khoảng 19:10). Trước đó các trường này của phiên hôm nay để trống
Cổ tức, giao dịch nội bộ, cổ đông lớn, bài viết cộng đồngCập nhật cùng lượt khoảng 19:10
BCTC, vĩ mô, danh mục tham chiếuCập nhật lượt đêm 23:00; mỗi số chỉ được dùng từ ngày "đã biết" của nó (xem BCTC, Vĩ mô)

Máy chủ chậm phiên (lượt dựng lỗi) thì Studio vẫn chạy trên dữ liệu đã có, ghi chú Dữ liệu lịch sử của máy chủ mới đến dd/mm/yyyy — kết quả chưa gồm các phiên sau đó (máy chủ đang cập nhật)., và máy chủ tự dựng lại 10 phút một lần tới khi kịp.

Ai dùng giá tạm?

Loại chạyGiá tạm của phiên đang giao dịch
Bộ lọcCó — kết quả phản ánh giá đang khớp (bộ lọc khai báo includeToday: false hoặc lọc tại một ngày cũ thì không)
Phân tíchCó (mặc định của data.bars); Ghi chú dữ liệu có dòng Gồm nến tạm của phiên dd/mm/yyyy (chưa chốt)., dòng cuối kết quả ghi Gồm giá tạm phiên dd/mm/yyyy · đã chốt đến dd/mm/yyyy
Trợ lý Quant khi tính nhanhCó, và được dặn ghi rõ số của phiên hôm nay là tạm tính
Backtest, tối ưu, kiểm địnhKhông — chỉ dùng phiên đã chốt, chạy lại trong ngày luôn cho cùng kết quả

Giá gốc của nến tạm là giá đang khớp, nên P/E, P/B, tỷ suất cổ tức có cả trong phiên. Phiên hôm nay là ngày GDKHQ mà máy chủ chưa dựng hệ số điều chỉnh mới, Studio tự chia lại lịch sử của mã theo giá tham chiếu để nến tạm nối liền.

Giá điều chỉnh và cổ tức​

  • Giá điều chỉnh = giá gốc ÷ tích các hệ số điều chỉnh của mọi sự kiện quyền (cổ tức tiền, cổ tức cổ phiếu, thưởng, phát hành thêm) có ngày GDKHQ sau phiên đó. Phiên gần nhất giá điều chỉnh bằng giá gốc; càng về quá khứ giá điều chỉnh càng thấp hơn giá đã giao dịch thật.
  • Nhờ vậy chuỗi giá không bị "rơi" ở ngày GDKHQ: nắm cổ phiếu qua ngày chia cổ tức tiền, lợi nhuận mô phỏng đã gồm cổ tức như được tái đầu tư ngay vào chính cổ phiếu đó.
  • KL khớp là số gốc, không điều chỉnh theo chia tách; cần KL so sánh được qua các đợt chia tách thì dùng trường KL đã điều chỉnh (xem Dữ liệu và Panel).
  • Phiên tạm ngừng giao dịch của một mã: giữ giá đóng cửa trước, KL 0, không khớp lệnh được. Mã có nến cuối cách phiên cuối của dữ liệu hơn 10 phiên coi như đã ngừng giao dịch: sau nến cuối để trống, không "bịa" giá.

BCTC theo ngày công bố​

Backtest chỉ được dùng báo cáo đã có trước phiên đang xét. Với mỗi BCTC quý / năm, kho ghi hai ngày:

  1. Ngày có bản đầu — mốc công bố BCTC của FireAnt. Khoảng 21% báo cáo 2012–2026 không có mốc này; khi đó ngày được ước bằng cuối quý + 45 ngày (BCTC năm: + 90 ngày), hoặc ngày nhập liệu nếu muộn hơn (chặn ở cuối quý + 120 ngày, cuối năm + 200 ngày).
  2. Ngày có số đang lưu — cơ sở dữ liệu chỉ giữ số sau cùng của mỗi kỳ: số kiểm toán ghi đè BCTC năm, số soát xét ghi đè quý 2, quý 4 ghi lại theo số kiểm toán. Khi bản ghi được cập nhật quá 7 ngày sau bản đầu, số đang lưu chỉ được dùng từ ngày cập nhật (chặn ở cuối năm + 200 ngày, cuối quý 2 + 120 ngày). 43% báo cáo 2012–2026, gồm 81% BCTC năm, rơi vào trường hợp này.

Một báo cáo được dùng từ ngày sau ngày có số đang lưu, giữ tới khi có báo cáo mới hơn. Báo cáo kỳ cũ công bố muộn không thay số của kỳ mới hơn đã có.

BCTC của FPTNgày có bản đầuBacktest dùng từ
Quý 4/202530/01/202631/01/2026
Năm 2025 (số kiểm toán)04/02/202622/03/2026
Quý 1/202628/04/202629/04/2026
Quý 2/2026 (số soát xét)29/07/202623/08/2026 — phiên đầu tiên là 24/08/2026

Cách làm này thận trọng: hầu như không dùng số trước khi có, đổi lại có thể dùng muộn hơn thực tế 1–3 tháng với BCTC năm, khoảng một tháng với quý 2 (số chưa kiểm toán, chưa soát xét không còn trong cơ sở dữ liệu). Ngân hàng, công ty chứng khoán, bảo hiểm dùng mẫu BCTC riêng: nhiều chỉ tiêu để trống hoặc khác nghĩa — chỉ nên so trong cùng nhóm ngành.

Giao dịch nội bộ và cổ đông lớn​

  • Giao dịch của lãnh đạo, người nội bộ, người liên quan, cổ đông lớn chia hai nhóm: cá nhân và tổ chức (cổ đông lớn, công ty mẹ, quỹ, tổ chức liên quan). Chỉ tính mua, bán; thực hiện quyền mua cổ phiếu phát hành thêm không tính.
  • KL đã thực hiện ghi ở phiên thứ 3 sau ngày thực hiện — hạn công bố kết quả giao dịch — nên backtest không biết sớm hơn thị trường. KL đăng ký (chỉ cá nhân) ghi ở phiên đầu tiên của thời gian đăng ký giao dịch.
  • Cổ đông lớn là ảnh chụp danh sách hiện tại: chỉ tính cổ đông có ngày báo cáo trong 2 năm tính tới báo cáo mới nhất của mã, và chỉ có số từ ngày danh sách được cập nhật. Dùng cho bộ lọc hôm nay; backtest dùng các trường này có ghi chú … là ảnh chụp cổ đông lớn hiện tại (CSDL không lưu lịch sử)… — không dùng được cho backtest.

Vĩ mô: số đã biết ở từng phiên​

108 chuỗi vĩ mô chuẩn hóa (đơn vị thống nhất, tỷ lệ tính bằng số phần trăm) lấy từ kho kinh tế vĩ mô của FireAnt — cùng danh mục với Kinh tế vĩ mô. Ở mỗi phiên, Studio lấy kỳ mới nhất đã công bố trước phiên đó; số được sửa sau (ước tính → sơ bộ → chính thức) chỉ dùng từ ngày có bản sửa.

Ngày "đã biết" là ngày công bố thật khi kho ghi được ngày đó (Cục Thống kê, Ngân hàng Nhà nước, IMF WEO); còn lại, hoặc khi thiếu ngày thật, ngày được ước theo lịch của nguồn. Kho nạp số sớm hơn thì lấy lúc nạp (sau 14:45 tính từ phiên hôm sau):

NguồnSố được coi là đã biết
Cục Thống kê (GDP, CPI, IIP, bán lẻ, FDI, lao động…)Ngày ra báo cáo có số đó (mỗi lần sửa số có ngày riêng). Thiếu ngày: kỳ đến 7/2024 ngày làm việc cuối của tháng báo cáo, từ kỳ 8/2024 ngày 6 tháng sau
Lãi suất, doanh số liên ngân hàngNgày Ngân hàng Nhà nước công bố số của phiên (thường phiên làm việc kế tiếp). Thiếu ngày: 2 ngày làm việc sau
Tín dụng, tổng phương tiện thanh toánNgày Ngân hàng Nhà nước công bố số của tháng (thường 5–11 tuần sau cuối tháng). Thiếu ngày: 50 ngày sau cuối tháng
Cán cân thanh toán (quý)Ngày Ngân hàng Nhà nước công bố. Thiếu ngày: 90 ngày sau cuối quý
IMF WEOPhiên sau ngày phát hành bản WEO (có từ bản 10/2025); bản trước: cuối tháng của kỳ WEO (tháng 4, tháng 10). Số dự báo chỉ dùng khi năm đó đã qua
Hải quan (xuất, nhập khẩu)Số sơ bộ 15 ngày sau cuối tháng; số chính thức 45 ngày
Thị trường mở, giá xăng dầuPhiên hôm sau
Tỷ giá VietcombankNgay trong ngày
Dự trữ ngoại hối (IMF)60 ngày sau cuối tháng
World Bank31/7 năm sau

Độ dài lịch sử dùng được trong backtest khác nhau rất xa giữa các chuỗi:

ChuỗiDùng được liên tục từ
Lãi suất, doanh số liên ngân hàng (qua đêm → 9 tháng)01/2014
CPI, chỉ số giá vàng, giá đô la Mỹ01/2000; CPI theo nhóm hàng từ 2006–2009; lạm phát cơ bản từ 01/2015
Sản xuất công nghiệp (IIP)2011–2012; điện sản xuất, dầu thô từ 2007, xi măng từ 2000, thép từ 2013
Xuất, nhập khẩu, cán cân thương mại03/2009 (xuất khẩu, cán cân thiếu tháng 1–2/2014: liền mạch từ 05/2014)
Bán lẻ hàng hóa, dịch vụ (so cùng kỳ)09/2018
GDP quý03/2018 (số của quý 1/2018; trước đó kho chỉ có quý 1 mỗi năm nên không đưa vào)
Lao động, thất nghiệp04/2013 (số của quý 3/2012)
Tỷ giá USD/VND Vietcombank02/2020 (tỷ giá cuối tháng của IMF từ 02/1995 — các mẫu vĩ mô dùng thay cho kỳ trước 02/2020)
Tín dụng, tổng phương tiện thanh toán03/2025 (tổng phương tiện thanh toán liền mạch từ 03/2026)
Bơm tiền / dư nợ thị trường mở11/2025 / 02/2026
IMF WEO (GDP, lạm phát, nợ công…)Theo kỳ WEO: tăng trưởng, lạm phát, cán cân vãng lai từ 04/1990; GDP theo USD từ 09/2003; dân số từ 09/2006; nợ công từ 10/2010

Trong khoảng kho trống, giá trị giữ nguyên số cũ — đừng coi là quan sát mới; thu hẹp kỳ phân tích hoặc chỉ dùng kỳ có số. Kỳ phân tích có khoảng trống, chuỗi bắt đầu muộn hơn kỳ phân tích hoặc ngừng có số mới thì trợ lý AI nhận gợi ý Chuỗi vĩ mô "…" (…) … để tự điều chỉnh code; gợi ý này hiện ở Nhật ký chạy của tab Mã, không hiện trong báo cáo. Danh mục đủ 108 mã, đơn vị, kỳ và mốc có số ở Dữ liệu và Panel.

Rổ mã theo thời điểm​

Backtest trên danh sách mã hôm nay cho cả quá khứ mắc thiên lệch sống sót: mã đã hủy niêm yết (thường là doanh nghiệp làm ăn kém) biến mất khỏi kiểm tra, nên kết quả đẹp hơn thực tế. Studio dựng rổ theo thời điểm cho backtest trên các rổ chung:

RổBacktestBộ lọc, phân tích
Toàn bộ cổ phiếu (ALL), HOSE, theo ngànhTheo thời điểm: gồm mã đã hủy niêm yết và mã đã rời HOSE; mỗi mã chỉ được mua khi đang thuộc rổ ở phiên đóDanh sách hiện tại
HNX, UPCoM, VN30, HNX30, VN100, VNMidcap, VNSmallcapThành phần hiện tại cho cả quá khứ (cơ sở dữ liệu chưa lưu lịch sử sàn HNX / UPCoM và kỳ xét rổ chỉ số)Danh sách hiện tại
Danh sách mã tự chọn, watchlistĐúng danh sách bạn đưaĐúng danh sách bạn đưa
  • Mã hủy niêm yết trong kỳ: vị thế đang giữ được bán hết theo giá đóng cửa phiên giao dịch cuối, lý do Hủy niêm yết trong danh sách lệnh; từ phiên đó không mua thêm.
  • Giai đoạn ở HOSE suy từ bước giá (chỉ HOSE có bước giá 10 / 50 đồng từ 12/09/2016), nên rổ HOSE theo thời điểm có từ 09/2016; backtest 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.
  • Với rổ theo thời điểm, .top(n) xếp theo GTGD bình quân trong kỳ kiểm tra (lúc mã thuộc rổ), không theo thanh khoản hôm nay; điều kiện thanh khoản .liquid(…) xét GTGD bình quân 20 phiên ở từng phiên.
  • Nhãn rổ ở dòng thông tin cuối báo cáo ghi rõ, ví dụ mẫu Golden Cross MA50 / MA200 chạy ngày 19/10/2026: Cổ phiếu HOSE · GTGD ≥ 10 tỷ · top 240 · theo thời điểm, 9 mã đã hủy niêm yết.
  • Rổ VN30, HNX30, VN100, VNMidcap, VNSmallcap có ghi chú Rổ VN30 lấy theo thành phần hiện tại cho cả quá khứ — kết quả có thể đẹp hơn thực tế. và độ tin cậy của báo cáo bị hạ một bậc (xem Đọc báo cáo backtest); rổ HNX, UPCoM có ghi chú Dữ liệu chỉ gồm mã đang niêm yết và theo sàn hiện tại — mã đã huỷ niêm yết / chuyển sàn không có trong kiểm tra (thiên lệch sống sót nhẹ).

Giới hạn số mã mỗi lần chạy​

GóiSố mã tối đa mỗi lần chạy
Miễn phíKhông dùng Quant AI Studio
Thiết yếu250
Chuyên nghiệp, Cao cấp2.000
  • Rổ chung (tên rổ như ALL, HOSE, VN30, hoặc theo ngành) vượt giới hạn: Studio giữ các mã thanh khoản nhất (rổ theo thời điểm: thanh khoản trong kỳ; rổ hiện tại: GTGD 20 phiên) và ghi chú, ví dụ Rổ theo thời điểm có … mã trong kỳ — chạy 250 mã thanh khoản nhất (mức tối đa mỗi lần chạy; gói Chuyên nghiệp chạy tới 2,000 mã).
  • Danh sách tự chọn, watchlist vượt giới hạn: lần chạy báo lỗi (Studio không tự bỏ mã bạn đã chọn) — thu hẹp danh sách, chia thành nhiều lần chạy hoặc nâng gói.
  • Để tham khảo, ngày 19/10/2026 cả ba sàn có 1.519 cổ phiếu (mã 3 ký tự), trong đó 277 mã có GTGD bình quân 20 phiên từ 1 tỷ đồng, 134 mã từ 10 tỷ; HOSE có 407 mã, 111 mã từ 10 tỷ. Vì vậy phần lớn mẫu lọc thanh khoản rồi chặn .top(240), ví dụ universe("HOSE").liquid(10e9).top(240) hay universe("ALL").liquid(3e9).top(240): đủ nhóm mã có thanh khoản mà vẫn dưới 250 mã của gói Thiết yếu.

Mô phỏng khớp lệnh​

Backtest không "mua bán tức thì ở giá đóng cửa". Mỗi lệnh đi qua đúng các ràng buộc của sàn Việt Nam, nên kết quả thường kém hơn các backtest đơn giản — và gần hơn với những gì bạn thực sự làm được.

Một phiên trong mô phỏng​

Mỗi phiên t, theo thứ tự:

  1. Khớp lệnh đến hạn — bán trước, rồi tái cân bằng theo tỷ trọng (nếu có), rồi mua; giá mở cửa phiên t (hoặc ATC nếu đặt khớp ATC).
  2. Cắt lỗ trong phiên — chỉ khi chiến lược đặt chế độ cắt lỗ trong phiên.
  3. Định giá danh mục theo giá đóng cửa phiên t; mã hủy niêm yết có phiên cuối là t thì bán hết ở giá đóng cửa.
  4. Quy tắc rủi ro (cắt lỗ, chốt lời, dừng lỗ trượt, giữ tối đa) xét trên giá đóng cửa → tạo lệnh bán cho phiên sau.
  5. Tín hiệu cuối phiên — tín hiệu bán rồi tín hiệu mua, tính bằng dữ liệu tới hết phiên t → lệnh khớp ở phiên t + 1.

Không bước nào đọc dữ liệu sau phiên t. Mặc định tín hiệu cuối phiên t khớp giá mở cửa phiên t + 1; độ trễ 2 phiên trở lên lùi phiên khớp tương ứng. Khai báo độ trễ 0 phiên chỉ thêm ghi chú cảnh báo Khớp lệnh cùng phiên với tín hiệu (delay = 0)…, lệnh vẫn khớp sớm nhất ở phiên t + 1.

Luật sàn luôn áp dụng​

Quy tắcTrong mô phỏng
T+2Cổ phiếu mua phiên t chỉ bán được từ giá mở cửa phiên t + 3 (khớp ATC: ATC phiên t + 2). Tính theo từng lô mua, lô cũ bán trước. Tín hiệu bán đến sớm hơn thì chờ, thử lại mỗi phiên
LôCổ phiếu, ETF: bội số 100; chỉ số, HĐTL, chứng quyền: 1. KL mua làm tròn xuống
Trần / sàn trắng bênCổ phiếu, ETF theo biên độ HOSE 7%, HNX 10%, UPCoM 15%. Phiên cả ngày một giá và đóng cửa cách giá đóng cửa phiên trước từ 97% biên độ trở lên: lệnh mua ở phiên trần như vậy, lệnh bán ở phiên sàn như vậy không khớp
Thanh khoảnMỗi lệnh mua tối đa 10% KL khớp bình quân 20 phiên trước phiên khớp; vượt thì cắt bớt
Không bán khốngChỉ bán cổ phiếu đang có
Tạm ngừng giao dịchPhiên mã không có giao dịch thì không khớp được
Hủy niêm yếtBán hết ở giá đóng cửa phiên giao dịch cuối, kể cả lô chưa đủ T+2

Lệnh mua bị trắng bên hoặc gặp phiên không giao dịch thì bị bỏ (không treo sang phiên sau), trừ khi chiến lược bật thử lại (xem Chiến lược). Lệnh bán thì giữ và thử lại tới khi khớp.

Giá khớp, phí, thuế và trượt giá​

Tác động = 0,01 × √(KL lệnh ÷ KL khớp bình quân 20 phiên trước)
Giá mua = giá khớp × (1 + trượt giá + tác động)
Giá bán = giá khớp × (1 − trượt giá − tác động)
Phí mua = giá trị mua × phí
Phí + thuế bán = giá trị bán × (phí + thuế bán)

giá khớp là giá mở cửa (hoặc giá đóng cửa khi khớp ATC); phiên không có giá mở cửa dùng giá đóng cửa. Mặc định phí 0,15% mỗi chiều, thuế bán 0,1%, trượt giá 0,1%, hệ số tác động 0,01.

Ví dụ. Vốn 1 tỷ, tối đa 5 mã → mỗi lệnh khoảng 200 triệu. Mua một mã giá mở cửa 100 nghìn đồng, KL bình quân 20 phiên 5 triệu cổ phiếu:

  • KL = 200 triệu ÷ (100.000 × 1,001), làm tròn xuống lô 100 → 1.900 cổ phiếu; tác động = 0,01 × √(1.900 ÷ 5.000.000) ≈ 0,02%.
  • Giá mua ≈ 100 × (1 + 0,1% + 0,02%) = 100,12; giá trị 190,23 triệu, phí 0,29 triệu.
  • Bán sau khi giá lên 110: giá bán ≈ 110 × (1 − 0,12%) = 109,87; tiền về 208,75 triệu trừ 0,52 triệu phí + thuế.
  • Giá tăng 10% nhưng lãi sau chi phí là 9,3%: mỗi vòng mua – bán tốn khoảng 0,65% vốn. Chiến lược đổi toàn bộ danh mục 20 lần mỗi năm mất khoảng 13%/năm chỉ vì chi phí — lý do các mẫu ngắn hạn khó thắng thị trường.

Chia vốn và thứ tự mua​

  • Tiền cho mỗi lệnh mua theo tín hiệu = (tiền mặt + giá trị cổ phiếu theo giá khớp) ÷ số mã tối đa (mặc định 5); hoặc một tỷ lệ cố định của tài sản nếu chiến lược đặt. Không vượt tiền mặt còn lại (đã trừ phí).
  • Có nhiều tín hiệu mua hơn chỗ trống: ưu tiên điểm (score) cao hơn, bằng điểm thì mã có KL bình quân 20 phiên lớn hơn. Đã đủ số mã tối đa thì tín hiệu bị bỏ (Bỏ do đủ số mã); không mua được lô nào — hết tiền, hoặc giới hạn thanh khoản còn dưới một lô — thì bỏ (Bỏ do hết tiền).
  • Mã đang nắm giữ không mua thêm theo tín hiệu; một mã có cả tín hiệu mua và bán trong cùng phiên thì không mua.
  • Tiền nhàn rỗi mặc định không sinh lãi, không vay ký quỹ.

Thoát lệnh: tín hiệu, cắt lỗ, chốt lời​

Cách thoátĐiều kiện (mặc định xét trên giá đóng cửa, bán ở phiên sau)Lý do trong danh sách lệnh
Tín hiệu bánexit của chiến lược đúng ở cuối phiênTín hiệu
Cắt lỗĐóng cửa ≤ giá vốn × (1 − ngưỡng)Cắt lỗ
Chốt lờiĐóng cửa ≥ giá vốn × (1 + ngưỡng)Chốt lời
Dừng lỗ trượtĐóng cửa ≤ đỉnh × (1 − ngưỡng); đỉnh là giá đóng cửa cao nhất từ khi mua (tính cả giá mua)Trailing
Giữ tối đaĐã giữ đủ n phiênHết hạn giữ
Tái cân bằngTỷ trọng mới thấp hơn đang giữTái cân bằng
Hủy niêm yếtPhiên giao dịch cuối của mãHủy niêm yết

giá vốn là giá mua bình quân đã gồm trượt giá và tác động (chưa gồm phí). Các quy tắc xét theo thứ tự cắt lỗ → chốt lời → dừng lỗ trượt → giữ tối đa. Ở chế độ cắt lỗ trong phiên, khi giá thấp nhất chạm ngưỡng thì bán ngay ở giá ngưỡng (mở cửa đã thấp hơn ngưỡng thì bán ở giá mở cửa) — vẫn phải đủ T+2 và không trắng bên sàn. Vị thế còn mở ở cuối kỳ không bán: định giá theo giá đóng cửa cuối, hiện là Đang mở, lãi / lỗ đã trừ phí, thuế bán giả định.

Tái cân bằng danh mục​

Chiến lược xoay vòng (xếp hạng rồi nắm nhóm đầu) và tỷ trọng đổi danh mục ở phiên đầu tiên của mỗi kỳ (tuần, tháng, quý, năm hoặc mỗi n phiên): tín hiệu tính ở cuối phiên đó, lệnh khớp phiên sau. Studio không dùng "phiên cuối kỳ" vì muốn biết phiên t là cuối tháng phải biết trước lịch phiên t + 1.

Ở phiên khớp, Studio tính số cổ phiếu mục tiêu = tỷ trọng × tài sản ÷ giá, làm tròn xuống lô; bán phần thừa trước, rồi mua phần thiếu theo thứ tự tỷ trọng giảm dần, cùng các ràng buộc T+2, trần / sàn, thanh khoản, tiền mặt. Phần bán chưa được (chưa đủ T+2, sàn trắng bên) chờ tới kỳ tái cân bằng sau. Quy tắc cắt lỗ, chốt lời vẫn áp dụng giữa các kỳ.

Khối Khớp lệnh mô phỏng trong báo cáo​

Cuối tầng Chi tiết của báo cáo backtest, khối gập Khớp lệnh mô phỏng (dòng tóm tắt: Khớp … lần · phí, thuế, T+2, trần / sàn như sàn Việt Nam) ghi đúng giả định đã dùng cho lần chạy đó (vốn, số mã tối đa, cách khớp, phí, thuế, trượt giá, T+2, lô, giới hạn thanh khoản, trắng bên trần / sàn, quy tắc thoát nếu có) và đếm những lần luật sàn can thiệp — hình minh hoạ ở Đọc báo cáo backtest. Khối ghi giới hạn thanh khoản là ≤ 10% GTGD TB 20 phiên; Studio tính trên KL bình quân 20 phiên như Luật sàn.

DòngÝ nghĩa
Lệnh đặtSố lệnh từ tín hiệu mua / bán, quy tắc thoát xét cuối phiên (cắt lỗ, chốt lời…) và lệnh mua khi tái cân bằng. Phần bán bớt khi tái cân bằng, cắt lỗ trong phiên và bán do hủy niêm yết không tính ở đây; một lệnh bán chờ T+2 có thể khớp làm nhiều lần. Vì vậy Khớp có thể lớn hơn Lệnh đặt, nhất là với chiến lược xoay vòng, tỷ trọng
KhớpSố lần khớp (mua và bán)
Mua trần không khớpSố lần lệnh mua gặp phiên trần trắng bên
Bán sàn không khớpSố lần lệnh bán gặp phiên sàn trắng bên (thử lại phiên sau)
Bán chờ T+2Số lần lệnh bán phải chờ vì cổ phiếu chưa về
Cắt theo thanh khoảnSố lệnh mua bị cắt bớt vì vượt 10% KL bình quân 20 phiên
Bỏ do hết tiềnLệnh mua (theo tín hiệu hoặc tái cân bằng) không mua được lô nào: không đủ tiền, hoặc giới hạn thanh khoản dưới một lô
Bỏ do đủ số mãTín hiệu mua khi danh mục đã đủ số mã tối đa

Cắt theo thanh khoản, Mua trần không khớp lớn là dấu hiệu chiến lược dựa vào mã kém thanh khoản hoặc mua đuổi trần — kết quả thật sẽ khó đạt hơn. Bỏ do đủ số mã lớn nghĩa là tín hiệu nhiều hơn chỗ: thứ tự ưu tiên (score) quyết định kết quả.

Ví dụ. Mẫu Golden Cross MA50 / MA200 (rổ HOSE theo thời điểm, GTGD ≥ 10 tỷ, top 240; 04/01/2016 – 16/10/2026; giả định mặc định, tối đa 10 mã) có 552 lệnh đặt, 334 lần khớp. 218 tín hiệu mua bị bỏ vì danh mục đã đủ 10 mã — hơn một nửa số tín hiệu mua; mẫu ưu tiên mã có GTGD bình quân 20 phiên cao (score), nên đổi cách xếp ưu tiên có thể đổi đáng kể kết quả. Ngoài ra 6 lần lệnh bán gặp sàn trắng bên phải thử lại phiên sau, 1 lần lệnh bán phải chờ đủ T+2.

Giả định mặc định và Cài đặt​

Mặc định: vốn 1 tỷ, phí 0,15% mỗi chiều, thuế bán 0,1%, trượt giá 0,1%, lãi suất phi rủi ro 0% (dùng khi tính Sharpe, Sortino), khớp ở giá mở cửa phiên sau tín hiệu. Đổi trong Cài đặt › Giả định mô phỏng mặc định (xem Cài đặt); thay đổi áp cho mọi lần backtest sau của bạn.

Thứ tự ưu tiên: mặc định của Studio < Cài đặt của bạn < khai báo trong code của chiến lược. Các luật T+2, lô, trần / sàn, thanh khoản, không bán khống luôn áp dụng; code chiến lược đổi được tham số của chúng (xem Chiến lược).

Kiểm tra dùng dữ liệu tương lai​

Mỗi lần backtest, Studio tính lại tín hiệu trên dữ liệu bị cắt bỏ phần sau ở hai mốc (55% và 80% kỳ kiểm tra) rồi so với tín hiệu tính trên dữ liệu đầy đủ. Tín hiệu của một phiên quá khứ đổi khi bỏ dữ liệu tương lai nghĩa là chiến lược đang "nhìn trước": báo cáo hiện cảnh báo nêu rõ trường, mã, ngày, độ tin cậy về thấp, và dòng cuối báo cáo ghi kiểm tra dữ liệu tương lai: KHÔNG đạt. Lỗi phổ biến là dùng giá trị của phiên sau hoặc thống kê trên cả chuỗi — xem Dữ liệu và Panel.

Vì sao kết quả thật sẽ khác​

Mô phỏng sát luật sàn nhưng vẫn là mô phỏng. Những giả định đáng chú ý:

Giả định của StudioThực tế
Cả lệnh khớp ở một giá (mở cửa hoặc ATC) cộng trượt giá cố định và tác động ước lượngLệnh lớn khớp dần, giá ATO có thể lệch xa giá tham chiếu; mã ít thanh khoản trượt nhiều hơn
Trắng bên chỉ nhận ra khi cả phiên một giáPhiên có giao dịch ở giá trần nhưng dư mua lớn vẫn được coi là mua được
Biên độ theo sàn hiện tại (7% / 10% / 15%); mã đã hủy niêm yết từng ở HOSE tính 7%, mã đã hủy khác không xét trắng bênNgày đầu niêm yết, sau tạm ngừng dài có biên độ khác; mã đã chuyển sàn từng có biên độ khác
Cổ tức tiền nằm trong giá điều chỉnh (như tái đầu tư ngay), không trừ thuế thu nhập 5%Cổ tức về tài khoản sau vài tuần và bị khấu trừ thuế
Quyền mua cổ phiếu phát hành thêm quy về giá điều chỉnhPhải nộp tiền thực hiện quyền, hoặc bán quyền
Số cổ phiếu, lô 100 tính trên giá điều chỉnhỞ kỳ xa, số cổ phiếu mô phỏng khác số cổ phiếu thật lúc đó (tỷ suất lợi nhuận không đổi)
Phí 0,15% mỗi chiềuPhí tùy công ty chứng khoán, có thể thấp hơn
BCTC, vĩ mô dùng theo ngày công bố ước tính khi thiếu ngày thật; BCTC đã kiểm toán, soát xét chỉ dùng từ ngày có sốNhà đầu tư thấy bản đầu sớm hơn 1–3 tháng
Rổ HNX, UPCoM, chỉ số, danh sách tự chọn dùng thành phần hiện tạiThiên lệch sống sót: kết quả đẹp hơn
Lệnh của bạn không ảnh hưởng giá (ngoài phần tác động)Lệnh lớn đẩy giá; có ngày không đặt được lệnh, có lúc bạn không dám giữ lệnh qua đợt giảm 30%

Hãy coi kết quả backtest là giới hạn trên của những gì có thể đạt được, và kiểm tra thêm ở Tối ưu và kiểm định độ vững.

Hỏi đáp​

Vì sao backtest không có phiên hôm nay?

Backtest chỉ dùng phiên đã chốt (sau 15:05, khi máy chủ dựng xong tệp khoảng 15:20). Trong giờ giao dịch, chỉ bộ lọc, phân tích và trợ lý dùng giá tạm.

Khối ngoại, tự doanh của hôm nay trống?

Số này công bố cuối ngày, có sau 19:00. Bộ lọc khối ngoại của mẫu đặt includeToday: false nên xét tới phiên đã chốt trước đó.

Chạy lại hôm nay ra số khác hôm qua?

Kho đã thêm phiên mới, BCTC mới hoặc số vĩ mô mới; hoặc một mã vừa có sự kiện quyền làm cả chuỗi giá điều chỉnh đổi theo. Chạy lại trong cùng ngày (sau khi giá đã chốt) luôn cho cùng kết quả.

Giá trong danh sách lệnh khác giá trên bảng giá ngày đó?

Giá trong backtest là giá điều chỉnh. Mã đã chia cổ tức, thưởng cổ phiếu sau ngày đó thì giá điều chỉnh thấp hơn giá đã giao dịch thật; tỷ suất lãi / lỗ vẫn đúng.

Có lệnh lý do Hủy niêm yết?

Rổ theo thời điểm gồm cả mã đã hủy niêm yết. Mã đang giữ bị bán hết ở giá đóng cửa phiên cuối — đúng rủi ro bạn gặp khi nắm cổ phiếu đó, thay vì để mã "biến mất" khỏi kiểm tra.

Lỗi Không chạy được: kho dữ liệu của máy chủ còn thiếu năm … (đang nạp)?

Máy chủ đang dựng lại kho. Thử lại sau ít phút; Cài đặt › Dữ liệu & bộ nhớ đệm cho biết khi nào kho dùng lại được.

Ghi chú Rổ có … mã — chạy … mã thanh khoản nhất là gì?

Rổ vượt giới hạn số mã của gói, Studio đã giữ các mã thanh khoản nhất. Thêm .liquid(…) hoặc .top(n) để tự chọn phạm vi, hoặc nâng gói để chạy tới 2.000 mã.