问题描述
/
解决方案
在量化交易中,处理停牌股票是保证策略健壮性的重要一环。在 ptrade 量化平台中,您可以通过以下几种主要方式来得知股票是否临时停牌:
方法一:使用 get_stock_status 函数查询停牌状态
get_stock_status 是专门用于获取指定日期股票的 ST、停牌、退市属性的接口。将 query_type 参数设置为 'HALT' 即可查询股票是否停牌。
代码示例:
def initialize(context):
g.security = ['600570.SS', '000001.SZ']
set_universe(g.security)
def handle_data(context, data):
# 获取股票停牌信息,返回字典,值为 True 表示停牌
halt_status = get_stock_status(g.security, 'HALT')
for stock in g.security:
if halt_status.get(stock) is True:
log.info(f"{stock} 当前处于停牌状态")
else:
log.info(f"{stock} 交易正常")
方法二:使用 get_snapshot 获取实时交易状态
在盘中交易时,您可以使用 get_snapshot 获取股票的实时行情快照,其中的 trade_status 字段详细记录了股票当前的交易状态。
常见的停牌相关状态包括:
HALT-- 暂停交易(临时停牌)SUSP-- 停盘STOPT-- 长期停盘
代码示例:
def handle_data(context, data):
stock = '600570.SS'
snapshot = get_snapshot(stock)
if snapshot and stock in snapshot:
status = snapshot[stock].get('trade_status')
if status in ['HALT', 'SUSP', 'STOPT']:
log.info(f"{stock} 处于停牌状态,状态码:{status}")
elif status == 'TRADE':
log.info(f"{stock} 正在连续撮合交易")
方法三:在盘前使用 filter_stock_by_status 过滤停牌股票
如果您希望在每天开盘前直接从股票池中剔除停牌的股票,可以在 before_trading_start 中使用 filter_stock_by_status 函数。
代码示例:
def initialize(context):
g.security = ['600570.SS', '000001.SZ', '600000.SS']
set_universe(g.security)
def before_trading_start(context, data):
# 过滤掉 ST、停牌(HALT) 和 退市(DELISTING) 的股票
g.trade_stocks = filter_stock_by_status(g.security, ["ST", "HALT", "DELISTING"])
log.info(f"今日可交易股票列表:{g.trade_stocks}")
def handle_data(context, data):
# 仅对过滤后的可交易股票进行操作
for stock in g.trade_stocks:
pass # 执行交易逻辑
总结建议
- 盘前选股:推荐使用
filter_stock_by_status或get_stock_status提前剔除停牌标的。 - 盘中监控:推荐使用
get_snapshot获取最实时的trade_status,以应对盘中突发的临时停牌(HALT)。 - 历史回测:在回测中,ptrade 默认不会跳过停牌日期,停牌时会使用停牌前的数据填充,且成交量(volume)为 0。您也可以通过判断
volume == 0来辅助识别历史停牌日。