3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 ptrade 量化交易平台中,调用 get_history 接口获取历史行情时,处理停牌或某时刻缺失的数据(尤其是分钟 K 线数据)是保证策略稳定运行的关键。以下是关于 get_history 接口中 fill 参数的详细用法及停牌处理机制:
get_history 接口中的 fill 参数详解在 get_history 接口中,fill 参数主要用于控制分钟级别数据缺失时的填充行为(注:该参数仅在**交易(实盘/模拟盘)**环境有效):
fill='nan'(默认值):
NaN(Not a Number)进行填充。fill='pre':
NaN 导致技术指标(如 MACD、RSI)计算中断或报错的策略。无论是日线还是分钟线,ptrade 对停牌股票有以下默认处理规则:
volume)和成交额(money)会强制填充为 0。volume == 0 或调用 get_stock_status 接口来过滤停牌标的。以下是一个完整的 ptrade 策略示例。该策略在分钟级别运行,展示了如何安全地获取历史分钟数据,并利用成交量为 0 的逻辑过滤停牌股票,避免废单委托。
def initialize(context):
# 设置操作的股票池(例如:恒生电子)
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
sid = g.security
# 1. 获取最近 10 条分钟 K 线数据,设置 fill='pre' 确保数据连续无 NaN
# 注意:在实盘/模拟盘中,fill='pre' 会用前一分钟数据填充缺失值
df = get_history(
count=10,
frequency='1m',
field=['close', 'volume'],
security_list=sid,
fq='pre',
include=False,
fill='pre'
)
if df is None or df.empty:
log.warning(f"未能获取到 {sid} 的历史数据")
return
# 2. 提取最新的收盘价和成交量
# 在多股或单股返回的 DataFrame 中提取数据(兼容 python3.11 结构)
if 'code' in df.columns:
sub_df = df.query('code in [@sid]')
else:
sub_df = df
last_volume = sub_df['volume'].iloc[-1]
last_close = sub_df['close'].iloc[-1]
# 3. 停牌过滤逻辑:如果最新一分钟的成交量为 0,大概率处于停牌或未开盘状态
if last_volume == 0:
log.info(f"{sid} 当前成交量为 0,可能处于停牌状态,暂不进行交易。")
return
# 4. 正常交易逻辑(示例:简单买入)
cash = context.portfolio.cash
if cash > last_close * 100:
order(sid, 100)
log.info(f"正常交易:买入 {sid} 100股,价格:{last_close}")
get_history 与 get_price 接口不支持多线程同时调用。请避免在 run_daily 或 run_interval 定时任务中与 handle_data 同时调用这两个接口,否则可能导致获取数据为空。fill 参数的填充行为主要在交易环境中生效。在回测环境中,系统会严格按照历史静态数据库进行撮合。