def sharpe_ratio(close: Series, benchmark_rate: float = 0.0, log: bool = False, use_cagr: bool = False, period: int = RATE["TRADING_DAYS_PER_YEAR"]) -> float: """Sharpe Ratio of a series. Args: close (pd.Series): Series of 'close's benchmark_rate (float): Benchmark Rate to use. Default: 0.0 log (bool): If True, calculates log_return. Otherwise it returns percent_return. Default: False use_cagr (bool): Use cagr - benchmark_rate instead. Default: False period (int, float): Period to use to calculate Mean Annual Return and Annual Standard Deviation. Default: RATE["TRADING_DAYS_PER_YEAR"] (currently 252) >>> result = ta.sharpe_ratio(close, benchmark_rate=0.0, log=False) """ close = verify_series(close) returns = percent_return(close=close) if not log else log_return( close=close) if use_cagr: return cagr(close) / volatility(close, returns, log=log) else: period_mu = period * returns.mean() period_std = npSqrt(period) * returns.std() return (period_mu - benchmark_rate) / period_std
def volatility(close: Series, tf: str = "years", returns: bool = False, log: bool = False, **kwargs) -> float: """Volatility of a series. Default: 'years' Args: close (pd.Series): Series of 'close's tf (str): Time Frame options: 'days', 'weeks', 'months', and 'years'. Default: 'years' returns (bool): If True, then it replace the close Series with the user defined Series; typically user generated returns or percent returns or log returns. Default: False log (bool): If True, calculates log_return. Otherwise it calculates percent_return. Default: False >>> result = ta.volatility(close, tf="years", returns=False, log=False, **kwargs) """ close = verify_series(close) if not returns: returns = percent_return(close=close) if not log else log_return( close=close) else: returns = close returns = log_geometric_mean(returns).std() # factor = returns.shape[0] / total_time(returns, tf) # if kwargs.pop("nearest_day", False) and tf.lower() == "years": # factor = int(factor + 1) # return npSqrt(factor) * returns.std() return returns
def optimal_leverage(close: Series, benchmark_rate: float = 0.0, period: Tuple[float, int] = RATE["TRADING_DAYS_PER_YEAR"], log: bool = False, capital: float = 1., **kwargs) -> float: """Optimal Leverage of a series. NOTE: Incomplete. Do NOT use. Args: close (pd.Series): Series of 'close's benchmark_rate (float): Benchmark Rate to use. Default: 0.0 period (int, float): Period to use to calculate Mean Annual Return and Annual Standard Deviation. Default: None or the default sharpe_ratio.period() log (bool): If True, calculates log_return. Otherwise it returns percent_return. Default: False >>> result = ta.optimal_leverage(close, benchmark_rate=0.0, log=False) """ close = verify_series(close) use_cagr = kwargs.pop("use_cagr", False) returns = percent_return(close=close) if not log else log_return( close=close) # sharpe = sharpe_ratio(close, benchmark_rate=benchmark_rate, log=log, use_cagr=use_cagr, period=period) period_mu = period * returns.mean() period_std = npSqrt(period) * returns.std() mean_excess_return = period_mu - benchmark_rate # sharpe = mean_excess_return / period_std opt_leverage = (period_std**-2) * mean_excess_return amount = int(capital * opt_leverage) return amount
def sortino_ratio(close:Series, benchmark_rate:float = 0.0, log:bool = False) -> float: """Sortino Ratio of a series.""" close = verify_series(close) returns = percent_return(close=close) if not log else log_return(close=close) result = cagr(close) - benchmark_rate result /= downside_deviation(returns) return result
def sharpe_ratio(close:Series, benchmark_rate:float = 0.0, log:bool = False) -> float: """Sharpe Ratio of a series.""" close = verify_series(close) returns = percent_return(close=close) if not log else log_return(close=close) result = cagr(close) - benchmark_rate result /= volatility(close, returns, log=log) return result
def volatility(close: Series, tf:str = "years", returns:bool = False, log: bool = False, **kwargs) -> float: """Volatility of a series. Default: 'years'""" close = verify_series(close) if not returns: returns = percent_return(close=close) if not log else log_return(close=close) factor = returns.shape[0] / total_time(returns, tf) if kwargs.pop("nearest_day", False) and tf.lower() == "years": factor = int(factor + 1) return returns.std() * npSqrt(factor)
def sortino_ratio(close: Series, benchmark_rate: float = 0.0, log: bool = False) -> float: """Sortino Ratio of a series. Args: close (pd.Series): Series of 'close's benchmark_rate (float): Benchmark Rate to use. Default: 0.0 log (bool): If True, calculates log_return. Otherwise it returns percent_return. Default: False >>> result = ta.sortino_ratio(close, benchmark_rate=0.0, log=False) """ close = verify_series(close) returns = percent_return(close=close) if not log else log_return(close=close) result = cagr(close) - benchmark_rate result /= downside_deviation(returns) return result