戰場歸來,存活者發聲
實戰之理論驗證!或「理論之實戰驗證」?沒寫錯,我的實戰是跑在前面的,在我沒讀過什麼金融理論的狀況下,就摸索並實作出關於 Beta 的許多功能。在個人策略轉向 Beta 中立的初期,遇到持續半年以上的強勁多頭!(可能是歷史上屬一屬二的)

驚奇,誇張,扯,沒有最,只有更,...,無數日子就這樣度過。近期稍作回檔,終於讓空頭喘口氣。整整半年期間,每天看著盤跟鬼一樣沒有止境的一直向上爬,千百個聲音在笑自己是白癡!但策略轉向有其持續性,不可能輕易就棄械投降,因此就這樣持續被碾壓著。在嚴控 Beta 風險的大方向下,稍微增加曝險到正的 0.2 左右,還是堅持多空配置。在逆境的苦思中,從本質與原理出發,激發出更進一步的風險分散方法,就是將原始的日報酬資料向量化,降維並視覺化成美麗泡泡的「風險分布圖」。然後終於逐漸享受到淨值「不動如山」的穩健感,在大漲大跌的風浪中,悠遊自在於一葉輕舟,從從容容,取得我該得的一瓢飲。如以下不專業 ai 圖。

Beta,原來這只是一個特例!
然後我去找,市場上有沒有人這樣做,竟然....找不到!有些市場中性策略的論述,但都不鼓勵,難度高,勸退。我所尊敬的財經博主們,也沒有一個這樣做,是怎樣?只有兩種可能:我可能產生了一點點的原創價值喔!或者,也可能是異想天開。但交易有趣之處就是,市場會直接驗證有效性,不需要經過權威機構認證,哈哈。回到量化分析的基本功,分析,探勘,檢定,預測,均圍繞在「因子」。靜心研讀後發現,我的 Beta 只是一個特例,可以稱為「市場因子的曝險 Beta」,市場是一個因子。直接以 Beta 稱呼之也是沒有問題的,因為市場這個因子,是最大最重要的,探討個股與市場因子的關係,是基本且重要的工作。要獲得市場平均報酬,本來也是不簡單的工作,但得益於指數公司已經為我們完成了複雜的統計工作,即時性更新大盤指數,再加上指數期貨與 ETF 工具的興盛,要取得市場平均報酬,已經不是難事了。想到以前,也許一個基金經理,大費周章的辛勤工作,只為了幫客戶分散風險,報酬率可以跟上大盤,這種工作在現在,已經徹底被 ETF 取代了。對經理人的要求,轉而更嚴苛更艱難的 Alpha!必須對抗的是「系統性風險」。
因此,定期定額買 0050,就可以取得市場平均報酬,一句話講完。一堆書和論文,講來講去只是在證明此事有效而已,有必要一直研究嗎?哈哈。大盤崩跌時有解嗎?這才是重點。若有錢繼續扣款就沒事,不然若因生活所需,一樣要割肉,這才是真相。要維持定期定額的系統持續運作,本業收入是必要的,不然就要有夠大的「現金蓄水池」!若兩者都沒有,必須潛心研究,尋找 Alpha,且要「夠純粹」的 Alpha。誤把 Beta 當 Alpha 的是大有人在。
若相信大盤長期向上,專業術語就是「Market Factor」有效。因此進行因子曝險,實現方法就是做多指數期貨或是買進 0050 等市值型 ETF。若 All In 0050,就是 Market Factor Beta Exposure 接近 1 的投資組合。以下是我自行開發,初試啼聲的「精明管家」系統,顯示 0050 在今年多頭氛圍旺盛的狀況下,年化報酬率達到大約 30%,但注意 highlight 處,也必須承受 25% 的波動喔,和最大 30% 的回撤。

只要願意承受風險,得這些報酬,應該,合理。但是,我不願意。因為我屬於上面兩者皆無的人,無所謂的本業收入,也無夠大的現金蓄水池,因此「擴大資金效益」就是必要的行為。做事業的人少有不借錢的,做產品者少有不廣告的,台北到台中也少有步行的,這就是「槓桿」,其實是很自然的事。在金融工具便利的現在,曝險 200% 大概就是一種日常。但當 30% 回撤來臨之時,我的資產將減損六成!這就很難接受了。朋友們,當你定期定額到退休,金額創新高之時,減損 30% 能否接受?也許少有人提醒你過。那怎麼辦?不一定要如我搞這些避險玩意兒,但注意保留夠多的現金水位,不要失去風險意識,這是理財最重要的事。
更多因子,但有效嗎?
真正有效的因子是稀有且珍貴的,太多所謂的因子,只活躍於歷史資料中,真實未來資料一驗證就破功了,或是只有短暫時間有效。據說現在的量化交易公司,運用爆量算力提取爆量因子,合成有效的因子;但都免不了要不斷探勘,不斷驗證,也不斷丟棄失效的因子,這些過程是大量消耗成本的。過去短暫研究後,就興趣缺缺了,因為這不是小散戶玩得起的。這次從市場因子再度介入,肯定量化分析還是存有一定希望,因為在交易工作中,不可能用單純的「質化」分析來涵蓋一切,最終的數字總是要面對的。無論如何,各種因子是存在的,只是要如何運用,驗證或檢定,在交易策略中要扮演何種角色,這就可以有相當多樣的應對方式。
以最大的市場因子而論,在策略中可以有意地去「放大 Beta」,也可以有意地去「抵銷 Beta」,其底層邏輯差異何在?基本上我是站在「抵銷」這邊。
先想想站在放大那邊,在享受獲利的同時該付出的有哪些?首先必須確實「驗證」因子的有效性。即使像市場因子這樣有多數共識的因子,都可能存在持續一兩年的熊市折磨,更何況一大堆動能,價值,規模,基本面,經濟面等五花八門的因子,那更是變幻莫測,有效性的存續期間飄忽不定,要一直追逐和驗證,實在太累了;擁有巨量算力的量化公司,就好好吃你們的餅吧。我相信市場很大,不是只有這種餅可吃的,無需像媒體吹噓的,過度神化這些公司。
那站在抵銷這邊呢?我們致力於抵銷所有已知的風險。而如果該因子其實是無效呢?那也無傷大雅,這就是明顯的好處。漲時不賺,跌時也不賺,那就賺波動啊。會花時間去管理和抵銷,表示並非認定因子無用,反而是認定因子有用,但拒絕去回答「何時有用」這個問題,只知不同的因子會在市場中不斷地「輪動」。
比如說,市場可能在某段時間流行「成長股」,卻在另一段時間「殺估值」,成長股被殺爆的同時,又慢慢推崇「價值股」。或是在某段時間對央行的利率預期極為敏感,又在另一段時間完全不管總體經濟怎麼樣,只管熱炒某個主題如 ai data center 之類的等等。市場時而瘋狂時而冷靜,總有許多故事在流傳著,或有些匯聚成輿論洪流,於是無堅不摧,碾壓所有次等敘事。如此觀察,承認因子在流竄是顯而易見的事實,但要抓到每一股浪潮的始末,真是難上加難!基本上我已經放棄了,所以偏向於採取抵銷策略。
不斷的抵銷和對沖,卻絕不擔心市場會歸於寂靜和單調,唯一可確定的,就是市場永遠都在波動,若能利用波動獲利,那才是長長久久的活水泉源。深諳此道甚至利用 tick trade 累積小小的價差,就能匯聚成巨大的財富,這是「微觀世界」的奧妙之處。極致玩家就是「造市商」,在使用者全無知覺的情況下,默默的為自己輸入財富的水流。當然要玩到那等級也是門檻太高了,但此 know-how 是可以借用的。身為小散戶,在工具發達的今日,追求正負 2% 的機會,是很合理的期望。此策略的門檻可說有點高,卻不會太高,剛剛好我可以勝任。雖沒有海量 GPU 算力,卻可以靈活串連交易資料,市場報價資料,期現貨整合資料等等;沒有嚴謹的因子檢定方法,但可以對沖並抵銷幾個重要並顯著的因子。
更多 Beta,更多分散,從 market beta 開始
到了該實作的時候了,我希望用現有的知識,泛化到其他因子,所以先來複習 Market Factor 的算法,這次想用詳細的說明,搭配優美的數學符號來描述。首先市場 (或稱大盤) 每天都有一個報酬率,記為:

蒐集一段歷史資料,比如說 125 個交易日,就成為 125 維的向量,是個時間序列,記為大寫的 R,為了與個股的 R 做區分,所以給下標 mkt,成為:

這可以說就是「因子的值」或「因子溢酬」。然後要來衡量因子對個股報酬率的影響,因股票有很多支,第 i 支的個股報酬也是一個時間序列,記為:

以上兩者作回歸分析,就會得到係數 Beta,和一個截距項 alpha (原來這個 alpha 就是所謂超額報酬的最初形式,即使所有的 beta 都抵銷,它依然存在!),和一個誤差項 Epsilon,數學式表達為:

而我們關心的就是回歸係數 Beta (i),每一隻股票擁有自己的 Beta。此值可以用 python 程式,運用套件輕易取得:
import statsmodels.api as sm
def calc_market_beta(stock_returns, market_returns):
X = sm.add_constant(market_returns)
model = sm.OLS(stock_returns, X).fit()
return model.params[1]
也可以用以下公式,直接計算 Beta:

動能因子 (Momentum)
此因子的基本邏輯是,過去漲的未來也容易漲。在此先不討論此因子有沒有效,或何時有效,因為我們是站在對沖方,只要確認此因子「有時候」會有效,那就有對沖價值。通常的算法是,過去一段時間的報酬率 (預設是一年),但排除最近一段時間 (預設是一個月)。為了謹慎使用計算資源,我先用半年和兩周,以 python code 表達如下:
# prices is a DataFrame with dimension (Date x Stock)
# hence, momentum also is (Date x Stock)
momentum = prices.pct_change(125).shift(10)
不同於市場因子,其他的因子還有一個稱呼「風格因子」,被定義來反映股票屬性,對時間的敏感度比較低。之後要探討的基本面相關的或經濟指標相關的,大部分都是每月甚至每季才變動的,所以不對報酬的時間序列作回歸分析,反而是對「所有股票」的值和報酬,在一個時間點的橫切面,作回歸分析。(請謹慎閱讀,這裡有點繞,哈哈)
因此首要解決的問題是資料的尺度問題 (Scale),必須先標準化,因此就成為 z-score,直接用 python code 精簡表達:
def zscore(series):
return (series - series.mean()) / series.std()
# momentum.iloc[-1] is a series which contains
# the last values of momentum of all stocks
# zscore() also returns a series
momentum_factor = zscore(momentum.iloc[-1])
然後,以上這個 momentum_factor 就是 Beta!怎樣,轉得過來嗎?市場因子的 Beta 是用回歸模型估計而得的,為何這種風格因子,是直接用 z-score 算的?這是由 z-score 的定義直接解釋的。假設 momentum_factor = 0.5,表示該股票相對於所有股票的平均 momentun 高出半個標準差,近似於「在 memmentum 的因子上,曝險 50%」。對應到市場因子的敘事,Beta = 0.5 可以描述為「該股票將反映大盤 50% 的漲跌福」或「在市場因子上,曝險 50%」,是不是很像?的確可以對應的。
那各種因子對報酬率的影響程度,應該有差別吧?的確是的,所以還是需要進行「時間點橫斷面的回歸」。所取得回歸係數,意義就是因子對報酬率的影響程度,正名為「因子的風險溢酬」,以 Lambda 來表示,所以在時間 t 的 i 股票的日報酬率就是:

但以上方程式表示,股票的報酬率完全由該因子決定?顯然是錯的。研究因子可以一個一個來嗎?很可惜的,不行!不然算出來的 Lambda 都被嚴重污染而失去意義了。依照目前被研究和討論的因子,最少必須涵蓋以下幾項:動能,價值,和波動。這沒得談的,是基本且必須,所以回歸方程式變成以下,這是一個多元回歸模型:

這三個因子是相對比較獨立的,之後行有餘力,再加入一些進階的因子,難免必須承受一些相關性,所以不能分開作回歸,各因子的 Lambda 表示對報酬率的影響程度。進階因子還有:流動性,市值,行業;更進階的還有:品質,成長性,預估修訂,...。那些還非常遙遠,先專注最小集合:動能,價值,和波動。
價值因子 (Value)
取用財報之淨值,除以最新價格,成為「淨值/股價」比,取 z-score 為之。
波動因子 (Volatility)
取用股票過去 60 天的日報酬,計算標準差,再年化,成為年化波動率。一樣要取 z-score 才是因子值。
returns = np.log(prices / prices.shift(1)).dropna()
vol_60 = returns.rolling(60).std().iloc[-1] * np.sqrt(252)
vol_factor = (vol_60 - vol_60.mean()) / vol_60.std()
觀念徹底打通,實作吧
敬請關注拙作,即將灌注所有學習 know-how 於其中,理論與實戰總是相輔相成的。
一個可運行的系統:https://newman-portfolio.azurewebsites.net/
Newman 2025/12/4
- 導覽頁:精明管家
- 技術議題有興趣者,也可關注這兒:紐曼的技術筆記-索引

















