问题描述
/
解决方案
在ptrade量化交易平台中,获取多只股票的历史收盘价时如果发现与第三方软件或预期存在误差,通常是由以下几个核心原因导致的。了解这些机制可以帮助您获取准确的行情数据。
1. 数据复权方式(fq参数)设置不当
股票在发生分红、送股等除权除息事件后,价格会出现跳空。如果在调用 get_history 或 get_price 时没有正确设置复权参数 fq,获取到的价格就会与实际复权后的价格产生巨大误差。
- 解决方案:在策略回测和实盘中,通常建议使用前复权(
fq='pre')或动态前复权(dypre)来保证价格曲线的连续性。
2. 停牌股票的数据填充机制
ptrade在处理停牌场景时,没有跳过停牌的日期。无论对单只股票还是多只股票进行调用,时间轴均为二级市场交易日日历。停牌时,系统会使用停牌前最后一个交易日的数据进行填充,且当天的成交量(volume)为0。
- 解决方案:如果您发现某只股票的收盘价连续多日不变,且成交量为0,说明该股处于停牌状态。可以通过过滤
volume == 0的数据来剔除停牌日的影响。
3. 板块与行业指数数据的计算差异
如果您获取的是证监会行业、聚源行业、概念板块或地域板块的收盘价,需要注意:这些数据为非标准的交易所下发数据,是由数据源自行按照成分股分类规则进行计算的。
- 解决方案:这会导致ptrade的数据与同花顺、通达信等第三方数据源存在不一致。如需在策略中使用,应自行评估该数据的合理性,或通过获取成分股自行加权计算。
4. 多线程并发调用导致数据为空或异常
ptrade的 get_history 与 get_price 接口不支持多线程同时调用。如果在 run_daily 或 run_interval 等定时函数中,与 handle_data 等框架模块同一时刻调用这两个接口,会偶现获取数据为空或错乱的现象。
- 解决方案:错开调用时间,避免在同一时刻并发请求历史行情数据。
标准获取多只股票收盘价的代码示例
以下是一个正确获取多只股票前复权收盘价,并排除停牌影响的示例:
def initialize(context):
g.security = ['600570.SS', '000001.SZ', '000002.SZ']
set_universe(g.security)
def handle_data(context, data):
# 获取过去5天的前复权日K线数据
# 返回DataFrame (Python 3.11环境下,包含code和close列)
history_data = get_history(5, frequency='1d', field=['close', 'volume'], security_list=g.security, fq='pre')
for stock in g.security:
# 筛选单只股票的数据
stock_df = history_data.query('code == @stock')
# 检查今天是否停牌 (成交量为0)
if stock_df['volume'].iloc[-1] == 0:
log.info(f"{stock} 今日停牌,跳过处理")
continue
# 获取准确的收盘价
valid_close = stock_df['close'].iloc[-1]
log.info(f"{stock} 的有效前复权收盘价为: {valid_close}")