Làm thế nào để code và backtest một chiến lược long–short thực sự dùng được?

30/11/2025

189 lượt đọc

1. Long–short thực chất là gì, và mình đang cố kiểm chứng điều gì?

Nếu bỏ hết “mỹ từ” đi, long–short đơn giản là cách tách phần thị trường chung (beta) ra khỏi phần khác biệt do mô hình (alpha). Thay vì chỉ mua những gì mình thích, ta vừa long thứ mình cho là sẽ chạy “tương đối tốt hơn”, vừa short thứ mình cho là sẽ chạy “tương đối kém hơn”, rồi ghép lại thành một danh mục gần như trung hòa với thị trường.

Về mặt logic:

  1. Long: các tài sản có tín hiệu tốt (score cao) – kỳ vọng outperform.
  2. Short: các tài sản có tín hiệu xấu (score thấp) – kỳ vọng underperform.

Ghép hai bên sao cho danh mục ít phụ thuộc vào việc VN-Index hay VN30 tăng / giảm, mà chủ yếu sống bằng chênh lệch giữa “tốt” và “xấu”.

Trong bối cảnh Việt Nam, long–short có vài dạng khả thi:

  1. Long–short trên phái sinh VN30F (dùng nhiều hợp đồng, nhiều kỳ hạn, hoặc nhiều chiến lược khác nhau).
  2. Long rổ cổ phiếu (ví dụ nhóm bank, chứng, hoặc top liquidity) và short VN30F để giảm bớt beta thị trường.

Về lý thuyết có thể long–short cổ phiếu với nhau, nhưng thực tế bị hạn chế khá nhiều bởi cơ chế short.

Ngay từ đầu, khi nói đến “code và backtest long–short”, QM Capital thường tự hỏi ba câu rất cụ thể:

Mô hình có xếp hạng được tài sản không? Nghĩa là nhóm được chọn vào long có thực sự tốt hơn nhóm short, nếu so trên cùng một giai đoạn và cùng điều kiện thị trường.

Khi biến những xếp hạng đó thành danh mục thực sự (có weight, rebalance, phí giao dịch, slippage), đường vốn nhìn ra sao: PnL, Sharpe, max drawdown, turnover?

Nếu đưa ra thế giới thật – với limit về short, margin, fee, thanh khoản – chiến lược còn sống được không, hay chỉ đẹp trên giấy?

Ví dụ: giả sử QM Capital xây một chiến lược long–short trên rổ 30 cổ phiếu thanh khoản nhất HOSE. Signal rất đơn giản: 60-day momentum. Mỗi tuần, hệ thống chọn top 20% cổ phiếu có momentum cao nhất để long, bottom 20% để short, cân bằng vốn hai bên. Sau 5 năm backtest, ta thấy:

  1. Danh mục long trung bình outperform VN-Index 8%/năm.
  2. Danh mục short underperform VN-Index khoảng 4%/năm.
  3. Danh mục long–short (dollar-neutral) cho ra ~12%/năm, Sharpe 1.2.

Nhìn vậy là ổn, nhưng phải nhớ: kết quả này chỉ có ý nghĩa nếu ta chắc rằng dữ liệu không bị “nhìn tương lai”, phí giao dịch được tính đúng, và cấu trúc long–short có thể triển khai trong bối cảnh thật (ví dụ dùng VN30F để hedge thay vì short trực tiếp cổ phiếu). Toàn bộ phần còn lại – code và backtest – thực ra chỉ là cách trả lời cẩn thận cho ba câu hỏi đó.

2. Quy trình code & backtest một chiến lược long–short từ dữ liệu đến PnL

Để không bị lạc trong chi tiết kỹ thuật, có thể chia quy trình thành bốn khối: dữ liệu → signal → danh mục → đánh giá. Mỗi khối nếu làm ẩu một chút thì kết quả cuối cùng sẽ lệch đi khá xa.

(a) Chuẩn bị dữ liệu và universe

Bước đầu tiên thường bị xem nhẹ, nhưng nó quyết định chiến lược có “đứng được” hay không.

Chọn universe: ví dụ top 50 mã thanh khoản nhất HOSE, hoặc rổ VN30 + một số bluechip.

Gom dữ liệu giá dạng OHLCV (open, high, low, close, volume) theo ngày; nếu trade intraday thì là 5-min, 15-min.

Đồng bộ ngày giao dịch, xử lý ngày nghỉ, loại các mã volume quá thấp.

Trong code (Python):

Đưa dữ liệu về dạng ma trận price[date, ticker], volume[date, ticker].

Cẩn thận với survivorship bias: nếu có thể, nên dùng toàn bộ danh sách mã ở từng thời điểm, không chỉ những mã còn sống tới hôm nay.

(b) Xây tín hiệu (signal) và xếp hạng

Long–short thực chất là một bài toán ranking. Với mỗi ngày (hoặc mỗi kỳ rebalance), ta cần một con số score cho mỗi mã.

Ví dụ signal đơn giản:

Momentum: 20-day hoặc 60-day return.

Mean reversion: âm của 5-day return (giảm mạnh có thể bật lại).

Yếu tố cơ bản: kết hợp P/E, P/B, tăng trưởng lợi nhuận, vốn hóa…

Trong code:

Tính signal dạng signal[date, ticker].

Dùng shift(1) để đảm bảo ngày T chỉ dùng thông tin đến T–1, tránh look-ahead bias.

Sau đó:

Loại mã không đủ dữ liệu, thanh khoản kém, bị hạn chế giao dịch.

Xếp hạng theo signal trên từng ngày.

Chọn top X% để long, bottom Y% để short (thường X = Y cho đơn giản).

(c) Từ signal sang portfolio: thiết kế trọng số long–short

Đây là nơi “lý thuyết đẹp” dễ bị vỡ khi gặp thực tế. Ý tưởng căn bản:

Long leg: phân bổ vốn đều cho các mã ở nhóm điểm cao (ví dụ mỗi mã +1/N).

Short leg: phân bổ đều cho các mã ở nhóm điểm thấp (mỗi mã –1/M).

Chuẩn hóa lại để tổng giá trị long ≈ tổng giá trị short → gần dollar-neutral.

Có thể thêm một số ràng buộc:

Giới hạn weight tối đa trên từng mã (ví dụ |weight| ≤ 5% NAV).

Giới hạn theo ngành để tránh một bên full bank, bên kia full thép.

Đặt lịch rebalance: hàng ngày, hàng tuần, hoặc khi tín hiệu thay đổi mạnh.

Nếu dùng VN30F làm công cụ short, cấu trúc sẽ khác một chút: ta long cổ phiếu, sau đó tính beta của rổ long với VN30, rồi short VN30F theo beta đó để giảm bớt rủi ro thị trường.

(d) Backtest: từ weight và return sang PnL

Khi đã có ma trận weight w[date, ticker] và lợi suất r[date, ticker], phần còn lại tương đối thẳng:

Portfolio return ngày T = tổng (w[T–1, ticker] × r[T, ticker]) – phí – slippage.

Cộng dồn để ra equity curve.

Từ đường vốn này, ta tính:

Lợi suất năm hóa, volatility, Sharpe, Sortino.

Max drawdown, thời gian hồi phục, win rate theo ngày / tháng.

Turnover (khối lượng điều chỉnh vị thế mỗi lần rebalance) → từ đó suy ra mức phí thực tế.

Một thói quen tốt là luôn tách long leg và short leg ra xem riêng:

Long leg có alpha dương rõ rệt không?

Short leg có thực sự underperform không, hay chỉ đơn giản là “không làm gì nhiều nhưng tốn phí”?

Ví dụ: trong backtest, QM Capital thấy long leg mang lại +18%/năm, short leg –6%/năm, danh mục long–short khoảng +12%/năm. Nếu sau này môi trường thay đổi, short leg không còn underperform nữa, chiến lược sẽ tụt khá nhanh. Nhìn riêng từng leg giúp thấy rõ rủi ro này.

3. Những bẫy phổ biến

Khi code xong một chiến lược long–short, nhìn đường equity đẹp là cảm giác rất “phê”. Nhưng trước khi tin, mình nên chủ động đi tìm lỗi – nhất là trong bối cảnh thị trường Việt Nam còn nhiều giới hạn về short, thanh khoản, biên độ.

(a) Những bẫy kỹ thuật dễ mắc

Có vài lỗi “kinh điển” mà QM Capital gần như luôn check lại:

Look-ahead bias: dùng dữ liệu của ngày T để quyết định ngày T – ví dụ dùng giá đóng cửa để quyết định lệnh cùng ngày – là lỗi nặng. Mọi input phải là shift(1).

Survivorship bias: chỉ dùng các mã đang niêm yết hiện tại. Những mã đã hủy niêm yết, delist, hoặc bị kiểm soát thường là mã xấu – loại chúng ra khỏi mẫu làm chiến lược trông khỏe hơn thực tế.

Phí và trượt giá (slippage): long–short thường có turnover cao, đặc biệt nếu rebalance mỗi ngày. Nếu để transaction cost = 0, Sharpe nào cũng đẹp. Thực tế phải giả định spread, phí môi giới, và độ trượt tùy theo thanh khoản từng mã.

Giới hạn short: với cổ phiếu Việt Nam, short trực tiếp là câu chuyện khác xa sách giáo khoa. Nếu backtest chiến lược “short 30 mã yếu nhất” mà không mô hình hóa được cơ chế short, thì kết quả chỉ mang tính tham khảo.

(b) Gợi ý áp dụng trong bối cảnh Việt Nam

Trong điều kiện hiện tại, hai hướng khá thực tế:

Long–short trên phái sinh VN30F

Dùng nhiều chiến lược khác nhau (trend following, mean reversion intraday, basis trading…) để tạo nhiều “mini-signal”, sau đó long–short giữa các chiến lược / các kỳ hạn.

Dữ liệu: 1–5 phút, có volumes, order book nếu có.

Lưu ý biên độ, limit up/down, những ngày basis bị méo do roll hợp đồng hoặc tin vĩ mô.

Long stock / short VN30F

Chiến lược stock-picking (value, quality, momentum…) nằm ở leg long; leg short là VN30F để giảm bớt tác động của thị trường chung.

Ví dụ: long rổ 10 mã bank, chứng, tiêu dùng mà model đánh giá tốt; short VN30F với size sao cho beta danh mục về gần 0.

Backtest phải tính cả: phí giao dịch cổ phiếu, phí hợp đồng tương lai, chi phí margin/ ký quỹ.

(c) Cách “vặn vẹo” chiến lược trước khi tin

Sau khi đã có một backtest nhìn ổn, QM Capital thường làm thêm vài bước kiểm tra:

Chạy chiến lược trên các giai đoạn con:

– Bull market (ví dụ 2017, 2020–2021).

– Sideway, hoặc phân hóa mạnh.

– Giai đoạn xấu (2011–2012, 2022...).

Nếu chiến lược chỉ kiếm được tiền trong một giai đoạn rất hẹp, cần hiểu rõ lý do.

Thử thay đổi nhẹ tham số:

– Window 60-day momentum → 40 hoặc 80 ngày.

– Rebalance hàng ngày → 2–3 ngày/lần.

– Thay top/bottom 20% → 10% hoặc 30%.

Nếu chỉ cần chỉnh nhẹ là PnL sụp, khả năng cao là overfit.

Đặt thêm lớp phí / constraint “xấu hơn”:

– Nhân transaction cost lên 1.5–2 lần.

– Cắt 20–30% khối lượng lệnh ở những ngày thanh khoản thấp.

– Giới hạn không được full position khi volatility bùng nổ (risk cap).

Ví dụ: một chiến lược long–short VN30F intraday có Sharpe 2.0 với phí 0.02%/chiều. Khi tăng phí lên 0.04% và giảm 20% khối lượng lệnh ở phiên ATC, Sharpe rơi xuống 0.7. Điều này cho thấy chiến lược đang sống nhờ việc “suýt sít” vào–ra với chi phí cực thấp – khó triển khai nếu không có hạ tầng tương đương backtest.

Cuối cùng, nếu nhìn long–short dưới góc độ hệ thống, nó chỉ là:

Một cơ chế xếp hạng tài sản (hoặc tín hiệu) nhất quán.

Một engine biến ranking thành trọng số, có kiểm soát risk.

Một bộ câu hỏi khó, dùng backtest để trả lời: chiến lược kiếm tiền từ đâu, và khi điều kiện thị trường thay đổi, nó sẽ “đau” ở đâu trước.

Khi trả lời được ba lớp đó một cách trung thực bằng code và dữ liệu, long–short không còn là câu chuyện “nghe rất hedge fund”, mà trở thành một công cụ rất rõ ràng để kiểm soát rủi ro và đo alpha trên thị trường Việt Nam

Chia sẻ bài viết

Đánh giá

Hãy là người đầu tiên nhận xét bài viết này!

Đăng ký nhận tin

Nhập Email để nhận được bản tin mới nhất từ QM Capital.

Bài viết liên quan

Lộ trình theo đuổi sự nghiệp trong ngành Tài chính: Không phải chọn “ngành hot”, mà là chọn con đường bạn chịu được lâu dài
13/01/2026
30 lượt đọc

Lộ trình theo đuổi sự nghiệp trong ngành Tài chính: Không phải chọn “ngành hot”, mà là chọn con đường bạn chịu được lâu dài C

Ngành tài chính luôn có một sức hút rất đặc biệt. Lương cao, môi trường chuyên nghiệp, tiếp xúc với tiền, quyền lực và những quyết định lớn. Nhưng cũng chính vì vậy mà tài chính là một trong những ngành khiến người mới vào dễ… chọn sai nhất. Không phải vì họ kém năng lực, mà vì họ chọn con đường dựa trên hình ảnh bề ngoài, thay vì hiểu rõ bản thân và bản chất từng vai trò.

Momentum Indicators: Hiểu đúng “động lượng” – thứ quyết định khi nào nên vào lệnh và khi nào nên đứng ngoài
13/01/2026
27 lượt đọc

Momentum Indicators: Hiểu đúng “động lượng” – thứ quyết định khi nào nên vào lệnh và khi nào nên đứng ngoài C

Khi nói đến momentum indicators, rất nhiều trader – đặc biệt là người mới – thường mặc định rằng đây là công cụ để đoán hướng giá. Điều này dẫn đến một loạt cách dùng sai phổ biến như “RSI quá mua thì short”, “MACD cắt xuống thì bán”. Nhưng nếu nhìn sâu hơn một chút, bạn sẽ thấy momentum indicator chưa bao giờ được thiết kế để trả lời câu hỏi giá sẽ đi lên hay đi xuống. Nhiệm vụ của nó là trả lời một câu hỏi khác quan trọng không kém: chuyển động giá hiện tại còn bao nhiêu sức để tiếp diễn.

Biến động bạn không “nhìn thấy”: vì sao volatility là thứ dễ hiểu sai nhất trên thị trường
13/01/2026
27 lượt đọc

Biến động bạn không “nhìn thấy”: vì sao volatility là thứ dễ hiểu sai nhất trên thị trường C

Trong đầu tư và trading, volatility (biến động) là một trong những khái niệm được nhắc đến nhiều nhất. Ai cũng nói về nó: “thị trường đang biến động cao”, “vol thấp quá nên khó trade”, “vol sắp nổ”… Nhưng có một sự thật rất ít người dừng lại để nghĩ cho kỹ: volatility là thứ không thể nhìn thấy trực tiếp.

Phái sinh tại Việt Nam: Không phải công cụ “đánh nhanh thắng nhanh”, mà là tấm gương phản chiếu rủi ro hệ thống
07/01/2026
171 lượt đọc

Phái sinh tại Việt Nam: Không phải công cụ “đánh nhanh thắng nhanh”, mà là tấm gương phản chiếu rủi ro hệ thống C

Khi thị trường phái sinh Việt Nam ra đời vào năm 2017 với sản phẩm đầu tiên là hợp đồng tương lai VN30, rất nhiều người nhìn nó như một “sòng bài mới”: T+0, đòn bẩy cao, kiếm tiền hai chiều, không cần vốn lớn. Cách nhìn đó không hoàn toàn sai, nhưng nếu dừng lại ở đó thì ta đã bỏ lỡ bản chất quan trọng nhất của phái sinh: đây là nơi rủi ro của toàn hệ thống được biểu hiện rõ ràng và nhanh nhất.

Edge trong trading: từ khái niệm trừu tượng đến lợi thế có thể sống sót qua chu kỳ thị trường
05/01/2026
72 lượt đọc

Edge trong trading: từ khái niệm trừu tượng đến lợi thế có thể sống sót qua chu kỳ thị trường C

Trong trading, “edge” thường được nhắc đến như một thứ gì đó rất mơ hồ: một cảm giác thị trường, một mô hình quen mắt, hay một bộ quy tắc “đã từng kiếm tiền”. Nhưng nếu tiếp cận thị trường dưới góc độ định lượng, edge không phải là cảm giác, càng không phải là niềm tin. Edge là một đặc tính thống kê của hành động giao dịch, chỉ có thể được xác nhận khi quan sát trên một tập mẫu đủ lớn và đủ đa dạng về điều kiện thị trường.

Chiến lược giao dịch Price Action: Cách đọc biểu đồ giá để hiểu thị trường
03/01/2026
105 lượt đọc

Chiến lược giao dịch Price Action: Cách đọc biểu đồ giá để hiểu thị trường C

Price Action thường bị hiểu nhầm như một tập hợp các mô hình nến hoặc vài đường kẻ hỗ trợ – kháng cự. Thực tế, nếu chỉ dừng ở đó thì Price Action không khác gì một dạng technical analysis tối giản. Bản chất sâu hơn của Price Action là một hệ quy chiếu để hiểu cách thị trường vận hành, nơi giá không còn là kết quả ngẫu nhiên của tin tức, mà là biểu hiện trực tiếp của hành vi con người, dòng tiền và cấu trúc thanh khoản.

video-image

Truy Cập Miễn Phí Thư Viện Bot Tín Hiệu Giao Dịch Tự Động

Được nghiên cứu và phát triển bởi các chuyên gia từ QMTrade và cộng đồng nhà đầu tư chuyên nghiệp.

Truy cập ngay!