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'])
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()
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)
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'])
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()
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)
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()