Add adjust_ohlcv.py
Browse files- adjust_ohlcv.py +12 -7
adjust_ohlcv.py
CHANGED
|
@@ -78,6 +78,17 @@ def _close_prior(df: pd.DataFrame, ex_date: dt.date) -> float | None:
|
|
| 78 |
return float((regular if not regular.empty else last_day)["close"].iloc[-1])
|
| 79 |
|
| 80 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 81 |
def _dividend_events(df: pd.DataFrame, dividends: pd.DataFrame | None) -> dict[dt.date, tuple[float, float]]:
|
| 82 |
"""{ex_date: (amount, close_prior)}; close_prior is taken from the bars unless given.
|
| 83 |
|
|
@@ -88,13 +99,7 @@ def _dividend_events(df: pd.DataFrame, dividends: pd.DataFrame | None) -> dict[d
|
|
| 88 |
events: dict[dt.date, tuple[float, float]] = {}
|
| 89 |
given = dividends["close_prior"] if "close_prior" in dividends else [None] * len(dividends)
|
| 90 |
for d, amount, cp in zip(dividends["date"], dividends["amount"], given, strict=True):
|
| 91 |
-
|
| 92 |
-
if ex_date in events:
|
| 93 |
-
events[ex_date] = (events[ex_date][0] + float(amount), events[ex_date][1])
|
| 94 |
-
continue
|
| 95 |
-
close_prior = cp if not pd.isna(cp) else _close_prior(df, ex_date)
|
| 96 |
-
if close_prior is not None and close_prior > 0:
|
| 97 |
-
events[ex_date] = (float(amount), float(close_prior))
|
| 98 |
return events
|
| 99 |
|
| 100 |
|
|
|
|
| 78 |
return float((regular if not regular.empty else last_day)["close"].iloc[-1])
|
| 79 |
|
| 80 |
|
| 81 |
+
def _add_dividend(events: dict, df: pd.DataFrame, ex_date: dt.date, amount: float, close_prior) -> None:
|
| 82 |
+
"""Insert one dividend; a repeat ex-date adds to the amount already recorded."""
|
| 83 |
+
if ex_date in events:
|
| 84 |
+
events[ex_date] = (events[ex_date][0] + amount, events[ex_date][1])
|
| 85 |
+
return
|
| 86 |
+
if pd.isna(close_prior):
|
| 87 |
+
close_prior = _close_prior(df, ex_date)
|
| 88 |
+
if close_prior is not None and close_prior > 0:
|
| 89 |
+
events[ex_date] = (amount, float(close_prior))
|
| 90 |
+
|
| 91 |
+
|
| 92 |
def _dividend_events(df: pd.DataFrame, dividends: pd.DataFrame | None) -> dict[dt.date, tuple[float, float]]:
|
| 93 |
"""{ex_date: (amount, close_prior)}; close_prior is taken from the bars unless given.
|
| 94 |
|
|
|
|
| 99 |
events: dict[dt.date, tuple[float, float]] = {}
|
| 100 |
given = dividends["close_prior"] if "close_prior" in dividends else [None] * len(dividends)
|
| 101 |
for d, amount, cp in zip(dividends["date"], dividends["amount"], given, strict=True):
|
| 102 |
+
_add_dividend(events, df, pd.Timestamp(d).date(), float(amount), cp)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 103 |
return events
|
| 104 |
|
| 105 |
|