停止损失迭代python pandas numpy

2024-09-30 01:23:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个交易系统,有几个买卖信号。系统总是要么长要么短。同一方向上可能会出现多个信号,但只有给定方向(长或短)上的第一个信号有效(一旦长信号长,另一个长信号就不会被接收,因为系统已经拥有股票)。在

我用Python和Pandas来解决这个问题。我按日期在数据框的一列中排列我的买卖:

df['BuysandSells'] = [+1,+1,-1,+1,etc]  

然后,我使用ffill在第一个列的基础上创建第二个列。在

^{pr2}$

然后通过移动Column2创建第三列:

df['Column3'] = df['Column2'].shift()

最后,我使用np.哪里要找到买卖信号的新实例:

df['ValidNewSignal'] = np.where(df['Column2']<>df['Column3'],df['Column2'],np.nan)

这对于创建一个准确的买卖清单是有效的,省略了冗余。然后索引有效信号。这一切都很好。在

不过,现在我想确定止损是否能提高我的成绩。我的目标是,如果我的头寸被“止损”(即当前价格高于/低于我预设的止损值)时退出。为了确定我的止损点,我将我的切入点乘以一个固定的金额(例如$100进入*80%=80)。然后,我使用.ffill()在列中填充此值。问题就在这里。与上面一样,如果我没有停止,在同一方向的二次信号是无效的。但是,如果我真的被阻止了,后续的信号(在同一个方向,但在另一个方向之前)变得有效。但我写这篇文章的方式造成了某种悖论。在

我认为问题是我需要迭代行并创建一个新列,该列将回溯到前面的行。我在网上找过一些文档,也看过iterows,也研究过列表理解,但是这两种方法都没有得到深入的支持/似乎可以解决问题。我愿意使用循环或其他方法。在

更多信息: csv文件如下所示:

Row, Date,BuysandSells,Close
1, 8/19/15,+1,100
2, 8/20/15,+1,101
3, 8/21/15,+1,100
4, 8/24/15,-1,99
5, 8/25/15,NaN,99
6, 8/26/15,-1,98
7, 8/27/15,+1,100

我会把它读入一个数据帧,使用:

df = pd.read_csv('C:\filename.csv')

首先,我想根据我上面的注释来识别唯一的记录(即消除冗余——见上面的代码)。在

从那时起,我的目标就是在每一个新的参赛者身上设置一个止损点。所以假设我的规则是止损点是10%,那么代码会是:

stoplevel = 90%
df['Stop'] = np.where(df['ValidNewSignal'] == 1,df['Close']*stoplevel,np.nan)

这就是事情变得有点混乱的地方。我是用ffill填写的:

df['trailingstop'] = df['stop'].ffill()
df['stoppedout'] = np.where(df['Close']<=df['trailingstop'],-1,np.nan)

回顾上面的数据文件,系统将在第1行100处做多(即买入股票)。车站会变成90度。在这个例子中,第2行和第3行中的后续买入被忽略,因为没有触及止损点。但是,例如,如果第二排的收盘价是75,这意味着系统停止运行,第三排的买入将生效,从而导致新的止损设置。在

最大的问题是我不知道如何决定是否接受后续信号,因为我不知道我是否被阻止了。根据我的止损水平(90%,95%,等等),我可能会被止损,也可能不会被止损,因此后续的信号(以及相关的新止损)将取决于此。因此思考迭代是必要的。我试过很多次轮班之类的工作,但什么也做不到。在

理想的产出将显示所有的买卖都取决于止损水平。在

增加清晰度:

主要有两个问题:

  1. 如何在持仓止损后动态重置止损金额。

  2. 如何处理同一天同时有信号和停车的日子

取以下csv:

Row,Date,BuysandSells,Close,New Long (if yes 1 else 0),Stop(90%ofnewlong),trailingstop
1,8/19/15,+1,100,1,90,90
2,8/19/15,+1,101,0,NaN,90
3,8/19/15,+1,102,0,NaN,90
4,8/19/15,+1,101,0,NaN,90
5,8/19/15,+1,102,0,NaN,90
6,8/19/15,+1,101,0,NaN,90
7,8/19/15,+1,102,0,NaN,90
8,8/19/15,+1,101,0,NaN,90
9,8/19/15,+1,100,0,NaN,90
10,8/19/15,+1,101,0,NaN,90
11,8/19/15,+1,100,0,NaN,90
12,8/19/15,+1,101,0,NaN,90
13,8/19/15,+1,100,0,NaN,90

在这里,我们看到我们在第一排得到了一个新的买入,我们在100点进入90个止损点。接下来的每一天,我们也会收到一个买入信号(buysandsells列),但由于我们已经做多了,我们忽略了这些信号。我们还可以看到,新的停止级别被忽略(没有新的条目),原始的停止点落后(使用ffill())。这个我来说明一个基线。在

接下来,让我们假设一个带有稍微不同csv的停止:

Row,Date,BuysandSells,Close,New Long (if yes 1 else 0),Stop(90%ofnewlong),trailingstop,stopped (1=yes)
1,8/1/15,+1,100,1,90,90,NaN
2,8/2/15,+1,95,0,NaN,90,NaN
3,8/3/15,+1,91,0,NaN,90,NaN
4,8/4/15,0,89,0,NaN,90,1
5,8/5/15,0,90,0,NaN,NaN,NaN
6,8/8/15,+1,90,1,81,81,NaN
7,8/9/15,+1,102,0,NaN,81,NaN
8,8/10/15,+1,101,0,NaN,81,NaN
9,8/11/15,+1,100,0,NaN,81,NaN
10,8/12/15,+1,101,0,NaN,81,NaN
11,8/15/15,+1,100,0,NaN,81,NaN
12,8/16/15,+1,101,0,NaN,81,NaN
13,8/17/15,+1,100,0,NaN,81,NaN

在第一天,我们在100点以上以90点为止损点。在第4天,我们看到价格跌破了90的初始止损水平,因此我们被止损。对应的尾随停止在下一行中不再存在(不确定如何在pandas中这样做)。然后在8/8/15的第6排,我们得到了另一个买入信号,因为现在没有头寸。这次的价格是90,所以止损是81。在这里,我们忽略后续的购买信号,直到我们再次被阻止(这不会发生)。这里固有的问题是止损需要逐行确定,只有在前一个头寸被止损时,才会进行后续买入。熊猫的能力(据我所知)不允许这样。如果I ffill()第一个实例,那么当我到达停止/新位置时,停止将保持原始值。如果我重置每个新信号的停止并使用ffill(),我实际上没有跟踪正确的停止。在

下一个问题(正如一位评论者所提到的那样)是当你在同一天得到停车和信号时会发生什么。从逻辑上讲,这听起来很简单(如果没有位置接收信号,如果某个位置接收停止信号),但是我知道如何使用Pandas的方法,这是行不通的,我无法想出如何在初始停止后忽略止损点(它们通常是成串出现的,就像买卖信号一样)。考虑到所有这些,似乎有些迭代方法是必要的吗?在


Tags: csv方法dfclose信号系统npnan

热门问题