3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
在 PTrade 中使用 get_history 获取行情数据时,处理缺失值主要依赖于该函数的 fill 参数以及后续对返回数据的 Pandas 处理。
以下是关于如何处理缺失值的详细说明和代码示例。
fill 参数(主要针对分钟级交易环境)根据 PTrade API 文档,get_history 提供了一个名为 fill 的参数,专门用于控制分钟级别数据获取不到某一时刻数据时的填充方式。
fill'nan' (默认值):使用 NaN (Not a Number) 进行填充。这意味着如果某分钟没有数据,返回的 DataFrame 中对应位置将是空值。'pre':使用上一分钟的数据进行填充(即前向填充)。对于日线级别或停牌场景,PTrade 有一套默认的处理逻辑,不受 fill 参数控制:
以下代码展示了如何在策略中调用 get_history 并使用 fill 参数,以及如何使用 Pandas 对获取后的数据进行二次清洗(适用于 fill='nan' 的情况)。
def initialize(context):
# 设置股票池
g.security = '600570.SS'
set_universe(g.security)
def handle_data(context, data):
# ------------------------------------------------------------------
# 方法一:在获取数据时直接指定填充方式 (仅交易模式下分钟线有效)
# ------------------------------------------------------------------
# 使用 'pre':如果某分钟缺失,用上一分钟数据填充
df_pre = get_history(10, frequency='1m', field='close', security_list=g.security, fill='pre')
log.info("使用 fill='pre' 获取的数据:")
log.info(df_pre)
# 使用 'nan':如果某分钟缺失,保留 NaN
df_nan = get_history(10, frequency='1m', field='close', security_list=g.security, fill='nan')
log.info("使用 fill='nan' 获取的数据:")
log.info(df_nan)
# ------------------------------------------------------------------
# 方法二:获取数据后使用 Pandas 进行处理 (通用,推荐)
# ------------------------------------------------------------------
# 如果使用了默认的 fill='nan',或者在回测中需要处理 NaN
if df_nan is not None and not df_nan.empty:
# 1. 去除包含缺失值的行 (Drop)
df_dropped = df_nan.dropna()
# 2. 使用前值填充 (Forward Fill) - 类似于 fill='pre'
# 注意:Python 3.5/Pandas 旧版本中 ffill() 可能不可用,建议使用 fillna(method='ffill')
df_filled = df_nan.fillna(method='ffill')
# 3. 使用特定值填充 (例如 0)
df_zero = df_nan.fillna(0)
log.info("Pandas 前向填充后的数据:")
log.info(df_filled)
# ------------------------------------------------------------------
# 停牌股处理逻辑示例
# ------------------------------------------------------------------
# 获取日线数据,检查成交量是否为0来判断是否由停牌填充而来
daily_df = get_history(5, frequency='1d', field=['close', 'volume'], security_list=g.security)
# 检查最后一条数据的成交量
if daily_df['volume'][-1] == 0:
log.info("该股票当前可能处于停牌状态(成交量为0,价格沿用前值)")
get_history 中设置 fill='pre'。如果您需要识别哪些时间点没有成交(例如判断流动性缺失),请使用 fill='nan'。fill,系统会自动处理停牌数据(价格延续,量为0)。NaN 或 0成交量 的判断(如 df.dropna() 或 if volume > 0:),以防止策略因脏数据报错。Q: get_history 的 fill 参数在回测模式下起作用吗?
A: 根据 API 文档说明,fill 参数仅在交易模块有效。在回测模式下,PTrade 引擎会自动处理数据对齐和停牌填充(通常是价格前向填充,成交量为0),用户无需手动指定。
Q: 如果我获取的数据中包含 NaN,直接计算移动平均线(MA)会报错吗?
A: 这取决于具体的计算库。Pandas 的 mean() 通常会自动忽略 NaN,但如果 NaN 过多可能导致结果偏差。如果在计算技术指标(如 MACD、RSI)之前存在 NaN,建议先使用 df.fillna(method='ffill') 进行处理,否则指标计算结果可能也是 NaN。
Q: 如何判断某只股票当天是否停牌从而导致数据是填充的?
A: 可以通过 get_history 获取 volume(成交量)字段。如果某只股票在交易时间内 volume 为 0,且非涨跌停导致的无量,通常意味着该股票处于停牌状态。此外,也可以使用 get_stock_status(stocks, 'HALT') 接口直接查询停牌状态。