以前こちらの記事でBarraモデルを紹介しましたが、実際のデータからbetaを計算する方法については後回しにしていました。
今回は実際のデータを用いて、Pythonで計算する方法を試してみたいと思います。
Contents
計算式
簡単のため、今回はファクターが一つのファクターモデルを計算します。
インデックスETFのリターンデータとTOPIXの値動きから、TOPIX(日本株全体にかかるファクターと考える)から受けるファクターベータを計算してみます。
この時、計算式は以下のようになり、この式とリターンデータを用いて回帰分析を行います。
\[
R_{etf} = \alpha_{etf} + \beta_{etf,topix} F_{topix} + \epsilon_{etf}\\
\begin{align}
R_{etf} &: \text{ETFのリターン} \\
\alpha_{etf} &: \text{銘柄固有のリターン} \\
\beta_{etf,topix} &: \text{TOPIXに対するエクスポージャー(ベータ)} \\
F_{topix} &: \text{TOPIX のリターン} \\
\epsilon_{etf} &: \text{固有リスク成分(ランダムウォーク分、説明がつかない部分)} \\
\end{align}
\]
実際にPythonで書く
対数収益率から計算する形にしています。
import yfinance as yf
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression
# 1. データを取得
etf_ticker = '1626.T' # TOPIX-17情報通信・サービスその他ETF
topix_ticker = '^TOPX' # TOPIX指数
# 期間を指定してデータを取得
start_date = '2011-01-01'
end_date = '2024-8-16'
etf_data = yf.download(etf_ticker, start=start_date, end=end_date)['Adj Close']
topix_data = yf.download(topix_ticker, start=start_date, end=end_date)['Adj Close']
# 2. 1日ごとの対数収益率を計算
etf_return = np.log(etf_data/etf_data.shift(1))
topix_return = np.log(topix_data/topix_data.shift(1))
# 3. データを整形し、回帰分析を行う
data = pd.DataFrame({
'ETF_Return': etf_return,
'TOPIX_Return': topix_return,
}).dropna()
# 4. 回帰分析の準備
X = data[['TOPIX_Return']] # 説明変数(TOPIXのリターン)
y = data['ETF_Return'].values # 目的変数(ETFのリターン)
# 5. 回帰分析を実施
model = LinearRegression()
model.fit(X, y)
# 6. 結果を表示
beta_etf_topix = model.coef_[0] # TOPIXに対するベータ
alpha_etf = model.intercept_ # アルファ値
print(f"β(TOPIXに対するETFのベータ): {beta_etf_topix}")
print(f"α(銘柄固有のリターン): {alpha_etf}")
実行結果
TOPIXに対するETFのベータが0.659、1日ごとの対数収益率が0.026%であることがわかりました。
β(TOPIXに対するETFのベータ): 0.6591968184312232
α(銘柄固有のリターン): 0.00026399258025840264
最後に
基本的にはデータを得るところが鬼門で、データがあれば後はライブラリの助けを借りて簡単に計算できそうです。
入門の意味でもデータが得やすいファクター(ドル円レート、米国金利、その他インデックスなど)を考えて、一回試してみると面白いかもしれませんね。