Skip to content

历史 K 线:get_market_data_ex vs get_history

这是工程记录。只谈怎么把日线取齐、复权、当日未收盘。不构成投资建议,不代操盘。

手册: get-market-data-exget-historyqmt-how-to-get-quote

对照

QMT get_market_data_exPTrade get_history
后缀.SH / .SZ.SS / .SZ
复权dividend_type='front'/'back'/'none'fq='pre'/'post'/None
当日这根end_time='' 会含最新include=False 默认不含当前周期
回测本地subscribe=False研究/回测/交易都能调
不要拿来当盘口对,盘口用 get_full_tick盘口用 get_snapshot

盘中日线的 close 会变,不是已收盘价。要定稿日线,结束时间截到上一交易日 15:00。

QMT:定稿日线

python
#coding:gbk
def load_daily(C, codes, last_trade_yyyymmdd, count=60):
    end = last_trade_yyyymmdd + '150000'
    return C.get_market_data_ex(
        ['open', 'high', 'low', 'close', 'volume'],
        codes, period='1d', end_time=end, count=count,
        dividend_type='front', subscribe=False)

def handlebar(C):
    if not C.is_last_bar():
        return
    data = load_daily(C, ['600000.SH'], '20260908', 20)
    df = (data or {}).get('600000.SH')
    print(df.tail() if df is not None else 'empty')

不要在 init 里取数,那时往往只有本地缓存。subscribe=True 会订实时,回测用 False

PTrade:最近 N 根

python
def handle_data(context, data):
    df = get_history(20, frequency='1d', field=['open', 'high', 'low', 'close', 'volume'],
                     security_list='600000.SS', fq='pre', include=False)
    log.info(df.tail() if df is not None else 'empty')

单只必须传字符串 '600000.SS',传 ['600000.SS'] 返回结构会变。is_dict=True 更快。停牌日不会从时间轴里删掉,成交量为 0。

  1. 复权和撮合价不是一套。PTrade 回测撮合常见不复权;均线用 pre、下单用未复权,信号会对不齐。判断和撮合用同一套,或自己换算。
  2. run_daily 里不要和 handle_data 同一时刻抢 get_history / get_price,会偶发空表。
  3. PTrade 历史从 2005 年起。
  4. QMT 盘中 period='1d' 的最后一根 close 会跟着 tick 变。算昨日收益,把 end_time 截昨天。
  5. 后缀错了就是空表,先对 .SS / .SH

相关:API 查询 · 热门问题 · 关注 / 知识星球

完整讨论和附件在 知识星球 Kimi量化研究所