開源量化交易書籍:完整學習路徑與美股應用
開源量化交易書籍完整整理從資料清理、訊號建立、回測到下單的學習路徑,說明初學者常停在哪一階段,以及哪些方法可延伸至美國股票。
開源量化交易書籍是一份免費的公開課綱,完整記錄從原始資料到送出實盤訂單的路徑,並按照初學者實際接觸的順序編排。xingwudao 在 GitHub 發布的《XQuant:人人都能成為量化交易員》手稿,截至2026年8月獲得686顆星,是一個清晰的範例。該書共九章,依循幾乎所有量化課程都會涵蓋的完整脈絡。本頁將逐階段介紹這條路徑,指出每個階段涉及的具體失敗風險,並標示哪些部分能從中國A股市場延伸至美國股票市場。
開源量化交易書籍包含哪些內容?
撇除任何入門課程的品牌包裝後,仍會留下五個階段,而且順序固定:取得並清理資料、據此建立訊號、用歷史資料測試訊號、決定下注規模,最後送出訂單並支付成本。以 2026年7月14日的提交版本 016b66e 來看,XQuant 的目錄分成九章,涵蓋的正是這些內容。
- 準備工作,接著是第一章:完整執行一套策略。
- 第二章,買什麼:從三檔 ETF 開始。
- 第三章,買多少:比較三種配置方法。
- 第四章,何時交易:再平衡、停損、停利。
- 第五章,判斷策略是否有效:四個觀點。
- 第六章,不要過早慶祝:避免過度擬合。
- 第七章,從理想走向現實:執行交易。
- 第八章,啟動後的運作:監控、診斷與迭代。
- 第九章,尋找新機會:因子研究入門。
這樣的編排值得注意。第三章就談部位規模,早於兩章回測內容;因子研究則放在最後。自學通常採取相反的順序:先有因子想法,再做回測,卻從未制定部位規模規則。配套的練習儲存庫(截至同日有 333 顆星)以書面任務規格為核心,而不是提供完成的程式碼;讀者需要指示 AI 助理加以實作。閱讀並非自己撰寫的程式碼,仍是決定後續一切的技能,因為接下來的每個失敗,都藏在某個實作細節中。
第一階段:取得資料,然後定義研究範圍
資料清理是資料工作的可見部分,包括錯誤成交、缺少交易時段,以及分割與股利調整。選擇要研究哪些標的是不可見的部分。存續偏誤會在策略程式碼撰寫前,就從這裡開始產生。逐年找出每年6月某一週內曾出現成交的所有美國 ticker,然後確認其中有多少檔在2026年同一週仍持續交易。
每個數據背後的精確 SQL 語法
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在2016該週曾交易的8224檔 ticker 中,50%檔在2026同一週仍持續交易。其餘標的遭收購、合併、更名或下市。使用今日標的名單建立的回測,只會研究成功存續的標的,並讓策略持有事後才被選出的公司。初學者資料源會直接提供這份存續標的名單,卻不會加上警示標籤:免費股市資料 API指南說明這些資料源包含哪些資料,以及不包含哪些資料。
第二階段:將資料轉化為訊號
訊號是在某個時間點評分股票的一項規則。因子則是你認為能同時適用於許多股票的訊號。動能、價值與低波動性是教科書中的典型例子。
這個階段的問題,在於不斷測試規則,直到找到一個有效的規則。以單一指數的一個十年期間測試移動平均線交叉策略的 twenty 種變體,最後一定會產生一個勝出者。這個勝出者只是最符合雜訊的變體。
防範方法並不華麗:在衡量規則之前先固定規則;保留一部分你完全不查看的歷史資料;記錄嘗試過的每一個變體;並優先採用較少可調整參數的規則。XQuant 將完整的一章放在因子研究之前討論這些內容,順序是正確的。
第三階段:回測,多數初學者止步於此
這是多數自學專案終止的階段。它們往往悄然結束,留下看似出色的權益曲線。前文所述的存活者偏差,是兩項錯誤中的第一項。前視偏差則是第二項:策略使用了下單時鐘尚未提供的數值。最常見的情況,是根據今日收盤價計算交易規則,卻在同一收盤價成交。請衡量這項假設跳過了多大的價差。
每個數據背後的精確 SQL 語法
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在 July 2026,一次收盤與下一次開盤成交價之間的平均距離,SPY 為 40.8 個基點,NVDA 為 107.4 個基點。一個基點是百分之一個百分點。面板上從 August 2024 開始的全部 24 個月份,數值都高於零。回測若在收盤時做出決策,並以該收盤價成交,就會在每筆交易中免費取得這段距離;但實際下單從來無法做到這點。回測中的前視偏差拆解了其中的運作機制,而股票為何會在隔夜跳空則解釋了跳空本身。
第四階段:決定買進多少
這裡的問題在於缺乏規則。多數自學交易者從未寫下部位規模規則,因此他們往往在無意間採用了一套規則。通常是每個標的投入相同金額,或投入手邊可用的現金。投入相同金額不代表承擔相同風險。
每個數據背後的精確 SQL 語法
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截至2026年7月31日的12個月內,COIN的年化波動率為68%;相較之下,處於樣本中最平靜一端的SPY為12.7%。COIN最差的單一交易日收盤價較前一日收盤價低13.34%;SPY最差的一日則為2.69%。每個標的投入相同金額,所承受的每日波動幅度可能截然不同。初學者實際感受到的是波動,而不是訊號。凱利準則部位規模說明了一種正式的做法;集中風險則呈現非正式做法的樣貌。
第五階段:執行交易,以及回測忽略的成本
兩種成本,其中一種看得見。佣金與監管費用會出現在對帳單上。滑價則不會。滑價是螢幕上的價格與實際成交價格之間的差額。滑價的下限是買賣價差,也就是當下最佳買價與最佳賣價之間的距離。買方支付賣價,賣方則以買價成交,因此一買一賣會穿越價差兩次。價差並非常數。
每個數據背後的精確 SQL 語法
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圖表涵蓋某個星期五的 16 個半小時區間,從開盤鐘前的 09:00 個區間,到收盤後的 16:30 個區間。AAPL 在第一個區間的報價價差為 10.53 個基點,最後一個區間則為 3.27 個基點;KO 分別為 28.87 與 8.04 個基點。當天最窄的報價位於圖表中段,介於這兩個端點之間。在市場上兩檔流動性最高的股票於開盤交易的策略,承擔的成本不同於其盤中版本;採用零成本假設的回測,則兩者都無法正確定價。買賣價差決定這個數字,為何開盤時價差會擴大說明這條曲線,交易一檔股票的成本則計算完整的一買一賣。從乾淨的回測到實際投入資金之間,還有一步:投入實際資金前的紙上交易。
A股課程中哪些部分可套用至美股?
XQuant及同類課程是為中國A股與ETF設計。其方法可以完整套用:包括階段順序、定義、防止過度擬合的紀律、將成本列為獨立項目而非事後補上的習慣,以及所有部位規模計算。價格柱線就是價格柱線。無法直接套用的是其背後的交易規則。
- A股實行真正的T+1限制:今日買進的股票必須等到下一個交易日才能賣出。美股的T+1是交割慣例,不會限制盤中交易;但當沖交易者規則會將資產低於25,000美元的保證金帳戶限制為五個營業日內最多三次當沖交易。
- A股主板每日漲跌幅上限為10%,成長板則為20%。美股沒有每日漲跌幅上限,改由波動性熔斷機制與新聞停牌暫停交易。
- A股股票以每手100股為交易單位。許多美國券商可執行零股交易,這會改變部位規模規則能夠表達的內容。
- 中國會對賣方收取印花稅。美股賣方則須支付金額與計算方式不同、且金額較小的監管費用。
- 交易時段結構不同,上海與深圳市場還有午間休市。美股交易時段連續運作,並以收盤競價結束。
將課程中的任何成本或時間常數直接複製到自己的程式碼中,等同於埋下一個等待首次實盤下單時才會暴露的錯誤。
固定參照版本,而不是 README
截至2026年8月,該儲存庫沒有任何標記版本,因此最持久的引用方式是採用提交版本:016b66e,日期為2026年7月14日。對於仍在撰寫中的書稿而言,這一點很重要。章節編號會變動,README 檔案會被改寫,標題也可能移動;原本指向第七章的連結,可能在不知不覺間指向其他內容。請引用提交版本與日期,並記錄你閱讀的章節標題,而不是章節編號。如此一來,這些筆記在一年後仍可供查核。書稿採用 CC BY-NC-SA 4.0 授權,建置腳本則採用 MIT 授權。這項紀律本身也是課程大綱的最後一課:如果一項策略無法從固定版本的資料快照重新執行,那它就是一個故事,而不是結果。
常見問題
可以從免費的開放原始碼書籍學習量化交易嗎?
可以用它建立整體架構,而且開放手稿讓你能逐項根據來源核對每項主張。書籍無法提供的是你所在市場的資料、成本與規則。這正是為單一交易所撰寫的課程大綱與你的券商不再相符之處。
量化課程的哪個階段最容易讓初學者卡關?
回測。這個階段有兩項錯誤,而且都會美化結果:存活者偏誤來自事後建立的標的範圍;前視偏誤則來自以時鐘尚未記錄的價格成交。50% 的股票代號在 2016 那個六月週仍有交易,但十年後仍在交易的只占其中一部分。
存活者偏誤與前視偏誤有何不同?
存活者偏誤是標的範圍的問題:受測標的是因為存續至今才被選入。前視偏誤是時間點的問題:策略使用了下單時尚不存在的數值。前者擴大了標的名單,後者提高了成交價格。
中國 A 股量化課程適用於美國股票嗎?
方法適用,但市場規則不適用。保留階段順序、防止過度擬合的紀律與成本核算方式。之後,在投入任何資金前,將資料串接、T+1 賣出限制、每日價格漲跌停限制及交易單位,改為美國市場的相應規則。
上方的每個面板都是一項已儲存的查詢,底下附有 SQL。開啟其中一項,替換股票代號或日期,再在 Strasmore 終端機上自行執行。