Giao dịch thuật toán là đặt lệnh theo một bộ quy tắc viết sẵn bằng code, thay vì quyết định tay từng lệnh. Tại Việt Nam, tính đến 22/10/2026, chưa có luật, nghị định hay thông tư nào quy định riêng về giao dịch thuật toán của cá nhân, nhưng tháng 09/2023 UBCKNN cho rằng đặt lệnh tự động bằng robot “chưa được phép thực hiện” và đến nay chưa có văn bản công khai nào làm rõ lại. Phần quyết định nằm ở backtest (chạy thử quy tắc trên dữ liệu cũ): ở biểu phí 0,15% mỗi chiều và thuế 0,1% khi bán, mỗi lệnh mua rồi bán mất khoảng 0,4%; thêm trượt một bước giá mỗi chiều ở mức giá 50.000 đồng là 0,8%, tức quy tắc phải lãi trung bình hơn 0,8% mỗi lệnh mới hòa vốn.

Bài này không đưa ra chiến lược nào để làm theo. Mục tiêu là giúp bạn loại sớm những ý tưởng không sống nổi qua phí, thuế và T+2, trước khi chúng tốn tiền thật.

Giao dịch thuật toán là gì?

Giao dịch thuật toán là giao dịch mà một chương trình máy tính tự quyết định một hoặc nhiều thông số của lệnh (có đặt lệnh hay không, lúc nào, giá, khối lượng, hay xử lý lệnh sau khi gửi) với can thiệp hạn chế hoặc không có can thiệp của con người. Đây là cách Chỉ thị MiFID II của châu Âu định nghĩa (Điều 4 khoản 1 điểm 39). Việt Nam chưa có định nghĩa pháp lý tương đương.

Trong cùng chữ “thuật toán” có hai thế giới rất khác nhau:

Tiêu chíThuật toán theo quy tắcGiao dịch tần suất cao (HFT)
Ví dụMua khi giá vượt đường trung bình, bán khi thủngĐặt, hủy hàng nghìn lệnh để kiếm chênh lệch rất nhỏ
Khung thời gianNến ngày, nến 5–15 phútMili giây trở xuống
Hạ tầngMáy tính cá nhân hoặc máy chủ thuê, API của CTCKĐặt máy cạnh máy chủ sàn (co-location)

API cho cá nhân ở Việt Nam có giới hạn tần suất (ví dụ VPBankS 5 request mỗi giây), nên phần còn lại của bài nói về loại thứ nhất. Cách đăng ký, xác thực và giới hạn API của SSI, DNSE, TCBS, VPBankS có ở bài API chứng khoán.

Cá nhân ở Việt Nam có được giao dịch thuật toán không?

Chưa có luật, nghị định hay thông tư nào chúng tôi tìm thấy cấm riêng hay cho phép riêng giao dịch thuật toán của cá nhân, tính đến 22/10/2026; nhưng tháng 09/2023 UBCKNN cho rằng đặt lệnh tự động bằng robot “chưa được phép thực hiện” và chưa làm rõ lại, dù nay nhiều CTCK đã mở API đặt lệnh cho cá nhân. Ba mốc cần biết:

  1. Khung hiện hành không nhắc tới thuật toán. Thông tư 134/2017/TT-BTC, sửa bởi Thông tư 73/2020/TT-BTC, định nghĩa dịch vụ giao dịch trực tuyến là dịch vụ để nhà đầu tư “mở tài khoản, đặt lệnh, … thông qua mạng Internet hoặc điện thoại” (Điều 3 khoản 9); văn bản hợp nhất không có chữ “thuật toán” hay “robot”.
  2. UBCKNN tháng 09/2023. Theo VnEconomy (13/09/2023), UBCKNN cho rằng theo quy định về giao dịch trực tuyến, việc dùng các công nghệ này để đặt lệnh “chưa được phép thực hiện”, yêu cầu CTCK “dừng ngay việc sử dụng hình thức đặt lệnh tự động” và “yêu cầu nhà đầu tư chấm dứt việc sử dụng hình thức trên (nếu có) khi chưa được cơ quan quản lý cho phép”. Tiêu đề bài báo nói robot “tần suất lớn”, nhưng phần yêu cầu nhắc chung hình thức đặt lệnh tự động. Báo không nêu số hiệu văn bản của UBCKNN; phần căn cứ được VnEconomy in là “Thông tư số 13/2017/TT-BTC”, VietTimes in là “Thông tư số 134/2017”.
  3. Hai văn bản đang soạn. Dự thảo thông tư thay Thông tư 134/2017 “lần đầu tiên dành riêng một mục quy định về giao diện lập trình ứng dụng mở”, chủ yếu cho kết nối giữa CTCK và bên thứ ba, với yêu cầu “xác thực, bảo mật, giới hạn tần suất truy cập”; bài báo không nhắc giao dịch thuật toán (Thời báo Tài chính, 08/07/2026). Dự án Luật Chứng khoán sửa đổi trình Quốc hội ngày 17/10/2026; báo cáo thẩm tra đề nghị “kiểm soát trí tuệ nhân tạo, giao dịch thuật toán, bảo đảm khả năng can thiệp của con người” (CafeF, 18/10/2026). Đến 22/10/2026, cả hai chưa có hiệu lực.

Đây là cách hiểu của chúng tôi, không phải ngưỡng do UBCKNN công bố: văn bản năm 2023 không nêu mức tần suất nào là được phép, và giới hạn tần suất của CTCK là giới hạn kỹ thuật, không phải sự cho phép của cơ quan quản lý. Cách thận trọng là giữ số lệnh, số lần hủy ở mức một người giao dịch, luôn có cách dừng tay, và hỏi CTCK bằng văn bản trước khi chạy chiến lược đặt, hủy lệnh dày. Mua tín hiệu, mua bot hay giao tài khoản cho người khác chạy: xem bài bot giao dịch phái sinh.

Khi đã rõ khung pháp lý, câu hỏi còn lại là quy tắc của bạn có đáng chạy bằng tiền thật không. Đó là việc của backtest.

Backtest là gì, vì sao hay sai?

Backtest là chạy thử bộ quy tắc giao dịch trên dữ liệu giá quá khứ để xem nó sẽ cho kết quả gì nếu đã được áp dụng; nó hay sai vì người làm bỏ qua chính những ràng buộc khiến thị trường Việt Nam khác sách vở: T+2, biên độ, lô, bước giá, phí và thuế. Mỗi lệnh trong backtest phải qua ba câu hỏi: đặt được không, khớp được ở giá đó không, sau chi phí còn bao nhiêu. Các mục dưới đây đi theo thứ tự làm: dữ liệu, luật của Sở, chi phí, kiểm tra ngoài mẫu, chạy thử.

Dữ liệu cho backtest chứng khoán Việt Nam

Nguồn chính thống nhất cho cá nhân là API dữ liệu của CTCK nơi bạn có tài khoản, nhưng bạn phải tự kiểm tra ba lỗi: giá chưa điều chỉnh theo sự kiện quyền, thiếu mã đã hủy niêm yết, và dùng giá đóng cửa như thể đã biết trước.

Nguồn dữ liệu

Bảng so sánh API dữ liệu của các CTCK có ở bài API chứng khoán đã dẫn ở trên. Riêng với backtest: trong tài liệu SSI FastConnect Data, chỉ DailyStockPrice trả trường Closepriceadjusted (giá đóng cửa điều chỉnh), và tài liệu không nói cách điều chỉnh. Thư viện cộng đồng tiện hơn nhưng lấy từ bên thứ ba, bạn phải tự đối chiếu.

Giá điều chỉnh theo sự kiện quyền

Ngày không hưởng quyền, Sở hạ giá tham chiếu theo giá trị cổ tức hoặc quyền; tách, gộp cổ phiếu cũng vậy (Quy chế niêm yết và giao dịch chứng khoán niêm yết, Quyết định 22/QĐ-HĐTV ngày 16/03/2026, Điều 33 khoản 4, 5). Giá trên bảng tụt dù về lý thuyết tổng giá trị nắm giữ không đổi.

Dữ liệu chưa điều chỉnh cho thuật toán thấy một cú “giảm giá” không có thật, kích hoạt cắt lỗ hoặc tín hiệu bán. Chuỗi đã điều chỉnh lại làm giá cũ khác giá đã thực sự giao dịch, nên không dùng được để kiểm tra bước giá, trần, sàn hay tính phí. Cách an toàn: giữ cả hai chuỗi, dùng chuỗi điều chỉnh để tính tín hiệu và lợi nhuận, dùng giá gốc để mô phỏng việc đặt lệnh.

Thiên lệch sống sót

Backtest trên danh sách mã đang niêm yết hôm nay bỏ sót mọi mã đã rời sàn, trong đó có những mã bị hủy niêm yết bắt buộc vì kết quả xấu, ví dụ thua lỗ 03 năm liên tục (điểm e khoản 1 Điều 120 Nghị định 155/2020/NĐ-CP, đã sửa đổi). Chiến lược “mua cổ phiếu giảm sâu” chạy trên danh sách hôm nay vì vậy đẹp hơn thực tế. Tương tự, dùng thành phần VN30 hôm nay cho 10 năm trước là đã biết trước mã nào sẽ lớn.

Giá đóng cửa không phải giá bạn mua được

Giá đóng cửa là “giá thực hiện tại lần khớp lệnh lô chẵn cuối cùng trong ngày giao dịch” (Quy chế, Điều 3 khoản 17), tức thường là giá khớp phiên ATC 14h30–14h45 trên HOSE. Muốn khớp ở giá này, bạn phải gửi lệnh ATC trước khi phiên kết thúc, khi chưa biết giá đóng cửa. Một quy tắc tính tín hiệu bằng giá đóng cửa rồi “mua ở giá đóng cửa” cùng phiên là đang nhìn trước tương lai. Cách sửa: tín hiệu từ nến phiên T, khớp ở giá mở cửa hoặc trong phiên T+1; hoặc tính tín hiệu từ giá lúc 14h25 và chấp nhận rủi ro khớp ATC.

Đưa luật của Sở vào backtest

Bốn ràng buộc phải có trong code mô phỏng cổ phiếu: T+2, biên độ giá, lô và bước giá, quy tắc phiên; thiếu một cái là backtest đang giao dịch trên một thị trường không tồn tại.

Ràng buộcHOSEHNXẢnh hưởng tới backtest
Ngày bán sớm nhấtPhiên chiều T+2Phiên chiều T+2Không cắt lỗ, chốt lời trong T và T+1
Biên độ trong ngày±7%±10%Giá chạm sàn, trần có thể không khớp được
Lô chẵn100 cổ phiếu, tối đa 500.000 mỗi lệnh100 cổ phiếuLàm tròn khối lượng xuống bội số 100
Bước giá cổ phiếu10, 50, 100 đồng theo mức giá100 đồngTrượt giá tối thiểu một bước

Theo Phụ lục III Quy chế niêm yết và giao dịch chứng khoán niêm yết (Quyết định 22/QĐ-HĐTV ngày 16/03/2026) và chu kỳ thanh toán T+2 từ 29/08/2022. UPCoM không thuộc quy chế này; biên độ UPCoM ±15% theo quy định giao dịch UPCoM do MBS tổng hợp (22/07/2025). Cập nhật 22/10/2026.

T+2. Cổ phiếu và tiền về tài khoản trước 13h ngày T+2 (LSVN, 30/08/2022). Với code: lệnh bán chỉ hợp lệ từ phiên chiều T+2, và muốn dùng ngay tiền bán chưa về thì phải ứng trước, có lãi (DNSE ghi ứng trước tự động 12,5%/năm). Backtest xoay vòng toàn bộ vốn mỗi ngày đang ngầm vay ứng trước mà không trả lãi.

Biên độ. Giá trần làm tròn xuống, giá sàn làm tròn lên theo bước giá (Điều 32 khoản 1). Khi giá nằm sàn, phía mua có thể trống: backtest ghi “đã bán ở giá sàn” trong khi thực tế không khớp được. Cách thận trọng: phiên đóng cửa ở giá sàn thì coi lệnh bán là không khớp.

Lô và bước giá. Lô lẻ 1–99 cổ phiếu chỉ đặt lệnh LO (Điều 34) và thanh khoản thường mỏng hơn lô chẵn. Tính theo phần trăm, một bước giá chênh rất nhiều giữa các vùng giá:

Giá cổ phiếu HOSE (đồng)Bước giá (đồng)Một bước giá (%)
9.990100,10
10.000500,50
49.950500,10
50.0001000,20
100.0001000,10

Tự tính theo Phụ lục III Quyết định 22/QĐ-HĐTV ngày 16/03/2026.

Một mã giá 10.000 đồng chỉ cần trượt một bước mỗi chiều là mất 1% mỗi lệnh khứ hồi, nhiều hơn cả phí và thuế cộng lại ở nhiều CTCK.

Phiên giao dịch. Trên HOSE, phiên ATO 9h00–9h15 và ATC 14h30–14h45 không được sửa, hủy lệnh nào, kể cả lệnh LO đặt từ trước (Điều 23). Mã bị hạn chế giao dịch chỉ khớp định kỳ, mỗi đợt 15 phút (Phụ lục III), nên backtest trong phiên với những mã này là vô nghĩa.

Với hợp đồng tương lai VN30 (VN30F) không có T+2, mở và đóng vị thế trong cùng phiên được; thay vào đó, chuỗi giá “liên tục” ghép các hợp đồng tháng có khoảng nhảy ở ngày chuyển kỳ hạn (đáo hạn thứ Năm thứ ba hằng tháng), cần xử lý như sự kiện quyền ở cổ phiếu.

Chi phí phải trừ trong backtest

Với cổ phiếu, mỗi lệnh khứ hồi tốn phí CTCK hai chiều, phí trả Sở (nhiều CTCK đã gộp vào phí), thuế 0,1% trên giá bán và trượt giá.

Khoản (cổ phiếu)MứcCăn cứ
Phí CTCK, ví dụ SSI đặt lệnh online0,15% mỗi chiều, đã gồm phí SởBiểu giá SSI hiệu lực 10/10/2025
Phí CTCK, ví dụ DNSE giao dịch tiền mặt0%, chưa gồm phí SởBiểu phí DNSE 2026.03
Phí Sở với cổ phiếu niêm yết0,027% giá trị giao dịchQuyết định 1541/QĐ-BTC
Thuế TNCN0,1% giá bán, kể cả khi bán lỗLuật 109/2025/QH15, Nghị định 253/2026/NĐ-CP

Cập nhật 22/10/2026. DNSE thu 0,045% khi giao dịch ký quỹ. Bảng phí đủ 23 CTCK ở bài so sánh phí giao dịch chứng khoán.

Điểm hay bị bỏ sót: thuế tính trên giá bán chứ không trên lãi, nên chiến lược nhiều lệnh nhỏ chịu thuế cả trên những lệnh lỗ.

Với VN30F, chi phí tính theo hợp đồng, khoảng 0,45–0,47 điểm mỗi khứ hồi ở 1.900 điểm tại SSI và DNSE trước trượt giá; cách tính ở bài phí giao dịch phái sinh.

Ví dụ: phí và T+2 làm thay đổi kết quả backtest

Trong ví dụ giả định dưới đây, lệnh lãi 2.000.000 đồng khi chưa trừ gì còn 1.595.000 đồng sau phí, thuế; phải giữ đến chiều T+2 theo luật thanh toán (giả định giá lúc đó về 50.400 đồng) còn 398.000 đồng; thêm trượt giá một bước mỗi chiều thì lỗ 1.800 đồng. Không phải dữ liệu của mã hay chiến lược nào.

Tình huống: tín hiệu mua 2.000 cổ phiếu HOSE ở 50.000 đồng và bán sáng hôm sau ở 51.000 đồng; phí CTCK 0,15% mỗi chiều (đã gồm phí Sở), thuế 0,1% giá bán. Cột cuối thêm trượt giá (giá khớp thực tế kém hơn giá bạn định, ở đây là 1 bước giá 100 đồng): mua 50.100, bán 50.300 đồng.

Khoản (đồng)Chưa trừ gìTrừ phí, thuếThêm T+2Thêm trượt giá
Tiền mua100.000.000100.000.000100.000.000100.200.000
Tiền bán102.000.000102.000.000100.800.000100.600.000
Phí mua 0,15%0150.000150.000150.300
Phí bán 0,15%0153.000151.200150.900
Thuế 0,1% giá bán0102.000100.800100.600
Lãi, lỗ ròng2.000.0001.595.000398.000−1.800

Tự tính: lãi, lỗ ròng = tiền bán − tiền mua − phí mua − phí bán − thuế.

Khoản hụt lớn nhất ở cột T+2 đến từ giá giả định, không phải từ luật: giá chiều T+2 cũng có thể cao hơn. Thứ T+2 chắc chắn lấy đi là lệnh “bán sáng hôm sau” và mọi lệnh cắt lỗ trong T và T+1. Phần chắc chắn là chi phí, và nó nhân lên theo số lệnh: 100 lệnh khứ hồi một năm, mỗi lệnh khoảng 100 triệu đồng, giá ra vào gần nhau.

Chi phí một năm (đồng)Phí 0,15% mỗi chiềuPhí 0% cộng phí Sở 0,027%
Phí mua, phí bán30.000.0005.400.000
Thuế 0,1% giá bán10.000.00010.000.000
Trượt 1 bước mỗi chiều ở giá 50.00040.000.00040.000.000
Tổng80.000.00055.400.000

Tự tính, giả định 100 lệnh × 100 triệu đồng mỗi chiều; cột 2 theo mức tiền mặt 0% của DNSE cộng phí Sở 0,027%.

Tính trên 100 triệu đồng mỗi lệnh, chiến lược phải lãi gộp 55–80% số vốn đó một năm mới hòa vốn; xoay đủ 100 vòng với chỉ 100 triệu đồng còn phải ứng trước tiền bán, có lãi, chưa tính ở đây. Đây là lý do số lệnh, chứ không phải độ thông minh của tín hiệu, thường quyết định một thuật toán cổ phiếu có sống được hay không.

Trừ đủ chi phí mới loại được lỗi tính toán. Lỗi còn lại nằm ở người làm backtest: chỉnh tham số đến khi kết quả đẹp.

Tránh overfitting: dữ liệu trong mẫu và ngoài mẫu

Overfitting (quá khớp) là khi tham số được chỉnh mãi cho đến lúc khớp với nhiễu của dữ liệu cũ; dấu hiệu là kết quả đẹp trên dữ liệu đã dùng để chỉnh và sụp trên dữ liệu mới. Theo một nghiên cứu đăng trên tạp chí của Hiệp hội Toán học Hoa Kỳ (05/2014), với 5 năm dữ liệu, thử quá 45 cấu hình độc lập là gần như chắc chắn tìm được một cấu hình có Sharpe trong mẫu khoảng 1 dù kỳ vọng ngoài mẫu bằng 0.

Cách làm giảm rủi ro:

  • Tách dữ liệu ngoài mẫu (out-of-sample) ngay từ đầu. Ví dụ giữ 20–30% đoạn cuối, không nhìn tới cho đến khi chốt quy tắc; đã nhìn rồi chỉnh tiếp thì nó không còn là ngoài mẫu.
  • Walk-forward. Tối ưu trên một cửa sổ dữ liệu, chạy thử trên đoạn ngay sau nó, rồi trượt cửa sổ lên và lặp lại. Kết quả là chuỗi các đoạn ngoài mẫu, gần với cách bạn sẽ dùng thuật toán thật.
  • Ít tham số, vùng tham số ổn định. Nếu đổi đường trung bình từ 20 sang 22 phiên mà lãi biến thành lỗ, chiến lược đang dựa vào một điểm may mắn.
  • Đo bằng tiền và mức sụt giảm. Nhìn mức sụt giảm lớn nhất từ đỉnh (max drawdown) và chuỗi thua dài nhất, không chỉ tỷ lệ thắng.

Chạy giấy và sandbox trước khi dùng tiền thật

Sau kiểm tra ngoài mẫu là chạy giấy, kiểm thử trên sandbox nếu CTCK có, rồi mới chạy tiền thật với khối lượng nhỏ nhất.

Chạy giấy (paper trading): thuật toán nhận giá thật, ghi lại lệnh định đặt nhưng không gửi; sau vài tuần, lệch nhiều so với backtest cùng kỳ nghĩa là backtest có lỗi dữ liệu hoặc giả định khớp quá lạc quan.

Sandbox (môi trường thử của CTCK, dữ liệu giả lập) kiểm tra code có gọi API đúng hay không, không kiểm tra chiến lược. Trong bốn CTCK mở API cho cá nhân, chỉ DNSE công bố sandbox, và tài liệu ghi rõ môi trường này “không dùng để benchmark hiệu năng hay chạy chiến lược giao dịch”; dùng nó để thử luồng đặt, sửa, hủy lệnh, nối lại kết nối, làm mới token. Ở VPBankS, lệnh qua API là lệnh thật ngay từ đầu.

Tiền thật, khối lượng nhỏ nhất: 100 cổ phiếu hoặc 1 hợp đồng VN30F. Đo trượt giá và tỷ lệ khớp thật rồi đưa ngược vào backtest. Danh sách 13 điểm kiểm soát rủi ro trước khi cho bot chạy nằm ở bài API chứng khoán.

Review Chứng Khoán không khuyến nghị chiến lược hay thuật toán cụ thể nào.