def excess_returns( price_series: pd.Series, benchmark_or_rate: Union[Asset, Currency, float], *, day_count_convention=DayCountConvention.ACTUAL_360) -> pd.Series: if isinstance(benchmark_or_rate, float): er = [price_series.iloc[0]] for j in range(1, len(price_series)): fraction = day_count_fraction(price_series.index[j - 1], price_series.index[j], day_count_convention) er.append(er[-1] + price_series.iloc[j] - price_series.iloc[j - 1] * (1 + benchmark_or_rate * fraction)) return pd.Series(er, index=price_series.index) if isinstance(benchmark_or_rate, Currency): try: marquee_id = SharpeAssets[benchmark_or_rate.value].value except KeyError: raise MqValueError(f"unsupported currency {benchmark_or_rate}") else: marquee_id = benchmark_or_rate.get_marquee_id() with DataContext(price_series.index[0], price_series.index[-1]): q = GsDataApi.build_market_data_query([marquee_id], QueryType.SPOT) df = GsDataApi.get_market_data(q) if df.empty: raise MqValueError(f'could not retrieve risk-free rate {marquee_id}') df = df[~df.index.duplicated( keep='first')] # handle bad data (duplicate rows) return excess_returns_pure(price_series, df['spot'])
def excess_returns( price_series: pd.Series, benchmark_or_rate: Union[Asset, Currency, float], *, day_count_convention=DayCountConvention.ACTUAL_360) -> pd.Series: if isinstance(benchmark_or_rate, float): er = [price_series.iloc[0]] for j in range(1, len(price_series)): fraction = day_count_fraction(price_series.index[j - 1], price_series.index[j], day_count_convention) er.append(er[-1] + price_series.iloc[j] - price_series.iloc[j - 1] * (1 + benchmark_or_rate * fraction)) return pd.Series(er, index=price_series.index) if isinstance(benchmark_or_rate, Currency): try: marquee_id = SharpeAssets[benchmark_or_rate.value].value except KeyError: raise MqValueError(f"unsupported currency {benchmark_or_rate}") else: marquee_id = benchmark_or_rate.get_marquee_id() with DataContext(price_series.index[0], price_series.index[-1]): q = GsDataApi.build_market_data_query([marquee_id], QueryType.SPOT) df = GsDataApi.get_market_data(q) curve, bench_curve = align(price_series, df['spot'], Interpolate.INTERSECT) e_returns = [curve.iloc[0]] for i in range(1, len(curve)): multiplier = 1 + curve.iloc[i] / curve.iloc[ i - 1] - bench_curve.iloc[i] / bench_curve.iloc[i - 1] e_returns.append(e_returns[-1] * multiplier) return pd.Series(e_returns, index=curve.index)
def _market_data_timed(q): start = time.perf_counter() df = GsDataApi.get_market_data(q) _logger.debug('market data query ran in %.3f ms', (time.perf_counter() - start) * 1000) return df