2401_82456333 2025-08-06 21:31 采纳率: 0%
浏览 16

聚宽怎么剔除st、*st股??写了个剔除条件,回测还是会买入这些

img

img

img


如题,在聚宽中做回测,试了好几个筛选条件的写法,还是会买入这些,应该怎么修改呢?

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-08-06 21:32
    关注

    晚上好🌙🌙🌙
    本答案参考通义千问

    在聚宽(JoinQuant)平台上进行量化回测时,剔除ST、*ST股票是非常重要的一步,因为这些股票通常波动较大、风险较高,不适合大多数策略。如果你已经尝试了多种筛选条件但仍然买入ST/*ST股,可能是筛选逻辑存在错误或未正确应用。


    问题分析

    1. 数据字段不准确:你可能使用了错误的字段名来判断是否为ST/*ST。
    2. 筛选条件逻辑错误:例如没有使用 & 连接多个条件,或者条件顺序不对。
    3. 未正确应用筛选函数:如未使用 filterget_fundamentals 等函数。
    4. 未在回测中启用过滤:某些情况下需要显式调用 set_filterset_universe 来限制可选股票范围。

    解决方案

    一、确认正确的字段名

    在聚宽中,判断一只股票是否为ST/*ST,可以使用以下字段:

    • is_st:是否为ST股
    • is_sst:是否为*ST股

    ⚠️ 注意:is_stis_sst 是聚宽提供的基础字段,可以直接用于筛选。


    二、编写正确的筛选条件

    ✅ 正确的筛选条件写法如下:

    def filter_stock(context, stock_list):
        # 获取当前时间点的基本面数据
        fundamentals = get_fundamentals(
            query(
                # 选择所有股票
                # 并且排除ST和*ST股
                # 使用 is_st == False 与 is_sst == False
                # 注意:这里必须使用 & 来连接多个条件
            ).filter(
                # 排除ST股
                (is_st == False) &
                # 排除*ST股
                (is_sst == False)
            )
        )
        # 返回筛选后的股票列表
        return list(fundamentals.index)
    

    三、在回测中应用筛选函数

    你需要将上面的筛选函数设置为策略中的筛选函数,确保每次选股前都经过过滤。

    ✅ 修改后的完整代码示例:

    def initialize(context):
        # 设置筛选函数
        context.filter_func = filter_stock
    
    def before_trading_start(context):
        # 调用筛选函数获取符合条件的股票
        context.universe = context.filter_func(context, context.portfolio.positions.keys())
    
    def handle_data(context, data):
        # 处理交易逻辑
        pass
    

    四、验证筛选结果

    你可以通过打印筛选后的股票列表来验证是否成功剔除了ST/*ST股:

    def before_trading_start(context):
        context.universe = context.filter_func(context, context.portfolio.positions.keys())
        log.info("筛选后的股票列表: " + str(context.universe))
    

    五、其他注意事项

    • 如果你使用的是 get_all_securities 方法,请确保只包含上市股票(type='stock'),并加上筛选条件。
    • 注意:ST/*ST股在某些市场(如科创板、北交所)中可能没有 is_st 字段,需根据实际情况调整。

    总结:关键步骤

    1. 使用正确的字段is_stis_sst
    2. 正确连接多个条件:使用 & 连接多个筛选条件。
    3. 设置筛选函数:将筛选逻辑封装为函数,并在 before_trading_start 中调用。
    4. 验证结果:通过日志输出查看筛选结果是否符合预期。

    ✅ 示例代码(完整版)

    def initialize(context):
        # 设置筛选函数
        context.filter_func = filter_stock
    
    def filter_stock(context, stock_list):
        fundamentals = get_fundamentals(
            query(
                # 查询所有股票
            ).filter(
                # 剔除ST和*ST股
                (is_st == False) &
                (is_sst == False)
            )
        )
        return list(fundamentals.index)
    
    def before_trading_start(context):
        context.universe = context.filter_func(context, context.portfolio.positions.keys())
        log.info("筛选后的股票列表: " + str(context.universe))
    
    def handle_data(context, data):
        # 你的交易逻辑
        pass
    

    如有更多关于聚宽的问题,欢迎继续提问!

    评论

报告相同问题?

问题事件

  • 创建了问题 8月6日