diff --git a/rqrisk/risk.py b/rqrisk/risk.py index fa43331..3bff158 100644 --- a/rqrisk/risk.py +++ b/rqrisk/risk.py @@ -179,15 +179,23 @@ def calmar(self): else: return self.annual_return / self.max_drawdown + @indicator_property(min_period_count=1) + def _excess_return_rate(self): + return np.expm1(np.log1p(self._active_returns).sum()) + @deprecate_property def excess_return_rate(self): # activate return rate - return np.expm1(np.log1p(self._active_returns).sum()) + return self._excess_return_rate @deprecate_property def excess_annual_return(self): + return self._excess_annual_return + + @indicator_property(min_period_count=1) + def _excess_annual_return(self): # active annual return - return (1 + self.excess_return_rate) ** (self._annual_factor / self.period_count) - 1 + return (1 + self._excess_return_rate) ** safe_div(self._annual_factor, self.period_count) - 1 @indicator_property(min_period_count=2, value_when_pc_not_satisfied=0.) def excess_volatility(self): diff --git a/rqrisk/utils.py b/rqrisk/utils.py index 51e2272..9562215 100644 --- a/rqrisk/utils.py +++ b/rqrisk/utils.py @@ -16,10 +16,7 @@ # 详细的授权流程,请联系 public@ricequant.com 获取。 import numpy as np -import logging - - -logger = logging.getLogger() +import warnings class IndicatorProperty: @@ -88,7 +85,7 @@ def deprecate_property(func): @property def inner(self): - logger.warning("\"{}\" is deprecate.".format(func.__name__)) + warnings.warn("'{}' is deprecate.".format(func.__name__)) return func(self) return inner diff --git a/setup.cfg b/setup.cfg index 49a18bc..c269920 100644 --- a/setup.cfg +++ b/setup.cfg @@ -5,7 +5,7 @@ [metadata] name = rqrisk -version = 1.0.6 +version = 1.0.7 [versioneer] VCS = git diff --git a/versioneer.py b/versioneer.py index 5e9c41f..913c16e 100644 --- a/versioneer.py +++ b/versioneer.py @@ -1394,7 +1394,7 @@ def render_pep440_ricequant(pieces): raise Exception("Only post release tag allowed, tag %s" % tag) if pieces["distance"] > 0: rendered += ".post%d" % (parsed_tag._version.post[1] + 1) - rendered += ".dev%d-g%s" % (pieces["distance"], pieces["short"]) + rendered += ".dev%d" % pieces["distance"] elif pieces["distance"] == 0: rendered += ".post%d" % parsed_tag._version.post[1] if pieces["dirty"]: @@ -1404,13 +1404,13 @@ def render_pep440_ricequant(pieces): # 如果最近的tag是正式版tag,那么就是在开发该系列的.post1 elif parsed_working == parsed_tag: if pieces["distance"] > 0: - rendered += ".post1.dev%d-g%s" % (pieces["distance"], pieces["short"]) + rendered += ".post1.dev%d" % pieces["distance"] if pieces["dirty"]: rendered += ".dirty" # 如果正在开发到是一个新的系列,那么就从该系列的.dev0开始 else: if pieces["distance"] >= 0: - rendered += ".dev%d-g%s" % (pieces["distance"], pieces["short"]) + rendered += ".dev%d" % pieces["distance"] if pieces["dirty"]: rendered += ".dirty" @@ -1428,7 +1428,7 @@ def render_pep440_ricequant(pieces): "distance"] == 0: return rendered - rendered += ".g%s" % pieces["short"] + rendered += "+%s" % pieces["short"] return rendered