基于Pandas历史与当前金融数据新增Buy_Signal信号的实现咨询
实现代码
首先先处理StopLoss列的特殊标记(样例中存在[Cond]后缀,需先提取数值),再按规则生成信号列:
import pandas as pd # 1. 处理StopLoss列的特殊标记,转为纯数值 df['StopLoss'] = df['StopLoss'].astype(str).str.replace(r'\s*\[.*\]', '', regex=True).astype(float) # 2. 生成上一行的Buy、StopLoss偏移列 df['prev_Buy'] = df['Buy'].shift(1) df['prev_StopLoss'] = df['StopLoss'].shift(1) # 3. 生成判断掩码:当前行High > 当前行Buy signal_mask = df['High'] > df['Buy'] # 4. 新增信号列,满足条件则赋值上一行对应值,否则为NaN df['Buy_Signal_Buy'] = df['prev_Buy'].where(signal_mask) df['Buy_Signal_StopLoss'] = df['prev_StopLoss'].where(signal_mask) # 可选:删除中间临时列 df.drop(columns=['prev_Buy', 'prev_StopLoss'], inplace=True)
结果验证
对应你的样例数据,生成的信号列结果如下:
| DateTime | Buy | StopLoss | High | Buy_Signal_Buy | Buy_Signal_StopLoss |
|---|---|---|---|---|---|
| 2021-09-13 09:15:00 | NaN | NaN | 460.05 | NaN | NaN |
| 2021-09-13 09:16:00 | 500.825 | 352.5 | 456.25 | NaN | NaN |
| 2021-09-13 09:17:00 | 410.375 | 330.0 | 479.5 | 500.825 | 352.5 |
| 2021-09-13 09:18:00 | 400.125 | 367.25 | 453.0 | 410.375 | 330.0 |
| 2021-09-13 09:19:00 | 367.0 | 320.0 | 477.75 | 400.125 | 367.25 |
注意事项
- 第一行不存在上一行数据,因此无论是否满足条件,信号列均为NaN,符合逻辑
- 如果你的原始StopLoss列已经是纯数值,可跳过第一步的特殊字符处理步骤
内容的提问来源于stack exchange,提问作者Yatin Dave
相关产品推荐
相关产品推荐

