ranaroussi / yfinance

Download market data from Yahoo! Finance's API
https://aroussi.com/post/python-yahoo-finance
Apache License 2.0
14.86k stars 2.44k forks source link

Adjusted Close from yfinance is not the same as total return from Yahoo Finance #2070

Open Allen-JThomas opened 1 month ago

Allen-JThomas commented 1 month ago

I am trying to calculate the monthly and annual percent return for a fund like VSMPX. My understanding is that the Adjusted Close from yfinance takes into account splits and dividends.

To get the percent return I am doing:

  hist = ticker.history(start="2020-01-01", end=None, interval="1d", auto_adjust=True)
  # Calculate daily, monthly, and annual percentage returns
  daily_returns = hist['Close'].pct_change()
  monthly_returns = hist['Close'].resample('M').last().pct_change()
  annual_returns = hist['Close'].resample('Y').last().pct_change()

  # Save the returns to CSV files
  daily_returns.to_csv("VSMPX_daily_adjusted_returns.csv")
  monthly_returns.to_csv("VSMPX_monthly_adjusted_returns.csv")
  annual_returns.to_csv("VSMPX_annual_adjusted_returns.csv")

My annual return is the following:

2016-12-31 00:00:00-05:00,0.12694628348918013
2017-12-31 00:00:00-05:00,0.21189241900874567
2018-12-31 00:00:00-05:00,-0.05155696029590995
2019-12-31 00:00:00-05:00,0.3079293379439798
2020-12-31 00:00:00-05:00,0.21010764518963132
2021-12-31 00:00:00-05:00,0.2574150697504418
2022-12-31 00:00:00-05:00,-0.19501641528697433
2023-12-31 00:00:00-05:00,0.26013908084513204

However, when I check the total return percentage on the Yahoo Finance website, my adjusted return percentages are off by a little. image

For example, you can see that my 2019 annual return is 30.79%, but on Yahoo Finance, it is 30.82%. I realize this is a small descripency but I want 1) Understand why there is a difference 2) I noticed every other total return is the same as Yahoo Finance, so concerned I am doing something wrong.

Kelly-W1115 commented 1 month ago

Good question and also wait for an answer

ValueRaider commented 1 month ago

Hard to answer without Yahoo's source code. Can you get a third opinion from other source e.g. Morning Star?

vdbergh commented 1 month ago

I find it confusing that hist['Close'] actually refers to the adjusted close price and not to the real close price. IMHO yfinance should supply both.

EDIT: I am now seeing that this behavior is configurable through the auto_adjust parameter to history. Sorry for noise!

Incidentally: I tried to compute the adjusted close prices for https://finance.yahoo.com/quote/HYLD.L/history/?period1=1352793600&period2=1728108169 following the explanation here https://help.yahoo.com/kb/SLN28256.html but the numbers I got were also slightly off.

ValueRaider commented 1 month ago

The adjustment from a dividend is 1.0 - [ dividend / close day before ] . Accumulate them by multiplying. Any differences are rounding errors.

deeleeramone commented 2 days ago

Total returns typically assumes reinvestment on the payment date, which would create a slightly different value because of the compounding effect.

Instead of discounting the price, the base unit (1 share) increases by the multiplier, base unit * (1 + (div/close)).

The next dividend received, all else equal, would be a slightly larger amount.

The adjusted price level would reflect the increase in the base unit (1 share), not because of any cash flow, but because of compounding from reinvestment.

At the end of the holding period, the exit price would be the closing price multiplied by 1 + however many fractional shares accumulated from reinvestment.

ValueRaider commented 2 days ago

Instead of discounting the price, the base unit (1 share) increases by the multiplier, base unit * (1 + (div/close)).

Valid way to adjust but Yahoo does reverse.