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