Beispiel #1
0
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
Beispiel #2
0
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
Beispiel #3
0
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
Beispiel #4
0
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
Beispiel #5
0
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
Beispiel #6
0
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