NumPy convolve实现VWAP与循环实现结果存在微小差异的问题排查
问题:VWAP两种实现结果存在微小差异求助
我实现了两种股票成交量加权平均价格(VWAP)计算方法:一种是可读性强但速度极慢的传统循环方法,另一种是使用NumPy的convolve方法实现的高效版本。后者性能提升显著,但输出结果与循环方法存在微小差异。我已排除整数除法的影响,目前无法确定差异原因,特此求助。
VWAP实现代码
import numpy as np def calc_vwap(price, volume, period_lookback): """ Calculates the volume-weighted average price (VWAP) for a given period of time. The VWAP is calculated by taking the sum of the product of each price and volume over a given period, and dividing by the sum of the volume over that period. Parameters: price (numpy.ndarray): A list or array of prices. volume (numpy.ndarray): A list or array of volumes, corresponding to the prices. period_lookback (int): The number of days to look back when calculating VWAP. Returns: numpy.ndarray: An array of VWAP values, one for each day in the input period. """ vwap = np.zeros(len(price)) for i in range(period_lookback, len(price)): lb = i - period_lookback # lower bound ub = i + 1 # upper bound volume_sum = volume[lb:ub].sum() if volume_sum > 0: vwap[i] = (price[lb:ub] * volume[lb:ub]).sum() / volume_sum else: vwap[i] = np.nan return vwap def calc_vwap_speedy(price, volume, period_lookback): # Calculate product of price and volume price_volume = price * volume # Use convolve to get the rolling sum of product of price and volume and volume array price_volume_conv = np.convolve(price_volume, np.ones(period_lookback), mode='valid') volume_conv = np.convolve(volume, np.ones(period_lookback), mode='valid') # Create a mask to check if the volume sum is greater than 0 mask = volume_conv > 0 # Initialize the vwap array vwap = np.zeros(len(price)) # Use the mask to check if volume sum is greater than zero, if it is, proceed with the division and store the result in vwap array, otherwise store NaN vwap[period_lookback-1:] = np.where(mask, price_volume_conv / volume_conv, np.nan) return vwap
测试结果
RUN TIME standard -> 8.046217331999998 speedy -> 0.09436071299998616 OUTPUT standard -> [0. 0. 0. ... 0.49073531 0.48826866 0.49220622] speedy -> [0. 0. 0. ... 0.49525183 0.48842067 0.49092021]
内容的提问来源于stack exchange,提问作者Hofbr
相关产品推荐
相关产品推荐

