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 matplotlibCore 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()