auto-sync: 2026-05-31 19:10:58
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user