我最初从一个np.where()开始运行我的RSI规则,即当RSI(rsip)跌破20(lower_bnd)并发出(0.0)高于80(upper_bnd)时发出买入信号(1.0)。该程序已正确购买,但在rsip超过20时就立即卖出。我希望该程序继续购买,直到RSI达到80。
这是我的原始功能:
signals['signal']= np.where(signals['rsip'] < lower_bnd, 1.0, 0.0)
信号是一个包含一系列信号和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“ ...
但是我遇到了错误。
系列的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。
当我在信号['rsip']的末尾添加.values [-1]时,数据帧中的每个信号都是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()语句一样有效。