Price Charts with Technical Indicators
Calculating Stock Price Indicators using FINTA python library, and visualizing using plotly python library.
Image credits to Markus Spiske - Unsplash photos
There are a couple of libraries to use to calculate technical indicators for stocks. In previous posts, we had tried out the following python libraries:
mplfinance
TA-lib
In this post we will be looking at the finta library.
!pip install finta
from pandas_datareader import data
import numpy as np
from datetime import datetime
from datetime import date, timedelta
import pandas as pd
# import ipwidgets library and functions
from __future__ import print_function
from ipywidgets import interact, interactive, fixed
import ipywidgets as widgets
from IPython.display import display
from finta import TA
#tickers = ('MMM', 'AOS', 'AAN', 'ABB', 'ABT', 'ABBV', 'ABM', 'ACN', 'AYI', 'GOLF', 'ADCT', 'ADT', 'AAP', 'ADSW', 'WMS', 'ACM', 'AEG', 'AER', 'AJRD', 'AMG', 'AFL', 'AGCO', 'A', 'AEM', 'ADC', 'AL', 'APD', 'AGI', 'ALK', 'ALB', 'ACI', 'AA', 'ALC', 'ARE', 'AQN', 'BABA', 'Y')
#tickers = ('ARKF', 'ARKG', 'ARKK', 'ARKW', 'QQQ','TQQQ', 'VCR', "KARS", 'ZNGA')
tickers = ('SOXX', 'SOXL', 'TQQQ', 'QQQ', 'ARKK', 'ARKW', 'FDN', 'XLY', 'VCR', 'FPX', 'SMH')
stock_ticker = widgets.Dropdown(
options= tickers,
description='Select Stock Ticker',
disabled=False,
style = {'description_width': 'initial'},
layout = {'width': '200px'}
)
# create selection slider for days
w = widgets.IntSlider(
value=90,
min=5,
max=365,
step=1,
description = 'Calendar days',
disabled=False,
continuous_update=False,
orientation='horizontal',
readout=True,
readout_format='d',
style = {'description_width': 'initial','handle_color' : 'blue'},
layout = {'width': '400px'}
)
# create function for time frame of selected calendar days from today
def timeframe(w):
days = timedelta(w)
start = date.today() - days
today = date.today()
print('Start Date: ',start, ' ' ,'Last Date: ',today)
dates = widgets.interactive_output(timeframe, {'w': w} )
display(stock_ticker, w, dates)
v = widgets.Text(
value=stock_ticker.value,
description='Stockticker:',
disabled=True
)
# create function to load stock data from yahoo
def load_stock_data(stock_ticker, w):
start = date.today() - timedelta(w)
today = date.today()
stock_data = data.DataReader(stock_ticker, start=start, end=today, data_source='yahoo')
return stock_data
# create dataframe for selected stock
stock = load_stock_data(stock_ticker.value, w.value)
# display ticker and dataframe
display(v, stock)
ohlcv = stock[['Open', 'High', 'Low', 'Close', 'Volume']] # select the columns in the order required
ohlcv.columns = ['open', 'high', 'low', 'close', 'volume'] # rename the columns
ohlcv
ex_df = ohlcv.copy()
ex_df['RSI'] = TA.RSI(ex_df)
ex_df['Simple_Moving_Average_50'] = TA.SMA(ex_df, 50)
ex_df[['macd', 'macd_s']] = TA.MACD(ex_df)
ex_df
def create_dataframe(df):
"""
This function creates a Dataframe for key indicators
"""
df['Daily_Returns'] = df['close'].pct_change() # create column for daily returns
df['Price_Up_or_Down'] = np.where(df['Daily_Returns'] < 0, -1, 1) # create column for price up or down
# add columns for the volatility and volume indicators
df['Average_True_Range'] = TA.ATR(df)
df['On_Balance_Volume'] = TA.OBV(df)
df['Volume_Flow_Indicator'] = TA.VFI(df)
## add column for moving averages
df['Simple_Moving_Average_50'] = TA.SMA(df, 50)
#df['Simple_Moving_Average_200'] = TA.SMA(df, 200)
df['Volume Weighted Average Price'] = TA.VWAP(df)
df['Exponential_Moving_Average_50'] = TA.EMA(df, 50)
# add columns for momentum indicators
df['ADX'] = TA.ADX(df) #create column for ADX assume timeperiod of 14 days
df['RSI'] = TA.RSI(df) #create column for RSI assume timeperiod of 14 days
df['William %R'] = TA.WILLIAMS(df) #create column for William %R use high, low and close, and assume timeperiod of 14 days
df['MFI'] = TA.MFI(df) #create column for MFI use high, low and close, and assume timeperiod of 14 days
df['MOM'] = TA.MOM(df)
df[['macd', 'macd_signal']] = TA.MACD(df)
return df # return the dataframe
stocks_df = create_dataframe(df = ohlcv)
stocks_df
import plotly.graph_objects as go
fig_ohlc = go.Figure(data=[go.Ohlc(x=stocks_df.index,
open=stocks_df['open'],
high=stocks_df['high'],
low=stocks_df['low'],
close=stocks_df['close'], showlegend=False)])
fig_ohlc.update_layout(title = 'Price Action Chart', yaxis_title = 'Stock Price', template = 'presentation')
fig_ohlc.update(layout_xaxis_rangeslider_visible=False)
display(v)
fig_ohlc.show()
import plotly.graph_objects as go
fig_candle = go.Figure(data=[go.Candlestick(x=stocks_df.index,
open=stocks_df['open'],
high=stocks_df['high'],
low=stocks_df['low'],
close=stocks_df['close'], showlegend=False)])
fig_candle.update_layout(title = 'Price Action Chart', yaxis_title = 'Stock Price', template = 'presentation')
fig_candle.update(layout_xaxis_rangeslider_visible=False)
display(v)
fig_candle.show()
import plotly.graph_objects as go
trace1 = go.Scatter(x=stocks_df.index, y=stocks_df['macd'], mode='lines', marker=dict(color="green"), showlegend=True, name='macd')
trace2 = go.Scatter(x=stocks_df.index, y=stocks_df['macd_signal'], mode='lines', marker=dict(color="blue"), showlegend=True, name='macd_signal')
data= [trace1, trace2]
layout = go.Layout(title = 'MACD indicator')
fig = go.Figure(data=data, layout=layout)
fig.show()
References
Plotly Figure Reference accessed October 22, 2020.
FinTA (Financial Technical Analysis) python library accessed October 22, 2020.