这段计算股票贝塔值的代码有什么问题?

问题描述 投票:0回答:1

我正在根据 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
python statistics stock quantitative-finance
1个回答
0
投票

我发现雅虎财经和扎克使用百分比变化来计算贝塔而不是阿尔法。另外,进行此更改后,我忘记将期间改回五年,将间隔改回一天。现在这些值令人满意。这是最终的代码:

    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
© www.soinside.com 2019 - 2024. All rights reserved.