Skip to content

建立 2025-08-12 更新 2026-09-15

夏普、崔諾、詹森指標

1️⃣ 夏普指標(Sharpe Ratio)

定義

衡量每承擔一單位總風險(標準差 σ)所得到的超額報酬。 用來比較投資組合的風險調整後報酬

公式

\[ Sharpe = \frac{E(R_p) - R_f}{\sigma_p} \]
  • \(E(R_p)\):投資組合的期望報酬率
  • \(R_f\):無風險利率
  • \(\sigma_p\):投資組合報酬率的標準差(總風險)

特點

  • 風險衡量方式:總風險(標準差 σ)
  • 適合比較分散程度不同的投資組合
  • 越高越好 → 每單位風險獲得更多報酬

2️⃣ 崔諾指標(Treynor Ratio)

定義

衡量每承擔一單位系統風險(β)所得到的超額報酬。 假設投資組合已經高度分散,非系統風險可忽略。

公式

\[ Treynor = \frac{E(R_p) - R_f}{\beta_p} \]
  • \(E(R_p)\):投資組合的期望報酬率
  • \(R_f\):無風險利率
  • \(\beta_p\):投資組合的 β 值(系統風險)

特點

  • 風險衡量方式:系統風險(β)
  • 適合比較已經分散化的投資組合
  • 越高越好 → 每單位市場風險獲得更多報酬

3️⃣ 詹森指標(Jensen’s Alpha)

定義

衡量投資組合的實際報酬率與 CAPM 預測報酬率的差異。 反映基金經理是否「創造超額報酬」。

公式

\[ \alpha_p = E(R_p) - [R_f + \beta_p \cdot (E(R_M) - R_f)] \]
  • \(E(R_p)\):投資組合的期望報酬率
  • \(R_f\):無風險利率
  • \(E(R_M)\):市場組合的期望報酬率
  • \(\beta_p\):投資組合的 β 值

特點

  • α > 0 → 表示經理人有正超額報酬(跑贏市場)
  • α < 0 → 表示經理人表現不如市場
  • 基於 CAPM 模型 計算

4️⃣ 三者比較表

指標 公式 風險衡量方式 適用情境 判斷依據
Sharpe \(\frac{E(R_p) - R_f}{\sigma_p}\) 總風險(σ) 組合未必分散完善 高 → 風險調整後報酬好
Treynor \(\frac{E(R_p) - R_f}{\beta_p}\) 系統風險(β) 組合已分散化 高 → 市場風險利用效率好
Jensen’s α \(E(R_p) - [R_f + \beta_p (E(R_M) - R_f)]\) 系統風險(β) 檢驗經理績效 α > 0 表示超額報酬

5️⃣ 考試口訣(選擇題速記)

Sharpe 總風險 → 適用未分散

Treynor \(\beta\) 風險 → 適用已分散

Jensen \(\alpha\) → 與CAPM比較

6️⃣ 範例程式碼

# Create two figures in English with Matplotlib (no custom colors), and save them for download.
import numpy as np
import matplotlib.pyplot as plt

# ---------- Common parameters ----------
Rf = 0.02         # Risk-free rate
ER_M = 0.10       # Market expected return

# ---------- Figure 1: CML & Sharpe (risk = sigma) ----------
sigma = np.linspace(0.0, 0.30, 200)
sigma_M = 0.18
CML = Rf + (ER_M - Rf) / sigma_M * sigma

# Example portfolio P (on the CML for illustration)
sigma_p = 0.12
ER_p = Rf + (ER_M - Rf) / sigma_M * sigma_p  # keeps P on CML so the Sharpe equals CML slope

plt.figure(figsize=(7,5))
plt.plot(sigma, CML, linewidth=2, label="CML (Capital Market Line)")
plt.scatter([0.0], [Rf], label="Risk-free (Rf)")
plt.scatter([sigma_p], [ER_p], label="Portfolio P")
plt.xlabel("σ (Total Risk, Std Dev)")
plt.ylabel("E(R) (Expected Return)")
plt.title("Sharpe Ratio on CML (slope from Rf to P)")

# Draw the Sharpe slope line (same as CML slope here, from Rf to P)
plt.plot([0.0, sigma_p], [Rf, ER_p], linestyle="--", label="Sharpe Ratio line (Rf→P)")

# Annotate Sharpe value
sharpe = (ER_p - Rf) / sigma_p
plt.annotate(f"Sharpe = (E[R_P]-Rf)/σ_P ≈ {sharpe:.2f}",
             xy=(sigma_p, ER_p),
             xytext=(sigma_p*0.55, ER_p+0.03),
             arrowprops=dict(arrowstyle="->"))

plt.legend()
plt.grid(True)
plt.tight_layout()
plt.savefig("/mnt/data/CML_Sharpe.png", dpi=200)
plt.show()

# ---------- Figure 2: SML, Treynor & Jensen's Alpha (risk = beta) ----------
beta = np.linspace(0.0, 2.0, 200)
SML = Rf + beta * (ER_M - Rf)

# Example portfolio P with actual return not exactly on SML
beta_p = 1.20
ER_p_capm = Rf + beta_p * (ER_M - Rf)
ER_p_actual = 0.14  # actual return
alpha_p = ER_p_actual - ER_p_capm  # Jensen's alpha

plt.figure(figsize=(7,5))
plt.plot(beta, SML, linewidth=2, label="SML (Security Market Line, CAPM)")
plt.scatter([0.0], [Rf], label="Risk-free (Rf)")
plt.scatter([beta_p], [ER_p_capm], label="CAPM-predicted return")
plt.scatter([beta_p], [ER_p_actual], label="Portfolio P (actual)")
plt.xlabel("β (Systematic Risk)")
plt.ylabel("E(R) (Expected Return)")
plt.title("Treynor Ratio (slope Rf→P) and Jensen's Alpha (vertical gap)")

# Treynor line: slope from Rf to the actual portfolio point
plt.plot([0.0, beta_p], [Rf, ER_p_actual], linestyle="--", label="Treynor line (Rf→P)")

# Jensen's alpha annotation (vertical distance)
plt.annotate(f"Alpha = {alpha_p:.2%}",
             xy=(beta_p, ER_p_actual),
             xytext=(beta_p+0.1, ER_p_actual+0.01),
             arrowprops=dict(arrowstyle="->"))

plt.legend()
plt.grid(True)
plt.tight_layout()
plt.savefig("/mnt/data/SML_Treynor_Jensen.png", dpi=200)
plt.show()

# Provide computed values for reference
print(f"Sharpe (P): {sharpe:.4f}")
print(f"Treynor (P): {(ER_p_actual - Rf)/beta_p:.4f}")
print(f"Jensen's alpha (P): {alpha_p:.4%}")