[英]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.