def d_returns(self, is_portfolio: bool=True, col_name: str='Retornos') -> pd.DataFrame: """Retorna os retornos diários do portfólio, se is_portfolio=True, ou dos ativos que o compõem, se is_postfolio=False. Args: is_portfolio (bool, optional): refere-se aos retornos do portfólio ou dos ativos que o compõem. Padrão: True. col_name (str, optional): nome da coluna de retornos. Padrão: 'Retornos'. Returns: pd.DataFrame """ if is_portfolio: ret = (qt.returns(self.prices) * self.weights).sum(axis=1).to_frame() ret.rename(columns={0: col_name}, inplace=True) return ret.dropna() return qt.returns(self.prices).dropna()
def total_returns(self, period: str = 'a') -> pd.DataFrame: """Retorna a variação total do período, (preço final - preço inicial) / preço final. Args: period (str, optional): refere-se à periodização dos retornos ('m' ou 'a'). Padrão: 'a'. Returns: pd.DataFrame """ return qt.returns(self.prices, which='total', period=period).dropna()
def total_returns(self, scaled: bool = True) -> pd.DataFrame: """Retorna a variação total do período, (preço final - preço inicial) / preço final, se scaled=False; e retorna a variação anualizada se scaled=True. Args: scaled (bool, optional): refere-se à anualização dos retornos. Padrão: True. Returns: pd.DataFrame """ return qt.returns(self.prices, which='total', scaled=scaled).dropna()
def m_returns(self, is_portfolio: bool=True) -> pd.DataFrame: d_rets = self.d_returns(is_portfolio=is_portfolio) if is_portfolio: # dataframe com multindex m_rets = d_rets.iloc[:, 0].groupby( [d_rets.index.year, d_rets.index.month] ).apply(lambda r: (1 + r).prod() - 1).to_frame() # deixando o index como Y-m, em datetime m_rets.index = map( lambda t: dt(t[0], t[1], 1).strftime('%Y-%m'), m_rets.index ) return m_rets return d_rets.aggregate(lambda r: qt.returns(r, 'monthly'))