Skip to content

Commit

Permalink
Merge pull request #1798 from ranaroussi/fix/price-repair-div-adjust
Browse files Browse the repository at this point in the history
Fix price repair div adjust
  • Loading branch information
ValueRaider authored Dec 31, 2023
2 parents 7e6ad08 + d44eff4 commit 477dc6e
Showing 1 changed file with 11 additions and 7 deletions.
18 changes: 11 additions & 7 deletions yfinance/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -695,7 +695,7 @@ def _reconstruct_intervals_batch(self, df, interval, prepost, tag=-1):
f_tag = df_block_calib['Adj Close'] == tag
if f_tag.any():
div_adjusts = df_block_calib['Adj Close'] / df_block_calib['Close']
# The loop below assumes each 1d repair is isoloated, i.e. surrounded by
# The loop below assumes each 1d repair is isolated, i.e. surrounded by
# good data. Which is case most of time.
# But in case are repairing a chunk of bad 1d data, back/forward-fill the
# good div-adjustments - not perfect, but a good backup.
Expand All @@ -707,26 +707,30 @@ def _reconstruct_intervals_batch(self, df, interval, prepost, tag=-1):
if df_new.loc[dt, "Dividends"] != 0:
if idx < n - 1:
# Easy, take div-adjustment from next-day
div_adjusts[idx] = div_adjusts.iloc[idx + 1]
div_adjusts.iloc[idx] = div_adjusts.iloc[idx + 1]
else:
# Take previous-day div-adjustment and reverse todays adjustment
div_adj = 1.0 - df_new_calib["Dividends"].iloc[idx] / df_new_calib['Close'].iloc[
idx - 1]
div_adjusts[idx] = div_adjusts.iloc[idx - 1] / div_adj
div_adjusts.iloc[idx] = div_adjusts.iloc[idx - 1] / div_adj
else:
if idx > 0:
# Easy, take div-adjustment from previous-day
div_adjusts[idx] = div_adjusts.iloc[idx - 1]
div_adjusts.iloc[idx] = div_adjusts.iloc[idx - 1]
else:
# Must take next-day div-adjustment
div_adjusts[idx] = div_adjusts.iloc[idx + 1]
div_adjusts.iloc[idx] = div_adjusts.iloc[idx + 1]
if df_new_calib["Dividends"].iloc[idx + 1] != 0:
div_adjusts[idx] *= 1.0 - df_new_calib["Dividends"].iloc[idx + 1] / \
div_adjusts.iloc[idx] *= 1.0 - df_new_calib["Dividends"].iloc[idx + 1] / \
df_new_calib['Close'].iloc[idx]
f_close_bad = df_block_calib['Close'] == tag
div_adjusts = div_adjusts.reindex(df_block.index, fill_value=np.nan).ffill().bfill()
df_new['Adj Close'] = df_block['Close'] * div_adjusts
if f_close_bad.any():
df_new.loc[f_close_bad, 'Adj Close'] = df_new['Close'][f_close_bad] * div_adjusts[f_close_bad]
f_close_bad_new = f_close_bad.reindex(df_new.index, fill_value=False)
div_adjusts_new = div_adjusts.reindex(df_new.index, fill_value=np.nan).ffill().bfill()
div_adjusts_new_np = f_close_bad_new.to_numpy()
df_new.loc[div_adjusts_new_np, 'Adj Close'] = df_new['Close'][div_adjusts_new_np] * div_adjusts_new[div_adjusts_new_np]

# Check whether 'df_fine' has different split-adjustment.
# If different, then adjust to match 'df'
Expand Down

0 comments on commit 477dc6e

Please sign in to comment.