问题描述
/
解决方案
ptrade 平台如何设定特定持股不参与盘中异动策略?
在 ptrade 量化交易平台中,完全可以设定特定的持股股票不参与盘中异动策略。这通常通过在代码中引入黑名单机制(Blacklist)或在遍历股票池时进行条件过滤来实现。
以下是实现该功能的两种常用方法及对应的 Python 源码示例:
方法一:使用全局变量定义黑名单
你可以在 initialize 函数中定义一个全局变量(如 g.blacklist),将不希望参与策略的股票代码放入其中。在盘中处理函数(如 handle_data 或 tick_data)中,判断当前股票是否在黑名单内,如果在则直接跳过(continue 或 return)。
def initialize(context):
# 设置股票池
g.security = ['600570.SS', '000001.SZ', '600000.SS']
set_universe(g.security)
# 定义不参与盘中异动策略的股票黑名单(例如长线持仓的股票)
g.blacklist = ['600000.SS']
def handle_data(context, data):
for stock in g.security:
# 如果股票在黑名单中,则跳过不处理
if stock in g.blacklist:
continue
# 以下为盘中异动策略逻辑
current_price = data[stock]['close']
# 假设异动逻辑:价格突破某值
if current_price > 50:
order(stock, 100)
log.info(f"{stock} 触发异动,买入100股")
方法二:动态获取持仓并过滤特定股票
如果你的需求是“只要是持仓中的某几只股票就不参与”,你可以结合 get_positions() 接口动态获取持仓,并进行过滤。
def initialize(context):
g.security = ['600570.SS', '000001.SZ', '600000.SS']
set_universe(g.security)
# 设定需要保护的持仓股票(即使持仓也不卖出或不参与异动)
g.protected_stocks = ['600570.SS']
def handle_data(context, data):
# 获取当前所有持仓
positions = get_positions()
for stock in g.security:
# 检查该股票是否在持仓中,且属于受保护的股票
if stock in positions and stock in g.protected_stocks:
log.info(f"{stock} 为受保护持仓,不参与盘中异动策略")
continue
# 执行异动策略逻辑
snapshot = get_snapshot(stock)
if snapshot:
last_px = snapshot[stock].get('last_px', 0)
# 异动买卖逻辑...
总结与建议
- 灵活性:使用
g.blacklist是最简单直接的方法,适合固定的长线底仓。 - 动态管理:如果黑名单需要根据某些条件(如停牌、ST状态)动态变化,可以在
before_trading_start中结合get_stock_status或filter_stock_by_status接口每日更新g.blacklist。 - Tick 级别策略:如果你使用的是
tick_data函数处理高频异动,过滤逻辑同样适用,只需在tick_data的开头加上if stock in g.blacklist: return即可有效降低不必要的计算和误触发。