股票Beta值计算代码问题:与Yahoo Finance/Zacks结果不符
股票Beta值计算与Yahoo Finance/Zacks结果不一致的问题
我正基于SPY计算股票的Beta值,但计算结果与Yahoo Finance和Zacks上的数值始终不符。Beta值的标准计算公式为:Beta = 协方差(股票与指数) / 方差(指数)。
以下是调用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}
我测试了苹果(AAPL)和特斯拉(TSLA)两只股票,计算出的Beta值均明显偏低——苹果的Beta值理应高于SPY。使用5年期数据时,预期苹果Beta约为1.27、特斯拉约为2.07,但实际计算值仅为0.66和1.5。
更新
我了解到Yahoo计算Beta时使用的是每日涨跌幅而非收盘价本身,公式为:Beta = (股票每日涨跌幅与指数每日涨跌幅的协方差) / (指数每日涨跌幅的方差)。我实现了涨跌幅计算函数并修改代码后,结果更接近预期但仍存在偏差:苹果的计算值为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
内容的提问来源于stack exchange,提问作者Alex Michael
相关产品推荐
相关产品推荐

