问题描述
如题,请问 1 年前的历史 tick 数据如何获取?投研版只能获取 1 年内的,1 年前怎么获取呢?
解决方案
在 QMT 平台中,API 获取历史数据(包括 Tick 数据)的底层逻辑是读取本地客户端已经下载好的数据。如果您使用的投研版在客户端的【数据管理】中最多只能补充近 1 年的 Tick 数据,那么通过 QMT 的内置 API(如 ContextInfo.get_market_data_ex 或 ContextInfo.get_local_data)确实只能获取到这 1 年内的数据。
由于 Tick 数据量极其庞大,券商或 QMT 官方服务器通常会对普通版或投研版的历史 Tick 数据下载时间跨度进行限制。针对需要 1 年前历史 Tick 数据的需求,建议采用以下几种解决方案:
方案一:使用第三方数据源并结合 Pandas 本地读取(推荐)
QMT 平台内置了标准的 Python 运行环境,并且原生支持 pandas、numpy 等强大的数据处理库。您可以从第三方数据源(如 Tushare、聚宽、万得或购买的商业数据)获取 1 年前的 Tick 数据,将其保存为本地的 CSV 或 HDF5 文件,然后在 QMT 策略中直接使用 pandas 读取。
示例代码:
#coding:gbk
import pandas as pd
import os
def init(ContextInfo):
# 设置股票池
ContextInfo.set_universe(['000001.SZ'])
# 定义本地第三方Tick数据存放路径
ContextInfo.local_tick_path = 'D:/my_tick_data/'
def handlebar(ContextInfo):
stock = ContextInfo.get_universe()[0]
date_str = '20210510' # 假设需要读取1年前的某一天
file_path = os.path.join(ContextInfo.local_tick_path, f"{stock}_{date_str}.csv")
if os.path.exists(file_path):
# 使用 pandas 读取本地 CSV 格式的 Tick 数据
tick_df = pd.read_csv(file_path)
print(f"成功读取 {stock} 在 {date_str} 的历史 Tick 数据:")
print(tick_df.head())
else:
print(f"未找到本地文件: {file_path}")
方案二:联系券商或迅投官方开通更高权限
部分券商的极速交易柜台(如 VIP 节点)或 QMT 的机构/专业版可能会提供更长时间跨度的历史 Tick 数据下载权限。您可以直接联系为您开通 QMT 的券商客户经理,询问是否可以通过付费或升级账号权限的方式,在【数据管理】中解锁 1 年以上的 Tick 数据下载权限。
方案三:自行积累与维护数据
如果您打算长期进行高频量化研究,建议从现在开始,编写一个定时脚本,每天盘后通过 ContextInfo.get_market_data_ex(period='tick') 或 ContextInfo.get_full_tick() 将当天的 Tick 数据获取并导出保存到本地数据库或 CSV 文件中。随着时间的推移,您将建立起属于自己的、不受平台时间限制的 Tick 数据库。
总结:
QMT API 本身不生产数据,只搬运本地客户端的数据。突破 1 年限制的最快方法是外部获取数据 + Pandas 本地读取。