我正在根据 SPY 计算股票的贝塔值。然而,我的计算得出的数字与我在雅虎财经和 Zacks 上看到的数字不同。股票的贝塔值是协方差除以方差。下面是我调用
get_beta(['AAPL'])
时的代码和输出
代码:
def covariance(self, SPY_hist, hist2):
SPY_closes = SPY_hist['Close'].to_list()
length = len(SPY_closes)
SPY_average = 0
for p in SPY_closes:
SPY_average += p
SPY_average = SPY_average / length
hist2_closes = hist2['Close'].to_list()
length = len(hist2_closes)
hist2_average = 0
for day in hist2_closes:
hist2_average += day
hist2_average = hist2_average / length
total = 0
for i in range(len(SPY_hist)):
total += ((SPY_closes[i] - SPY_average) * (hist2_closes[i] - hist2_average))
return total / (length - 1)
def variance(self, SPY_hist):
SPY_closes = SPY_hist['Close'].to_list()
length = len(SPY_closes)
SPY_average = 0
for p in SPY_closes:
SPY_average += p
SPY_average = SPY_average / length
sum = 0
for i in SPY_closes:
dif = i - SPY_average
sum += (dif ** 2)
return (sum / (length-1))
def beta(self, SPY_hist, hist2):
_covariance = self.covariance(SPY_hist=SPY_hist, hist2=hist2)
_variance = self.variance(SPY_hist=SPY_hist)
return (_covariance / _variance)
def get_beta(self, securities):
SPY_hist = yfinance.Ticker('SPY').history('1mo')
betas = {}
for security in securities:
security_hist = yfinance.Ticker(security).history('1mo')
b = self.beta(SPY_hist=SPY_hist, hist2=security_hist)
betas[security] = b
return betas
输出:
{'AAPL': 0.6610297779078679}
我尝试过苹果和特斯拉。两次产生的贝塔值都很低。我多次查看了代码,但无法弄清楚我做错了什么。不过,我几乎可以肯定,苹果的贝塔值应该高于 SPY。当我使用五年期和 1 个月间隔时,我预计苹果的贝塔值约为 1.27,特斯拉的贝塔值约为 2.07,但苹果的贝塔值为 0.66,特斯拉的贝塔值为 1.5。
更新
我在这个页面上读到,雅虎使用以下公式计算贝塔值:
Beta = (Stock’s % daily change and Index’s % daily change) / (Index’s % daily change.)
。我实现了百分比变化函数,并更改了代码以从我将放在下面的百分比变化函数中获取值。我的价值观虽然没有接近,但仍然存在偏差。现在苹果是1.14,特斯拉是2.5。
新代码
def covariance(self, SPY_hist, hist2):
#SPY_closes = SPY_hist['Close'].to_list()
SPY_closes = SPY_hist
length = len(SPY_closes)
SPY_average = 0
for p in SPY_closes:
SPY_average += p
SPY_average = SPY_average / length
#hist2_closes = hist2['Close'].to_list()
hist2_closes = hist2
length = len(hist2_closes)
hist2_average = 0
for day in hist2_closes:
hist2_average += day
hist2_average = hist2_average / length
total = 0
for i in range(len(SPY_hist)):
total += ((SPY_closes[i] - SPY_average) * (hist2_closes[i] - hist2_average))
return total / (length - 1)
def variance(self, SPY_hist):
#SPY_closes = SPY_hist['Close'].to_list()
SPY_closes = SPY_hist
length = len(SPY_closes)
SPY_average = 0
for p in SPY_closes:
SPY_average += p
SPY_average = SPY_average / length
sum = 0
for i in SPY_closes:
dif = i - SPY_average
sum += (dif ** 2)
return (sum / (length-1))
def beta(self, SPY_hist, hist2):
_covariance = self.covariance(SPY_hist=SPY_hist, hist2=hist2)
_variance = self.variance(SPY_hist=SPY_hist)
return (_covariance / _variance)
def percent_change(self, hist):
closes = hist['Close'].to_list()
percent_change = []
for i in range(len(closes)):
if i != 0:
percent_change.append(((closes[i-1] - closes[i]) / closes[i-1]) * 100)
return percent_change
def get_beta(self, securities):
SPY_hist = yfinance.Ticker('SPY').history('1mo')
SPY_pc = self.percent_change(hist=SPY_hist)
betas = {}
for security in securities:
security_hist = yfinance.Ticker(security).history('1mo')
security_pc = self.percent_change(hist=security_hist)
b = self.beta(SPY_hist=SPY_pc, hist2=security_pc)
betas[security] = b
return betas
我发现雅虎财经和扎克使用百分比变化来计算贝塔而不是阿尔法。另外,进行此更改后,我忘记将期间改回五年,将间隔改回一天。现在这些值令人满意。这是最终的代码:
def covariance(self, SPY_hist, hist2):
#SPY_closes = SPY_hist['Close'].to_list()
SPY_closes = SPY_hist
length = len(SPY_closes)
SPY_average = 0
for p in SPY_closes:
SPY_average += p
SPY_average = SPY_average / length
#hist2_closes = hist2['Close'].to_list()
hist2_closes = hist2
length = len(hist2_closes)
hist2_average = 0
for day in hist2_closes:
hist2_average += day
hist2_average = hist2_average / length
total = 0
for i in range(len(SPY_hist)):
total += ((SPY_closes[i] - SPY_average) * (hist2_closes[i] - hist2_average))
return total / (length - 1)
def variance(self, SPY_hist):
#SPY_closes = SPY_hist['Close'].to_list()
SPY_closes = SPY_hist
length = len(SPY_closes)
SPY_average = 0
for p in SPY_closes:
SPY_average += p
SPY_average = SPY_average / length
sum = 0
for i in SPY_closes:
dif = i - SPY_average
sum += (dif ** 2)
return (sum / (length-1))
def beta(self, SPY_hist, hist2):
_covariance = self.covariance(SPY_hist=SPY_hist, hist2=hist2)
_variance = self.variance(SPY_hist=SPY_hist)
return (_covariance / _variance)
def percent_change(self, hist):
closes = hist['Close'].to_list()
percent_change = []
for i in range(len(closes)):
if i != 0:
percent_change.append(((closes[i-1] - closes[i]) / closes[i-1]) * 100)
return percent_change
def get_beta(self, securities):
SPY_hist = yfinance.Ticker('SPY').history(period='5y', interval='1mo')
SPY_pc = self.percent_change(hist=SPY_hist)
betas = {}
for security in securities:
security_hist = yfinance.Ticker(security).history(period='5y', interval='1mo')
security_pc = self.percent_change(hist=security_hist)
b = self.beta(SPY_hist=SPY_pc, hist2=security_pc)
betas[security] = b
return betas