使用 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-30
和 2008-07-01
上都有退出信号是没有意义的,因为我们不能两次卖出相同的股票。
所以我有一种方法可以在 LONG EXIT
列中生成信号,但是我需要通过从每个日期向后查看来确定是否 LONG ENTRY = 1
更早并且没有 LONG EXIT = 1
在 LONG 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
希望对您有所帮助。
我有两个具有以下布局的 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-30
和 2008-07-01
上都有退出信号是没有意义的,因为我们不能两次卖出相同的股票。
所以我有一种方法可以在 LONG EXIT
列中生成信号,但是我需要通过从每个日期向后查看来确定是否 LONG ENTRY = 1
更早并且没有 LONG EXIT = 1
在 LONG 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
希望对您有所帮助。