You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

股票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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 09:44:59