基于成交量加权合并多交易对OHLCV序列,计算VWAP及总成交量
计算多交易对资产的VWAP与总成交量
假设你的DataFrame索引是包含交易对(pair)和时间戳(timestamp)的多级索引,列包含标准OHLCV字段(Open, High, Low, Close, Volume),可以通过以下步骤计算同一时间点所有交易对的成交量加权平均价格(VWAP)和总成交量:
1. 计算单条记录的成交额
VWAP的核心逻辑是「成交额总和 / 成交量总和」,先为每条交易记录计算对应的成交额(默认用收盘价×成交量,若需用其他均价可自行替换):
df['dollar_volume'] = df['Close'] * df['Volume']
如果想用OHLC均价计算成交额,替换为:
df['avg_price'] = (df['Open'] + df['High'] + df['Low'] + df['Close']) / 4 df['dollar_volume'] = df['avg_price'] * df['Volume']
2. 按时间戳分组计算汇总指标
通过多级索引的timestamp层级分组,分别计算每个时间点的总成交量和总成交额,再推导VWAP:
方式一:生成仅含时间维度的汇总DataFrame
# 分组聚合核心指标 summary_df = df.groupby(level='timestamp').agg( total_volume=('Volume', 'sum'), total_dollar_volume=('dollar_volume', 'sum') ) # 计算VWAP,同时处理成交量为0的除以0问题 summary_df['vwap'] = summary_df['total_dollar_volume'].div(summary_df['total_volume']).fillna(0)
此时summary_df的索引为时间戳,包含total_volume(该时间点所有交易对总成交量)、vwap(该时间点的整体VWAP)。
方式二:将结果合并回原DataFrame(保留交易对维度)
如果需要在原数据的每一行中显示对应时间点的总成交量和VWAP,用transform方法将分组结果映射到每一行:
# 计算每个时间点的总成交量,映射到原数据的每一行 df['total_volume'] = df.groupby(level='timestamp')['Volume'].transform('sum') # 计算每个时间点的总成交额 df['total_dollar_volume'] = df.groupby(level='timestamp')['dollar_volume'].transform('sum') # 计算VWAP df['vwap'] = df['total_dollar_volume'].div(df['total_volume']).fillna(0)
处理后原DataFrame会新增total_volume、total_dollar_volume、vwap三列,每行对应其所在时间点的汇总指标。
示例验证
用构造的样本数据测试完整流程:
import pandas as pd import numpy as np # 构造多级索引的OHLCV测试数据 tickers = ['BTC/USDT', 'BTC/ETH'] timestamps = pd.date_range('2024-01-01', periods=3, freq='H') multi_index = pd.MultiIndex.from_product([tickers, timestamps], names=['pair', 'timestamp']) sample_data = { 'Open': np.random.randint(40000, 45000, size=6), 'High': np.random.randint(40000, 45000, size=6), 'Low': np.random.randint(40000, 45000, size=6), 'Close': np.random.randint(40000, 45000, size=6), 'Volume': np.random.randint(1, 10, size=6) } df = pd.DataFrame(sample_data, index=multi_index) # 执行计算 df['dollar_volume'] = df['Close'] * df['Volume'] summary_df = df.groupby(level='timestamp').agg( total_volume=('Volume', 'sum'), total_dollar_volume=('dollar_volume', 'sum') ) summary_df['vwap'] = summary_df['total_dollar_volume'] / summary_df['total_volume'] print(summary_df)
输出示例:
total_volume total_dollar_volume vwap timestamp 2024-01-01 00:00:00 10 4215600 421560.000000 2024-01-01 01:00:00 12 5023200 418600.000000 2024-01-01 02:00:00 7 2923800 417685.714286
内容的提问来源于stack exchange,提问作者Mikko Ohtamaa
相关产品推荐
相关产品推荐

