Python 雅虎金融如何计算调整后的收盘价?

Python 雅虎金融如何计算调整后的收盘价?,python,finance,yahoo-finance,yahoo-api,Python,Finance,Yahoo Finance,Yahoo Api,以下是雅虎金融(Yahoo Finance)显然是如何计算调整后收盘价的: 由此,我了解到一个常数因子适用于未经调整的价格,并且该因子随每次股息或分割事件而变化,这种情况不应经常发生。我应该能够通过将未调整的价格除以调整后的价格来推断出这个因素 但是,如果我用AAPL数据(使用Python)验证这一点,就会得到令人困惑的结果: import yfinance df = yfinance.download("AAPL", start="2010-01-01", end="2019-12-31

以下是雅虎金融(Yahoo Finance)显然是如何计算调整后收盘价的:

由此,我了解到一个常数因子适用于未经调整的价格,并且该因子随每次股息或分割事件而变化,这种情况不应经常发生。我应该能够通过将未调整的价格除以调整后的价格来推断出这个因素

但是,如果我用AAPL数据(使用Python)验证这一点,就会得到令人困惑的结果:

import yfinance 
df =  yfinance.download("AAPL", start="2010-01-01", end="2019-12-31")
df["Factor"] = df["Close"] / df["Adj Close"]
print(df["Factor"].nunique(), df["Factor"].count())
它产生:
24422516

因此,到目前为止,在大多数情况下,这个因素是不同的。但AAPL通常每年有4次股息事件,并且在这段时间内进行了股票分割,因此我预计大约有40个不同的因素,而不是2442个


Yahoo Finance在上面链接下提供的公式是否过于简化,或者我在这里遗漏了什么?

我不确定这是否是一个完整的答案,但它太长了,无法发表评论:

首先,四舍五入肯定是一个问题。如果将第三行修改为

df["Factor"] = df["Close"] / df["Adj Close"].round(12)
你得到2441个独特的因素。但是,如果使用,例如
round(6)
,则只能得到46个唯一因子

其次,根据你问题中雅虎帮助页面中的调整规则,每次股息都会导致在除权日期之前的5个交易日进行调整。在你所问的10年期间,没有发生股票分割和大约40次季度股息。这应该导致200个日期的调整收盘价。所有其他2300个左右的日期都不应进行收盘调整,即系数
1
。然而,当你跑步时:

df[df.Factor == 1].shape
您只获得
37
日期(不考虑使用的四舍五入),没有任何调整


显然,这是没有道理的,除非我遗漏了一些基本的东西,否则在调整方法的实现或雅虎代码中都存在一些错误。

问题是雅虎财经没有为您提供原始和调整后的价格。如果您查看示例历史价格页面(如MSFT)的脚注,您将看到一条文字,上面写着“调整拆分的收盘价;调整股息和拆分的收盘价。”

为了得出净调整比率,需要原始(未调整)和调整价格。然后,您可以应用调整方法(如CRSP)来推导正确的值。总之,你没有做错任何事!这是雅虎输出的内在限制

参考资料: [1]
[2]

有些事情没有道理:一年大约有250个交易日,所以在此期间应该只有2500个交易日。@JackFleeting我的数据框报告了2516行,看起来很合理,不是吗?谢谢你的帮助,@JackFleeting。重新取整:我不确定这是否是一个取整问题。这些值彼此接近,因此调整系数的差异也很小。因此,如果你舍入到更少的数字,我希望得到更多的匹配,但我认为这并不能解释这里的问题。仅5个交易日的重新调整:你在文档中看到了什么?我对调整的理解是,在每次股息事件中,调整因素都会被调整,然后,过去所有的价格都会用新的因素进行调整。这里有一个图说明:
[“Diff”]=(df[“Close”]-df[“Adj Close”])/df[“Adj Close”]*100
df[“Diff”].plot()
Re结尾出现
37次的
1
s:这与我刚才阐述的一致:从最近的股息事件到今天,该因子始终是
1
,因为(根据定义)还没有发生进一步的股息,因此没有股息调整。AAPL的最新股息事件发生在。和:
df[df[“Factor”]==1]。头(1)