Python 利用Pandas数据帧生成交易信号
我有两个具有以下布局的数据帧: 引用数据帧Python 利用Pandas数据帧生成交易信号,python,pandas,quantitative-finance,Python,Pandas,Quantitative Finance,我有两个具有以下布局的数据帧: 引用数据帧 DATE PRICE SMA 2008-06-25 107.505122 106.480321 2008-06-26 107.138449 103.531552 2008-06-27 106.737588 102.608466 2008-06-30 106.360232 101.309296 2008-07-01 105.993987 101.941783 2008-07-02 105
DATE PRICE SMA
2008-06-25 107.505122 106.480321
2008-06-26 107.138449 103.531552
2008-06-27 106.737588 102.608466
2008-06-30 106.360232 101.309296
2008-07-01 105.993987 101.941783
2008-07-02 105.632870 101.796483
DATE LONG ENTRY LONG EXIT
2008-06-25 0 0
2008-06-26 0 1
2008-06-27 1 0
2008-06-30 0 1
2008-07-01 0 1
2008-07-02 1 0
DATE LONG ENTRY LONG EXIT
2008-06-25 0 0
2008-06-26 0 0
2008-06-27 1 0
2008-06-30 0 1
2008-07-01 0 0
2008-07-02 1 0
信号数据帧
DATE PRICE SMA
2008-06-25 107.505122 106.480321
2008-06-26 107.138449 103.531552
2008-06-27 106.737588 102.608466
2008-06-30 106.360232 101.309296
2008-07-01 105.993987 101.941783
2008-07-02 105.632870 101.796483
DATE LONG ENTRY LONG EXIT
2008-06-25 0 0
2008-06-26 0 1
2008-06-27 1 0
2008-06-30 0 1
2008-07-01 0 1
2008-07-02 1 0
DATE LONG ENTRY LONG EXIT
2008-06-25 0 0
2008-06-26 0 0
2008-06-27 1 0
2008-06-30 0 1
2008-07-01 0 0
2008-07-02 1 0
第一个数据帧是股票价格和移动平均数。第二个数据帧包含何时购买股票(进入)和何时出售(退出)的信号
入门部分已经可以了。但我的退出部分有问题
在2008-06-26
上显示退出信号是没有意义的,因为尚未购买任何股票。在2008-06-30
和2008-07-01
上都有退出信号是没有意义的,因为我们不能两次卖出同一只股票
因此,我有一种方法可以在LONG EXIT
列中生成信号,但我需要通过从每个日期向后查看来过滤它们,以确定在LONG ENTRY=1
之前是否有LONG EXIT=1
,并且在LONG ENTRY=1
和date
之间是否没有LONG EXIT=1
我需要的数据帧看起来像这样,但我如何才能用熊猫做到这一点
信号数据帧
DATE PRICE SMA
2008-06-25 107.505122 106.480321
2008-06-26 107.138449 103.531552
2008-06-27 106.737588 102.608466
2008-06-30 106.360232 101.309296
2008-07-01 105.993987 101.941783
2008-07-02 105.632870 101.796483
DATE LONG ENTRY LONG EXIT
2008-06-25 0 0
2008-06-26 0 1
2008-06-27 1 0
2008-06-30 0 1
2008-07-01 0 1
2008-07-02 1 0
DATE LONG ENTRY LONG EXIT
2008-06-25 0 0
2008-06-26 0 0
2008-06-27 1 0
2008-06-30 0 1
2008-07-01 0 0
2008-07-02 1 0
以下是您如何跟踪进入/退出信号平衡的示意图,以便您仅在上一次进入尚未被后续退出取消时发出退出信号: 首先是:
date entry exit
0 2008-06-25 0 0
1 2008-06-26 0 1
2 2008-06-27 1 0
3 2008-06-30 0 1
4 2008-07-01 0 1
5 2008-07-02 1 0
为新的过滤信号添加列
:
df['filtered_exit'] = np.nan
遍历数据帧
,计算之前的余额(假设您在同一天没有发出进入和退出的信号),并相应地过滤:
for i, data in df.iterrows():
holding_status = (df.loc[:(i-1), 'entry'] - df.loc[:(i-1), 'filtered_exit']).sum()
if data.exit == 0 or i == 0:
df.loc[i, 'filtered_exit'] = 0
elif data.exit == 1:
if holding_status == 0:
df.loc[i, 'filtered_exit'] = 0
elif holding_status == 1:
df.loc[i, 'filtered_exit'] = 1
要在您提到的情况下获得所需的结果:
date entry exit filtered_exit
0 2008-06-25 0 0 0
1 2008-06-26 0 1 0
2 2008-06-27 1 0 0
3 2008-06-30 0 1 1
4 2008-07-01 0 1 0
5 2008-07-02 1 0 0
希望这能有所帮助。我期待着对你问题的回答超出此范围。您是否有机会在quantstart.com上阅读文章(如同一作者的文章)?所有这些材料都与您的背景相关(请注意,我[不幸地]没有得到quantstart.com的赞助)。这个问题与quant无关。这只是上下文。真正的问题是如何转换/过滤数据帧。我还建议发布一些示例代码,说明如何生成
数据帧。上下文帮助人们提供更好的答案。你必须跟踪你的投资组合中当前的内容。也许您可以创建一个特定的数据框,或者在此处添加一列“holding”,并在刺激交易订单之前测试它是否大于0(例如,请参见我上面提供的第二个链接中的幻灯片14和15)。