(4/5) MACD Indicator: Python Implementation and Technical Analysis

This is the fourth article in our pursuit of understanding technical analysis and indicators using Python. We have already learned Technical Analysis, the Moving Average Crossover strategy, and the Relative Strength Indicator (RSI).

In this article, we will learn about the Moving Average Convergence and Divergence (MACD) indicator and understand it using Python and its libraries.

MACD, or Moving Average Convergence Divergence, is a popular technical analysis indicator that helps identify trends in asset price movements. It consists of two lines: the MACD line, which is the difference between short-term and long-term exponential moving averages (EMAs), and the signal line, which is an EMA of the MACD line itself. Traders use MACD to generate buy and sell signals based on the crossovers and divergences between these lines.

Recommended: Understanding the Capital Asset Pricing Model (CAPM)

Recommended: Empirical Distribution in Python: Histograms, CDFs, and PMFs

Understanding MACD: Components and Interpretation

MACD, or Moving Average Convergence Divergence, is a famous technical analysis indicator. It essentially depicts trends in the price movement of an asset.

MACD Indicator
MACD Indicator

The MACD line shows the difference between the long-term EMA ( Exponential Moving Average ) and the short-term EMA. The short-term EMA’s period is 12, whereas the long-term EMA’s is generally 26.

In addition to that, we also have a signal line, which is a 9-day EMA. It gives us signals on when to trade. In the image above, the red line is the signal line and the blue line is the MACD line.

Whenever the MACD line crosses the signal line upwards, it essentially signals that the stock will have a bullish run. Similarly, when the MACD line crosses the signal line downwards, it signals that the stock price will fall.

Now we know that the indicator is about convergence and divergence, as mentioned in its name. There are two types of divergence: bullish and bearish.

Bullish divergence occurs when the signal and MACD lines move away when the signal is bullish. Similarly in bearish divergence, signal and MACD lines move away when the signal is bearish.

Let us move on to the next segment, which discusses implementing the MACD line in Python.

Implementing MACD in Python: Code Examples and Explanations

In the code below, we have randomly generated stock prices for 500 days. We have calculated the MACD line which is the difference between the 12-day EMA and the 26-day EMA. We have also plotted the signal lines.

import numpy as np
import matplotlib.pyplot as plt

def generate_stock_prices(n=500, start_price=100, volatility=0.05):
    prices = [start_price]
    for _ in range(1, n):
        price = prices[-1] * (1 + np.random.normal(0, volatility))
        prices.append(price)
    return prices

def calculate_macd(prices, short_window=12, long_window=26, signal_window=9):
    short_ema = np.mean(prices[-short_window:])
    long_ema = np.mean(prices[-long_window:])
    macd_line = short_ema - long_ema
    signal_line = np.mean(macd_values[-(signal_window + 1):-1])
    return macd_line, signal_line

# Generate random stock prices
stock_prices = generate_stock_prices()

# Calculate MACD
macd_values = []
signal_values = []
for i in range(26, len(stock_prices)):
    macd, signal = calculate_macd(stock_prices[:i+1])
    macd_values.append(macd)
    signal_values.append(signal)

# Plot stock prices
plt.figure(figsize=(12, 6))
plt.plot(stock_prices, label='Stock Prices', color='blue')

# Plot MACD and Signal lines
plt.plot(range(26, len(stock_prices)), macd_values, label='MACD Line', color='red')
plt.plot(range(26, len(stock_prices)), signal_values, label='Signal Line', color='green')

plt.title('Stock Prices and MACD Indicator')
plt.xlabel('Days')
plt.ylabel('Price')
plt.legend()
plt.grid(True)
plt.show()

Let us look at the output of the code above.

MACD Indicator Output
MACD Indicator Output

From the output above, the red line is the MAD line, and the green line is the signal line. Let us now look at the code, which will take a CSV file as the input and can be downloaded from Yahoo Finance.

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

def calculate_macd(prices, short_window=12, long_window=26, signal_window=9):
    short_ema = prices.ewm(span=short_window, min_periods=short_window, adjust=False).mean()
    long_ema = prices.ewm(span=long_window, min_periods=long_window, adjust=False).mean()
    macd_line = short_ema - long_ema
    signal_line = macd_line.ewm(span=signal_window, min_periods=signal_window, adjust=False).mean()
    return macd_line, signal_line

# Read stock prices from CSV
data = pd.read_csv('stock_prices.csv')  # Replace 'stock_prices.csv' with your file name

# Assuming the CSV file has a column named 'Close' containing the closing prices
prices = data['Close']

# Calculate MACD
macd_line, signal_line = calculate_macd(prices)

# Plot stock prices
plt.figure(figsize=(12, 6))
plt.plot(prices, label='Stock Prices', color='blue')

# Plot MACD and Signal lines
plt.plot(macd_line, label='MACD Line', color='red')
plt.plot(signal_line, label='Signal Line', color='green')

plt.title('Stock Prices and MACD Indicator')
plt.xlabel('Days')
plt.ylabel('Price')
plt.legend()
plt.grid(True)
plt.show()

Conclusion

This article dived into the MACD indicator and its significance in technical analysis. By leveraging the power of Python and its libraries, we gained a deeper understanding of how MACD works and how to implement it in code.

With the knowledge and tools available, you can now analyze stock prices and generate valuable insights using the MACD indicator. Whether you’re a seasoned trader or just starting your journey in technical analysis, MACD can be a powerful ally in your arsenal.

As you continue to explore the realm of technical indicators, consider this: How can you combine MACD with other indicators and strategies to make more informed trading decisions? The possibilities are endless; the key lies in continuous learning and experimentation.

Happy analyzing and happy trading!

Recommended: How to Scrape Yahoo Finance Data in Python using Scrapy

Recommended: 10 PyJanitor’s Miscellaneous Functions for Enhancing Data Cleaning

Ninad Pathak
Ninad Pathak

Ninad is a Python and PHP developer turned writer out of passion. Over the last 6+ years, he has written for brands including DigitalOcean, DreamHost, Hostinger, and many others. When not working, you'll find him tinkering with open-source projects, vibe coding, or on a mountain trail, completely disconnected from tech.

Articles: 39