Strasmore Research
Học tập Matt ConnorBởi Matt Connor

Học giao dịch định lượng qua sách mã nguồn mở

Sách giao dịch định lượng mã nguồn mở trình bày toàn bộ lộ trình, từ dữ liệu thô đến lệnh giao dịch. Tìm hiểu từng giai đoạn và khả năng áp dụng cho cổ phiếu Mỹ.

Một cuốn sách giao dịch định lượng mã nguồn mở là một giáo trình công khai miễn phí. Cuốn sách trình bày toàn bộ quy trình từ dữ liệu thô đến lệnh giao dịch thực tế, theo đúng trình tự mà người mới thường tiếp cận. Bản thảo XQuant: Everyone Can Be a Quantitative Trader, do xingwudao xuất bản trên GitHub, đã đạt 686 sao tính đến tháng 8 năm 2026. Chín chương của sách đi theo lộ trình mà hầu hết giáo trình định lượng đều sử dụng. Bài viết này lần lượt trình bày từng giai đoạn, nêu rõ lỗi đặc thù ở mỗi giai đoạn và đánh giá những phần còn phù hợp khi chuyển từ cổ phiếu hạng A của Trung Quốc sang cổ phiếu Mỹ.

Sách giao dịch định lượng mã nguồn mở có nội dung gì?

Loại bỏ phần thương hiệu khỏi bất kỳ giáo trình nhập môn nào, vẫn còn lại năm giai đoạn theo đúng thứ tự: thu thập và làm sạch dữ liệu, xây dựng tín hiệu từ dữ liệu đó, kiểm định tín hiệu bằng dữ liệu lịch sử, quyết định quy mô vị thế, sau đó gửi lệnh và thanh toán các chi phí. Mục lục XQuant, được đọc tại commit 016b66e ngày 14 tháng 7 năm 2026, bao quát cùng nội dung này trong chín chương.

  • Phần chuẩn bị, sau đó là chương một: triển khai trọn vẹn một chiến lược từ đầu đến cuối.
  • Chương hai, mua tài sản nào: bắt đầu với ba ETF.
  • Chương ba, mua với quy mô bao nhiêu: ba phương pháp phân bổ, được đo lường và so sánh với nhau.
  • Chương bốn, giao dịch khi nào: tái cân bằng, stop loss, take profit.
  • Chương năm, đánh giá một chiến lược có thực sự tốt hay không: bốn góc nhìn.
  • Chương sáu, không ăn mừng quá sớm: ngăn ngừa overfitting.
  • Chương bảy, từ lý tưởng đến thực tế: thực hiện giao dịch.
  • Chương tám, cuộc sống sau khi triển khai: theo dõi, chẩn đoán và lặp lại.
  • Chương chín, tìm kiếm cơ hội mới: nhập môn nghiên cứu nhân tố.

Thứ tự này đáng được chú ý. Việc xác định quy mô vị thế xuất hiện ở chương ba, trước cả hai chương về backtest, còn nghiên cứu nhân tố được đặt ở cuối. Lộ trình tự học thường đi theo hướng ngược lại: bắt đầu bằng một ý tưởng về nhân tố, tiếp đến là backtest, còn quy tắc xác định quy mô vị thế thì không có. Kho bài tập đi kèm (333 stars, cùng ngày) được tổ chức xoay quanh các đặc tả nhiệm vụ bằng văn bản thay vì mã hoàn chỉnh, trong đó người đọc hướng dẫn một trợ lý AI triển khai chúng. Khả năng đọc mã mà bạn không tự viết vẫn là kỹ năng quyết định mọi nội dung bên dưới, vì mỗi thất bại tiếp theo đều ẩn trong một chi tiết triển khai.

Giai đoạn một: thu thập dữ liệu, sau đó xác định phạm vi nghiên cứu

Làm sạch dữ liệu là phần dễ thấy của công việc dữ liệu: các giao dịch bị ghi nhận sai, những phiên bị thiếu, cùng các điều chỉnh do chia tách cổ phiếu và cổ tức. Việc chọn những mã nào để nghiên cứu là phần khó nhận thấy, và đây là nơi thiên lệch sống sót xuất hiện, trước cả khi có một dòng mã chiến lược nào được viết. Hãy lấy mọi ticker của Mỹ có giao dịch được thực hiện trong một tuần của tháng 6, theo từng năm, rồi xem có bao nhiêu mã vẫn được giao dịch trong cùng tuần đó của năm 2026.

Truy vấnCác ticker Mỹ giao dịch trong một tuần tháng 6 và số ticker vẫn giao dịch trong tháng 6/2026
Câu lệnh SQL chính xác đằng sau mỗi con số
WITH june_week AS (
    SELECT toYear(toTimeZone(window_start, 'America/New_York')) AS year,
           ticker
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE toMonth(toTimeZone(window_start, 'America/New_York')) = 6
      AND toDayOfMonth(toTimeZone(window_start, 'America/New_York')) BETWEEN 10 AND 16
      AND toYear(toTimeZone(window_start, 'America/New_York')) BETWEEN 2016 AND 2026
      AND volume > 0
    GROUP BY year, ticker
),
survivors AS (
    SELECT ticker FROM june_week WHERE year = 2026
)
SELECT year,
       uniqExact(ticker) AS tickers_traded,
       uniqExactIf(ticker, ticker IN (SELECT ticker FROM survivors)) AS still_trading_2026,
       round(100 * uniqExactIf(ticker, ticker IN (SELECT ticker FROM survivors))
             / uniqExact(ticker), 1) AS still_trading_pct
FROM june_week
GROUP BY year
ORDER BY year
Run this yourself

Trong số 8224 ticker được giao dịch vào tuần đó của năm 2016, 50% vẫn được giao dịch trong cùng tuần của năm 2026. Những mã còn lại đã bị thâu tóm, sáp nhập, đổi tên hoặc hủy niêm yết. Một phép backtest được xây dựng từ danh sách mã hiện tại chỉ nghiên cứu những mã đã tồn tại đến nay và ghi nhận hiệu quả cho một chiến lược nắm giữ các công ty được chọn dựa trên thông tin nhìn lại. Một nguồn dữ liệu dành cho người mới sẽ cung cấp danh sách các mã sống sót đó mà không có cảnh báo: hướng dẫn API dữ liệu miễn phí về thị trường chứng khoán giải thích những gì các nguồn dữ liệu đó có và không cung cấp.

Giai đoạn hai: biến dữ liệu thành tín hiệu

Tín hiệu là một quy tắc chấm điểm cho một cổ phiếu tại một thời điểm cụ thể. Factor là một tín hiệu mà bạn tin rằng có hiệu lực đồng thời trên nhiều cổ phiếu. Momentum, value và low volatility là những ví dụ kinh điển. Sai lầm ở giai đoạn này là thử các quy tắc cho đến khi tìm được một quy tắc hoạt động. Hai mươi biến thể của tín hiệu giao cắt đường trung bình động trên dữ liệu một thập kỷ của một chỉ số sẽ luôn tạo ra một biến thể chiến thắng. Đó là biến thể khớp với nhiễu tốt nhất. Các biện pháp phòng vệ không hào nhoáng nhưng cần thiết: cố định quy tắc trước khi đo lường, giữ lại một phần lịch sử mà bạn không bao giờ xem, đếm mọi biến thể đã thử và ưu tiên ít tham số cần điều chỉnh hơn. XQuant dành hẳn một chương cho vấn đề này trước phần nghiên cứu factor. Đó là đúng trình tự.

Giai đoạn ba: backtest, nơi phần lớn người mới bắt đầu dừng lại

Đây là giai đoạn kết thúc hầu hết các dự án tự học. Nó kết thúc một cách âm thầm, với đường cong vốn trông rất đẹp. Survivorship bias được nêu ở trên là lỗi thứ nhất trong hai lỗi. Look-ahead bias là lỗi thứ hai: chiến lược sử dụng một con số mà tại thời điểm đặt lệnh, dữ liệu đó chưa xuất hiện. Trường hợp phổ biến nhất là một quy tắc được tính từ giá đóng cửa hôm nay rồi được khớp ngay tại chính mức giá đóng cửa đó. Hãy đo khoảng cách mà giả định này bỏ qua.

Truy vấnKhoảng cách trung bình từ giá đóng cửa của phiên này đến giá mở cửa của phiên kế tiếp, theo tháng
Câu lệnh SQL chính xác đằng sau mỗi con số
WITH sessions AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS session,
           argMin(open, window_start) AS session_open,
           argMax(close, window_start) AS session_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'NVDA')
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2024-08-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, session
),
gaps AS (
    SELECT ticker,
           session,
           toFloat64(session_open) AS open_px,
           toFloat64(lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY session)) AS prev_close
    FROM sessions
)
SELECT formatDateTime(toStartOfMonth(session), '%Y-%m') AS month,
       formatDateTimeInJodaSyntax(toStartOfMonth(session), 'MMMM yyyy') AS month_label,
       round(avgIf(abs(open_px / prev_close - 1) * 10000, ticker = 'SPY'), 1) AS spy_gap_bps,
       round(avgIf(abs(open_px / prev_close - 1) * 10000, ticker = 'NVDA'), 1) AS nvda_gap_bps
FROM gaps
WHERE prev_close > 0
GROUP BY month, month_label
HAVING countIf(ticker = 'SPY') > 0 AND countIf(ticker = 'NVDA') > 0
ORDER BY month
Run this yourself

Trong July 2026, khoảng cách trung bình giữa một giá đóng cửa và giá mở cửa kế tiếp là 40.8 điểm cơ bản đối với SPY và 107.4 điểm cơ bản đối với NVDA. Một điểm cơ bản bằng một phần trăm của một điểm phần trăm. Tất cả 24 tháng trong bảng, bắt đầu từ August 2024, đều nằm trên mức 0. Một backtest đưa ra quyết định tại giá đóng cửa và khớp lệnh cũng tại mức giá đó sẽ thu được khoảng cách này miễn phí trong mọi giao dịch, trong khi không có lệnh thực tế nào có thể làm được như vậy. Look-ahead bias trong backtest phân tích cơ chế này, còn vì sao cổ phiếu gap qua đêm giải thích chính khoảng gap đó.

Giai đoạn bốn: quyết định mua bao nhiêu

Sai lầm ở đây là không có quy tắc. Phần lớn trader tự học không bao giờ viết ra quy tắc phân bổ quy mô vị thế. Điều đó có nghĩa là họ vô tình sử dụng một quy tắc, thường là phân bổ cùng một số tiền cho mỗi mã hoặc dùng toàn bộ số tiền mặt hiện có. Phân bổ cùng số tiền không đồng nghĩa với cùng mức rủi ro.

Truy vấnBiến động giá hằng ngày trong 12 tháng: volatility quy đổi theo năm và phiên tệ nhất, 8 mã
Câu lệnh SQL chính xác đằng sau mỗi con số
WITH daily AS (
    SELECT ticker,
           toDate(toTimeZone(window_start, 'America/New_York')) AS session,
           argMax(close, window_start) AS session_close
    FROM global_markets.delayed_stocks_minute_aggs
    WHERE ticker IN ('SPY', 'KO', 'JNJ', 'MSFT', 'AAPL', 'NVDA', 'TSLA', 'COIN')
      AND toDate(toTimeZone(window_start, 'America/New_York')) >= toDate('2025-08-01')
      AND toDate(toTimeZone(window_start, 'America/New_York')) <= toDate('2026-07-31')
      AND (toHour(toTimeZone(window_start, 'America/New_York')) * 60
           + toMinute(toTimeZone(window_start, 'America/New_York'))) BETWEEN 570 AND 959
    GROUP BY ticker, session
),
rets AS (
    SELECT ticker,
           toFloat64(session_close) AS close_px,
           toFloat64(lagInFrame(session_close) OVER (PARTITION BY ticker ORDER BY session)) AS prev_close
    FROM daily
)
SELECT ticker,
       round(stddevSamp(close_px / prev_close - 1) * sqrt(252) * 100, 1) AS annualized_vol_pct,
       round(abs(min(close_px / prev_close - 1)) * 100, 2) AS worst_day_pct
FROM rets
WHERE prev_close > 0
GROUP BY ticker
ORDER BY annualized_vol_pct DESC
Run this yourself

Trong mười hai tháng kết thúc vào ngày 31 tháng 7 năm 2026, COIN có biến động thường niên hóa ở mức 68%, so với 12.7% của SPY, mã có mức biến động thấp nhất trong nhóm theo dõi. Phiên đơn lẻ tồi tệ nhất của mã này đóng cửa thấp hơn 13.34% so với phiên trước, trong khi phiên tồi tệ nhất của SPY2.69%. Cùng một số tiền đầu tư vào mỗi mã sẽ tạo ra các mức dao động hằng ngày rất khác nhau. Nhà đầu tư mới thực sự trải nghiệm mức dao động đó, chứ không phải tín hiệu. phân bổ quy mô vị thế theo tiêu chí Kelly trình bày một câu trả lời có tính hệ thống, còn rủi ro tập trung cho thấy hình dạng của câu trả lời không chính thức.

Giai đoạn năm: khớp lệnh và các chi phí mà backtest bỏ quên

Hai loại chi phí, nhưng chỉ một loại hiện rõ. Hoa hồng và phí quản lý xuất hiện trên sao kê. Slippage thì không: đó là chênh lệch giữa mức giá trên màn hình và mức giá bạn thực sự nhận được. Mức tối thiểu của slippage là bid-ask spread, tức khoảng cách giữa giá chào mua tốt nhất và giá chào bán tốt nhất tại thời điểm đó. Người mua trả giá chào bán, còn người bán khớp vào giá chào mua, nên một giao dịch khứ hồi sẽ vượt qua spread hai lần. Spread không cố định.

Truy vấnSpread niêm yết trung bình theo mỗi nửa giờ ET: AAPL và KO, thứ Sáu, ngày 17/7/2026
Câu lệnh SQL chính xác đằng sau mỗi con số
WITH quotes AS (
    SELECT ticker,
           toStartOfInterval(toTimeZone(sip_timestamp, 'America/New_York'), INTERVAL 30 MINUTE) AS bucket,
           toFloat64(ask_price - bid_price) / toFloat64((ask_price + bid_price) / 2) * 10000 AS spread_bps
    FROM global_markets.cache_stocks_quotes
    WHERE ticker IN ('AAPL', 'KO')
      AND sip_timestamp >= toDateTime('2026-07-17 13:00:00')
      AND sip_timestamp < toDateTime('2026-07-17 21:00:00')
      AND bid_price > 0
      AND ask_price > bid_price
)
SELECT formatDateTime(bucket, '%H:%i') AS et_time,
       round(avgIf(spread_bps, ticker = 'AAPL'), 2) AS aapl_spread_bps,
       round(avgIf(spread_bps, ticker = 'KO'), 2) AS ko_spread_bps
FROM quotes
WHERE spread_bps > 0 AND spread_bps < 500
GROUP BY et_time
HAVING countIf(ticker = 'AAPL') > 0 AND countIf(ticker = 'KO') > 0
ORDER BY et_time
Run this yourself

Biểu đồ bao quát 16 khung thời gian nửa giờ của một ngày thứ Sáu, từ khung 09:00 trước tiếng chuông mở cửa đến khung 16:30 sau khi thị trường đóng cửa. AAPL có spread rộng 10.53 điểm cơ bản trong khung đầu tiên và 3.27 trong khung cuối, còn KO lần lượt ở mức 28.878.04. Mức giá chào mua và chào bán sít nhất trong ngày nằm ở giữa biểu đồ, giữa hai đầu này. Một chiến lược giao dịch lúc mở cửa với hai mã có thanh khoản cao nhất thị trường sẽ chịu chi phí khác với chính chiến lược đó khi giao dịch vào giữa ngày, còn backtest giả định chi phí bằng không thì không định giá được trường hợp nào. Bid-ask spread xác định con số này, vì sao spread giãn rộng lúc mở cửa giải thích đường cong, còn chi phí giao dịch một cổ phiếu cộng lại toàn bộ giao dịch khứ hồi. Giữa một backtest sạch và việc sử dụng tiền thật còn một bước nữa: paper trading trước khi dùng tiền thật.

Những phần nào của chương trình học về cổ phiếu A có thể áp dụng cho cổ phiếu Mỹ?

XQuant và các tài liệu tương tự được xây dựng cho cổ phiếu A và ETF của Trung Quốc. Phương pháp này có thể chuyển sang thị trường Mỹ gần như nguyên vẹn: thứ tự các giai đoạn, các định nghĩa, kỷ luật chống overfitting, thói quen ghi chi phí thành một khoản mục riêng thay vì xem đó là phần bổ sung sau cùng, cùng toàn bộ phép tính về quy mô vị thế. Biểu đồ giá vẫn là biểu đồ giá. Phần không thể chuyển nguyên trạng là bộ quy tắc áp dụng cho các biểu đồ đó.

  • Cổ phiếu A thực sự áp dụng quy định T+1: cổ phiếu mua hôm nay không thể bán trước phiên kế tiếp. T+1 tại Mỹ là quy ước thanh toán và không ngăn giao dịch trong ngày. Tuy nhiên, quy định về day trader giao dịch thường xuyên giới hạn tài khoản margin dưới $25,000 ở mức ba giao dịch trong ngày trong năm ngày làm việc.
  • Cổ phiếu A trên sàn chính bị giới hạn ở mức biến động 10% mỗi ngày, còn các sàn tăng trưởng áp dụng mức 20%. Cổ phiếu Mỹ không có giới hạn hằng ngày như vậy. Thay vào đó, giao dịch có thể bị tạm dừng do các biên độ biến động hoặc tin tức.
  • Lệnh cổ phiếu A được giao dịch theo lô 100 cổ phiếu. Nhiều broker Mỹ cho phép khớp lệnh theo cổ phiếu lẻ, làm thay đổi những gì một quy tắc xác định quy mô vị thế có thể thể hiện.
  • Trung Quốc áp dụng thuế tem đối với bên bán. Người bán tại Mỹ phải trả các khoản phí quản lý nhỏ hơn, với quy mô và cơ chế khác.
  • Cấu trúc phiên giao dịch cũng khác nhau, trong đó Thượng Hải và Thâm Quyến có thời gian nghỉ giữa ngày. Giờ giao dịch của thị trường chứng khoán Mỹ diễn ra liên tục và kết thúc bằng phiên đấu giá đóng cửa.

Bất kỳ hằng số nào về chi phí hoặc thời gian được sao chép từ một khóa học vào mã của bạn đều có thể trở thành lỗi ngay khi lệnh đầu tiên được gửi vào thị trường thực.

Ghim phiên bản tham chiếu, không phải README

Tính đến tháng 8 năm 2026, repository chưa có bản phát hành nào được gắn thẻ. Vì vậy, thông tin trích dẫn bền vững là một commit: 016b66e, ngày 14 tháng 7 năm 2026. Điều này quan trọng với một cuốn sách vẫn đang được viết. Số chương có thể thay đổi, các tệp README có thể được viết lại, tiêu đề có thể được di chuyển, và một liên kết từng trỏ đến chương bảy có thể âm thầm trỏ sang nội dung khác. Hãy trích dẫn commit và ngày tháng, đồng thời ghi lại tiêu đề chương bạn đã đọc thay vì số chương. Khi đó, ghi chú của bạn vẫn có thể được kiểm chứng sau một năm. Bản thảo được phát hành theo giấy phép CC BY-NC-SA 4.0, còn các tập lệnh build sử dụng giấy phép MIT. Đây cũng là bài học cuối cùng của chính giáo trình: một chiến lược không thể chạy lại từ một snapshot dữ liệu được ghim phiên bản chỉ là một câu chuyện, không phải một kết quả.

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

Có thể học giao dịch định lượng từ một cuốn sách mã nguồn mở miễn phí không?

Có, nếu bạn cần một lộ trình. Một bản thảo mở cho phép bạn kiểm tra từng nhận định với nguồn gốc của nó. Tuy nhiên, sách không thể cung cấp dữ liệu, chi phí và quy định của chính thị trường bạn giao dịch. Đây chính là điểm mà một giáo trình viết cho một sở giao dịch sẽ không còn phù hợp với công ty môi giới của bạn.

Giai đoạn nào trong chương trình học giao dịch định lượng khiến hầu hết người mới bắt đầu gặp khó khăn nhất?

Backtest. Có hai lỗi thường xuất hiện ở đó, và cả hai đều khiến kết quả trông tốt hơn thực tế: thiên lệch sống sót, do tập hợp cổ phiếu được xây dựng sau khi sự việc đã xảy ra; và thiên lệch nhìn trước, do khớp lệnh tại mức giá mà đồng hồ thị trường chưa ghi nhận. Chỉ 50% trong số các ticker được giao dịch vào tuần tháng Sáu đó của 2016 vẫn còn được giao dịch sau một thập kỷ.

Thiên lệch sống sót khác gì thiên lệch nhìn trước?

Thiên lệch sống sót là vấn đề về tập hợp cổ phiếu: các mã được kiểm định được lựa chọn vì chúng đã tồn tại. Thiên lệch nhìn trước là vấn đề về thời điểm: chiến lược sử dụng một con số chưa tồn tại tại thời điểm lẽ ra lệnh phải được đặt. Lỗi thứ nhất làm tập hợp cổ phiếu trông tốt hơn, còn lỗi thứ hai làm giá khớp lệnh trông tốt hơn.

Một khóa học giao dịch định lượng về cổ phiếu A của Trung Quốc có phù hợp với cổ phiếu Mỹ không?

Phương pháp thì có. Quy định thị trường thì không. Hãy giữ nguyên thứ tự các giai đoạn, kỷ luật chống overfitting và cách hạch toán chi phí. Sau đó, trước khi đưa tiền vào giao dịch, hãy thay hệ thống dữ liệu, hạn chế bán T+1, biên độ giá hằng ngày và quy mô lô bằng các quy định tương đương của Mỹ.


Mỗi bảng ở trên là một truy vấn được lưu trữ, kèm theo câu lệnh SQL bên dưới. Hãy mở một bảng, thay ticker hoặc ngày tháng, rồi tự chạy truy vấn trên terminal Strasmore.

#quant#learning path#backtesting#open source#beginners