繁体   English   中英

在python中计算股票的平衡量(OBV)

[英]Calculating stocks's On Balance Volume (OBV) in python

我正在用 python 做我的第一个项目。 我有一个名为 df 的 Pandas 数据框,其中有两列“close”和“volume”。 我想根据前两列计算/获取 OBV 列。 公式如下;

如果收盘价高于先前收盘价,则:当前 OBC = 先前 OBC + 当前成交量

如果收盘价低于前收盘价,则:当前 OBV = 先前 OBV - 当前成交量

如果收盘价等于先前的收盘价,则: 当前 OBV = 先前 OBV(无变化)

close volume  OBC
30    2500    nan
32    3000    5500
25    2700    2800
35    4000    6800
20    1000    5800

我正在使用此代码:

for i in df.close[1:]:
    if i > df.close.shift(-1):
        df["OBC"] = df.volume + df.OBC.shift(-1) 
    elif i < df.close.shift(-1):
        df["OBC"] = df.OBC.shift(-1) - df.volume
    else:
        df["OBC"] = df.OBC

我得到这个错误:

ValueError:系列的真值不明确。 使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

我看过这个问题,但没有得到任何帮助。 系列的真值不明确。 使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()

除了这个错误,我觉得代码在计算正确的 OBV 时可能会遇到麻烦。 任何帮助都将非常有价值。

我不知道你为什么会收到错误,但这里有一个获得 OBV 的解决方案:

np.where(df['close'] > df['close'].shift(1), df['volume'], 
np.where(df['close'] < df['close'].shift(1), -df['volume'], 0)).cumsum()

它也更快,如果您要进行多次迭代,这很好!

我基于 Olli 的回答,但我认为这是一个更简洁的解决方案:

obv = (np.sign(df['close'].diff()) * df['volume']).fillna(0).cumsum()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM