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