iT邦幫忙

2025 iThome 鐵人賽

DAY 12
0
自我挑戰組

30天用Python打造你的數位金融實力:從零開始的FinTech入門筆記系列 第 12

用 Python 算夏普比率與最大回撤:把風險與報酬說清楚

  • 分享至 

  • xImage
  •  

為什麼要學這兩個?

  • 夏普比率:同樣的波動下,誰賺得更有效率?越高越好。
  • 最大回撤:從峰值跌到谷底的最大跌幅。越小越抗跌。
    把兩者合在一起,你就能說出「不只賺多少,還能承受多大的跌」。

指標極簡觀念

https://ithelp.ithome.com.tw/upload/images/20250817/20177983I7CijuNeDx.png

Python 小實作

import yfinance as yf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

plt.rcParams['font.family'] = 'Heiti TC'

# 1) 參數設定
symbol = "BTC-USD"          # 可改 "ETH-USD" 等
annual_days = 365           # 加密貨幣用 365
rf_annual = 0.02            # 年化無風險利率(可改 0.0)
rf_daily = rf_annual / annual_days

# 2) 抓資料(過去一年)
df = yf.download(symbol, period="1y", interval="1d",
                 auto_adjust=True, progress=False)

# --- 關鍵穩健處理:把 Close 壓成 Series ---
close = df["Close"]
if isinstance(close, pd.DataFrame):           # 防止多層欄位或單欄 DataFrame
    close = close.iloc[:, 0]
close = close.dropna()

# 3) 計算日報酬與夏普(年化)
ret = close.pct_change().dropna()
mean_d = ret.mean()
std_d  = ret.std(ddof=1)                      # 樣本標準差
sharpe = ((mean_d - rf_daily) / std_d) * np.sqrt(annual_days)

# 4) 計算最大回撤(以收盤價為基準)
roll_max = close.cummax()
drawdown = close / roll_max - 1.0
mdd = float(drawdown.min(skipna=True))        # <- 壓成 float,避免 Series 格式化錯誤

print(f"=== {symbol} 指標(過去一年)===")
print(f"年化夏普比率:{sharpe:.2f}")
print(f"最大回撤 (MDD):{mdd:.2%}")

# 5) 視覺化(可選)
plt.figure(figsize=(12,5))
plt.plot(close.index, close.values, label="收盤價")
plt.title(f"{symbol} 價格(過去一年)")
plt.xlabel("日期"); plt.ylabel("價格 (USD)")
plt.grid(True); plt.legend(); plt.tight_layout()
plt.show()

plt.figure(figsize=(12,5))
plt.plot(drawdown.index, drawdown.values, label="回撤")
plt.title(f"{symbol} 回撤曲線(越低代表離峰值越遠)")
plt.xlabel("日期"); plt.ylabel("回撤(負值,例如 -0.35 = -35%)")
plt.axhline(0, linestyle="--", linewidth=1, alpha=0.6)
plt.grid(True); plt.legend(); plt.tight_layout()
plt.show()

https://ithelp.ithome.com.tw/upload/images/20250817/20177983kcpAqO4BOx.png

https://ithelp.ithome.com.tw/upload/images/20250817/201779836p0MKcmHIx.png

讀數怎麼看?

  • 夏普比率:大於 1 通常代表不錯、2 以上相當優秀(但要看期間與資產類別)。
  • 最大回撤:若顯示 -0.45 就是峰谷最大跌 45%;越接近 0 越抗跌。
  • 回撤圖如果長期「貼近 0」代表價格屢創新高;大幅下探則顯示經歷過深跌。
  • 空值處理:第一天報酬為 NaN 屬正常,計算均值/標準差會自動忽略。

小結

今天你把 Day10/11 的「資料與波動」整合成兩個超實用指標:夏普比率與最大回撤。之後你就能用同一段程式碼,快速比較不同幣種(或股票)的「效率與風險」。


上一篇
用 Python 計算加密貨幣的「30 日滾動年化波動率」
下一篇
用 Python 抓取 DeFi/加密代幣市值榜單
系列文
30天用Python打造你的數位金融實力:從零開始的FinTech入門筆記29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言