CodeForFinance
Python

Algorithmic Trading Basics with Python

Introduction to algorithmic trading with Python. Backtesting, strategy development, and connecting to broker APIs.

Getting Started

pip install pandas numpy yfinance matplotlib

Core Implementation

import pandas as pd
import numpy as np
import yfinance as yf

# Simple Moving Average Crossover Strategy
def sma_crossover_backtest(ticker, short_window=20, long_window=50, period="2y"):
    # Get data
    data = yf.download(ticker, period=period)

    # Calculate moving averages
    data["SMA_Short"] = data["Close"].rolling(window=short_window).mean()
    data["SMA_Long"] = data["Close"].rolling(window=long_window).mean()

    # Generate signals
    data["Signal"] = 0
    data.loc[data["SMA_Short"] > data["SMA_Long"], "Signal"] = 1   # Buy
    data.loc[data["SMA_Short"] <= data["SMA_Long"], "Signal"] = -1  # Sell

    # Calculate returns
    data["Daily_Return"] = data["Close"].pct_change()
    data["Strategy_Return"] = data["Signal"].shift(1) * data["Daily_Return"]

    # Cumulative returns
    data["Buy_Hold"] = (1 + data["Daily_Return"]).cumprod()
    data["Strategy"] = (1 + data["Strategy_Return"]).cumprod()

    return data.dropna()

results = sma_crossover_backtest("AAPL")
print(f"Buy & Hold Return: {(results['Buy_Hold'].iloc[-1] - 1) * 100:.1f}%")
print(f"Strategy Return: {(results['Strategy'].iloc[-1] - 1) * 100:.1f}%")

Extended Example

# Plot the results
import matplotlib.pyplot as plt

fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(14, 10), gridspec_kw={"height_ratios": [3, 1]})

# Price and moving averages
ax1.plot(results.index, results["Close"], label="Price", alpha=0.7)
ax1.plot(results.index, results["SMA_Short"], label="20 SMA", linewidth=1)
ax1.plot(results.index, results["SMA_Long"], label="50 SMA", linewidth=1)
ax1.set_title("SMA Crossover Strategy")
ax1.legend()
ax1.set_ylabel("Price")

# Cumulative returns comparison
ax2.plot(results.index, results["Buy_Hold"], label="Buy & Hold")
ax2.plot(results.index, results["Strategy"], label="Strategy")
ax2.legend()
ax2.set_ylabel("Cumulative Return")

plt.tight_layout()
plt.savefig("backtest_results.png", dpi=150)
plt.show()

Developer Essentials

As an Amazon Associate we may earn from qualifying purchases.