如何在Pandas中重采样并计算成交量加权平均价格?
问题:计算1分钟周期内基于成交量的加权平均价格
我有一份包含交易数据的DataFrame,每笔交易包含amount(成交量)和price(价格)字段,数据示例如下:
>>> df amount price datetime 2023-06-23 10:55:40.420 0.04657 30106.01 2023-06-23 10:55:42.348 0.00085 30104.54 2023-06-23 10:55:42.491 0.00368 30104.54 2023-06-23 10:55:43.211 0.03008 30104.54 2023-06-23 10:55:45.910 0.00035 30101.56 ... ... ... 2023-06-23 10:58:06.401 0.00863 30108.00 2023-06-23 10:58:06.661 0.00829 30108.00 2023-06-23 10:58:07.474 0.00305 30108.00 2023-06-23 10:58:07.599 0.00048 30108.00 2023-06-23 10:58:08.393 0.00041 30108.00 [428 rows x 2 columns]
我已经能通过以下代码实现1分钟周期的成交量重采样求和:
>>> df['amount'].resample("1Min").sum() datetime 2023-06-23 10:55:00 0.78885 2023-06-23 10:56:00 12.84216 2023-06-23 10:57:00 9.56456 2023-06-23 10:58:00 0.08334 Freq: T, Name: amount, dtype: float64
请问如何计算每个1分钟周期内基于成交量的加权平均价格?
解答
基于成交量的加权平均价格(VWAP)核心公式为:(成交量×价格的总和) ÷ 成交量的总和,可以通过两种简洁方式实现:
方法一:分步计算
先拆分计算逻辑,更直观易懂:
- 新增列计算每笔交易的成交额(成交量×价格)
- 分别对成交额、成交量按1分钟周期重采样求和
- 用成交额总和除以对应周期的成交量总和,得到加权平均价格
代码示例:
# 计算每笔交易的成交额 df['turnover'] = df['amount'] * df['price'] # 按1分钟周期重采样,分别求和成交额与成交量 turnover_sum = df['turnover'].resample('1Min').sum() amount_sum = df['amount'].resample('1Min').sum() # 计算加权平均价格 vwap = turnover_sum / amount_sum
执行后会得到类似结果:
>>> vwap datetime 2023-06-23 10:55:00 30104.87 2023-06-23 10:56:00 30105.22 2023-06-23 10:57:00 30106.15 2023-06-23 10:58:00 30108.00 Freq: T, dtype: float64
方法二:用resample.apply()一步完成
无需新增列,直接在重采样时自定义计算逻辑:
vwap = df.resample('1Min').apply(lambda x: (x['amount'] * x['price']).sum() / x['amount'].sum())
该方法通过apply传入匿名函数,在每个1分钟周期内直接完成加权平均计算。
内容的提问来源于stack exchange,提问作者Florent
相关产品推荐
相关产品推荐

