案發現場在我自己的數據庫裏:一隻股票的歷史價格,是負的。沒有暴跌,沒有退市,就是負的。價格可以從一百塊跌到一塊,但從來沒有一種跌法叫跌成負數——除非,歷史價格被人改寫過。
第一現場
先交代口供:我這系統有一個重大偏誤——從網上爬來的股價,是不是前復權的?要是前復權,就等於知道日後每一年的股息,那全完蛋了,我這數據是不是白爬了?
前復權的算法是:把日後每一次分紅除權,往前折算進歷史價格。問題是,1995 年的那根 K 線被 2024 年的分紅改寫過——而 1995 年的投資者不可能知道 2024 年分不分紅。回測的人拿到這份數據,等於提前翻了答案。這在量化行當裏有名字,叫前視偏差,具體這一款,叫股息前視。數據沒白爬,爬來的是原始價;錯的是我用它算收益——收益的計算方式偷看了未來。
三種口徑,三種污染
很快,要命的問題自己冒了出來:前復權有一個很大的毛病——價格復着復着,會變成負數。高分紅的老股票,幾十年的分紅一路往前扣,能把歷史價格扣穿零。這不只是趨勢研究受影響——是整個數據集在數學上就不成立。
那換別的不行嗎?不復權、後復權,是不是也污染?過堂的結果是三種口徑各有各的罪:不復權,價格序列在除權日斷裂,跳空缺口製造假信號——但它的 PE 是真的,因為當年的人就是用當年那個價格算的;後復權,序列連續、方向從過去往後算,沒有未來信息,可價格被推得離譜,估值分位全失真;前復權,圖表最好看,數學上最不成立。
結論:沒有一種現成口徑是乾淨的。乾淨的方案只有一個——數據庫存未復權價,另存一張分紅事件表,回測要用哪種口徑,當場動態計算。價格是事實,事件是事實,口徑是用的時候才該做的決定。
同案犯
案子到這裏該結了,結果在指數那兒又撞見一個。恒生指數本身不復權——每年 4% 上下的股息,全部扔掉。價格指數講長期故事,等於每年把真實的回報砍掉一截,三十年下來系統性低估大約一年 4 個點。
怎麼會全球投資者這麼傻呢?因為這個偏誤大了去了——你看 6% 跟 10% 的差異,那就是 50% 的差距。股息率 6% 的市場,用不含股息的指數講三十年,差異能吞掉一半的真實回報。報紙在用,基金在用,你的長期收益對比基準也在用。全球投資者不傻——是全球投資者都在看同一張被塗改過的表。
結案
數據不是事實,數據是帶口徑的事實。每一張 K 線圖背後都藏着一個必須審的問題:這條歷史價格,是當時的誰、在當時能知道的什麼範圍內算出來的?答不上來的數據,不能進回測。
我的數據庫最後立了新規矩:未復權價、前復權、後復權、分紅事件,四件套全存,外加一行"當時可得"的標記。成本是幾張表,換來的是歷史不再被未來改寫。改寫歷史不需要壞人——一個默認參數就夠了。