import yfinance as yf
import numpy as np
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.arima.model import ARIMA as arima
import ta
import seaborn as sb
import pandas as pd
from datetime import datetime as dt
from datetime import timedeltaDownload stock prices from Yahoo Finance
end_time = dt.now()
start_time = end_time - timedelta(days=365*2)
tickers = 'SPY, MSFT, META, NVDA, AMD'
popular5 = yf.download(tickers, start = start_time, end = end_time)[*********************100%%**********************] 5 of 5 completed
Calculate indicators Bollinger Bands & RSI, buy/sell points, and visualize
def calculate_indicators(historical_close):
historical_close_ma20 = historical_close.rolling(20).mean()
std = historical_close.rolling(20).std()
upper = historical_close_ma20 + 2* std
lower = historical_close_ma20 - 2*std
rsi14 = ta.momentum.rsi(historical_close, 14)
# put indicators in a dataframe
df = pd.concat([historical_close, upper, lower, rsi14], axis=1)
df.columns = ['close','upper','lower','rsi']
df['signal']='no action'
df.loc[(df['close'] < df['lower']) & (df['rsi']<30), 'signal'] = 'buy'
df.loc[(df.close>df.upper) & (df.rsi > 70), 'signal'] = 'sell'
# print(df.query('signal == "buy"').shape[0])
# print(df.query('signal == "sell"').shape[0])
# visualize
fig = plt.figure(figsize = (15,6))
ax = fig.add_axes([0.1,0.1,0.9,0.9])
ax.plot(historical_close.index, historical_close.values, label = 'daily close')
ax.plot(historical_close_ma20.index, historical_close_ma20.values)
ax.plot(upper.index, upper.values, label='upper Bollinger')
ax.plot(lower.index, lower.values, label='lower Bollinger')
ax2 = ax.twinx()
ax2.plot(rsi14, alpha=0.3)
ax2.axhline(y=70, ls='--', alpha=0.5, c='r')
ax2.axhline(y=30, ls='--', alpha=0.5, c='g')
ax.set_title(f'{symbol} Prices & Indicators', fontsize=25)
ax2.set_ylabel('RSI', fontsize=15)
ax.set_ylabel('Price', fontsize=15)
ax.xaxis.set_tick_params(labelsize=15)
ax.yaxis.set_tick_params(labelsize=15)
ax2.yaxis.set_tick_params(labelsize=15)
ax.legend()
# draw arrow
signal_colors = {'buy':'green', 'sell':'red'}
# signal_offsets = {'buy':pd.Timedelta(days=-40), 'sell':pd.Timedelta(days=40)}
y_offsets = {'buy':-20, 'sell':20}
signal_offsets = {'buy':pd.Timedelta(days=-40), 'sell':pd.Timedelta(days=40)}
for signal, color in signal_colors.items():
signal_data = df[df['signal']==signal]
ax.scatter(signal_data.index, signal_data.close, marker='o', s=90, c=color, label=signal)
time_deltas = signal_data.replace(signal_offsets)
y_ends = signal_data.close - 1
for i, row in signal_data.iterrows():
x_end = i
# x_start = x_end + time_deltas['signal'].loc[i]
x_start = x_end + pd.Timedelta(days=-40)
y_start = y_ends[i] + y_offsets[signal]
y_end = y_ends[i]
ax.annotate(signal_data.signal[i], xy=(x_end, y_end), xytext=(x_start, y_start), arrowprops=
dict(facecolor=signal_colors[row['signal']], shrink=0.1, lw=2))Pick a stock
symbol = 'SPY'
ts = popular5['Close'][symbol]
calculate_indicators(ts)returns = ts.pct_change()*100
plot_pacf(returns[1:], zero=False, auto_ylims=True);Calculate returns
position=False
portfolio_value = 1.0
for index, row in df_tsla.iterrows():
if not position and row.signal == 'buy':
position = True
entry = row.close
if position:
if (row.signal == 'sell' or row.close < entry*0.9):
position = False
exit = row.close
portfolio_value *= (exit - entry)/entry + 1
print(f'return = {portfolio_value}')
return = 3.412705492910159
Pages: 1 2