回報、風險與年化的實戰計算:由價格到夏普比率|Quant Theory 第 8 講筆記
第 8 課・共 34 課
目錄
這是 Liu Peng 大學級量化交易課程第 3 講第二段的筆記。上一講建立了風險與回報的理論框架(詳見風險與回報|第 7 講),本講落到實作層面:用 Python 親手計算回報與風險、推導年化 Annualization 的公式,最後以真實股票數據示範夏普比率的完整計算流程。
學習重點
- 複利下的財富路徑:用累乘函數計算財富演變,可親眼驗證「平均回報相同、波動較大者終值較低」這個上一講的理論結論。
- 價格轉回報的多種寫法:逐期相除、忽略索引整列相除、shift 平移、pct_change 一次過——結果相同,重點是理解索引對齊問題。
- 年化回報用複利:日回報取 252 次方、月回報取 12 次方、季回報取 4 次方,再減 1;本質是把單期回報複利滾存一年。
- 年化風險用平方根法則:日波動率乘 $\sqrt{252}$,因為方差隨時間線性增長、標準差只隨平方根增長——與回報的次方換算邏輯完全不同。
- 無風險基準會改變排名:扣除無風險利率後,回報風險比的排名可以逆轉,這正是夏普比率的意義。
詳細筆記
複利驗證:相同平均回報、不同終值
講者先重溫上一講的例子:兩條人手構造的回報序列 Asset1 與 Asset2,算術平均同為 0.16,但 Asset2 的標準差明顯較高。實作上,他把兩條序列以鍵值對字典轉成 pandas 的 DataFrame,之後用 std() 與 mean() 一行算好兩列的風險與平均回報。
接着是財富路徑的計算。把回報加 1 變成 $1+R$ 格式後,每期財富就是把之前所有期的 \$1+r$ 累乘起來:
$$W_t = W_0 \prod_{i=1}^{t} (1 + r_i)$$假設本金 100 元,用累乘函數(cumprod)一步算出每個時點手上有多少錢。結果與理論一致:Asset2 的平均回報與 Asset1 相同,但終值明顯較低。

講者強調這雖是假設性例子,卻清楚展示風險的影響:複利之下,大上大落的回報路徑會侵蝕終值。
由價格到回報:四種 Python 寫法
實務上我們手上的原始資料是資產價格,不是回報。單期回報由價格計算:
$$R_{t-1,t} = \frac{S_t}{S_{t-1}} - 1$$講者示範了四種等價寫法,各有學習價值:
- 逐期手算:相鄰兩個價格相除再減 1。直觀但繁瑣,只適合驗算。
- NumPy 一次過:取出「後段價格」與「前段價格」兩條陣列整列相除,一次算好所有期數的 $1+R$。
- iloc 配合 values:用 iloc 按位置取材時,兩條序列的索引分別是 0、1 與 1、2,直接相除會因索引錯位對錯行;解法是取出
.values忽略索引,只對數值運算。這個索引對齊陷阱是 pandas 新手最常見的 bug 來源。 - shift 平移:把價格列向下平移一格,索引保持 0、1、2 對齊,整列相除即可。亦可用內建的 pct_change 函數,一行完成同一件事。
四種方法結果完全相同:工具層面有多條路,底層數學只有一條。
終值回報:累乘的兩種叫法
由單期回報算整段時期的終值回報 Terminal Return,本質是複利累乘:
$$R_{total} = \prod_{t=1}^{n} (1 + r_t) - 1$$NumPy 寫法是先加 1、累乘、再減 1;pandas 寫法更簡潔,直接對整列叫 prod(),按列把所有元素相乘,最後減 1。兩者結果一致。
年化回報:複利次方推導
年化 Annualization 的目的,是把不同時間尺度的數字統一到「一年」這把尺上,方便比較。回報的年化遵循複利邏輯——假設未來每期的回報都複製當期的單期回報 $r_p$,一年共 $N$ 期,則:
$$R_{ann} = (1 + r_p)^{N} - 1$$代入不同周期:
- 日回報(一年約 252 個交易日):$R_{ann} = (1 + r_d)^{252} - 1$
- 月回報:$R_{ann} = (1 + r_m)^{12} - 1$
- 季回報:$R_{ann} = (1 + r_q)^{4} - 1$
講者以月回報 1% 為例:$(1.01)^{12} - 1 \approx 12.68\%$,而不是簡單的 $1% \times 12 = 12%$——複利令年化結果略高於線性放大。季回報 5% 年化後約 21.55%,同樣高於 \$5% \times 4 = 20%$。

年化風險:平方根法則
風險的年化邏輯完全不同。假設每日回報獨立同分佈,一年回報的方差是日方差按日數累加:
$$\sigma_{ann}^2 = 252 \, \sigma_d^2$$但我們慣用的風險單位是標準差而非方差,兩邊開方後:
$$\sigma_{ann} = \sigma_d \times \sqrt{252}$$講者特別提醒:這裡不是取 252 次方,而是乘以 $\sqrt{252}$,因為我們活在標準差的單位裡。舉例:日波動率 0.1%,年化後約 $0.001 \times \sqrt{252} \approx 1.59%$。平方根的寫法亦可以是取 0.5 次方,兩者等價。平方根法則背後的假設是各期回報獨立——若回報有自相關,這個換算會有偏差。
夏普比率:無風險基準改變排名
講者用一個簡例說明為何要引入無風險利率 Risk-Free Rate。設資產一回報 5%、波動率 20%,資產二回報 10%、波動率 50%,無風險利率 3%。
單看回報除風險:資產一 $0.05/0.20 = 0.25$,資產二 \$0.10/0.50 = 0.20$,資產一似乎較好。但扣除基準後計算夏普比率:
$$S = \frac{R - R_f}{\sigma}$$資產一 $(0.05-0.03)/0.20 = 0.10$,資產二 $(0.10-0.03)/0.50 = 0.14$——排名逆轉,資產二反而較優。

原因很直觀:資金泊在無風險資產已有 3% 落袋,承擔風險只為賺取超出這條線的部分。資產一的回報僅比基準高 2 個百分點,承擔風險換來的超額回報其實很薄。
真實數據實戰:Apple 對 Google
最後講者用 yfinance 下載 Apple 與 Google 由 2003 年初起計的經調整收市價,走完整條流程。幾個實作要點:
- 多層列索引:下載的數據第一層是價格類型、第二層是股票代號,按列取出兩隻股票的 Adjusted Close。
- pct_change 轉回報:一行算好 $1+R$ 格式的日回報,並剔除缺數的日子。
- 總體與樣本標準差:手算波動率(回報減均值、平方、取平均、開方)時若除以 $n$,結果與 pandas 的
std()不同——因為std()預設用樣本公式除以 $n-1$。行數可用 shape 取得,調整後兩者一致。 - 年化波動率:
std()乘 $\sqrt{252}$,一行完成。
年化回報方面,講者示範了幾何平均的推導。先把整段時期的回報累乘得終值回報,再開 $n$ 次方還原成每日的幾何平均回報:
$$\bar{r}_d = \left( \prod_{t=1}^{n} (1 + r_t) \right)^{1/n} - 1$$再取 252 次方年化。兩步亦可合併為一行:累乘後直接取 $252/n$ 次方再減 1:
$$R_{ann} = \left( \prod_{t=1}^{n} (1 + r_t) \right)^{252/n} - 1$$
最後把年化回報減去無風險利率(講者假設 3%)得超額回報 Excess Return,再除以年化波動率,得出兩隻股票的夏普比率作比較——以該段數據計,Apple 的風險調整表現明顯優於 Google。至此,由價格到回報、由日度到年化、由絕對回報到風險調整回報的完整計算鏈已經打通。
🙏 覺得內容有用?本站所有內容免費提供,使用推薦碼開戶就是支持我們繼續營運的最大鼓勵:
ZA Bank 邀請碼 P20923
—— 你享 HKD 2,000 迎新獎賞,本站獲得營運支持。
立即開戶 →
(聯盟連結|投資涉及風險,受條款及細則約束,此資料僅可於香港境內分發)
欣利克的看法
- 年化的本質是「假設」而非「預測」。$(1+r_d)^{252}-1$ 這條公式隱含假設未來一年 252 日每日都複製同一回報,現實中回報日日不同,年化數字只是把不同周期的表現放到同一把尺上比較的工具。樣本越短、遇上越極端的行情,年化結果越容易脫離常識——本講真實數據例子中動輒數倍的年化回報,正是短樣本被複利放大的效果,解讀任何年化數字前應先看數據時段。
- 回報用次方、風險用平方根,兩者不可混用。這是初學者最常見的錯誤:把日波動率直接乘 252,或把日回報用 $\sqrt{252}$ 年化。背後原因是回報按複利累乘、方差按時間累加,兩條數學路徑不同。記住「回報次方、風險開方」這句口訣可避免大部分錯誤。
- 252 這個數字本身也是約定俗成。一年實際交易日因市場與年份而異,美股慣用 252,加密貨幣市場全年無休則常用 365。跨市場比較年化指標時,若雙方用的日數假設不同,結果未必可直接對比。
- 排名逆轉的例子值得記住。本講示範了引入無風險基準後資產排名可以逆轉,說明「回報除以風險」與夏普比率量度的不是同一件事。比較不同來源的策略數據時,要留意對方是否已扣除無風險利率、以及用哪個利率作基準——基準不同,結論可以相反。
名詞解釋
- 年化 Annualization:把短周期回報或波動率換算成一年尺度的方法;回報按複利取次方,波動率按平方根法則換算。
- 複利 Compounding:每期回報連本帶利滾存再投資,多期回報以累乘而非累加計算。
- 無風險利率 Risk-Free Rate:理論上零風險投資的回報基準,常用短期國債利率代表,是超額回報與夏普比率的起點。
- 波動率 Volatility:回報的標準差,金融上直接當作風險使用;日波動率乘 $\sqrt{252}$ 可年化。
- 夏普比率 Sharpe Ratio:超額回報除以波動率,量度每承受一單位風險換取多少超額回報。
常見問題 FAQ
年化回報為何要用次方而非直接乘?
因為回報按複利滾存:每日賺到的錢會成為下一日的本金。日回報 $r_d$ 滾存 252 日的結果是 $(1+r_d)^{252}-1$,而不是 $r_d \times 252$。月回報 1% 直接乘 12 得 12%,複利計算則是約 12.68%,周期越長、單期回報越大,兩者差距越明顯。
為何波動率年化是乘 $\sqrt{252}$ 而非 252?
假設每日回報獨立,方差會隨時間線性累加,一年方差是日方差的 252 倍。但我們用的是標準差,標準差是方差的平方根,所以只需乘 $\sqrt{252} \approx 15.87$。若回報存在自相關(例如動能或均值回歸特徵),這個換算會有偏差。
算術平均回報相同,為何複利終值可以不同?
累乘之下,虧損與盈利不對稱:跌 50% 之後要升 100% 才能回本。波動越大的路徑,這種「波動拖累」越明顯,所以即使算術平均一樣,波動大者的幾何平均(即複利終值)會較低。年化回報用幾何平均計算,正是為了反映這一點。
為何比較資產時要扣無風險利率?
因為資金泊在無風險資產已有基本回報,承擔風險的目的只是賺取超出這條基準線的部分。本講的例子顯示,不扣基準時資產一的回報風險比較高,扣除 3% 無風險利率後排名逆轉——風險調整後的比較才反映承擔風險的真正回報。
原影片
本文整理自以下影片,版權屬原創作者所有,建議配合原片觀看: