python - 高效地运行 Python 数据框中的行以构建交易信号
问题描述
我有一个数据框,我正在尝试构建指标并根据某个信号跟踪我的头寸/交易。信号是第一列(分数)。假设交易规则是:
- 如果得分 > 1 则卖出
- 如果分数 < -1 则购买
- 如果有负仓位且得分低于 0.5,则回购
- 如果我们有正面头寸并且得分高于-0.5,则回售
所以我们只有在持平或积极的头寸时才能卖出(所以在第 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()
但它只适用于开始,这就是为什么我认为我遇到了一个参考循环,因为卖出列需要知道位置,反之亦然。
解决方案
推荐阅读
- jenkins - 创建自定义工作区时找不到 .Jenkins 文件夹
- python-3.x - Python3 - 以编程方式更改 PSD 图层的可见性
- r - 在 R 中使用 is.na 和 Sapply 函数
- python-3.x - 如何让 Sublime Text3 只用一个点显示所有方法
- ios - 您可以多次设置 contentInset 吗?
- regex - 查找并替换字符串值后的所有数字并递增每个数字
- ruby - 为什么我的 jekyll 命令不再起作用?
- python - 两个 QListView 框,一个显示文件夹中的文件,一个显示第一个 QListview 中的选定文件
- ssis - SSIS,平面文件连接页眉,不同列宽的页脚
- database - 夏令时更改的 generate_series - 不同的结果取决于服务器时区