## Finance: Leaning Stochastic Oscillator, python, yfinance, pandas_ta, plotly.graph_objects

By mishou Apr 22, 2023

Last Updated on April 30, 2023 by mishou

## I. Using yfinance + dictionary + matplotlib

### I.1. Getting historic pricing data using yfinance

Load the data and get the pricing data for NASDAQ:

``````!pip install yfinance
import yfinance as yf
import pandas as pd
import datetime
# set the start and end dates
start_date = '2022-01-01'
end_date = datetime.date.today().strftime('%Y-%m-%d')
# load the data and create a dictionary
# list the ticker symbols
ticker_ls = ["^IXIC", "^DJI", "^GSPC"]
# create a dictionary for each data frame
dic_df = {}
for ticker in ticker_ls:
nasdaq = dic_df['^IXIC']``````

### I.2. Creating a stochastic oscillator function from scratch

You can learn the code from the tutorial linked below:

Create a stochastic oscillator in Python

``````def add_stochastic_oscillator(df, periods=14):
copy = df.copy()

high_roll = copy["High"].rolling(periods).max()
low_roll = copy["Low"].rolling(periods).min()

# Fast stochastic indicator
num = copy["Close"] - low_roll
denom = high_roll - low_roll
copy["%K"] = (num / denom) * 100

# Slow stochastic indicator
copy["%D"] = copy["%K"].rolling(3).mean()

return copy``````

Adding %K and %D to NASDAQ prices:

``````nasdaq_kd = add_stochastic_oscillator(nasdaq, periods=14)
nasdaq_kd``````

### I.3. Creating Stochastic Oscillator plot using matplotlib

``````import datetime
import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
today = datetime.datetime.now()
date_pattern = "%Y-%m-%d"
today_str = today.strftime(date_pattern)
date_ranges = {
"1M": (today - datetime.timedelta(days=30)).strftime(date_pattern),
"3M": (today - datetime.timedelta(days=90)).strftime(date_pattern),
"6M": (today - datetime.timedelta(days=180)).strftime(date_pattern),
"1Y": (today - datetime.timedelta(days=365)).strftime(date_pattern),
"2Y": (today - datetime.timedelta(days=2*365)).strftime(date_pattern),
}
def plot_stochastic_oscillator(df, symbol, rng, periods=14):
start = date_ranges[rng]
end = today_str
temp_df = df[start:end]

fig, ax = plt.subplots(nrows=2, ncols=1, sharex=True, tight_layout=True, figsize=(12, 6))

ax[0].set_title(f"{symbol} price, {rng}")
ax[0].plot(temp_df["Close"], color="tab:blue")

ax[1].set_title(f"{symbol} Stochastic Oscillator ({periods}-day period), {rng}")
ax[1].set_ylim(-10, 110)
ax[1].plot(temp_df["%K"], color="tab:blue") # fast
ax[1].plot(temp_df["%D"], color="tab:orange") # slow

ax[1].axhline(80, color="tab:red", ls="--")
ax[1].axhline(20, color="tab:green", ls="--")

custom_lines = [
Line2D([0], [0], color="tab:blue", lw=4),
Line2D([0], [0], color="tab:orange", lw=4),
Line2D([0], [0], color="tab:red", lw=4),
Line2D([0], [0], color="tab:green", lw=4),
]
ax[1].legend(custom_lines, ["%K", "%D", "Overbought", "Oversold"], loc="best")``````

Show the plot:

## II. Using finance, pandas_ta, and plotly.graph_objects

You can learn the code here:

Using the Stochastic Oscillator in Python for Algorithmic Trading

You can see all the code above here on Google Colaboratory: