From 2c875414581f1b6ec6cbbf64301b7e8237f250a3 Mon Sep 17 00:00:00 2001 From: cfdaily Date: Sun, 31 May 2026 19:10:58 +0800 Subject: [PATCH] auto-sync: 2026-05-31 19:10:58 --- indicators/bollinger.py | 46 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 indicators/bollinger.py diff --git a/indicators/bollinger.py b/indicators/bollinger.py new file mode 100644 index 000000000..ae855452e --- /dev/null +++ b/indicators/bollinger.py @@ -0,0 +1,46 @@ +""" +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