Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 利用Pandas数据帧生成交易信号_Python_Pandas_Quantitative Finance - Fatal编程技术网

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)。