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