问题描述
解决方案
在PTrade中,剔除ST股、停牌股和退市股最简单且推荐的方法是使用内置函数 filter_stock_by_status。
该函数专门用于根据指定的状态(如ST、停牌、退市)过滤股票列表。
以下是具体的实现方法和代码示例:
方法一:使用 filter_stock_by_status(推荐)
这是最简洁的方法,通常在 before_trading_start 函数中调用,用于每日开盘前更新股票池。
函数说明:
filter_stock_by_status(stocks, filter_type=["ST", "HALT", "DELISTING"], query_date=None)
- stocks: 原始股票代码列表。
- filter_type: 需要剔除的类型列表。默认包含
ST(ST股),HALT(停牌),DELISTING(退市)。
代码示例:
def initialize(context):
# 初始化时设置一个初始股票池,例如沪深300
# 注意:get_index_stocks 建议在 before_trading_start 中调用以获取最新成分股
# 这里仅作演示初始化变量
g.security = []
def before_trading_start(context, data):
# 1. 获取原始股票池(例如获取沪深300成分股)
# 注意:get_index_stocks 不应在 initialize 中调用
raw_stocks = get_index_stocks('000300.SS')
# 2. 使用 filter_stock_by_status 剔除 ST、停牌、退市股票
# filter_type 参数默认就是 ["ST", "HALT", "DELISTING"],也可以显式写出来
g.security = filter_stock_by_status(raw_stocks, filter_type=["ST", "HALT", "DELISTING"])
# 3. 设置最终的股票池
set_universe(g.security)
log.info("原始股票数量: %d, 剔除后股票数量: %d" % (len(raw_stocks), len(g.security)))
def handle_data(context, data):
# 在这里执行交易逻辑,此时 g.security 已经是剔除过的干净列表
pass
方法二:使用 get_stock_status(手动过滤)
如果你需要更精细的控制(例如只想剔除ST,但保留停牌股,或者需要知道具体是因为什么原因被剔除),可以使用 get_stock_status 函数手动编写循环逻辑。
代码示例:
def initialize(context):
g.security = []
def before_trading_start(context, data):
# 1. 获取原始股票池
raw_stocks = get_index_stocks('000300.SS')
# 2. 获取股票状态信息
# 查询是否ST
is_st = get_stock_status(raw_stocks, 'ST')
# 查询是否停牌
is_halt = get_stock_status(raw_stocks, 'HALT')
# 查询是否退市
is_delisting = get_stock_status(raw_stocks, 'DELISTING')
clean_stocks = []
# 3. 遍历并筛选
for stock in raw_stocks:
# 如果是ST、停牌或退市,则跳过
if is_st[stock] or is_halt[stock] or is_delisting[stock]:
continue
clean_stocks.append(stock)
g.security = clean_stocks
set_universe(g.security)
log.info("筛选完成,剩余股票数量:%d" % len(g.security))
def handle_data(context, data):
pass
总结
- 一般情况:直接使用 方法一 (
filter_stock_by_status),代码简洁且运行效率高。 - 特殊需求:如果需要对被剔除的股票做统计或特殊处理,再考虑使用方法二。