SkillAgentSearch skills...

Stock Analysis

Simple to use interfaces for basic technical analysis of stocks.

Install / Use

npx skills add stefmolin/stock-analysis

Installs into whichever agent you are using.

README

Stock Analysis

Package for making elements of technical analysis of a stock easier from the book Hands-On Data Analysis with Pandas. This package is meant to be a starting point for you to develop your own. As such, all the instructions for installing/setup will be assuming you will continue to develop on your end.

Setup

# should install requirements.txt packages
$ pip3 install -e stock-analysis # path to top level where setup.py is

# if not, install them explicitly
$ pip3 install -r requirements.txt

Usage

This section will show some of the functionality of each class; however, it is by no means exhaustive.

Getting data

from stock_analysis import StockReader

reader = StockReader('2017-01-01', '2018-12-31')

# get bitcoin data in USD
bitcoin = reader.get_bitcoin_data('USD')

# get faang data
fb, aapl, amzn, nflx, goog = (
    reader.get_ticker_data(ticker)
    for ticker in ['META', 'AAPL', 'AMZN', 'NFLX', 'GOOG']
)

# get S&P 500 data
sp = reader.get_index_data('S&P 500')

Grouping data

from stock_analysis.utils import group_stocks, describe_group

faang = group_stocks(
    {
        'Facebook': fb,
        'Apple': aapl,
        'Amazon': amzn,
        'Netflix': nflx,
        'Google': goog
    }
)

# describe the group
describe_group(faang)

Building a portfolio

Groups assets by date and sums columns to build a portfolio.

from stock_analysis.utils import make_portfolio

faang_portfolio = make_portfolio(faang)

Visualizing data

Be sure to check out the other methods here for different plot types, reference lines, shaded regions, and more!

Single asset

Evolution over time:

import matplotlib.pyplot as plt
from stock_analysis import StockVisualizer

netflix_viz = StockVisualizer(nflx)

ax = netflix_viz.evolution_over_time(
    'close',
    figsize=(10, 4),
    legend=False,
    title='Netflix closing price over time'
)
netflix_viz.add_reference_line(
    ax,
    x=nflx.high.idxmax(),
    color='k',
    linestyle=':',
    label=f'highest value ({nflx.high.idxmax():%b %d})',
    alpha=0.5
)
ax.set_ylabel('price ($)')
plt.show()
<img src="images/netflix_line_plot.png?raw=true" align="center" width="600" alt="line plot with reference line">

After hours trades:

netflix_viz.after_hours_trades()
plt.show()
<img src="images/netflix_after_hours_trades.png?raw=true" align="center" width="800" alt="after hours trades plot">

Differential in closing price versus another asset:

netflix_viz.fill_between_other(fb)
plt.show()
<img src="images/nflx_vs_fb_closing_price.png?raw=true" align="center" width="600" alt="differential between NFLX and FB">

Candlestick plots with resampling (uses mplfinance):

netflix_viz.candlestick(resample='2W', volume=True, xrotation=90, datetime_format='%Y-%b -')
<img src="images/candlestick.png?raw=true" align="center" width="600" alt="resampled candlestick plot">

Note: run help() on StockVisualizer for more visualizations

Asset groups

Correlation heatmap:

from stock_analysis import AssetGroupVisualizer

faang_viz = AssetGroupVisualizer(faang)
faang_viz.heatmap(True)
<img src="images/faang_heatmap.png?raw=true" align="center" width="450" alt="correlation heatmap">

Note: run help() on AssetGroupVisualizer for more visualizations. This object has many of the visualizations of the StockVisualizer class.

Analyzing data

Below are a few of the metrics you can calculate.

Single asset

from stock_analysis import StockAnalyzer

nflx_analyzer = StockAnalyzer(nflx)
nflx_analyzer.annualized_volatility()

Asset group

Methods of the StockAnalyzer class can be accessed by name with the AssetGroupAnalyzer class's analyze() method.

from stock_analysis import AssetGroupAnalyzer

faang_analyzer = AssetGroupAnalyzer(faang)
faang_analyzer.analyze('annualized_volatility')

faang_analyzer.analyze('beta', index=sp)

Modeling

from stock_analysis import StockModeler

Time series decomposition

decomposition = StockModeler.decompose(nflx, 20)
fig = decomposition.plot()
plt.show()
<img src="images/nflx_ts_decomposition.png?raw=true" align="center" width="450" alt="time series decomposition">

ARIMA

Build the model:

arima_model = StockModeler.arima(nflx, ar=10, i=1, ma=5)

Check the residuals:

StockModeler.plot_residuals(arima_model)
plt.show()
<img src="images/arima_residuals.png?raw=true" align="center" width="650" alt="ARIMA residuals">

Plot the predictions:

arima_ax = StockModeler.arima_predictions(
    nflx, arima_model,
    start='2019-01-01', end='2019-01-07',
    title='ARIMA'
)
plt.show()
<img src="images/arima_predictions.png?raw=true" align="center" width="450" alt="ARIMA predictions">

Linear regression

Build the model:

X, Y, lm = StockModeler.regression(nflx)

Check the residuals:

StockModeler.plot_residuals(lm)
plt.show()
<img src="images/lm_residuals.png?raw=true" align="center" width="650" alt="linear regression residuals">

Plot the predictions:

linear_reg = StockModeler.regression_predictions(
    nflx, lm,
    start='2019-01-01', end='2019-01-07',
    title='Linear Regression'
)
plt.show()
<img src="images/lm_predictions.png?raw=true" align="center" width="450" alt="linear regression predictions">

About the Author

Stefanie Molin (@stefmolin) is a software engineer and data scientist at Bloomberg in New York City, where she tackles tough problems in information security, particularly those revolving around data wrangling/visualization, building tools for gathering data, and knowledge sharing. She is also the author of Hands-On Data Analysis with Pandas, which is currently in its second edition and has been translated into Korean. She holds a bachelor’s of science degree in operations research from Columbia University's Fu Foundation School of Engineering and Applied Science, as well as a master’s degree in computer science, with a specialization in machine learning, from Georgia Tech. In her free time, she enjoys traveling the world, inventing new recipes, and learning new languages spoken among both people and computers.

Related Skills

View on GitHub
GitHub Stars372
CategoryDevelopment
Updated12d ago
Forks136

Languages

Python

Security Score

100/100

Audited on Jul 26, 2026

No findings