47 lines
1.0 KiB
Python
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
|