🚀 AI 一键生成 qmt 策略代码
立即体验

QMT 平台如何利用 get_local_data 提取并处理非标准分钟周期本地行情?

qmt | 发布时间: 2026/8/13
以下内容由 EasyQuant 生成。

问题描述

QMT 离线分析:如何使用 get_local_data 获取多分钟(如3分钟、15分钟)K线?
qmt 如何利用 get_local_data 提取并处理非标准分钟周期的本地行情?

解决方案

QMT 离线分析:使用 get_local_data 获取多分钟 K 线指南

在 QMT 量化交易平台中,进行离线分析或回测时,我们经常需要获取非标准分钟周期(如 3 分钟、15 分钟或多分钟)的 K 线数据。QMT 提供了高效的本地数据读取接口 ContextInfo.get_local_data(),可以直接从本地数据库中提取这些周期的数据。


1. get_local_data 接口解析

接口定义

ContextInfo.get_local_data(stock_code, start_time='', end_time='', period='1d', divid_type='none', count=-1)

关键参数说明

  • stock_code: 合约代码,格式为 code.market,例如 '600000.SH'
  • start_time / end_time: 开始与结束时间,格式为 'YYYYMMDD''YYYYMMDDHHMMSS'
  • period: K线周期类型。获取多分钟数据时,可传入以下值:
    • '3m':3分钟线
    • '5m':5分钟线
    • '15m':15分钟线
    • '30m':30分钟线
    • 'mm':多分钟线
  • divid_type: 除复权方式,可选 'none'(不复权)、'front'(前复权)、'back'(后复权)等。
  • count: 获取的数据条数。若设为 -1 且指定了时间区间,则获取该区间内的全部数据。

返回值结构

返回一个 Python 字典(dict),键(Key)为毫秒级时间戳(timetag),值(Value)为包含行情字段的字典:

{
    1672531200000: {
        'open': 10.1,
        'high': 10.2,
        'low': 10.0,
        'close': 10.15,
        'volume': 5000,
        'amount': 50750
    },
    ...
}

2. Python 代码示例:提取并转换为 DataFrame

以下示例展示了如何在 handlebar 中提取 3 分钟和 15 分钟的本地 K 线数据,并使用 pandas 库将其转换为易于分析的 DataFrame 格式。

#coding:gbk
import pandas as pd

def init(ContextInfo):
    # 设定基础股票池
    ContextInfo.set_universe(['600000.SH'])

def handlebar(ContextInfo):
    # 仅在最后一根 K 线执行一次,避免重复打印
    if not ContextInfo.is_last_bar():
        return
    
    stock = '600000.SH'
    start = '20230101'
    end = '20230110'
    
    # 1. 获取 3 分钟本地 K 线数据
    data_3m = ContextInfo.get_local_data(
        stock_code=stock,
        start_time=start,
        end_time=end,
        period='3m',
        divid_type='none'
    )
    
    # 2. 获取 15 分钟本地 K 线数据
    data_15m = ContextInfo.get_local_data(
        stock_code=stock,
        start_time=start,
        end_time=end,
        period='15m',
        divid_type='none'
    )
    
    print(f"成功获取 3分钟数据共 {len(data_3m)} 条")
    print(f"成功获取 15分钟数据共 {len(data_15m)} 条")
    
    # 3. 数据处理:转换为 Pandas DataFrame 并格式化时间戳
    if data_3m:
        df_3m = pd.DataFrame.from_dict(data_3m, orient='index')
        # 将毫秒时间戳索引转换为可读的日期时间格式
        df_3m.index = pd.to_datetime(df_3m.index, unit='ms') + pd.Timedelta(hours=8) # 转换为北京时间
        df_3m.index.name = 'datetime'
        
        print("\n--- 3分钟 K 线数据前 5 行 ---")
        print(df_3m.head())

3. 避坑指南与注意事项

  1. 必须提前补充本地数据get_local_data 接口完全依赖本地数据库。在使用前,请务必通过 QMT 客户端的 【操作】-> 【数据管理】 -> 【补充数据】 功能,下载对应品种和对应分钟周期的历史数据,否则接口将返回空字典。
  2. 时间戳转换:接口返回的 Key 是格林威治时间(UTC)的毫秒时间戳。在转换为 Pandas DatetimeIndex 时,建议加上 8 小时的时区偏移(pd.Timedelta(hours=8))以对齐北京时间。
  3. 停牌处理:本地数据接口默认不进行停牌填充,若遇到停牌交易日,相应时间段内将无数据返回。