自行託管 A 股量化工作台:架構與資料來源
自行託管的 A 股量化工作台可在本機完成篩選與回測,本文拆解底層架構、免費資料方案與盤中限制,先掌握四項檢查重點。
自行託管的 A 股量化工作台,是一個整合市場篩選、個股清單監控、回測與盤後檢討報告撰寫功能的網頁介面。它運行在由使用者自行控制的機器上,而非券商終端機。一個採用 MIT 授權的專案 tickflow-stock-panel,透過單一連接埠整合上述功能。截至2026年8月,該專案在 GitHub 上約有2,800顆星標。功能清單容易閱讀。真正決定這些功能下季是否仍能運作的,是底層架構。
自架式 A 股量化工作台由哪些部分組成
這套架構簡單到可以記在腦中。根據 2026年8月的提交版本及其程式碼與文件,組成如下:
- 以 React 和 TypeScript 建置的網頁。
- Python 服務,採用 FastAPI,並透過排程器定時更新資料。
- 本機儲存層:將資料存為磁碟上的 Parquet 檔案,使用 DuckDB 查詢,並以 Polars 執行計算。
- 回測引擎 vectorbt,直接使用這些檔案。
- 負責擷取面板所繪製全部價格的供應商 SDK。
請注意其中缺少的部分。這套技術堆疊沒有任何元件連接交易所。面板負責計算,供應商負責提供資料。「自架式」只說明程式碼在哪裡執行,並未說明數字來自何處。擁有原始 K 線資料,是下方 本機 A 股市場資料湖 這一層的工作;也正因如此,上方的所有元件都可以替換。
資料來源免費方案涵蓋內容
一個環境變數決定面板能看到哪些資料。將供應商金鑰留白後,專案會進入文件所稱的 None 模式:透過免費端點取得歷史日線資料,當日交易時段的資料則會在收市後一至兩小時才出現。填入金鑰後,便可依付費方案開通存取權限。對收市後資料的工作而言,這是可用的免費方案;但對任何盤中用途而言,則有明確限制。這些條款也可能在供應商每次續約時重新表述。
維護者直接說明了這項安排:
本專案僅供學習與量化研究,不構成任何投資建議。回測結果不代表未來收益。
本專案為個人開源專案,基於 TickFlow 資料來源,並非 TickFlow 官方專案。
README,shy3130/tickflow-stock-panel,2026年8月13日讀取
換言之,這個專案供學習與量化研究使用,「不構成任何投資建議」;回測結果不代表未來報酬;這是「個人開源專案,而非 TickFlow 官方產品」。這就是整類方案最重要的長期教訓。Zero-ops 可替你處理營運工作,但依賴關係並未改變:你仍是在向一家從未同意支援此面板的公司租用資料。README 也將用途限制在學習與研究;授權檔則採用 MIT 授權條款。
為何應固定 commit SHA,而不是版本號
commit SHA 是 git 為每項已儲存變更指定的 40 字元指紋。它會永久指向程式碼的單一確切狀態。
截至2026年8月13日查閱時,該儲存庫的 GitHub Releases 頁面沒有任何內容。儲存庫雖有 31 個版本標籤,範圍從 v0.1.31 到 v0.1.88,但編號中間有缺漏,且沒有附註。最新標籤指向的 commit 日期為2026年7月31日,而預設分支已更新至2026年8月6日的工作內容。若標籤落後於分支且沒有附註,就無法告訴你實際取得的內容。
因此,請記下 SHA。2026年8月6日預設分支的最新 commit 是 ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33。請切換至該 commit,並將其記錄在你根據回測得出的任何結論旁。六週後,「我執行了最新版本」這句話無法說明任何事情。
文件所述的啟動方式只有兩行:將環境範例檔複製為 .env,接著執行 docker compose up --build,該指令會在連接埠 3018 提供面板服務。這是該 commit 的維護者指示,而非經測試的操作流程;建置程序會下載映像檔,且需要網路存取權限,本頁並未實際測試這條路徑。開發流程需要 Python 3.11 或更新版本、Node 20 或更新版本,以及 uv 與 pnpm 套件管理器;Windows 上則使用 ./dev.sh 或 .\dev.ps1。
LLM 策略功能會傳送哪些資料,以及傳送到哪裡
策略產生、個股評論與檢視說明都是選用功能。讓 AI_API_KEY 保持空白,整個介面就會維持停用狀態。填入該欄位後,還會設定 AI_PROVIDER(相容於 OpenAI 的端點,或 Ollama)、AI_BASE_URL、AI_MODEL 與 AI_DAILY_TOKEN_BUDGET;當天的 token 額度用完後,系統便會停止呼叫。
資料傳送的方向很重要。你的提示,以及面板附加的任何內容,都會離開你的裝置,傳送至你設定的端點。若將 base URL 指向託管式 API,請求就會傳送至該公司;若指向你自有網路上的 runtime,資料則會留在本地端。自行託管面板,不代表模型也由你自行託管。金鑰會以明文儲存在專案根目錄的 .env 中,也可以透過設定頁面編輯;設定頁面受儀表板密碼保護,密碼至少須有六個字元。我們關於LLM 產生的 alpha 因子的說明,介紹了機器撰寫的策略通常在哪些地方失效。
回測器是否納入交易成本?
回測器標榜支援 T+1 處理、佣金、滑價與停損。但有這些開關,不代表開關已經啟用;若回測以報價中的收盤價成交,且交易成本設為零,就等於假設交易是免費的。實際並非如此。1個基點是百分之一個百分點。下方面板衡量2026年6月17日中午一小時內,六檔美國上市標的的最佳買價與最佳賣價之間平均差距,單位為基點。
每個數據背後的精確 SQL 語法
SELECT
ticker AS symbol,
round(avg(toFloat64(ask_price) - toFloat64(bid_price))
/ avg((toFloat64(ask_price) + toFloat64(bid_price)) / 2) * 10000, 2) AS spread_bps
FROM global_markets.cache_stocks_quotes
WHERE ticker IN ('SPY', 'AAPL', 'MSFT', 'NVDA', 'KO', 'F')
AND sip_timestamp >= toDateTime('2026-06-17 15:00:00', 'UTC')
AND sip_timestamp < toDateTime('2026-06-17 16:00:00', 'UTC')
AND bid_price > 0
AND ask_price > bid_price
GROUP BY ticker
ORDER BY spread_bps面板中買賣價差最小的標的 SPY,該時段的平均報價差為 0.29 bps。最寬的標的 F,報價差為 6.98 bps。若要穿越這段價差兩次,一次進場、一次出場,來回交易成本約為圖中數值的兩倍,且尚未計入佣金。
交易時點與標的選擇同樣重要。下一個面板選取其中一檔標的,衡量其價格在單一分鐘內的波動幅度,並將同日數據彙整為每半小時一個區間。
每個數據背後的精確 SQL 語法
SELECT
formatDateTime(
toStartOfInterval(toTimeZone(window_start, 'America/New_York'), INTERVAL 30 MINUTE),
'%H:%i') AS et_time,
round(avg((toFloat64(high) - toFloat64(low)) / toFloat64(close)) * 10000, 1) AS range_bps
FROM global_markets.delayed_stocks_minute_aggs
WHERE ticker = 'KO'
AND window_start >= toDateTime('2026-06-17 12:00:00', 'UTC')
AND window_start < toDateTime('2026-06-17 21:00:00', 'UTC')
AND volume > 0
AND close > 0
GROUP BY et_time
ORDER BY et_time面板從 08:00 開始,也就是盤前時段。當時每分鐘 K 線的平均價格移動幅度為 0 bps;在這段期間有成交的分鐘,價格都維持在同一水準。最後一個區間 16:30 位於收盤後,平均為 4.2 bps。回測會從每個區間中挑選一個價格,並將其視為成交價。應觀察整條曲線,而不是只看兩端:同一項假設在某些時段較為寬鬆,在其他時段則可能過度懲罰。A股規則也會增加影響,因為 T+1 使投資人當日買入的股票必須等到下一個交易日才能賣出,而每日價格漲跌幅限制也可能使模型中的出場交易完全無法執行。我們的 可重現回測示範說明一套具備合理防護的設定應記錄哪些內容;前視偏誤則說明另一種使看似乾淨的曲線失真的方式。
拆分後調整或未調整:資料來源問題
公司行動是篩選器容易在不知不覺中誤導投資人的地方。股票若按 ten-for-one 比例拆分,當天價格會顯示下跌 90%,但投資人實際上分文未損。下表列出 2026年1月1日至8月13日期間,美國掛牌股票中前十二大正向拆分案例。
每個數據背後的精確 SQL 語法
SELECT
ticker AS symbol,
formatDateTime(execution_date, '%b %e, %Y') AS effective_on,
round(any(toFloat64(split_to)) / any(toFloat64(split_from)), 2) AS shares_after_per_share
FROM global_markets.stocks_splits
WHERE execution_date >= toDate('2026-01-01')
AND execution_date <= toDate('2026-08-13')
AND split_from > 0
AND split_to > split_from
AND ticker NOT IN ('SPCX')
GROUP BY ticker, execution_date
ORDER BY shares_after_per_share DESC, execution_date DESC
LIMIT 12其中最大的一筆會將一股拆分為 10000 股,生效日為 Feb 10, 2026。這種規模的比例並不是一般常見的 four-for-one;公司行動資料來源會在同一欄位中涵蓋完整的比例範圍。十二筆中最小的一筆,仍會將一股拆分為 20 股,足以讓未調整圖表看起來像是股價崩跌。若動能篩選器讀取原始價格,便會把這些股票全部標記為暴跌。中國資料來源也有相同問題,只是使用不同術語,為每個價格序列提供三種版本:未調整、前復權與後復權。請確認面板載入的是哪一種版本。拆分調整後的價格歷史將說明相關計算方式。
自行託管這類服務前應檢查的事項
- 資料來源。確認供應商、授權條款,以及免費方案是否涵蓋預計用途。
- 金鑰管理。確認 API keys 儲存於磁碟的哪個位置、誰能存取設定頁面,以及該機器是否暴露在自有網路之外。
- 成本建模。確認回測工具是否計入佣金、滑價與市場本身的規則,以及未特別設定時這些欄位採用何種數值。
- 更新路徑。記錄部署時所使用的確切 commit,並與結果一併保存,以便數月後重現。
常見問題
自行託管的 A 股量化工作台可以免費執行嗎?
程式碼採 MIT 授權,免費使用。資料則是另一回事:若不填寫供應商金鑰,本專案會改用免費的歷史日線資料,當前交易時段的資料則會在收市後一至兩小時提供。需要更快或更深入的資料時,則須使用供應商的付費方案。
這裡所說的自行託管,實際上是什麼意思?
網頁、排程器、儲存檔案與回測器,全部在你自己的電腦或伺服器上執行,不需在他人的平台上建立帳戶。這不代表資料歸你所有;除非將選用的 AI 功能指向自有網路上的模型,否則這些功能仍會連線至遠端服務。
LLM 功能會將我的資料傳送給第三方嗎?
啟用後會,資料會傳送至你所設定的 OpenAI 相容端點。此功能預設停用;若 AI 金鑰留白,任何資料都不會離開本機。
為什麼要固定 commit SHA,而不是版本標籤?
截至2026年8月13日,這個儲存庫沒有發布任何正式版本,也沒有版本說明;其最新標籤所指向的程式碼,甚至比預設分支的版本更舊。此時,「最新」代表你複製儲存庫當天分支上的內容,但 commit SHA 則能精確指定版本。這項原則也適用於 開放原始碼量化交易資料:固定你實際執行的版本。
驗證備註
上述所有架構與設定細節,均取自2026年8月13日公開儲存庫中的內容,版本為 commit ecfddb451e97f6fc9a7e43ac33e4ef0e69933b33,亦即預設分支的分支頂端;該分支最後更新於2026年8月6日。Releases 頁面沒有列出任何內容;標籤清單則包含從 v0.1.31 到 v0.1.88 的31個版本標籤,最新標籤指向2026年7月31日建立的 commit。引述內容均為維護者原文,直接取自 README,並非改寫。容器啟動指令也引自該 README,但本文未實際執行。
市場面板顯示的是美國掛牌標的,並固定採用過去的日期,使數據維持不變。這些面板用來示範適用於任何市場的兩項檢查:執行成本與公司行動調整,而非用來描述中國市場。
本文每個面板都附有產生該面板的 SQL,並可在下方展開查看。若你想在將某個標的接入篩選器前,先對自選清單執行相同的 spread 檢查,可在 Strasmore terminal 以自然語言提出要求。