如何使用 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和TWAP算法实现

如何使用带有询价和出价的熊猫数据框计算体积加权平均价格(VWAP)?

Pandas 高效的 VWAP 计算

Pandas:将重采样与 groupby 相结合并计算时间差

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用sum函数计算每个分组中的所有数值变量的聚合加和值