def get_volatility(symbol, start_date=dt(year=2013, month=1, day=1), end_date=dt.today(), index_symbol="^GSPC"):
    """
    Standard deviation of returns
    :param symbol:
    :param start_date:
    :param end_date:
    :param index_symbol:
    :return:
    """
    symbol_returns = get_pct_returns(symbol, start_date, end_date)
    index_returns = get_pct_returns(index_symbol, start_date, end_date)
    cov_mat = np.cov(symbol_returns, index_returns)

    volatility = np.sqrt(cov_mat[0, 0])

    return volatility * 100
def get_beta(symbol, start_date=dt(year=2013, month=1, day=1), end_date=dt.today(), index_symbol="^GSPC"):
    """

    :param symbol:
    :param start_date:
    :param end_date:
    :param index_symbol:
    :return:
    """
    symbol_returns = get_pct_returns(symbol, start_date, end_date)
    index_returns = get_pct_returns(index_symbol, start_date, end_date)

    # TODO: if stock does not have data since start_date

    cov_mat = np.cov(symbol_returns, index_returns)
    beta = cov_mat[0, 1] / cov_mat[1, 1]

    return beta
def get_volatility(symbol,
                   start_date=dt(year=2013, month=1, day=1),
                   end_date=dt.today(),
                   index_symbol='^GSPC'):
    """
    Standard deviation of returns
    :param symbol:
    :param start_date:
    :param end_date:
    :param index_symbol:
    :return:
    """
    symbol_returns = get_pct_returns(symbol, start_date, end_date)
    index_returns = get_pct_returns(index_symbol, start_date, end_date)
    cov_mat = np.cov(symbol_returns, index_returns)

    volatility = np.sqrt(cov_mat[0, 0])

    return volatility * 100
def get_beta(symbol,
             start_date=dt(year=2013, month=1, day=1),
             end_date=dt.today(),
             index_symbol='^GSPC'):
    """

    :param symbol:
    :param start_date:
    :param end_date:
    :param index_symbol:
    :return:
    """
    symbol_returns = get_pct_returns(symbol, start_date, end_date)
    index_returns = get_pct_returns(index_symbol, start_date, end_date)

    # TODO: if stock does not have data since start_date

    cov_mat = np.cov(symbol_returns, index_returns)
    beta = cov_mat[0, 1] / cov_mat[1, 1]

    return beta
def get_alpha(symbol,
              start_date=dt(year=2013, month=1, day=1),
              end_date=dt.today(),
              symbol_returns=None,
              index_returns=None,
              index_symbol='^GSPC'):
    """
    Using Jensen's alpha (https://en.wikipedia.org/wiki/Jensen%27s_alpha)
    :param symbol:
    :param start_date:
    :param end_date:
    :param index_symbol:
    :return:
    """
    if symbol_returns is None:
        symbol_returns = get_pct_returns(symbol, start_date, end_date)
    if index_returns is None:
        index_returns = get_pct_returns(index_symbol, start_date, end_date)
    beta = get_beta(symbol, start_date, end_date, index_symbol)
    alpha = np.mean(symbol_returns) - beta * np.mean(index_returns)

    return alpha * 100
def get_alpha(
    symbol,
    start_date=dt(year=2013, month=1, day=1),
    end_date=dt.today(),
    symbol_returns=None,
    index_returns=None,
    index_symbol="^GSPC",
):
    """
    Using Jensen's alpha (https://en.wikipedia.org/wiki/Jensen%27s_alpha)
    :param symbol:
    :param start_date:
    :param end_date:
    :param index_symbol:
    :return:
    """
    if symbol_returns is None:
        symbol_returns = get_pct_returns(symbol, start_date, end_date)
    if index_returns is None:
        index_returns = get_pct_returns(index_symbol, start_date, end_date)
    beta = get_beta(symbol, start_date, end_date, index_symbol)
    alpha = np.mean(symbol_returns) - beta * np.mean(index_returns)

    return alpha * 100