def test_log_total_returns(): data = log_total_returns(("GMKN", "RTKMP", "MTSS"), pd.Timestamp("2018-10-17")) assert isinstance(data, pd.DataFrame) assert list(data.columns) == ["GMKN", "RTKMP", "MTSS"] assert data.index[0] == pd.Timestamp("2003-10-02") assert data.index[-1] == pd.Timestamp("2018-10-17") assert data.loc["2018-10-08", "MTSS"] == pytest.approx( np.log(((269.9 + 2.6 * AFTER_TAX) / 275.1)) ) assert data.loc["2018-10-09", "MTSS"] == pytest.approx(np.log(((264 + 0) / 269.9))) assert data.loc["2018-10-01", "GMKN"] == pytest.approx( np.log(((11307 + 0) / 11388)) ) assert data.loc["2018-09-28", "GMKN"] == pytest.approx( np.log(((11388 + 776.02 * AFTER_TAX) / 11830)) ) assert data.loc["2018-07-05", "RTKMP"] == pytest.approx( np.log(((62.53 + 5.045825249373 * AFTER_TAX) / 66)) ) assert data.loc["2018-07-06", "RTKMP"] == pytest.approx(np.log(((62 + 0) / 62.53)))
def get(self, params=None) -> pd.Series: """Для дат, в которые есть котировки указывается тикер.""" returns = data.log_total_returns(self._tickers, self._last_date) tickers = returns.stack() tickers.loc[:] = tickers.index.get_level_values(1) tickers.name = self.name return tickers
def get(self, params=None) -> pd.Series: """Средняя доходность за указанное количество предыдущих дней.""" params = params or self._params days = params["days"] returns = data.log_total_returns(self._tickers, self._last_date) mom12m = returns.rolling(days).mean() mom12m = mom12m.stack() mom12m.name = self.name return mom12m
def get(self, params=None) -> pd.Series: """СКО за указанное количество предыдущих дней.""" params = params or self._params days = params["days"] returns = data.log_total_returns(self._tickers, self._last_date) std = returns.rolling(days).std() std = std.stack() std.name = self.name return std[std > LOW_STD]
def get(self, params=None) -> pd.Series: """Средняя доходность за указанное количество следующих дней.""" params = params or self._params days = params["days"] returns = data.log_total_returns(self._tickers, self._last_date) label = returns.rolling(days).mean() label = label.shift(-days).stack() label.name = self.name return label
def get(self, params=None) -> pd.Series: """Максимальная доходность за указанное количество предыдущих дней.""" params = params or self._params days = params["days"] returns = data.log_total_returns(self._tickers, self._last_date) retmax = returns.rolling(days).max() retmax = retmax.stack() retmax.name = self.name return retmax