【问题标题】:Calculating stocks's On Balance Volume (OBV) in python在python中计算股票的平衡量(OBV)
【发布时间】:2019-03-11 07:32:17
【问题描述】:

我正在用 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:Series 的真值不明确。使用a.empty, a.bool()、a.item()、a.any() 或 a.all()。

我看过这个问题,但没有得到任何帮助。 Truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()

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

【问题讨论】:

  • 语句i &gt; df.close.shift(-1) 将一个数字与一个系列进行比较,结果是一系列布尔值,这就是它现在不做什么的原因。
  • 知道如何处理吗?
  • 寻找解决方案like this
  • 在哪里可以找到解决方案,您是否使用电视图表输出验证了输出。在余额卷上搜索 github 有很多工作代码。但是这与 tradeivew 的输出不同。

标签: python pandas


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      这是另一个答案,可能对某人有所帮助:

      obv = (df.volume * (~df.close.diff().le(0) * 2 - 1)).cumsum()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-07
        • 2021-07-11
        • 2016-04-11
        相关资源
        最近更新 更多