Converts price data into returns + cleanup
(data, rf=0.0, nperiods=None)
| 205 | |
| 206 | |
| 207 | def _prepare_returns(data, rf=0.0, nperiods=None): |
| 208 | """Converts price data into returns + cleanup""" |
| 209 | data = data.copy() |
| 210 | function = inspect.stack()[1][3] |
| 211 | if isinstance(data, _pd.DataFrame): |
| 212 | for col in data.columns: |
| 213 | if data[col].dropna().min() >= 0 and data[col].dropna().max() > 1: |
| 214 | data[col] = data[col].pct_change() |
| 215 | elif data.min() >= 0 and data.max() > 1: |
| 216 | data = data.pct_change() |
| 217 | |
| 218 | # cleanup data |
| 219 | data = data.replace([_np.inf, -_np.inf], float("NaN")) |
| 220 | |
| 221 | if isinstance(data, (_pd.DataFrame, _pd.Series)): |
| 222 | data = data.fillna(0).replace([_np.inf, -_np.inf], float("NaN")) |
| 223 | unnecessary_function_calls = [ |
| 224 | "_prepare_benchmark", |
| 225 | "cagr", |
| 226 | "gain_to_pain_ratio", |
| 227 | "rolling_volatility", |
| 228 | ] |
| 229 | |
| 230 | if function not in unnecessary_function_calls: |
| 231 | if rf > 0: |
| 232 | return to_excess_returns(data, rf, nperiods) |
| 233 | |
| 234 | data = data.tz_localize(None) |
| 235 | return data |
| 236 | |
| 237 | |
| 238 | def download_returns(ticker, period="max", proxy=None): |
no test coverage detected