🚀 AI 一键生成 qmt 策略代码

QMT 数据教程:如何直接读取本地下载的历史行情数据?

qmt | 发布时间: 2025/12/20
以下内容由 EasyQuant 生成。

问题描述

如何不联网直接读取本地已下载的行情数据?

解决方案

在 QMT (Quantitative Trading Platform) 中,若需要不联网直接读取本地已下载的历史行情数据,可以使用 ContextInfo.get_local_data 接口。

该接口直接读取客户端本地存储的行情文件,不向服务器发送请求,因此适用于离线回测或需要极高读取速度的场景。

核心接口说明

函数名: ContextInfo.get_local_data

参数说明:

  • stock_code (必填): 合约代码,格式为 code.market (如 '600000.SH')。
  • start_time (可选): 开始时间,格式为 'YYYYMMDD''YYYYMMDDHHMMSS'
  • end_time (可选): 结束时间,格式同上。
  • period (可选): 周期,默认为 '1d' (日线)。支持 '1m', '5m', 'tick' 等。
  • divid_type (可选): 复权方式,默认为 'none' (不复权)。可选 'front' (前复权), 'back' (后复权) 等。
  • count (可选): 数据条数。默认为 -1。

注意事项:

  1. 数据预下载:使用此函数前,必须确保在 QMT 客户端的【数据管理】工具中已经下载了对应品种和周期的历史数据。
  2. 参数传递:官方文档建议默认参数需带上参数名方可生效(关键字参数传参)。
  3. 返回格式:返回的是一个 字典 (Dict),而不是 Pandas DataFrame。Key 为时间戳 (timetag),Value 为包含行情数据的字典。

代码示例

以下代码展示了如何读取 '600000.SH' (浦发银行) 在指定时间段内的本地日线数据,并将其转换为更易读的 Pandas DataFrame 格式。

# -*- coding: gbk -*-
import pandas as pd

def init(ContextInfo):
    # 设置要获取的股票代码
    stock_code = '600000.SH'
    
    # 调用本地数据接口
    # 注意:必须使用关键字参数传参 (如 period='1d')
    local_data_dict = ContextInfo.get_local_data(
        stock_code=stock_code,
        start_time='20230101',
        end_time='20230201',
        period='1d',
        divid_type='none',
        count=-1
    )
    
    # 打印原始返回类型
    print("返回数据类型:", type(local_data_dict))
    
    # 如果获取到了数据,进行处理
    if local_data_dict:
        # 将字典转换为 DataFrame 以便查看和分析
        # get_local_data 返回格式为 {timetag: {open: x, close: y, ...}, ...}
        df = pd.DataFrame.from_dict(local_data_dict, orient='index')
        
        # 索引是时间戳,通常需要转换成可读日期
        # QMT的时间戳通常是毫秒级,需要根据实际情况调整
        df.index = pd.to_datetime(df.index, unit='ms')
        df.index.name = 'datetime'
        
        # 按时间排序
        df = df.sort_index()
        
        print("本地数据读取成功,前5行如下:")
        print(df.head())
    else:
        print(f"未获取到 {stock_code} 的本地数据,请检查是否已通过数据管理下载数据。")

def handlebar(ContextInfo):
    pass

返回数据结构详解

ContextInfo.get_local_data 返回的数据结构如下:

  • Period 为 'tick' 时
    Value 字典包含:lastPrice (最新价), amount (成交额), volume (成交量), openInt (持仓量), askPrice (卖价五档列表), bidPrice (买价五档列表) 等。
  • Period 为其他周期 (如 '1d', '1m') 时
    Value 字典包含:open, high, low, close, volume, amount

Q&A

Q: get_local_dataget_market_data_ex 有什么区别?
A: get_local_data 仅读取本地磁盘上的数据文件,速度极快但依赖于用户是否手动下载了数据,且返回格式为字典。get_market_data_ex 会尝试从服务器获取最新数据(如果开启了订阅),返回格式通常为 Pandas DataFrame,使用更方便,但在回测模式下通常也依赖本地数据。

Q: 为什么调用 get_local_data 返回空字典?
A: 最常见的原因是本地没有数据。请在 QMT 客户端顶部菜单栏点击“数据管理”,选择对应的市场、品种和周期,点击“下载”补充历史数据。另外,请检查 start_timeend_time 格式是否正确。

Q: 如何将 get_local_data 的时间戳转换为日期字符串?
A: 返回的 Key 是毫秒级时间戳。可以使用 Python 的 datetime 模块或 QMT 提供的 timetag_to_datetime 函数进行转换。例如:timetag_to_datetime(timetag, '%Y-%m-%d %H:%M:%S')