问题描述
最近发现Ptrade上运行的策略停止了。
上去一看。
每一个tick都在报错:
解决方案
遇到因“蓝盾退债”等退市标的导致的Tick级别持续报错,通常是因为策略在尝试获取已退市标的的行情数据(如快照、Tick流)时,系统返回了空值(None)或缺失关键字段,而代码中没有进行有效性校验和异常捕获,导致触发 KeyError 或 TypeError,进而使策略中断。\n\n### 解决排查方案:\n\n#### 1. 剔除退市标的\n在每日盘前(before_trading_start)使用 Ptrade 提供的 filter_stock_by_status 接口,将退市(DELISTING)和停牌(HALT)的标的从当日交易列表中过滤掉。\n\n#### 2. 增加数据有效性校验\n在 tick_data 或 handle_data 中,获取数据后务必判断是否为 None 或空数据。\n\n#### 3. 增加全局异常捕获\n使用 try...except 包裹核心逻辑,防止单一标的的报错导致整个策略停止运行。\n\n### 修复代码示例:\n\npython\ndef initialize(context):\n g.security = ['123012.SZ', '110033.SS'] # 假设包含已退市转债\n set_universe(g.security)\n g.trade_list = []\n\ndef before_trading_start(context, data):\n # 过滤退市和停牌的标的\n g.trade_list = filter_stock_by_status(g.security, filter_type=['ST', 'HALT', 'DELISTING'])\n log.info('今日可交易标的: %s' % g.trade_list)\n\ndef tick_data(context, data):\n for stock in g.trade_list:\n try:\n # 确保标的在data中且包含tick数据\n if stock not in data or 'tick' not in data[stock]:\n continue\n \n tick_info = data[stock]['tick']\n if tick_info is None or len(tick_info) == 0:\n continue\n \n # 获取最新价等操作\n current_price = tick_info['last_px'][0] if 'last_px' in tick_info else None\n if current_price is not None:\n pass # 执行交易逻辑\n \n except Exception as e:\n log.error('处理标的 %s tick数据时发生异常: %s' % (stock, e))\n\n\n通过以上三步,可以有效避免因个别标的退市或停牌导致整个量化策略崩溃的问题。