如何使用 groupby 计算 vwap(交易量加权平均价格)并申请?
Posted
技术标签:
【中文标题】如何使用 groupby 计算 vwap(交易量加权平均价格)并申请?【英文标题】:How to calculate vwap (volume weighted average price) using groupby and apply? 【发布时间】:2017-12-04 21:20:19 【问题描述】:我已经阅读了多篇与我的问题类似的帖子,但我仍然无法弄清楚。我有一个看起来像下面这样的 pandas df(多天):
Out[1]:
price quantity
time
2016-06-08 09:00:22 32.30 1960.0
2016-06-08 09:00:22 32.30 142.0
2016-06-08 09:00:22 32.30 3857.0
2016-06-08 09:00:22 32.30 1000.0
2016-06-08 09:00:22 32.35 991.0
2016-06-08 09:00:22 32.30 447.0
...
计算我能做的 vwap:
df['vwap'] = (np.cumsum(df.quantity * df.price) / np.cumsum(df.quantity))
但是,我想重新开始每一天(groupby),但我不知道如何使它与(lambda?)函数一起工作。
df['vwap_day'] = df.groupby(df.index.date)['vwap'].apply(lambda ...
速度至关重要。将不胜感激任何帮助:)
【问题讨论】:
这不是 VWAP 的正确公式。您需要计算典型价格(Hi、Lo、Close 的平均值)。你的价格数据应该有这个。 @DISC-O 所以请贡献代码并添加您的答案... 不确定我理解,评论是关于计算公式和需要更多数据(期间的高点和低点,然后平均值进入您的计算);代码很简单,我假设你知道如何计算 3 列的平均值。 【参考方案1】:选项 0普通方法
def vwap(df):
q = df.quantity.values
p = df.price.values
return df.assign(vwap=(p * q).cumsum() / q.cumsum())
df = df.groupby(df.index.date, group_keys=False).apply(vwap)
df
price quantity vwap
time
2016-06-08 09:00:22 32.30 1960.0 32.300000
2016-06-08 09:00:22 32.30 142.0 32.300000
2016-06-08 09:00:22 32.30 3857.0 32.300000
2016-06-08 09:00:22 32.30 1000.0 32.300000
2016-06-08 09:00:22 32.35 991.0 32.306233
2016-06-08 09:00:22 32.30 447.0 32.305901
选项 1加入一点 eval
df = df.assign(
vwap=df.eval(
'wgtd = price * quantity', inplace=False
).groupby(df.index.date).cumsum().eval('wgtd / quantity')
)
df
price quantity vwap
time
2016-06-08 09:00:22 32.30 1960.0 32.300000
2016-06-08 09:00:22 32.30 142.0 32.300000
2016-06-08 09:00:22 32.30 3857.0 32.300000
2016-06-08 09:00:22 32.30 1000.0 32.300000
2016-06-08 09:00:22 32.35 991.0 32.306233
2016-06-08 09:00:22 32.30 447.0 32.305901
【讨论】:
花式游戏综合症 @TedPetrou 有罪 @piRSquared 当我如上所述运行选项 0 时,它工作正常。但是我需要在我的 df 中添加一个新列,所以我做了 df['vwap'] = df.groupby(df.index.date, group_keys=False).apply(vwap) 这引发了以下错误: ValueError: Wrong number通过了 7 个项目,位置意味着 1 个,这是为什么呢? 我返回的是一个包含列的新数据框。您想将整个事情重新分配给 df.不是 df['vwap'] 啊哈!现在像魅力一样工作,tnx vm。我会坚持选项 0,因为即使在阅读了它之后,我也不清楚 eval 的真正作用..【参考方案2】:我之前也使用过这种方法,但如果您试图限制窗口期,它的效果就不是很准确。相反,我发现 TA python 库运行良好: https://technical-analysis-library-in-python.readthedocs.io/en/latest/index.html
from ta.volume import VolumeWeightedAveragePrice
# ...
def vwap(dataframe, label='vwap', window=3, fillna=True):
dataframe[label] = VolumeWeightedAveragePrice(high=dataframe['high'], low=dataframe['low'], close=dataframe["close"], volume=dataframe['volume'], window=window, fillna=fillna).volume_weighted_average_price()
return dataframe
【讨论】:
以上是关于如何使用 groupby 计算 vwap(交易量加权平均价格)并申请?的主要内容,如果未能解决你的问题,请参考以下文章
用numpy计算成交量加权平均价格(VWAP),并实现读写文件
如何使用带有询价和出价的熊猫数据框计算体积加权平均价格(VWAP)?
Pandas:将重采样与 groupby 相结合并计算时间差
pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用sum函数计算每个分组中的所有数值变量的聚合加和值