※本記事のコードや情報は執筆時点の仕様に基づいています。投資は自己責任であり、必ずデモ環境や少額資金でテストした上で運用してください。
「儲かった」だけで戦略を評価してはいけない理由
年率+30%のリターンを出した戦略と年率+15%の戦略があるとき、前者の方が「良い戦略」と言えるでしょうか?実はそうとは限りません。前者が毎日50%の確率で大きく上下する激しい戦略であれば、精神的にも資金的にも継続が難しい。
そこで登場するのがシャープレシオ(Sharpe Ratio)です。リターンをリスクで割ることで「1単位のリスクで何単位のリターンを得ているか」を表します。
シャープレシオの計算式
| 要素 | 説明 |
|---|---|
| 期待リターン(Rp) | 戦略・銘柄の平均リターン(年率) |
| リスクフリーレート(Rf) | 国債利回りなどのリスクゼロの利率。日本では0〜0.5%程度 |
| 標準偏差(σ) | リターンのボラティリティ(年率) |
| シャープレシオ | (Rp – Rf)÷ σ |
シャープレシオが1.0以上なら良好、2.0以上なら優秀とされます。0以下はリスクフリー資産を下回っている状態です。
Pythonでシャープレシオを計算・比較する
import yfinance as yf
import pandas as pd
import numpy as np
# ==============================
# 設定エリア
# ==============================
PORTFOLIO = {
"7203.T": "トヨタ自動車",
"9984.T": "ソフトバンクG",
"6758.T": "ソニーG",
"^N225": "日経平均(参考)",
}
PERIOD = "3y" # 評価期間
RISK_FREE = 0.001 # リスクフリーレート(年率0.1%)
TRADING_DAYS = 252
# ==============================
# シャープレシオ計算
# ==============================
results = []
for symbol, name in PORTFOLIO.items():
df = yf.Ticker(symbol).history(period=PERIOD)
log_ret = np.log(df["Close"] / df["Close"].shift(1)).dropna()
# 年率リターンとボラティリティ
annual_ret = log_ret.mean() * TRADING_DAYS
annual_vol = log_ret.std() * np.sqrt(TRADING_DAYS)
# シャープレシオ
sharpe = (annual_ret - RISK_FREE) / annual_vol if annual_vol > 0 else np.nan
results.append({
"銘柄": name,
"年率リターン(%)": round(annual_ret * 100, 1),
"年率ボラティリティ(%)": round(annual_vol * 100, 1),
"シャープレシオ": round(sharpe, 2),
})
df_result = pd.DataFrame(results).sort_values("シャープレシオ", ascending=False)
print(df_result.to_string(index=False))
print()
print("シャープレシオの目安:")
print(" 2.0以上 → 非常に優秀")
print(" 1.0〜2.0 → 良好")
print(" 0.5〜1.0 → 普通")
print(" 0以下 → リスクフリー以下(問題あり)")
シャープレシオの注意点
シャープレシオはあくまで過去データの評価です。将来を保証するものではありません。また、最大ドローダウン(ピークから底値までの最大下落率)も合わせて確認することが重要です。
まとめ
- シャープレシオ = (リターン – リスクフリーレート)÷ ボラティリティ
- 1単位のリスクで何単位のリターンを得ているかを表す指標
- 1.0以上で良好、2.0以上で優秀とされる
- リターンの高さだけでなく、リスクとのバランスで戦略を評価できる

