Files
sanguo_quant_live/indicators/bollinger.py
T
2026-05-31 19:10:58 +08:00

47 lines
1.0 KiB
Python

"""
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