Calculates excess returns by subtracting risk-free returns from total returns Args: * returns (Series, DataFrame): Returns * rf (float, Series, DataFrame): Risk-Free rate(s) * nperiods (int): Optional. If provided, will convert rf to different freque
(returns, rf, nperiods=None)
| 157 | |
| 158 | |
| 159 | def to_excess_returns(returns, rf, nperiods=None): |
| 160 | """ |
| 161 | Calculates excess returns by subtracting |
| 162 | risk-free returns from total returns |
| 163 | |
| 164 | Args: |
| 165 | * returns (Series, DataFrame): Returns |
| 166 | * rf (float, Series, DataFrame): Risk-Free rate(s) |
| 167 | * nperiods (int): Optional. If provided, will convert rf to different |
| 168 | frequency using deannualize |
| 169 | Returns: |
| 170 | * excess_returns (Series, DataFrame): Returns - rf |
| 171 | """ |
| 172 | if isinstance(rf, int): |
| 173 | rf = float(rf) |
| 174 | |
| 175 | if not isinstance(rf, float): |
| 176 | rf = rf[rf.index.isin(returns.index)] |
| 177 | |
| 178 | if nperiods is not None: |
| 179 | # deannualize |
| 180 | rf = _np.power(1 + rf, 1.0 / nperiods) - 1.0 |
| 181 | |
| 182 | df = returns - rf |
| 183 | df = df.tz_localize(None) |
| 184 | return df |
| 185 | |
| 186 | |
| 187 | def _prepare_prices(data, base=1.0): |