簡體   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