【问题标题】:How does Yahoo Finance calculate Adjusted Close stock prices?雅虎财经如何计算调整后的收盘价?
【发布时间】:2020-05-05 01:30:00
【问题描述】:

雅虎财经显然是这样计算调整后收盘价的:

https://help.yahoo.com/kb/adjusted-close-sln28256.html

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

但是,如果我使用 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())

产生:2442 2516

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

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

【问题讨论】:

  • 有些不合理:一年大约有 250 个交易日,所以在此期间应该只有 2,500 个交易日。
  • @JackFleeting 我的数据框报告了 2516 行,所以看起来很合理,不是吗?

标签: python finance yahoo-finance yahoo-api


【解决方案1】:

问题在于,雅虎财经不提供原始价格和调整后的价格供您使用。如果您查看示例历史价格页面(例如,MSFT)的脚注,您将看到一条文本显示“针对拆分调整收盘价;针对股息和拆分调整调整后的收盘价。”

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

参考资料: [1]https://medium.com/@patrick.collins_58673/stock-api-landscape-5c6e054ee631 [2]http://www.crsp.org/products/documentation/crsp-calculations

【讨论】:

    【解决方案2】:

    我不确定这是一个完整的答案,但评论太长了:

    首先,四舍五入肯定存在问题。如果您将第三行修改为

    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 日期(无论使用的四舍五入),没有任何调整。

    显然,这没有意义,而且 - 除非我遗漏了一些基本内容 - 在调整方法的实施或 Yahoo 代码中存在一些错误。

    【讨论】:

    • 感谢您的帮助,@jack-fleeting。重新四舍五入:我不确定这是一个四舍五入的问题。这些值彼此接近,因此调整因子的差异也很小。所以如果你四舍五入到更少的数字,我希望得到更多的匹配,但我认为这不能解释这里的问题。
    • 仅5个交易日的重新调整:您在文件中哪里看到的?我理解调整的方式是,对于每个股息事件,调整因子都会被调整,然后所有过去的价格将用这个新因子进行调整。这是一个说明:["Diff"] = (df["Close"] - df["Adj Close"]) / df["Adj Close"] * 100;df["Diff"].plot()
    • Re the 1s 最后出现37 次:这与我刚才阐述的一致:从最近的股息事件到今天,Factor 始终是1因为(根据定义)还没有进一步派发股息,因此没有股息调整。 AAPL 最新的股息事件是11/7/2019。并且:df[df["Factor"] == 1].head(1)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-06
    • 1970-01-01
    • 1970-01-01
    • 2012-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多