""" 成交量指标 — OBV、VWAP 所有函数返回与输入等长的 list[float],不足周期位置填 0.0。 """ def obv(close: list[float], volume: list[float]) -> list[float]: """能量潮 (On-Balance Volume, OBV) 从 0 开始累加: - 收盘价 > 前收盘价:OBV += 成交量 - 收盘价 < 前收盘价:OBV -= 成交量 - 收盘价 == 前收盘价:OBV 不变 Args: close: 收盘价序列 volume: 成交量序列 Returns: 与输入等长的 OBV 序列 """ n = len(close) result = [0.0] * n if n == 0: return result result[0] = volume[0] for i in range(1, n): if close[i] > close[i - 1]: result[i] = result[i - 1] + volume[i] elif close[i] < close[i - 1]: result[i] = result[i - 1] - volume[i] else: result[i] = result[i - 1] return result def vwap( high: list[float], low: list[float], close: list[float], volume: list[float], ) -> list[float]: """成交量加权平均价 (VWAP) 累积计算:VWAP = Σ(典型价格 × 成交量) / Σ(成交量) 典型价格 = (high + low + close) / 3 Args: high: 最高价序列 low: 最低价序列 close: 收盘价序列 volume: 成交量序列 Returns: 与输入等长的 VWAP 序列(从第一个有效 bar 开始累加) """ n = len(close) result = [0.0] * n if n == 0: return result cum_pv = 0.0 # cumulative price * volume cum_vol = 0.0 # cumulative volume for i in range(n): typical_price = (high[i] + low[i] + close[i]) / 3.0 cum_pv += typical_price * volume[i] cum_vol += volume[i] if cum_vol > 0: result[i] = cum_pv / cum_vol return result