使用 Pandas DataFrame 生成交易信号

Using Pandas DataFrame to Generate Trading Signals

我有两个具有以下布局的 DataFrame:

QUOTES 数据帧

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

第一个DataFrame是股票价格和移动平均线。第二个 DataFrame 包含何时购买股票(进入)和何时出售(退出)的信号。

入口部分已经ok了。但是我在出口部分遇到了问题。

2008-06-26 上发出退出信号是没有意义的,因为尚未购买任何股票。在 2008-06-302008-07-01 上都有退出信号是没有意义的,因为我们不能两次卖出相同的股票。

所以我有一种方法可以在 LONG EXIT 列中生成信号,但是我需要通过从每个日期向后查看来确定是否 LONG ENTRY = 1 更早并且没有 LONG EXIT = 1LONG ENTRY = 1 和我正在查看的 DATE 之间。

我需要的 DataFrame 看起来像这样,但是我怎样才能用 Pandas 做到这一点?

信号数据帧

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

这里有一个草图,说明如何跟踪 entry/exit 信号的平衡,以便仅在前一个入场尚未被后续出场取消时发出出场信号:

开始于:

        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

为您的新过滤信号添加 column

df['filtered_exit'] = np.nan

遍历 DataFrame,计算先前的余额(假设您不会在同一天发出进场和退场信号),并相应地进行过滤:

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

希望对您有所帮助。