基于Trigger与Stop Loss列生成合规Entry信号的向量化解法
向量化实现符合规则的交易入场信号生成
核心规则明确
- 当出现
Trigger时,次日仅在上一次Entry后已触发Exit(或首次入场)的情况下,生成有效Entry信号 - 持仓期间(从
Entry到Exit前),即使出现Trigger也禁止生成新的Entry
向量化解决方案(Pandas)
步骤1:标记潜在入场候选
首先定位所有Trigger的次日位置,作为潜在的入场候选点:
import pandas as pd # 标记Trigger出现的行 df['trigger_flag'] = df['Trigger'] == 'Trigger' # 潜在Entry为Trigger的次日(shift(1)实现后移一行) df['potential_entry'] = df['trigger_flag'].shift(1).fillna(False)
步骤2:跟踪持仓状态
通过事件点(Entry/Exit)生成连续的持仓状态序列,避免循环遍历:
# 标记状态变更事件:Entry=持仓(True),Exit=清仓(False) df['state_event'] = pd.NA df.loc[df['signal 3'] == 'Entry', 'state_event'] = True df.loc[df['Stop Loss'] == 'Exit', 'state_event'] = False # 前向填充延续状态,初始状态为未持仓(False) df['in_position'] = df['state_event'].ffill().fillna(False)
步骤3:筛选有效Entry信号
仅保留「潜在入场点 + 上一交易日未持仓」的有效信号:
# 上一交易日未持仓,才允许生成新Entry df['valid_entry'] = df['potential_entry'] & ~df['in_position'].shift(1).fillna(False) # 更新signal 3列:仅保留有效Entry,清空不符合规则的无效Entry df.loc[df['valid_entry'], 'signal 3'] = 'Entry' df.loc[~df['valid_entry'] & (df['signal 3'] == 'Entry'), 'signal 3'] = pd.NA
关键逻辑验证
针对示例中的最后一个Trigger(2024-03-29):
- 次日(2024-04-01)的
in_position.shift(1)为True(因2024-03-28的Entry尚未触发Exit) - 因此
valid_entry为False,不会生成无效的Entry信号,完全符合规则
效率优势
该方案基于Pandas的向量化运算(底层为Numpy的C级实现),相比Python循环遍历,在处理百万级以上行的DataFrame时,效率可提升10~100倍,避免了循环的性能瓶颈。
内容的提问来源于stack exchange,提问作者Anonymous
相关产品推荐
相关产品推荐

