问题描述
回测提示报错: 当前频率不支持field指定字段:high_limit
解决方案
报错原因分析
在 ptrade 量化平台中,当您使用 get_history 或 get_price 接口获取历史行情数据时,如果遇到报错 “当前频率不支持field指定字段:high_limit”,通常是因为您在**非日线频率(如分钟线 1m、5m 等)**下请求了 high_limit(涨停价)或 low_limit(跌停价)字段。
根据 ptrade 官方 API 文档规定:
high_limit(涨停价) 和low_limit(跌停价) 仅在日线(1d / daily)级别返回。is_open(是否开盘) 和preclose(昨收盘价) 等字段同样仅限日线返回。
解决方案
要解决此问题,您需要根据策略的实际需求调整代码逻辑。以下是几种常见的解决场景:
方案一:将获取频率改为日线(1d)
如果您只是需要获取某只股票的涨停价,请确保将 frequency 参数设置为 '1d'。
正确示例:
def handle_data(context, data):
# 正确:在日线频率下获取涨停价
df = get_history(1, frequency='1d', field=['close', 'high_limit'], security_list='600570.SS')
log.info("今日涨停价为:%s" % df['high_limit'][-1])
方案二:在分钟策略中获取当日涨停价
如果您的策略是分钟级别(如每分钟运行一次),但需要判断当前价格是否达到涨停价,您不能直接在分钟级别的 get_history 中请求 high_limit。正确的做法是单独调用一次日线级别的数据来获取涨停价。
正确示例:
def handle_data(context, data):
security = '600570.SS'
# 1. 获取分钟级别的常规数据(不包含 high_limit)
min_df = get_history(5, frequency='1m', field=['close', 'volume'], security_list=security)
# 2. 单独获取日线级别的涨停价数据
day_df = get_history(1, frequency='1d', field=['high_limit'], security_list=security)
high_limit_price = day_df['high_limit'][-1]
# 3. 获取当前最新价
current_price = data[security]['close']
# 4. 逻辑判断
if current_price >= high_limit_price:
log.info("股票 %s 已触及涨停价!" % security)
方案三:在实盘/模拟盘交易中使用行情快照(get_snapshot)
如果您是在交易模块(实盘或模拟盘)中运行,并且需要获取实时的涨跌停价格,推荐使用 get_snapshot 接口,该接口返回的快照数据中直接包含 up_px(涨停价)和 down_px(跌停价)。
正确示例(仅限交易模块):
def handle_data(context, data):
security = '600570.SS'
snapshot = get_snapshot(security)
if snapshot and security in snapshot:
up_limit = snapshot[security].get('up_px')
current_price = snapshot[security].get('last_px')
if current_price >= up_limit:
log.info("当前价格已达涨停价:%s" % up_limit)
总结
牢记 ptrade 的数据字段限制:涨跌停价格(high_limit / low_limit)是日线级别的属性。在编写分钟或 Tick 级别策略时,务必将日线数据的获取与分钟线数据的获取分开调用,即可完美解决此报错。