Lab Research ETF・インデックス投資の基礎——アクティブとの違い、コスト、リターンの仕組み
目次
「市場に勝つことはできない」——これは金融経済学の到達した結論の一つだ。本稿では、ETF とインデックス投資の基礎を解説し、なぜ個人投資家にとって最適な選択肢となり得るのかを数理的な理解とともに示す。
投資運用の 2 つのアプローチ
| アプローチ | 説明 | 目的 |
|---|---|---|
| アクティブ運用 | ベンチマーク(日経平均や S&P500 など)を上回るリターンを目指す | アルファ(超過リターン)の獲得 |
| パッシブ運用(インデックス投資) | ベンチマークと連動するリターンを目指す | ベータ(市場リターン)の獲得 |
アクティブ運用の実績
多くのアクティブファンドはベンチマークに勝てない。SPIVA(S&P Indices Versus Active)レポートによると:
| 期間 | 大型株ファンド(S&P500 対比) | 中型株ファンド | 小型株ファンド |
|---|---|---|---|
| 1 年 | 60-70% が敗北 | 55-65% が敗北 | 50-60% が敗北 |
| 3 年 | 70-80% が敗北 | 65-75% が敗北 | 60-70% が敗北 |
| 5 年 | 75-85% が敗北 | 70-80% が敗北 | 65-75% が敗北 |
| 10 年 | 80-90% が敗北 | 75-85% が敗北 | 70-80% が敗北 |
出典:S&P Dow Jones Indices SPIVA U.S. Scorecard
なぜアクティブファンドは市場に勝てないのか?その理由は費用率にある。
def calculate_net_return(gross_return, expense_ratio):
"""アクティブファンドの純リターン計算"""
return gross_return - expense_ratio
# 例:アクティブファンドがベンチマーク +2% のリターンを達成
# しかし信託報酬が 1.5% かかる
active_gross_alpha = 0.02 # +2% の超過リターン
expense_ratio = 0.015 # 1.5% の信託報酬
net_alpha = calculate_net_return(active_gross_alpha, expense_ratio)
print(f"超過リターン(粗): +{active_gross_alpha*100:.1f}%")
print(f"信託報酬: {expense_ratio*100:.2f}%")
print(f"超過リターン(純): +{net_alpha*100:.1f}%")
# さらに売買手数料・税金・キャッシュドラッグ(現金保有による機会損失)を考慮すると…
trading_costs = 0.005 # 0.5% の売買コスト
cash_drag = 0.003 # 0.3% のキャッシュドラッグ
true_net_alpha = active_gross_alpha - expense_ratio - trading_costs - cash_drag
print(f"真の超過リターン: +{true_net_alpha*100:.2f}%")
ETF の仕組み
ETF(上場投資信託)の構造
ETF は株式のように取引所で売買できる投資信託だ。
┌─────────────────────────────────────────────────────────┐
│ 投資家 │
│ (ETF 株式を証券取引所で売買) │
└─────────────────────────────────────────────────────────┘
↑↓
┌─────────────────────────────────────────────────────────┐
│ 参加会社(証券会社) │
│ (ETF ファンドと現物バスケットの交換) │
└─────────────────────────────────────────────────────────┘
↑↓
┌─────────────────────────────────────────────────────────┐
│ ETF ファンド │
│ (日経平均や S&P500 の構成銘柄を保有) │
└─────────────────────────────────────────────────────────┘
ETF の価格決定メカニズム
ETF には 2 つの価格が存在する:
| 価格 | 説明 | 決定方法 |
|---|---|---|
| 市場価格 | 取引所での売買価格 | 需給で決定 |
| 基準価額(NAV) | 保有資産の純資産総額 | 算出方法:(総資産 - 総負債)/ 発口数 |
def calculate_etf_nav(total_assets, total_liabilities, outstanding_shares):
"""ETF の基準価額(NAV)計算"""
net_assets = total_assets - total_liabilities
return net_assets / outstanding_shares
# 例:総資産 1,000 億円、負債 1 億円、発口数 1 億口
nav = calculate_etf_nav(100_000_000_000, 100_000_000, 100_000_000)
print(f"基準価額:{nav:,.0f}円/口") # 999 円/口
プレミアム・ディスカウント
def calculate_etf_premium_discount(market_price, nav):
"""ETF のプレミアム・ディスカウント率の計算"""
return ((market_price - nav) / nav) * 100
# 例:市場価格 1,005 円、NAV 1,000 円
premium_rate = calculate_etf_premium_discount(1005, 1000)
print(f"プレミアム率:{premium_rate:.2f}%") # +0.50%(プレミアム)
# 裁定取引の仕組み
if premium_rate > 0.5: # 0.5% 以上のプレミアム
print("裁定機会:ETF を売却し、現物バスケットを購入")
elif premium_rate < -0.5: # 0.5% 以上のディスカウント
print("裁定機会:ETF を購入し、現物バスケットを売却")
裁定取引により、プレミアム・ディスカウントは 0.5% 以内に収束する仕組みだ。
インデックスの仕組み
主要な株価指数
| 指数 | 国・地域 | 構成銘柄数 | 特徴 |
|---|---|---|---|
| 日経平均株価 | 日本 | 225 | 株価換算方式、歴史的権威 |
| TOPIX | 日本 | 全上場銘柄 | 時価総額加重、東証全銘柄 |
| S&P500 | 米国 | 500 | 時価総額加重、米国大型株 |
| NASDAQ100 | 米国 | 100 | 技術株中心、ナスダック上場 |
| FTSE100 | 英国 | 100 | 英国大型株 |
| DAX | ドイツ | 40 | ドイツ主要株 |
株価換算方式 vs 時価総額加重方式
def calculate_price_weighted_index(stocks):
"""株価換算方式(日経平均)の計算"""
# 株価の合計 / 除数
total_price = sum(stock['price'] for stock in stocks)
divisor = stocks[0]['divisor'] # 株式分割・入れ替えで調整
return total_price / divisor
def calculate_market_cap_weighted_index(stocks, base_value=10000):
"""時価総額加重方式(TOPIX、S&P500)の計算"""
# 基準時点との比較
total_market_cap = sum(stock['price'] * stock['shares'] for stock in stocks)
base_market_cap = stocks[0]['base_market_cap']
return base_value * (total_market_cap / base_market_cap)
# 例:3 銘柄の指数計算
stocks = [
{'price': 5000, 'shares': 1_000_000, 'divisor': 3, 'base_market_cap': 15_000_000_000},
{'price': 3000, 'shares': 2_000_000, 'base_market_cap': 15_000_000_000},
{'price': 2000, 'shares': 3_000_000, 'base_market_cap': 15_000_000_000},
]
price_weighted = calculate_price_weighted_index(stocks)
cap_weighted = calculate_market_cap_weighted_index(stocks)
print(f"株価換算方式:{price_weighted:.2f}")
print(f"時価総額加重方式:{cap_weighted:.2f}")
株価換算方式(日経平均):
- メリット:計算が単純、歴史的連続性
- デメリット:株価が高い銘柄の影響が大きい(1 株 5 万円と 1 株 1 千円で 50 倍の重み)
時価総額加重方式(TOPIX、S&P500):
- メリット:経済全体を反映、発行体ベースの適正な重み
- デメリット:時価総額が大きい企業への集中
トラッキングエラー
インデックス投資では**ベンチマークとの乖離(トラッキングエラー)**が重要だ。
import numpy as np
def calculate_tracking_error(etf_returns, index_returns):
"""トラッキングエラー(追跡誤差)の計算"""
# 収益率の差(アクティブ・リターン)
active_return = np.array(etf_returns) - np.array(index_returns)
# 標準偏差(年率換算:日次データなら√252、月次データなら√12)
tracking_error = np.std(active_return, ddof=1) * np.sqrt(252)
return tracking_error
def calculate_information_ratio(active_return, tracking_error):
"""インフォメーション・レシオ(超過リターン/リスク)"""
if tracking_error == 0:
return 0
return active_return / tracking_error
# 例:月次リターン 12 ヶ月
etf_returns = [0.02, -0.01, 0.03, 0.015, -0.02, 0.01, 0.025, -0.015, 0.02, 0.01, -0.005, 0.03]
index_returns = [0.021, -0.009, 0.031, 0.016, -0.019, 0.011, 0.026, -0.014, 0.021, 0.011, -0.004, 0.031]
te = calculate_tracking_error(etf_returns, index_returns)
avg_active_return = np.mean(np.array(etf_returns) - np.array(index_returns)) * 12 # 年率
ir = calculate_information_ratio(avg_active_return, te)
print(f"トラッキングエラー(年率):{te*100:.2f}%")
print(f"平均アクティブ・リターン(年率):{avg_active_return*100:.2f}%")
print(f"インフォメーション・レシオ:{ir:.2f}")
# トラッキングエラーの要因
TRACKING_ERROR_SOURCES = {
"信託報酬": "ETF の運用コスト(0.03-0.20% が目安)",
"キャッシュドラッグ": "換金性確保のための現金保有による機会損失",
"証券貸付": "貸出収入でコストを相殺できる(0.01-0.03%)",
"再投資のタイミング": "配当金の再投資タイミングのズレ",
"税制": "源泉徴収税(特に外国株)",
"サンプリング法": "一部銘柄のみ保有する手法(完全再現より誤差大)"
}
| ETF 類型 | トラッキングエラー目安 | 特徴 |
|---|---|---|
| 完全再現型 | 0.01-0.05% | 全銘柄を保有、誤差小 |
| サンプリング型 | 0.05-0.20% | 一部銘柄で代表、コスト低 |
| 証券貸付あり | -0.01-0.03% | 貸出収入でコスト相殺 |
信託報酬の内訳
def calculate_etf_fee_breakdown(gross_fee):
"""ETF 信託報酬の内訳計算(概算)"""
# 内訳の目安
breakdown = {
"運用会社": gross_fee * 0.5, # 50%
"信託銀行": gross_fee * 0.2, # 20%
"販売会社": gross_fee * 0.2, # 20%
"その他": gross_fee * 0.1 # 10%(監査、事務等)
}
return breakdown
# 例:信託報酬 0.1% の場合
fees = calculate_etf_fee_breakdown(0.001)
for item, fee in fees.items():
print(f"{item}: {fee*100:.3f}%")
主要 ETF の信託報酬例:
| ETF | 信託報酬 | 特徴 |
|---|---|---|
| eMAXIS Slim 米国株式(S&P500) | 0.09% | 低コストの代表格 |
| Vanguard S&P500 ETF(VOO) | 0.03% | 米国の低コスト ETF |
| iShares コア TOPIX | 0.15% | 国内株式の低コスト |
| 日経 225 レバレッジ | 0.98% | レバレッジ型は高コスト |
累積リターンの計算
def calculate_cumulative_return(annual_return, years, initial_investment=1000000):
"""複利での累積リターン計算"""
final_value = initial_investment * (1 + annual_return) ** years
total_return = (final_value - initial_investment) / initial_investment
return final_value, total_return
def compare_active_vs_passive(active_fee, passive_fee, years, initial_investment=1000000):
"""アクティブ vs パッシブの累積リターン比較"""
# アクティブ運用:市場リターン + アルファ(ただし多くの場合はマイナス)
market_return = 0.07 # 年間 7% と仮定
active_alpha = -0.01 # アクティブは平均で -1%(費用後)
active_net_return = market_return + active_alpha - active_fee
passive_net_return = market_return - passive_fee
active_final, active_total = calculate_cumulative_return(active_net_return, years, initial_investment)
passive_final, passive_total = calculate_cumulative_return(passive_net_return, years, initial_investment)
return {
"active_final": active_final,
"active_total_return": active_total,
"passive_final": passive_final,
"passive_total_return": passive_total,
"difference": passive_final - active_final
}
# 比較:アクティブ(信託報酬 1.5%)vs パッシブ(0.1%)
result = compare_active_vs_passive(active_fee=0.015, passive_fee=0.001, years=30)
print(f"30 年後の資産額比較(元本 100 万円):")
print(f"アクティブ運用:{result['active_final']:,.0f}円(リターン {result['active_total_return']*100:.1f}%)")
print(f"パッシブ運用:{result['passive_final']:,.0f}円(リターン {result['passive_total_return']*100:.1f}%)")
print(f"差額:{result['difference']:,.0f}円")
税金の影響
配当課税
def calculate_after_tax_dividend(dividend, tax_rate):
"""配当金の税引後受取額"""
tax = dividend * tax_rate
return dividend - tax, tax
# 例:年間 10 万円の配当、税率 20.315%
after_tax, tax = calculate_after_tax_dividend(100000, 0.20315)
print(f"配当金:100,000 円")
print(f"税金:{tax:,.0f}円")
print(f"税引後:{after_tax:,.0f}円")
NISA(少額投資非課税制度)の活用
| 制度 | 期間 | 限度額 | 特徴 |
|---|---|---|---|
| 新 NISA(つみたて投資枠) | 無制限 | 年 120 万円 | 2024 年〜 |
| 新 NISA(成長投資枠) | 無制限 | 年 240 万円 | 2024 年〜 |
| 旧 NISA | 5 年/20 年 | 年 80 万円/40 万円 | 2023 年まで |
NISA 口座では配当・売却益が非課税。長期投資では絶大な効果がある。
def compare_taxable_vs_nisa(annual_return, years, initial_investment=1000000, dividend_yield=0.02, tax_rate=0.20315):
"""課税口座 vs NISA の比較"""
# 課税口座:配当課税あり
taxable_value = initial_investment
taxable_tax_paid = 0
for year in range(years):
dividend = taxable_value * dividend_yield
tax = dividend * tax_rate
taxable_tax_paid += tax
# 税引後配当を再投資
taxable_value = taxable_value * (1 + annual_return)
# NISA:非課税
nisa_value = initial_investment * (1 + annual_return) ** years
return {
"taxable_final": taxable_value,
"nisa_final": nisa_value,
"tax_saved": taxable_tax_paid + (nisa_value - taxable_value)
}
# 比較:30 年、年 7% リターン
result = compare_taxable_vs_nisa(annual_return=0.07, years=30)
print(f"30 年後の資産額(元本 100 万円、年 7%):")
print(f"課税口座:{result['taxable_final']:,.0f}円")
print(f"NISA: {result['nisa_final']:,.0f}円")
print(f"節税効果:{result['tax_saved']:,.0f}円")
ポートフォリオ構築の基礎
アセットアロケーションの重要性
import numpy as np
def calculate_portfolio_return(assets, weights):
"""ポートフォリオの期待リターン計算"""
return sum(asset['expected_return'] * weight for asset, weight in zip(assets, weights))
def calculate_portfolio_volatility(assets, weights, correlation_matrix):
"""ポートフォリオのボラティリティ(標準偏差)計算"""
n = len(assets)
variance = 0
for i in range(n):
for j in range(n):
covariance = correlation_matrix[i][j] * assets[i]['volatility'] * assets[j]['volatility']
variance += weights[i] * weights[j] * covariance
return np.sqrt(variance)
# 例:3 資産ポートフォリオ
assets = [
{'name': '日本株式', 'expected_return': 0.05, 'volatility': 0.20},
{'name': '先進国債券', 'expected_return': 0.02, 'volatility': 0.05},
{'name': 'REIT', 'expected_return': 0.04, 'volatility': 0.15},
]
weights = [0.6, 0.3, 0.1]
# 相関行列(日本株式と債券:-0.2、株式と REIT: 0.6、債券と REIT: 0.1)
correlation_matrix = [
[1.0, -0.2, 0.6],
[-0.2, 1.0, 0.1],
[0.6, 0.1, 1.0]
]
portfolio_return = calculate_portfolio_return(assets, weights)
portfolio_vol = calculate_portfolio_volatility(assets, weights, correlation_matrix)
print("ポートフォリオ(株式 60%、債券 30%、REIT 10%):")
print(f"期待リターン:{portfolio_return*100:.1f}%")
print(f"ボラティリティ:{portfolio_vol*100:.1f}%")
print(f"シャープレシオ(Rf=0% 仮定):{portfolio_return/portfolio_vol:.2f}")
代表的なポートフォリオ
| ポートフォリオ | 株式 | 債券 | 特徴 |
|---|---|---|---|
| バランス型 | 50% | 50% | 中立的なリスク |
| グロース型 | 70-80% | 20-30% | 成長重視 |
| 保守型 | 20-30% | 70-80% | 元本重視 |
| ライフサイクル | 若年:高株式、高齢:高債券 | 年齢で自動調整 | ターゲット・デート・ファンド |
投資判断のチェックリスト
ETF・インデックス投資を始める前に:
| チェック項目 | 確認ポイント |
|---|---|
| 投資目的 | 老後資金?住宅購入?教育資金? |
| 投資期間 | 5 年?10 年?20 年以上? |
| リスク許容度 | 20% の下落に耐えられるか? |
| インデックス選択 | 全世界?米国?日本? |
| 信託報酬 | 0.2% 以下か? |
| 取引コスト | 売買手数料は無料か? |
| NISA 活用 | 非課税枠を最大限活用しているか? |
まとめ
ETF・インデックス投資の核心を整理する:
- アクティブ運用の限界: 費用を差し引くと 80-90% が市場に敗北
- ETF の仕組み: 市場価格と基準価額(NAV)、裁定取引で乖離は 0.5% 以内に収束
- インデックスの種類: 株価換算方式(日経平均)vs 時価総額加重方式(TOPIX、S&P500)
- トラッキングエラー: 完全再現型は 0.01-0.05%、サンプリング型は 0.05-0.20%
- 信託報酬: 低コスト ETF は 0.03-0.15%、レバレッジ型は 1% 近く
- 税金の影響: 長期では NISA の非課税効果が絶大
- アセットアロケーション: 株式・債券・REIT 等の配分でリスク・リターンを調整
インデックス投資は「退屈な投資」だ。しかし、その退屈さこそが、長期的に安定したリターンをもたらすのである。
免責事項 — 当記事は情報提供を目的としており、特定の金融商品の売買を推奨するものではありません。投資判断はご自身の責任で行ってください。