2026年九月1日 · 公司行動

拆股調整資料拆解:NVDA 的 10 比 1 拆股如何影響背後每一列資料

拆股調整資料拆解:NVDA 的 10 比 1 拆股如何影響背後每一列資料

這是每日股票資料檔中的一列。NVDA,2024 年 6 月 7 日,星期五,也就是 10 比 1 拆股生效前的最後一個交易日。

欄位 數值
日期 2024-06-07
收盤價 1208.88
成交量 42,800,000 (約數)
拆股因子 1.0
股息 0.00
調整後收盤價 120.8781

我刻意不在這裡列出 OHLC 欄位。文章接近尾聲時會再談到它們,而它們正是悄悄出問題的欄位。

這列資料最值得注意的,都藏在第 2 欄和第 6 欄的落差裡。6 月 7 日的市場成交價是 1208.88。以這個價格代表的那種股票單位已不復存在,因此再也不會有人以那個價格成交。120.8781 是重建出來的價格,而且不只是 1208.88 除以 10。讓我們逐欄來看。

10:1套用於所有先前資料列的除數
0.99991789隔天蓋上時間戳的股息因子
$90來回交易憑空多出的手續費
5.6pp除數憑空造成的年化報酬拖累

日期:2024-06-07,以及另外 2 個更重要的日期

這次拆股於 2024 年 5 月 22 日公布,與財報同日發布。股東名冊基準日是 6 月 6 日。從 6 月 10 日星期一開始,股票以拆股調整後的價格交易。這是 3 個日期,而你資料供應商的 split_factor 欄位只會落在其中 1 個日期上,通常是拆股調整後的第 1 個交易日。我最常看到的公司行動錯誤,就是日期差 1 天;它在整體結果中不易察覺:你的權益曲線會在單日出現 90% 的跳空下跌或 900% 的跳空上漲,以 2,000 天計算的 Sharpe 幾乎看不出來,但最大回撤或停損規則一定會受到影響。

股息也有自己的日期問題,而且 2024 年時規則在大家毫無察覺的情況下改變了。NVDA 拆股後每季 $0.01 的股息,股東名冊基準日是 6 月 11 日。美國的交割週期於 2024 年 5 月 28 日改為 T+1,因此除息日與股東名冊基準日現在是同一天。任何把除息日推算為「股東名冊基準日前 1 個營業日」的資料載入器,這套做法沿用數十年都沒問題,卻從 2024 年 6 月起悄悄提前 1 個交易日產生股息調整。程式不會拋出錯誤,只是把因子放到了錯的資料列上。

公司行動程式碼出錯時,從來不會是例外狀況,而是數字差了 1 天,卻看起來完全合理。

收盤價:1208.88——檔案裡看不到的價格

這是原始成交價,在多數研究流程裡,它只存在於一個沒人讀取的欄位。訊號是根據 adj_close 計算的。任何以美元表示的每股價格水準規則,如今參照的都是市場參與者從未見過的數字。

NVDA 在 2024 年春季一路漲向 $1,000,這是真實發生的行情,背後有真實的委託流:整數關卡的磁吸效應、集中在 950 和 1000 的選擇權履約價,以及每次逼近時都會出現的新聞風險。在調整後資料裡,這整段行情發生在 $100。如果你要測試心理關卡行為、整數關卡附近的跳空回補邏輯,或接近履約價的特徵,你測試的價格序列已被一個當時尚未發生的事件重新縮放。

股票篩選條件也是一樣。「排除股價低於 $5 的股票」是個合理的代理條件,可用來篩出一群有共同微結構問題的股票:相對價差大、融資融券限制、最小跳動單位制度。若套用在調整後歷史資料上,你會把那些曾經以 $30 交易、後來才反向拆股的公司排除掉。若套用「股價高於 $500」的條件,你會不知不覺把 2024 年 6 月以前每一年的 NVDA 都排除。價格篩選應該用未調整的成交價。就是這麼簡單。

拆股因子:1.0——以及下一列的 0.1

這個因子是從今天往回累乘得來的。2024 年 6 月 10 日以前的每一列,都會乘上這次拆股的 0.1,再乘上 2021 年 4 比 1 拆股的 0.25,接著再乘上更早的因子。NVDA 在 2021 年以前的歷史資料縮放為 0.025,因此 2019 年以 $200 成交的日線,顯示時會變成 $5.00。

有 2 個後果值得記住。第一,每次發生新的公司行動,調整後歷史資料就會改變。你在 2024 年 5 月跑的回測,和今天用相同程式碼、相同日期區間跑出的結果會不同;如果你快取特徵時只用商品代號和日期做索引,沒有標記資料版本,那現在的快取就混用了 2 種尺度。正因如此,我們把調整時期版本納入特徵索引鍵;我們花了一個令人困惑的下午才學到這件事。

第二,按 0.025 縮放後,原本以 $0.01 跳動的股票,如今每次變動 $0.00025。你的跳動單位取整邏輯、「是否創新高」的比較,以及浮點數相等檢查,如今全都在遠低於市場實際精度的尺度上運作。

股息:0.01——讓所有歷史價格都不再落在美分格點上的數字

1 美分,看起來微不足道,卻正是 adj_close 顯示為 120.8781,而不是整齊的 120.888 的原因。

6 月 10 日的收盤價是 121.79。除息因子是 (121.79 − 0.01) / 121.79 = 0.99991789。這個因子會乘上 6 月 11 日以前的每個價格,因此拆股調整後的 120.888 會變成 120.878074。數值變化不大,卻會永久保留;而且沿著 NVDA 的歷史資料往回看,每次除息日都會再套用一次,總共約 60 多次。關鍵在於連乘效果:等你看到 2015 年的資料時,價格已乘上數十個不太合理的因子。沒有任何一個調整後的歷史價格還落在美分格點上。

這表示,每一次拿 == 和整數關卡比較都不準確;每一次「是否觸及限價」檢查都需要容許誤差;而把重建出的 OHLC 直接四捨五入到小數點後 4 位,也不再能保證低點 ≤ 開盤價 ≤ 高點。這也表示 adj_close 是總報酬序列,而 close 是價格報酬序列;如果你用其中一種計算報酬,卻用另一種畫回撤,就混用了兩種不同的事件定義。

成交量:42,800,000——大家套用方式不一的除數

若要和拆股後的交易時段比較,股數成交量必須乘以 10。有些資料供應商會這麼做,有些不會,也有些會調整 OHLC,卻保留原始成交量。這 3 種做法中,最後一種最糟,因為在你拿價格乘以成交量之前,整份檔案看起來都很一致。

最穩當的做法,是別再把股數成交量當作特徵,改用成交金額;成交金額天生不受拆股影響。20 日平均成交金額的流動性篩選條件完全不需要調整邏輯,也不會因公司行動而出錯。特徵保持不變,比寫出正確的調整程式碼更可靠,因為調整程式碼得一直維持正確。

資料供應商的檔案有 3 種形式,也有 3 種出錯方式。

提供的資料 會出什麼問題
只調整收盤價,OHLC 保留原值 跳空與盤中邏輯會跨越 2 種價格尺度計算
調整 OHLC,成交量保留原值 成交金額會因拆股比例而算錯;ADV 篩選條件也會失準
原始 OHLCV 加上因子欄位 套用方式正確就不會出問題;套錯資料列則樣樣都會出問題

缺少的欄位:adj_open、adj_high、adj_low

現在把 OHLC 欄位放回來。如果資料串流只調整收盤價,而你的策略用 open / prev_adj_close − 1 計算隔夜跳空,那麼在 2024 年 6 月 10 日,它會算出 120.37 / 120.8781 − 1,也就是大約 −0.4%,數值很合理。把同一段程式碼往回套到 2024 年 6 月 7 日,它會從原始檔案取開盤價(約 1207),再拿這個價格和經過更早拆股因子 0.025 調整的收盤價相比,結果會算出幾千個百分點的跳空。

任何把原始欄位和調整後欄位混用的運算,都是在 2 種座標系之間做計算。我現在會在資料載入器層級加上檢查,確保讀取時不會混用不同調整方式;我不再讓研究人員自己記得這件事,因為他們會忘,包括我自己。

沒有任何欄位會告訴你:實際上你會買進多少股

這是回測成本模型裡最直接花錢的錯誤,也是我會寫這篇股票拆股文章的原因。

美國股票交易的手續費常按股計算。假設每股 $0.005,最低訂單費用 $1.00,這是零售券商常見的固定費率方案。現在回測一筆 $400,000 的 NVDA 部位,時間在拆股前 1 年;當時原始股價約 $400,調整後價格則顯示為 $40。

股數 手續費
實際情況(原始價格 $400) 1,000 $5.00
回測看到的情況(調整後價格 $40) 10,000 $50.00

曝險相同、交易相同,模型算出的成本卻是 10 倍。每一邊交易都憑空多出 $45,來回交易多出 $90;若策略每天換倉,每年就會多算約 $22,000 的成本,這些成本根本不存在。對 $400k 的投資組合來說,這相當於年報酬被憑空拉低 5.6 個百分點,全是除數造成的。這裡的結果是讓你看起來比實際表現更差,還算能接受。

反向拆股會造成相反的結果,而這種方向更危險。1 比 10 反向拆股會讓調整後歷史資料的價格變成實際交易價格的 10 倍,股數則變成實際交易股數的十分之一。你的成本模型會悄悄把每股手續費除以 10。反向拆股常見的股票,正是小型股、股價低於 $5、價差大的股票;在這類股票中,每股費用往往是成本結構裡最大的一項。回測會特別美化那些本該被重罰的股票。

因此,解法簡單而且直接:用美元金額設定部位,再用該日期的未調整價格換算股數,並按這個股數計算每股手續費。資料載入器要永久保留原始價格欄位;它不是只供稽核的紀錄,而是成交模擬引擎的即時輸入。

  1. 訊號與報酬:調整後序列。
  2. 股數、每股手續費、跳動單位取整、價格水準篩選:未調整序列。
  3. 流動性與容量:用成交金額計算,兩者都不需要。

6 個欄位、1 列資料、1 個相當普通的公司行動,提前 3 週公告,沒有人感到意外。市場花了一個早上就處理完了。在研究流程中忠實重建這段變化,難度高得多;而流程有沒有做好,幾乎從來不是看錯誤訊息就能知道。

公司行動拆股調整美國股票資料工程回測
← 所有文章