為什麼用 Python 投資?多數文章的答案停在「免費、開源、自由度高」,這篇用一個完整的實驗把答案做給你看:我們把「月營收成長、自由現金流為正」這個聽起來很合理的選股點子,用 finlab 套件在台股 2018 年初到 2026 年 6 月的資料上跑了四種設計,最好的版本年化報酬 17.21%,仍然輸給同期 0050 含息買進持有的 25.05%。商用回測軟體很難做這種全市場實驗,而 Python 把它變成半小時的工作,這個差異就是本文要講清楚的事。
![]()
先把實驗的關鍵數字放在最前面(回測區間 2018-01 至 2026-06,含 finlab 預設交易成本;0050 為還原價買進持有,計算口徑見文末方法段):
| 組合 | 年化報酬 CAGR | 日夏普 | 最大回撤 MDD | 總報酬 |
|---|---|---|---|---|
| A:雙因子 z-score 合成,前 20 名 | 7.08% | 0.42 | -47.17% | 77.1% |
| B:改用百分位排名合成,前 20 名 | 11.11% | 0.58 | -43.05% | 141.1% |
| C:排名合成+兩因子皆為正,前 20 名 | 9.88% | 0.53 | -42.52% | 119.7% |
| D:同 C,持股放寬到 40 檔 | 17.21% | 0.83 | -36.69% | 276.6% |
| 0050 含息買進持有 | 25.05% | 1.22 | -33.96% | 558.5% |
這是一個沒有贏的實驗,我們照原樣發表。因為它同時回答了兩個問題:第一,網路上隨處可見的「成長+現金流」選股口訣,放進有交易成本的回測後長什麼樣子;第二,為什麼做量化研究的人最後幾乎都走向 Python。Python 不保證找到聖杯,它給你的是在投入真錢之前,就知道一個點子不行的能力。
程式化投資的四條路:MT4、XQ、MultiCharts、Python
市面上的程式交易工具各有專長:MT4 主攻外匯與 CFD、XQ 全球贏家主攻台股與期權、MultiCharts 主攻期貨,Python 則是通用程式語言搭配開源生態系。差異不在「能不能寫策略」,四套都能;差異在成本結構、能處理的問題形狀,以及學會之後這個技能還能帶你去哪裡。

| 比較面向 | MT4 | XQ 全球贏家 | MultiCharts | Python + finlab |
|---|---|---|---|---|
| 金錢成本 | 免費(經紀商版) | 基本免費/模組付費 | 券商版月費/買斷 | 免費開源 |
| 主攻商品 | 外匯、CFD | 台股、期權 | 期貨、台股 | 跨市場(台股/美股) |
| 全市場橫斷面排名 | 受限(單商品 EA) | 受限(封閉腳本) | 受限(單商品訊號) | 支援(全市場矩陣) |
| 機器學習整合 | 受限(MQL 語言) | 不支援 | 不支援 | 支援(sklearn 等) |
| 策略以外的用途 | 無 | 無 | 無 | 資料分析/網站/自動化 |
幾點補充,避免比較失真。XQ 內建選股中心與相當完整的台股資料,對只想用現成條件篩股的人夠用,受限的是「把自訂因子做成全市場排名再合成」這類研究自由度;MultiCharts 的圖表化策略開發與台灣券商的整合很成熟,期貨當沖族群用它有道理;MT4 的歷史資料與回測完全免費,在外匯圈仍是標準配備。各家定價隨方案變動,文中不列具體金額,以官方公告為準。想看 FinLab 與 XQ 的逐項對照,可以參考XQ 與 FinLab 的差異比較;若你的需求偏向看盤畫圖,TradingView 的比較頁整理了另一個面向。
固定月費的成本拖累,一條公式就能算
商用軟體常見的進階功能採月費制。月費本身不是問題,問題是它與本金規模無關,對小資金使用者形成固定比例的拖累。設月費為 元、投資本金為 元:
舉一個示例計算(非任何軟體的實際報價):月費 1,000 元、本金 10 萬元,一年的軟體費就是本金的 12%;本金 100 萬元時降到 1.2%。把月費 500、1,000、2,000 元三條曲線畫出來,可以看到本金低於約 50 萬元時,多數月費方案的拖累都還在 1% 參考線之上:

台股長期年化報酬約 8% 到 10%,若工具固定吃掉 1% 以上,等於起跑前先讓一段。Python 與其整個科學運算生態(pandas、numpy、scikit-learn)完全免費,finlab 套件本身免費註冊即可使用台股資料與回測引擎,這條成本曲線對你是一條貼著零的水平線。
Python 的結構性優勢:全市場橫斷面選股
成本只是表層差異,真正把 Python 與單商品腳本工具區分開的,是「問題的形狀」。MT4 的 EA、XQ 與 MultiCharts 的訊號腳本,核心模型都是「對一檔商品,逐根 K 棒判斷買賣」;但選股本質上是另一種運算:在同一個時間點,把全市場兩千多檔股票放在一起比較、排序、挑出前幾名。學術上稱為橫斷面(cross-sectional)分析,Fama & French (1992) 證明股票報酬的差異主要由橫斷面特徵(規模、淨值市價比)解釋,這條研究路線後來成為因子投資的基礎;近年 Gu, Kelly & Xiu (2020) 更示範了機器學習方法在橫斷面報酬預測上顯著優於傳統線性模型,而這類方法只活在 Python 這樣的開放生態裡。
橫斷面比較的標準做法是把因子標準化。對第 天、第 檔股票的因子值 ,z 分數定義為:
其中 與 是當天全市場該因子的平均數與標準差。兩個不同單位的因子(一個是百分比的營收年增率,一個是比率的現金流殖利率)經過標準化後就能相加:
用一家虛構的「甲公司」示範(純屬示例):甲公司月營收年增 35%,當月全市場平均 8%、標準差 18%,營收 z 分數為 ;它的自由現金流殖利率 9%,全市場平均 3%、標準差 4%,z 分數同樣是 1.5;合成分數 ,在常態假設下大約是全市場前 7% 的位置。這個運算在 pandas 裡是兩三行的矩陣操作,在單商品逐檔執行的腳本語言裡,你得自己處理兩千多檔股票的資料對齊、缺值與排序,多數使用者到這裡就放棄了。
這正是 finlab 套件存在的理由:台股的價格、月營收、財報、籌碼資料已經整理成對齊好的 DataFrame,橫斷面運算就是一般的 pandas 語法。詳細入門可以看5 分鐘用 finlab 選股回測的教學。
實測:一個雙因子選股點子,從想法到結果
光說「Python 能做全市場研究」太抽象,我們完整走一遍流程。研究問題:「買月營收還在成長、而且自由現金流為正的公司」這個直覺上很穩健的雙因子組合,2018 年以來在台股贏得過 0050 嗎?
兩個因子的定義:
- 月營收年增率:finlab 資料表
monthly_revenue:去年同月增減(%),索引已是公布截止日,回測時不會偷看未公布的數字。 - 自由現金流殖利率:近四季自由現金流合計除以市值,財報以公布截止日對齊。
股票池取 60 日均成交金額在全市場前 50% 的股票,剔除流動性後段,避免回測買得到、實單買不到。核心程式碼長這樣(完整可執行版本見文末下載):
顯示程式碼
from finlab import data
from finlab.backtest import sim
# 載入資料:價格、市值、月營收年增率、季度自由現金流
close = data.get("price:收盤價")
vol = data.get("price:成交股數")
market_value = data.get("etl:market_value")
rev_yoy = data.get("monthly_revenue:去年同月增減(%)")
fcf_q = data.get("fundamental_features:自由現金流量").index_str_to_date()
# 股票池:60 日均成交金額在全市場前 50%
amount = (close * vol).rolling(60).mean()
pool = (amount.rank(axis=1, pct=True) > 0.5) & close.notna()
# 因子一:月營收年增率,對齊到每個交易日
rev_daily = rev_yoy.reindex(close.index, method="ffill")
# 因子二:自由現金流殖利率 = 近四季 FCF 合計 / 市值
fcf_yield = fcf_q.rolling(4).sum().reindex(close.index, method="ffill") / market_value
# 橫斷面百分位排名後等權合成,要求兩因子皆為正
mask = pool & (rev_daily > 0) & (fcf_yield > 0)
score = (rev_daily.where(mask).rank(axis=1, pct=True)
+ fcf_yield.where(mask).rank(axis=1, pct=True)) / 2
# 取合成分數前 40 名,每月再平衡
position = score.where(mask).is_largest(40)
report = sim(position, resample="M")第一次跑 finlab 時執行 finlab.login(),套件會自動開啟瀏覽器引導你登入,之後就能取用資料。
四個設計變體,每一步都攤開
回測研究最常見的造假方式是只給你看最後一個版本。我們把迭代過程全部列出來:
- 變體 A:兩因子各做橫斷面 z 分數(1%/99% 分位縮尾抑制極端值)、等權合成、取前 20 名。最直觀的教科書做法。
- 變體 B:把 z 分數換成百分位排名。動機是月營收年增率分布有極長右尾(轉機股動輒年增數百個百分點),z 分數會被這些極端值綁架,排名法對極端值穩健。
- 變體 C:在 B 之上加「營收年增率大於零、自由現金流殖利率大於零」門檻。動機是排名法的前段可能混入「衰退中但跌得比較少」的公司。
- 變體 D:把 C 的持股檔數從 20 放寬到 40。動機是月頻換股的 20 檔組合單一個股權重 5%,個股事件對淨值影響太大。

結果在文首的表格:A 到 D 的年化報酬從 7.08% 一路改善到 17.21%,日夏普從 0.42 改善到 0.83。設計選擇造成的差距非常大(同樣兩個因子,z 分數版與分散版差了 10 個百分點的年化),其中從 A 到 B 的改善印證了極端值假說,但 C 比 B 還略差(9.88% 對 11.11%),說明「正值門檻」這個聽起來保險的條件在這段期間沒有加值。然後是最重要的事實:四個變體沒有一個贏過 0050 含息的 25.05%。
逐年拆開看更清楚。變體 D 不是全程都弱,2021 年它賺 43.93%、0050 只有 21.92%,2023 年它賺 54.50%、0050 是 27.52%;真正的崩壞在 2024 之後:2024 年 32.19% 對 48.64%、2025 年 0.36% 對 36.83%、2026 年至 6 月 12.66% 對 60.00%,連續三年大幅落後。這段期間台股由權值股領漲,0050 重押的台積電貢獻了大盤大部分漲幅,廣泛選中小型股的策略結構性吃虧:

風險端同樣沒有補償。變體 D 的最大回撤 -36.69%,比 0050 的 -33.96% 更深,2018 年下半年與 2022 年空頭都跌得不比大盤淺:

變體 D 的完整互動回測報告(持股明細、月報酬熱圖都能點開):
輸給 0050,這個實驗的價值在哪裡
第一,它把一句流行的選股口訣量化了。「買有成長又會賺現金的公司」聽起來無懈可擊,但在 2018 到 2026 這個權值股主導的多頭,光靠這兩個因子選出的組合風險調整後全面落後,日夏普 0.83 對 1.22。這個結論與站內其他研究互相印證:月營收公告漂移的 15 年回測發現純月營收年增率前 30 名的年化只有 8.73%,同樣輸給 0050;本文變體 B、C 落在 10% 上下,量級一致。
第二,它示範了負面結果的成本有多低。這整個實驗(含四個變體與所有圖表)的運算在筆電上幾十分鐘內完成。沒有快速回測工具的投資人,驗證同一個點子的方式是用真錢部位試半年,學費貴得多。回測本身的限制與正確心態,可以延伸讀回測是什麼、會騙人在哪裡。
第三,它留下了改進的明確方向。同一套框架裡,站內已有用不同因子組合跑出較好結果的研究:營收、動能、品質加低波動的四因子組合在同一窗口年化 29.45%、夏普 1.40;投信買超搭配營收動能的籌碼策略年化 33.9%。差別不在工具,在因子設計,而你需要一個能快速迭代因子設計的環境。
也要提防另一個極端:迭代太多次之後,你總會「找到」一個漂亮的回測。Bailey, Borwein, López de Prado & Zhu (2014) 把這個問題講得很直白:嘗試的策略組態夠多,回測過擬合幾乎無法避免,樣本內的夏普可以被搜尋過程本身製造出來。所以本文把全部四次嘗試攤開,而且對「在第幾步停下來」保持節制;自由度高的工具必須搭配相應的研究紀律,這是 Python 路線的代價,也是它逼你學會的第一課。
回測方法與限制
| 項目 | 本文做法 |
|---|---|
| 交易成本 | 策略使用 finlab sim() 台股預設值,含手續費 0.1425%(預設折扣)與賣出證交稅 0.3%;0050 基準為還原價純指數算術,不含成本,故對基準略偏有利 |
| 滑價 | 未另設滑價假設 |
| 股票池 | 台股上市櫃;需同時有月營收與財報自由現金流資料;ETF 無月營收資料,自然不在池內 |
| 流動性過濾 | 60 日均成交金額位於全市場前 50% |
| 排除類別 | 未另行排除金融股與 KY 股;下市股由 finlab 資料庫保留歷史,無生存者偏誤式剔除 |
| 前視偏差 | 月營收用公布截止日索引;財報用 index_str_to_date() 對齊公布截止日;皆於可得日後才進入訊號 |
| 權重 | 等權,無單檔上限(前 20 名版單檔 5%、前 40 名版 2.5%) |
| 周轉率 | 變體 D 月均單邊周轉約 54.5%,月頻換股的成本敏感度高 |
| 統計口徑 | 策略與 0050 的 CAGR、夏普、MDD 皆以截至 2026-06-09 的每日淨值序列用同一套算術公式計算,避免不同統計工具的口徑差異 |
| 樣本內外 | 全段 in-sample(2018-01 至 2026-06),未做樣本外切分;變體 A 到 D 為文中全部揭露的迭代,無未揭露的參數搜尋 |
上手路徑:從安裝到第一個回測
- 安裝 Python(或用 Google Colab 免安裝),執行
pip install finlab。 import finlab後呼叫finlab.login(),依指引完成免費註冊登入。- 用
data.get()取資料、寫條件、丟進sim(),第一個回測十行內可以完成,範例見finlab 選股回測五分鐘教學。 - 想抓台股以外的資料,用 yfinance 抓全球股價的教學是好的下一步;想把月營收玩出更多花樣,可以接著看三種月營收選股的 Python 實作。
- 策略成熟後,finlab 支援串接台灣券商 API 自動下單,研究到實單在同一個語言裡完成。
對程式交易這條路還沒有整體圖像的讀者,建議先讀程式交易是什麼建立框架,再用程式交易從策略到實單的指南規劃學習順序;量化方法的全貌與可以動手玩的互動回測器在量化交易完整指南。
不只拿來交易:Python 在投資之外的報酬
學 XQ 腳本或 MQL,技能的出口只有交易這一個;學 Python,量化投資只是眾多出口之一。同一套 pandas 功夫可以拿來做工作上的資料分析,同一套自動化能力可以寫爬蟲、排程、做網站,而 Python 連續多年位居最熱門程式語言,履歷上的價值與交易績效無關。對多數人來說這才是期望值最高的部分:就算你最後發現自己不適合主動投資(本文的回測說明這完全可能),學語言的時間也沒有浪費。
順帶回答一個老問題:R 語言呢?R 在統計與學術圈仍然優秀,但在量化交易的開源工具鏈(回測框架、券商 API、機器學習部署)上,Python 的生態已明顯更完整,台股的 finlab 也只支援 Python。除非你已有 R 基礎,新手從 Python 開始即可。
適合誰、不適合誰
適合:願意花一到三個月學基礎語法的投資人;想驗證自己選股想法而非聽信別人結論的人;小資金起步、對固定月費敏感的人;本來就想學程式、希望學習標的同時有投資用途的人。
不適合:完全不想碰程式碼的人(FinLab 另有 AI 對話式的選股介面,可以從AI 量化研究的工作流程了解);需要期貨高頻當沖逐筆功能的人,MultiCharts 這類專用工具仍有優勢;以為換了工具就會賺錢的人,本文的回測就是反例。
常見問題
沒寫過程式,學 Python 投資要多久? 以每週投入幾小時計,基礎語法約一個月,pandas 資料處理約一到兩個月,之後就能看懂並修改本文這種策略。finlab 把資料下載與回測引擎都包好了,新手實際要寫的只有選股邏輯那幾行。
用 Python 做量化投資要花多少錢? 語言、pandas、scikit-learn 全部免費;finlab 套件免費註冊即可使用台股資料與回測,進階資料與功能才需付費。本文全部回測使用免費可得的工具完成。
需要很好的電腦嗎? 不用。本文的全市場回測在一般筆電可以執行,沒有安裝環境也可以用 Google Colab 在瀏覽器裡跑。
已經在用 XQ 或 MultiCharts,有必要轉 Python 嗎? 看你的瓶頸。如果你做的是單商品技術指標進出場,現有工具夠用;如果你想做全市場選股、多因子合成或機器學習,那是單商品腳本架構先天受限的領域,遲早要碰 Python。兩者並用也常見:用 Python 研究選股、用熟悉的軟體看盤下單。
這篇的策略輸給 0050,那學 Python 還有意義嗎? 有,而且這正是重點。工具的價值是讓你低成本知道真相:這個雙因子組合不值得投入真錢,而同一框架換因子設計(例如四因子合成的做法)可以得到不同結果。不能快速驗證的人,只能把每個點子都用真金白銀試。
Python 可以自動下單嗎? 可以,finlab 支援串接多家台灣券商 API,回測通過的策略可以接上實單。建議先用小部位驗證回測與實單的落差(滑價、成交率)再放大。
夏普比率、最大回撤這些指標怎麼解讀? 夏普比率衡量每承擔一單位波動換到多少超額報酬,夏普比率計算器有互動說明;其他名詞可查量化名詞詞彙表。本文所有指標由 finlab 回測產出的每日淨值序列計算,口徑見回測方法段。
選股因子要去哪裡找靈感? 從台股選股方法的完整整理入手,站內每篇策略文都附可下載的程式碼;自由現金流因子的單獨研究可看自由現金報酬率選股的實測。
延伸閱讀
下載資源
| 檔案 | 說明 |
|---|---|
| strategy.py | 四個變體的完整回測程式碼,安裝 finlab 後可直接重現本文結果 |
| equity.csv | 各變體與 0050 的每日淨值序列 |
| 變體 A 互動回測報告 | z-score 版的完整持股與績效明細 |
免費註冊 FinLab,就能用本文同一套資料與回測引擎驗證你自己的選股點子;遇到問題歡迎到 FinLab 社群討論,把你的回測結果(不論好壞)丟出來一起檢視。
投資警語:本文僅供教學參考,不構成投資建議。過去績效不代表未來表現,投資有風險。 本文回測為全段樣本內研究,數字會隨資料更新與市場變化改變,請以可下載程式碼自行重現與檢驗。
最後更新:2026-06|回測區間:2018-01 至 2026-06(資料截止 2026-06-09)|作者:FinLab 量化研究團隊(經量化研究員審閱)
FinLab AI
想建立自己的策略?
用自然語言描述你的選股想法,AI 自動驗證、回測、給你答案
免費開始