问题描述
解决方案
在 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。
注意事项:
- 数据预下载:使用此函数前,必须确保在 QMT 客户端的【数据管理】工具中已经下载了对应品种和周期的历史数据。
- 参数传递:官方文档建议默认参数需带上参数名方可生效(关键字参数传参)。
- 返回格式:返回的是一个 字典 (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_data 和 get_market_data_ex 有什么区别?
A: get_local_data 仅读取本地磁盘上的数据文件,速度极快但依赖于用户是否手动下载了数据,且返回格式为字典。get_market_data_ex 会尝试从服务器获取最新数据(如果开启了订阅),返回格式通常为 Pandas DataFrame,使用更方便,但在回测模式下通常也依赖本地数据。
Q: 为什么调用 get_local_data 返回空字典?
A: 最常见的原因是本地没有数据。请在 QMT 客户端顶部菜单栏点击“数据管理”,选择对应的市场、品种和周期,点击“下载”补充历史数据。另外,请检查 start_time 和 end_time 格式是否正确。
Q: 如何将 get_local_data 的时间戳转换为日期字符串?
A: 返回的 Key 是毫秒级时间戳。可以使用 Python 的 datetime 模块或 QMT 提供的 timetag_to_datetime 函数进行转换。例如:timetag_to_datetime(timetag, '%Y-%m-%d %H:%M:%S')。