


如题,在聚宽中做回测,试了好几个筛选条件的写法,还是会买入这些,应该怎么修改呢?
晚上好🌙🌙🌙
本答案参考通义千问
在聚宽(JoinQuant)平台上进行量化回测时,剔除ST、*ST股票是非常重要的一步,因为这些股票通常波动较大、风险较高,不适合大多数策略。如果你已经尝试了多种筛选条件但仍然买入ST/*ST股,可能是筛选逻辑存在错误或未正确应用。
& 连接多个条件,或者条件顺序不对。filter 或 get_fundamentals 等函数。set_filter 或 set_universe 来限制可选股票范围。在聚宽中,判断一只股票是否为ST/*ST,可以使用以下字段:
is_st:是否为ST股is_sst:是否为*ST股⚠️ 注意:
is_st和is_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'),并加上筛选条件。is_st 字段,需根据实际情况调整。is_st 和 is_sst。& 连接多个筛选条件。before_trading_start 中调用。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
如有更多关于聚宽的问题,欢迎继续提问!