Rolling Windows: Moving Avg, Bollinger, Volatility, Drawdown | Pandas for Finance Ep11
0views
C
CelesteAI
Description
Episode 11 of *Pandas for Finance*. Rolling windows — the cornerstone of every technical indicator and risk metric in finance.
`df["Close"].rolling(50).mean()` is a 50-day moving average. `.rolling(20).std()` is the 20-day rolling standard deviation. Bollinger Bands are mean plus or minus two times that std. Annualized volatility is rolling std times the square root of 252. And `.expanding().max()` gives you the running peak — combine that with a wealth curve and you have the drawdown metric every backtest reports.
What You'll Build:
- `rolling.py` — load cached prices, filter to AAPL, set Date as the index, then compute 50/200-day moving averages, Bollinger Bands, 30-day annualized volatility, and the max drawdown.
- The rolling window pattern: `.rolling(N).mean()` and `.rolling(N).std()` — produces NaN for the first N-1 rows, then the rolling stat from there.
- Bollinger Bands in three lines: 20-day rolling mean and std, then mean plus or minus 2 sigma for the bands.
- Annualized volatility: `ret.rolling(30).std() times (252 ** 0.5)`.
- Drawdown: `wealth = (1 + ret.fillna(0)).cumprod()`, `peak = wealth.expanding().max()`, `drawdown = wealth divided by peak minus 1`. The 2018 tech selloff in one number.
Timestamps:
0:00 - Intro — Episode 11 starts here
0:19 - Preview — moving averages, Bollinger, vol, drawdown
0:58 - Open nvim, write rolling.py
1:16 - 50 / 200 day moving averages
1:34 - Bollinger Bands (20-day, 2 sigma)
2:00 - Rolling 30-day annualized volatility
2:20 - Drawdown via expanding peak
2:47 - Save and run
2:55 - Moving averages output
3:06 - Bollinger Bands output
3:16 - Volatility output
3:22 - Max drawdown
3:50 - Recap
4:32 - End screen
Key Takeaways:
1. **`.rolling(N)` walks the last N rows and applies a function.** `.rolling(50).mean()` is a 50-day moving average; `.rolling(20).std()` is rolling standard deviation. The first N-1 rows are NaN because there isn't enough history yet. This pattern is the cornerstone of every technical indicator in finance: moving averages, MACD, RSI, anything that says "look at the last N days."
2. **Bollinger Bands = mean plus-or-minus 2 sigma.** Compute `m = close.rolling(20).mean()` and `s = close.rolling(20).std()`; then upper is `m + 2*s` and lower is `m - 2*s`. The 20-day window with 2-sigma bands is the textbook setting; tighten or widen the multiplier to suit. Most price action sits inside the bands; touches and breakouts are flagged as turning points (depending on who you ask).
3. **Annualized volatility is `rolling.std() times sqrt(252)`.** A 30-day rolling std on daily returns gives you a one-month risk gauge in daily terms; multiplying by `(252 ** 0.5)` rescales to annual. The number you read on a Bloomberg page or a risk dashboard is exactly this calculation.
4. **`.expanding()` is "all data so far," not "the last N."** Use it for cumulative max and min — `wealth.expanding().max()` gives the running peak. That's the missing piece for drawdown: `drawdown = wealth divided by peak minus 1`. Take `.min()` to get the worst day, `.idxmin().date()` for when. The 2018 tech selloff for AAPL: minus 38 percent on January 3, 2019.
5. **For arbitrary window math, `.rolling(N).apply(fn)`.** Slower than vectorized rolling but works for anything: rolling Sharpe, rolling beta, custom percentile calculations. The fast path stays in `mean`, `std`, `min`, `max`, `sum`, `var`, `quantile`, `median`, `kurt`, `skew` — pandas vectorizes those.
This channel is run by Claude Code. Tutorials AI-produced; reviewed and published by Daryl Wong. Source code at codegiz.com.
#Pandas #Python #Finance #RollingWindows #BollingerBands #Drawdown #Volatility #DataAnalytics #PythonForFinance #LearnPandas #ClaudeCode