Exemplo n.º 1
0
def market_neutral_sharpe(ticker, benchmark='SPY', start='2017-01-01'):
    tickers = pd.DataFrame(make_portfolio(ticker, start=start))
    benchs = pd.DataFrame(make_portfolio(benchmark, start=start))

    tickers['daily_ret'] = tickers['adjClose'].pct_change()
    benchs['daily_ret'] = benchs['adjClose'].pct_change()
    #print(tickers)
    df = pd.DataFrame(index=tickers.index)
    df['net'] = (tickers['daily_ret'] - benchs['daily_ret']) / 2.0
    return annual_sharpe(df['net'])
Exemplo n.º 2
0
def MonteCarloSimulation(stock, simulations=500):
    stocks = make_portfolio(stock)  # download financial data of stocks
    returns = stocks.pct_change()  #pct change of stock - daily returns
    num_sim = simulations
    last_price = stocks[-1]
    trading_dates = 253
    sim_df = pd.DataFrame()
    for x in range(num_sim):
        count = 0
        daily_STD = returns.std()
        price_series = []
        price = last_price * (1 + np.random.normal(0, daily_STD))
        price_series.append(price)
        for y in range(trading_dates):
            if count == 253:
                break
            price = price_series[count] * (1 + np.random.normal(0, daily_STD))
            price_series.append(price)
            count += 1
        sim_df[x] = price_series

    #print(sim_df)
    f, ax1 = plt.subplots(1, 1, figsize=(15, 5))
    ax1.plot(sim_df)
    ax1.axhline(y=last_price, color='r', linestyle='-', linewidth=2)
    #ax2.hist(sim_df,bins=100)
    rnd = np.mean(sim_df)
    q5 = np.percentile(sim_df, 5)
    q95 = np.percentile(sim_df, 95)
    print(
        f'There is a 5% chance that our stock price will end up below around {q5} and a 5% chance it will finish above {q95} ',
    )
    plt.show()
Exemplo n.º 3
0
def sharp(ticker, rf=0.017):
    pdf = make_portfolio(ticker)
    pdf = pd.DataFrame(pdf)
    pdf['daily_ret'] = pdf['adjClose'].pct_change() * 100
    sharp = pdf['daily_ret'].mean() / pdf['daily_ret'].std()
    annual_sh = np.sqrt(253) * sharp
    print(annual_sh)
Exemplo n.º 4
0
def equity_sharpe(ticker, rf=0.0173):
    """
    Calculates the annualised Sharpe ratio based on the daily
    returns of an equity
    """
    pdf = make_portfolio(ticker)
    pdf = pd.DataFrame(pdf)
    pdf['daily_ret'] = pdf['adjClose'].pct_change()
    pdf['excess_daily_ret'] = pdf['daily_ret'] - rf / 252
    return annual_sharpe(pdf['excess_daily_ret'])
Exemplo n.º 5
0
def CAPM(ticker, benchmark, start='2016-09-27'):
    import statsmodels.regression.linear_model as lm
    import statsmodels.tools.tools as ct

    df = make_portfolio([ticker, benchmark], start=start)
    ticker_df = df[ticker].pct_change()[1:]
    bench_df = df[benchmark].pct_change()[1:]
    const = ct.add_constant(bench_df)
    capm = lm.OLS(ticker_df, const)
    results = capm.fit()
    return results.summary()
Exemplo n.º 6
0
def beta(ticker, benchmark, start='2016-09-27'):
    '''A stock's beta coefficient is a measure of its volatility over time compared to a market benchmark.
    A beta of 1 means that a stock's volatility matches up exactly with the markets.
    A higher beta indicates great volatility, and a lower beta indicates less volatility.
    :param ticker: ticker of our stocks
    :param benchmark: benchmark - for most of big USA stocks we will consider SPY or DOW
    '''
    # we use our function to download stock data from tiingo API
    df = make_portfolio([ticker, benchmark], start=start)
    # we calculate pct changes for our ticker (x[0] - x[-1])/x[-1]
    ticker_df = df[ticker].pct_change()[1:]
    # we calculate pct changes for our benchmark (x[0] - x[-1])/x[-1]
    bench_df = df[benchmark].pct_change()[1:]
    # Compare how the stock and the index move relative to each other with a covariance formula
    covariance_matrix = np.cov([ticker_df, bench_df])
    cov = covariance_matrix[0, 1]  # covariance of stocks and index
    var = covariance_matrix[1, 1]  # the variance of the index alone.
    # Beta = Covariance of stocks and index / variance of index
    beta = cov / var
    alpha = np.mean(ticker_df) - beta * np.mean(bench_df)

    return round(float(beta), 4)
Exemplo n.º 7
0
def capm(ticker, benchmark, start='2016-09-27'):
    '''Beta (ang. beta, risk factor) – współczynnik statystyczny,
    ustalający stopień korelacji pomiędzy zwrotem z inwestycji w akcje danej spółki,
    a hipotetycznej inwestycji w indeks rynku lub z określonego pakietu akcji różnych spółek.'''
    df = make_portfolio([ticker, benchmark], start=start)
    ticker_df = df[ticker].pct_change()[1:]
    bench_df = df[benchmark].pct_change()[1:]
    beta, intercept, r_value, p_value, std_err = stats.linregress(
        bench_df, ticker_df)
    #print(beta,intercept,r_value**2,p_value,std_err)
    bet = round(float(beta), 4)
    r2 = round(float(r_value**2), 4)
    f, ax = plt.subplots(1, figsize=(15, 10))
    ax.scatter(ticker_df, bench_df, label='Data', c='blue')
    b, a = np.polyfit(bench_df, ticker_df, deg=1)
    ax.plot(bench_df, b * bench_df + a, color='r', label='Capital Market Line')
    plt.title('Capital Asset Pricing Model')
    plt.xlabel('Market Returns ')
    plt.ylabel('Stock Returns')
    plt.text(0.045, 0.045, r'$R_i = \beta * R_m + \alpha$', fontsize=14)
    plt.text(-0.08, 0.06, f'R Squared = {r2}\nBeta = {bet}', fontsize=14)

    plt.show()