You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python交易算法实现同一时间仅允许1笔持仓的信号过滤方法咨询

解决方案

实现逻辑

核心通过维护冷却计数器实现信号过滤,规则如下:

  • 初始冷却计数器为0,代表当前无持仓可触发开仓
  • 若冷却计数器>0:当前周期信号设为0,计数器减1
  • 若冷却计数器=0且Long_Trade值为1:当前周期信号设为1,计数器重置为3(对应t入场后屏蔽t+1~t+3共3个周期)
  • 若冷却计数器=0且Long_Trade值为0:当前周期信号设为0,计数器保持0

代码实现

通用Pandas版本(适合普通数据量)

import pandas as pd
import numpy as np

def generate_filtered_signal(long_trade_series, cool_period=3):
    signal = []
    cool_counter = 0
    for val in long_trade_series:
        if cool_counter > 0:
            signal.append(0)
            cool_counter -= 1
        else:
            if val == 1:
                signal.append(1)
                cool_counter = cool_period
            else:
                signal.append(0)
    return pd.Series(signal, index=long_trade_series.index)

# 测试用例(匹配你给出的示例)
df = pd.DataFrame({'Long_Trade': [1,1,1,1,1]})
df['Signal'] = generate_filtered_signal(df['Long_Trade'])
print(df)
# 输出结果:
#   Long_Trade  Signal
# 0          1       1
# 1          1       0
# 2          1       0
# 3          1       0
# 4          1       1

高性能向量化版本(适合百万级以上数据量,Numba加速)

from numba import jit

@jit(nopython=True)
def generate_signal_vectorized(long_trade_arr, cool_period=3):
    n = len(long_trade_arr)
    signal = np.zeros(n, dtype=np.int8)
    cool_counter = 0
    for i in range(n):
        if cool_counter > 0:
            signal[i] = 0
            cool_counter -= 1
        else:
            if long_trade_arr[i] == 1:
                signal[i] = 1
                cool_counter = cool_period
    return signal

# 调用方式
df['Signal'] = generate_signal_vectorized(df['Long_Trade'].values)

内容的提问来源于stack exchange,提问作者Sacim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 20:36:07