首页 > 解决方案 > np.where() 导致 RSI 提前结束

问题描述

我最初从一个 np.where() 开始运行我的 RSI 规则,当 RSI (rsip) 跌至 20 (lower_bnd) 以下时发送买入信号 (1.0),并在 80 (upper_bnd) 上方卖出 (0.0)。该程序正确购买,但在 rsip 超过 20 时立即出售。我希望程序保持购买直到 RSI 达到 80。

这是我原来的功能:

signals['signal']= np.where(signals['rsip'] < lower_bnd, 1.0, 0.0)

Signals 是包含一系列信号和 RSI 级别的数据帧。

我尝试将额外的 np.where() 与布尔运算符一起嵌套,以确保保持信号直到达到 80+:

signals['signal'] = np.where(signals['rsip']
            < lower_bnd, 1.0, np.where((signals['rsip'] 
            < upper_bnd) & (signals['signal']==1.0), 1.0, np.where(signals['rsip'] 
            > upper_bnd, 0.0,np.where((signals['rsip']
            < upper_bnd) & (signals['signal']==0.0), 0.0, 0.0))))

上面基本上说,“如果低于 20,则买入(1.0);否则如果低于 80 并且信号已经 =1.0,则继续使用相同的信号;否则如果高于 80,则卖出(0.0);否则如果低于 80 并且信号已经 = 0.0,继续 0.0"...

但是我遇到了错误。

Series 的真值是模棱两可的。使用 a.empty、a.bool()、a.item()、a.any() 或 a.all()。

当我将 .values[-1] 添加到信号 ['rsip'] 的末尾时,数据帧中的每个信号都是 1.0,这让我相信这不是正确的方法......

经过数小时的故障排除后,我非常迷茫……我很想听听那里的任何想法或解决方案。谢谢你的时间。

编辑:通过使用此代码,使用与该方法略有不同的方法:

signals['signal'] = np.where(signals.rsip
        <= lower_bnd, 1.0, np.where(((signals.rsip 
        > lower_bnd) & (signals.signal==1.0)), 1.0, np.where(((signals.rsip 
        >= upper_bnd) &(signals.signal==0.0)), 0.0, 0.0)))

我不会产生任何错误消息,但是,它与原始的单数 np.where() 语句一样有效。

标签: pythonpandasnumpybooleanfinancial

解决方案


推荐阅读