历史 K 线:get_market_data_ex vs get_history
这是工程记录。只谈怎么把日线取齐、复权、当日未收盘。不构成投资建议,不代操盘。
手册: get-market-data-exget-historyqmt-how-to-get-quote
对照
QMT get_market_data_ex | PTrade 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。
坑
- 复权和撮合价不是一套。PTrade 回测撮合常见不复权;均线用
pre、下单用未复权,信号会对不齐。判断和撮合用同一套,或自己换算。 run_daily里不要和handle_data同一时刻抢get_history/get_price,会偶发空表。- PTrade 历史从 2005 年起。
- QMT 盘中
period='1d'的最后一根 close 会跟着 tick 变。算昨日收益,把end_time截昨天。 - 后缀错了就是空表,先对
.SS/.SH。
完整讨论和附件在 知识星球 Kimi量化研究所。
