首页 > 解决方案 > 高效地运行 Python 数据框中的行以构建交易信号

问题描述

我有一个数据框,我正在尝试构建指标并根据某个信号跟踪我的头寸/交易。信号是第一列(分数)。假设交易规则是:

所以我们只有在持平或积极的头寸时才能卖出(所以在第 3 行我们不再卖出)

数据示例在第 1 列中,而我想要在第 2 列和第 3 列中构建的所需输出:

score        trade     position   
0.9           0          0    
1.1          -1         -1    
1.1           0         -1    
0.9           0         -1    
0.4          +1          0    
0.9           0          0    
1.1          -1         -1  
1.3           0         -1  

我尝试了什么 使用 pandas 数据框,我尝试按如下方式构建逻辑。仅从分数列开始。 如果分数高于 1,我会创建一个指标列,即 1。看看我们是否需要出售。

如果前两列为 1,我将在该指标旁边创建另一列,滚动总和为 2 行,另一列为 1(这意味着信号第一次转向卖出)。

然后,我将为该列的 cumsum() 添加另一列。

然后,如果 cumsum 列是 -1 并且分数低于 0.5,我会添加另一列 1。所以我们知道我们可以回购。

.. .. 这需要一段时间,然后我似乎最终会遇到某种自引用问题。

现在另一种选择是使用函数遍历行,考虑到以前的值,但我相信这会很慢。特别是因为我想为一大堆分数这样做。

所以任何人都可以指出我正确的方向来做到这一点。

我添加了一张可视化预期策略的图片。红点是卖出,绿点是买入。只有当您当时持平(0 头寸)或多头(+1 头寸)时,您才能卖出,反之亦然。

在此处输入图像描述

调用数据框 df。我正在构建这样的列:

df['sell']=-1*(df['score']>1)    
df['signalS']=df['sell'].rolling(min_periods=1, window=2).sum()    
df['signalFiltered']=-1*((df['sell']==-1) & (df['signalS']==-1))    
df['cum']=df['signalFiltered'].cumsum()    
df['buytoclose']=1*((df['cum']==-1) & (df['score']<0.5))    
df['b2c']=df['buytoclose'].rolling(min_periods=1, window=2).sum()    
df['b']=1*((df['b2c']==1) & (df['buytoclose']==1))    
df['pos']=df['signalFiltered'].cumsum()+df['b'].cumsum()

但它只适用于开始,这就是为什么我认为我遇到了一个参考循环,因为卖出列需要知道位置,反之亦然。

标签: pythonpandasdataframe

解决方案


推荐阅读