ipemoの日記

読んだ本や買ったもの等

SP500に対するBeta値を取得する

DCF法のために

DCF法の理解がかなり進んだので、Pythonで自動化しつつ活用したいと考えています。

割引率(WACC)の計算には、様々な要素が必要ですが、まずは、Betaを算出するPythonコードをChat GPTに作成してもらいました。

Betaの基準の指数をどうするのかという問題がありますが、Yahoo FinanceがSP500に対するベータであるようなので、SP500に合わせています。

株式投資の場合は、他の指数が良いこともあるかもしれません。

ja.wikipedia.org

コード

米アップル社(AAPL)のベータを算出しています。

import yfinance as yf
import pandas as pd
import numpy as np
from sklearn.linear_model import LinearRegression

# 株価データの取得
apple_data = yf.download('AAPL', start='2020-01-01', end='2023-01-01')['Adj Close']
sp500_data = yf.download('^GSPC', start='2020-01-01', end='2023-01-01')['Adj Close']

# リターンの計算
apple_returns = apple_data.pct_change().dropna()
sp500_returns = sp500_data.pct_change().dropna()

# 線形回帰の実行
model = LinearRegression().fit(sp500_returns.values.reshape(-1, 1), apple_returns.values)
beta = model.coef_[0]

print(f"Apple's beta against the S&P 500: {beta}")

補足

pct_change()メソッド: このメソッドは、Pandas SeriesまたはDataFrameに対して使用されます。それは連続する2つの要素間のパーセンテージ変化を計算します。この場合、apple_dataの連続する日々の調整済み終値間のパーセンテージ変化(リターン)を計算します。

dropna()メソッド: pct_change()メソッドを使用すると、最初の要素の前に何もないため、最初のリターン値はNaN(Not a Number)になります。dropna()メソッドは、NaN値を削除するために使用され、この場合、最初のNaN値を削除します。

この2つのメソッドを組み合わせることで、apple_data.pct_change().dropna()はAppleの株価の連続する日々のリターンを計算し、最初のNaN値を削除します。この結果は、リターンの時系列データであり、以降の分析と可視化に使用されます。

補足2

sp500_returns.values.reshape(-1, 1)とapple_returns.valuesの処理を説明します。

sp500_returns.values.reshape(-1, 1) sp500_returns.values: sp500_returnsはPandas Seriesで、この属性によってNumPy配列が返されます。この配列にはS&P 500のリターンが含まれます。

reshape(-1, 1): このメソッドは、配列の形状を変更します。引数(-1, 1)は、最初の次元が可変であり(-1によって示される)、2番目の次元が1であることを意味します。この特定のケースでは、配列を列ベクトル(単一の列を持つ2D配列)に変換します。

線形回帰モデルの入力として、特徴量が2D配列である必要があります。reshape(-1, 1)によって、これを満たす形状に変換します。

apple_returns.values apple_returns.values: apple_returnsはPandas Seriesで、この属性によってNumPy配列が返されます。この配列にはAppleのリターンが含まれます。 このNumPy配列は既に1D配列であるため、形状の変更は必要ありません。ターゲット変数(この場合はAppleのリターン)として使用するため、1D配列である必要があります。

このプロセスにより、機械学習モデルに適切な形状の入力とターゲット変数が提供されます。

可視化コード

import matplotlib.pyplot as plt

# AppleとS&P 500のリターンをプロット
plt.figure(figsize=(12,6))
plt.subplot(2, 1, 1)
plt.plot(apple_returns, label='Apple Returns')
plt.plot(sp500_returns, label='S&P 500 Returns')
plt.xlabel('Date')
plt.ylabel('Returns')
plt.legend()

# リターン間の散布図と線形回帰のプロット
plt.subplot(2, 1, 2)
plt.scatter(sp500_returns, apple_returns, color='blue')
plt.plot(sp500_returns, model.predict(sp500_returns.values.reshape(-1, 1)), color='red')
plt.xlabel('S&P 500 Returns')
plt.ylabel('Apple Returns')
plt.title(f"Apple's Beta against S&P 500: {beta}")

plt.tight_layout()
plt.show()

そもそも

Betaの値自体はYahoo Financeにあります。

Yahoo Financeの中の表記は見つけられてないのですが、間接的な情報から一応、SP500に対するものであるようです。

finance.yahoo.com