""" Bollinger Bands 计算函数 Author: 张飞 翼德 Date: 2026-05-31 """ import math from typing import List, Tuple def calc_bollinger( closes: List[float], period: int = 20, num_std: float = 2.0, ) -> Tuple[List[float], List[float], List[float]]: """计算布林带指标。 Args: closes: 收盘价序列 period: SMA 周期,默认 20 num_std: 标准差倍数,默认 2.0 Returns: (upper, middle, lower) 三列表。 数据不足 period 时返回 ([], [], [])。 """ n = len(closes) if period <= 0 or n < period: return [], [], [] upper: List[float] = [] middle: List[float] = [] lower: List[float] = [] for i in range(period - 1, n): window = closes[i - period + 1 : i + 1] avg = sum(window) / period variance = sum((x - avg) ** 2 for x in window) / period std = math.sqrt(variance) middle.append(avg) upper.append(avg + num_std * std) lower.append(avg - num_std * std) return upper, middle, lower