问题描述
xtdata.download_history_data2(["204001.SH"],period="tick", start_time="", end_time="")
仅能下载近一个月的数据,怎么才能下载全量数据呢
解决方案
在 QMT 平台中,使用 xtdata.download_history_data 或 xtdata.download_history_data2 接口下载 period="tick"(分笔数据)时,确实会遇到只能下载近一个月数据的限制。这是因为 Tick 数据量极其庞大,为了保证服务器的稳定性和带宽,QMT 行情服务器对 API 直接拉取 Tick 数据的跨度做了严格限制。
要获取全量的历史 Tick 数据,您可以采用以下几种解决方案:
方案一:通过 QMT 客户端“数据管理”手动补充(推荐)
虽然 API 接口限制了单次下载的时间跨度,但您可以通过 QMT 客户端自带的 UI 界面来补充更长时间的历史 Tick 数据到本地:
- 打开 QMT 客户端,点击顶部菜单栏的 “数据管理”(或在左侧导航栏找到数据管理)。
- 选择 “补充数据” 选项卡。
- 在弹出的界面中,选择您需要的市场(如沪市、深市)和具体的品种(如
204001.SH)。 - 在数据周期中勾选 “分笔”(即 Tick 数据)。
- 设置您需要的开始时间和结束时间。
- 点击“开始补充”。
注:补充过程可能需要较长时间,请耐心等待。补充完成后,数据会保存在本地硬盘中。
方案二:分段下载并拼接(受限于券商服务器配置)
部分券商的 QMT 服务器允许通过 API 下载超过一个月的数据,但前提是必须分段请求。您可以尝试编写一个循环,每次请求一周或一个月的数据,然后将结果拼接起来。但请注意,如果券商服务器物理上只保留了近一个月的 Tick 数据,此方法依然无效。
import pandas as pd
from xtquant import xtdata
import datetime
# 示例:尝试分段下载(需视券商服务器是否支持)
def download_tick_in_chunks(stock, start_date, end_date):
current_start = pd.to_datetime(start_date)
end_dt = pd.to_datetime(end_date)
while current_start < end_dt:
current_end = current_start + pd.Timedelta(days=10) # 每次拉取10天
if current_end > end_dt:
current_end = end_dt
str_start = current_start.strftime("%Y%m%d")
str_end = current_end.strftime("%Y%m%d")
print(f"Downloading {str_start} to {str_end}...")
xtdata.download_history_data2([stock], period="tick", start_time=str_start, end_time=str_end)
current_start = current_end + pd.Timedelta(days=1)
方案三:使用第三方数据源导入
如果 QMT 官方服务器确实没有提供更早的 Tick 数据,您只能依赖第三方数据源(如 Tushare、AkShare、米筐,或购买专业的 Tick 历史数据)。
获取到 CSV 格式的 Tick 数据后,您可以在 QMT 策略中直接使用 pandas 读取本地文件进行回测:
import pandas as pd
def init(ContextInfo):
# 在初始化时加载本地第三方 Tick 数据
ContextInfo.my_tick_data = pd.read_csv("D:/data/204001_SH_tick.csv")
print("本地 Tick 数据加载完成")
总结建议
对于高频策略回测,强烈建议使用方案一,在周末或非交易时间通过 QMT 客户端的“数据管理”工具将所需的历史 Tick 数据一次性下载到本地。下载完成后,在策略中使用 ContextInfo.get_local_data() 或 xtdata.get_market_data_ex(设置 subscribe=False)直接读取本地数据,这样既能绕过 API 的下载限制,又能大幅提升回测速度。