基于Pandas DataFrame按日计算VWAP指标的实现方法问询
按日计算分时股票数据的VWAP(成交量加权平均价)
问题背景
现有分时股票数据存储在DataFrame中,原代码计算的VWAP是基于全量数据的累计值,无法实现按日独立计算——即仅用当日分时数据累计,不跨日计算VWAP。
解决方案
核心逻辑是按日期分组处理,对每个交易日的分时数据单独计算VWAP,再合并回原DataFrame。具体步骤如下:
- 转换日期格式并提取分组键,确保同一交易日的分时数据被归为一组;
- 定义VWAP计算函数,对每组数据单独执行累计计算;
- 通过分组应用函数完成计算,合并结果。
完整代码
import pandas as pd # 假设数据已加载到df中 # 1. 转换Date列为datetime类型,提取纯日期作为分组键 df['Date'] = pd.to_datetime(df['Date']) df['trade_date'] = df['Date'].dt.date # 2. 定义单组VWAP计算函数 def calc_daily_vwap(group): volume = group['Volume'] typical_price = (group['Low'] + group['Close'] + group['High']) / 3 group['vwap'] = (typical_price * volume).cumsum() / volume.cumsum() return group # 3. 按日期分组计算,合并结果 df = df.groupby('trade_date').apply(calc_daily_vwap) # 可选:删除临时分组列 df = df.drop('trade_date', axis=1)
代码说明
pd.to_datetime(df['Date']):将字符串格式的日期转为datetime对象,方便后续提取日期部分;df['Date'].dt.date:提取不含时分秒的纯日期(如2022-05-02),作为分组依据,确保同一天的分时数据被归为一组;groupby('trade_date').apply(calc_daily_vwap):对每个交易日的数据单独执行VWAP计算,每组的cumsum()仅在当日数据内累计,完全隔离不同日期的数据;- VWAP计算逻辑与原代码一致:先计算典型价格
typical_price,再通过(典型价格×成交量)累计和 / 成交量累计和得到当日逐时段的VWAP。
验证要点
计算完成后可检查:某交易日第一条数据的VWAP等于该时段的典型价格,后续数值仅基于当日累计数据变化,不会受到前一日数据的影响。
内容的提问来源于stack exchange,提问作者Fchpro01
相关产品推荐
相关产品推荐

