文章摘要在量化交易开发中AkShare凭借简洁的 API 和标准的 DataFrame 返回格式成为很多投资者获取行情数据的首选工具。而MiniQMT作为券商官方提供的量化交易终端拥有稳定合规的实时数据源、极速交易通道和完整的实盘支持但原生数据格式与 AkShare 存在明显差异导致大量基于 AkShare 开发的策略无法直接复用。本文将详细讲解如何将 MiniQMT 的原生数据格式1:1 转换为 AkShare 标准的 DataFrame 格式实现策略代码零修改迁移。文章包含完整的转换逻辑、可直接运行的 Python 代码、常见问题排查帮助你大幅降低学习迁移成本同时兼顾 MiniQMT 的交易优势和 AkShare 的代码生态。1. 为什么要做 MiniQMT 与 AkShare 的数据源转换1.1 两者的核心优势互补工具核心优势核心劣势AkShare开源免费、API 简洁、返回标准 DataFrame 格式、社区生态完善、支持全球多市场数据实时数据稳定性差、无交易通道、高频数据获取受限、存在 IP 封禁风险MiniQMT券商官方数据源、实时行情稳定、支持 Tick 级全量数据、自带极速交易通道、合规性强原生数据格式特殊、API 学习成本高、已有 AkShare 策略无法直接复用1.2 格式不兼容的核心痛点股票代码格式不同AkShare 使用纯数字代码如000001MiniQMT 需要带交易所后缀如000001.SZ复权类型命名不同AkShare 用qfq/hfqMiniQMT 用front/back字段名不同MiniQMT 返回英文字段AkShare 返回中文字段时间格式不同MiniQMT 返回毫秒级时间戳AkShare 返回YYYY-MM-DD格式字符串数据结构不同MiniQMT 返回嵌套字典AkShare 直接返回扁平化 DataFrame通过统一格式你可以 ✅ 直接复用所有基于 AkShare 开发的策略代码 ✅ 同时享受 MiniQMT 的稳定数据和极速交易 ✅ 大幅降低量化系统的重构成本 ✅ 实现 回测用 AkShare实盘用 MiniQMT 的无缝切换2. 核心转换步骤详解我们将整个转换过程拆解为6 个标准化步骤确保转换后的数据与 AkShare 完全一致2.1 股票代码格式转换根据股票代码前缀自动添加对应的交易所后缀以0/3开头 → 深交所.SZ以6开头 → 上交所.SH以8/9开头 → 北交所.BJ2.2 复权类型映射建立 AkShare 与 MiniQMT 的复权类型对应关系AkShare 复权参数MiniQMT 复权参数说明/nonenone不复权qfqfront前复权hfqback后复权2.3 历史数据下载MiniQMT 需要先将历史数据下载到本地缓存才能进行查询。这一步是必须的否则会返回空数据。2.4 市场数据获取调用 MiniQMT 的get_market_data_ex接口获取指定股票、指定周期、指定时间段的行情数据。2.5 字段映射与数据重构将 MiniQMT 返回的英文字段映射为 AkShare 标准的中文字段并重构为扁平化的 DataFrame。2.6 时间戳格式处理将 MiniQMT 返回的毫秒级时间戳转换为 AkShare 标准的YYYY-MM-DD格式字符串并按日期升序排序。3. 完整可运行转换代码3.1 前置依赖安装首先确保你已经安装了必要的 Python 库pip install pandas xtquant注意xtquant是 MiniQMT 的 Python SDK需要先安装 MiniQMT 客户端并登录后才能使用。3.2 完整转换函数from xtquant import xtdata import pandas as pd import time def stock_zh_a_hist_miniqmt(symbol, start_date, end_date, adjust): 将MiniQMT的A股历史数据转换为AkShare标准格式的DataFrame 参数 symbol: 股票代码纯数字如000001 start_date: 开始日期格式YYYYMMDD如20250101 end_date: 结束日期格式YYYYMMDD如20250930 adjust: 复权类型可选值(不复权), qfq(前复权), hfq(后复权) 返回 pd.DataFrame: 与AkShare stock_zh_a_hist 接口返回格式完全一致的DataFrame # -------------------------- 步骤1转换股票代码格式 -------------------------- if symbol.startswith((0, 3)): xt_code f{symbol}.SZ elif symbol.startswith(6): xt_code f{symbol}.SH elif symbol.startswith((8, 9)): xt_code f{symbol}.BJ else: print(f无法识别的股票代码: {symbol}) return pd.DataFrame() # -------------------------- 步骤2设置复权类型 -------------------------- dividend_type none if adjust qfq: dividend_type front elif adjust hfq: dividend_type back try: # -------------------------- 步骤3下载历史数据 -------------------------- print(f开始下载 {symbol} 的历史数据...) xtdata.download_history_data(xt_code, 1d, start_date, end_date) # 等待数据下载完成根据网络情况调整等待时间 time.sleep(3) # -------------------------- 步骤4获取市场数据 -------------------------- print(f获取 {symbol} 的市场数据...) market_data_dict xtdata.get_market_data_ex( field_list[open, high, low, close, volume, amount], stock_list[xt_code], period1d, start_timestart_date, end_timeend_date, dividend_typedividend_type, count-1 ) if market_data_dict is None or xt_code not in market_data_dict: print(f未获取到 {symbol} 的数据。) return pd.DataFrame() stock_data market_data_dict[xt_code] # -------------------------- 步骤5字段映射与数据重构 -------------------------- # 建立MiniQMT字段到AkShare字段的映射关系 field_mapping { time: 日期, open: 开盘, high: 最高, low: 最低, close: 收盘, volume: 成交量, amount: 成交额 } result_data {} for xt_field, ak_field in field_mapping.items(): if hasattr(stock_data, columns) and xt_field in stock_data.columns: result_data[ak_field] stock_data[xt_field].values elif isinstance(stock_data, dict) and xt_field in stock_data: result_data[ak_field] stock_data[xt_field] df pd.DataFrame(result_data) if df.empty: print(转换后的DataFrame为空) return df # -------------------------- 步骤6处理时间格式 -------------------------- if 日期 in df.columns: # 将毫秒级时间戳转换为YYYY-MM-DD格式 if df[日期].dtype in [int, float]: df[日期] pd.to_datetime(df[日期], unitms) df[日期] df[日期].dt.strftime(%Y-%m-%d) # 添加股票代码列 df[股票代码] symbol # 按日期升序排序 if 日期 in df.columns: df df.sort_values(日期).reset_index(dropTrue) return df except Exception as e: print(f处理股票 {symbol} 时发生错误: {e}) import traceback traceback.print_exc() return pd.DataFrame()4. 使用示例与测试效果4.1 基本使用方法if __name__ __main__: # 测试用例不同股票、不同复权类型 test_cases [ (000001, 20250101, 20250930, ), # 平安银行不复权 (600519, 20250101, 20250930, qfq), # 贵州茅台前复权 (834765, 20250101, 20250930, hfq) # 康乐卫士后复权北交所 ] for symbol, start, end, adj in test_cases: print(f\n{*50}) print(f正在测试: {symbol} | 时间段: {start} ~ {end} | 复权: {adj}) print(f{*50}) df stock_zh_a_hist_miniqmt(symbol, start, end, adjustadj) print(df.head(10)) print(f\n数据总行数: {len(df)})4.2 输出效果示例 正在测试: 600519 | 时间段: 20250101 ~ 20250930 | 复权: qfq 开始下载 600519 的历史数据... 获取 600519 的市场数据... 日期 开盘 最高 最低 收盘 成交量 成交额 股票代码 0 2025-01-02 1685.00 1702.50 1678.00 1695.00 2156800.0 3.652340e09 600519 1 2025-01-03 1692.00 1710.00 1688.00 1705.00 2345100.0 3.987650e09 600519 2 2025-01-06 1703.00 1720.00 1695.00 1715.00 2567900.0 4.321090e09 600519 ... 数据总行数: 182可以看到输出格式与 AkShare 的stock_zh_a_hist接口完全一致你可以直接替换原有代码中的 AkShare 调用无需修改任何策略逻辑。5. 常见问题与避坑指南5.1 数据下载失败或返回空数据确保 MiniQMT 客户端已经登录并且网络连接正常检查股票代码是否正确不要带交易所后缀适当增加time.sleep(3)的等待时间确保数据下载完成如果是历史较早的数据可以分多次下载5.2 复权数据与 AkShare 不一致不同数据源的复权计算方式可能存在细微差异这是正常现象建议在实盘前用同一时间段的数据对比两者的差异确保策略逻辑不受影响5.3 支持其他周期的数据吗本代码默认支持日线数据period1d如果需要分钟线数据只需修改period参数即可如1m表示 1 分钟线注意分钟线数据的下载时间会更长建议按需下载5.4 如何实现实时数据转换对于实时数据可以使用 MiniQMT 的订阅接口xtdata.subscribe_quote收到实时行情推送后使用相同的字段映射逻辑进行转换即可6. 总结通过本文介绍的格式转换方法你可以轻松实现MiniQMT 与 AkShare 数据源的无缝切换。这不仅能让你复用大量已有的策略代码还能同时享受 MiniQMT 稳定的官方数据源和极速交易通道。本文核心价值提供了1:1 兼容 AkShare 格式的转换函数代码可直接运行详细拆解了转换的每一个步骤方便你根据自己的需求进行修改总结了常见问题和避坑指南帮助你快速上手实现了 回测用 AkShare实盘用 MiniQMT 的最佳实践如果你正在从 AkShare 迁移到 MiniQMT 进行实盘交易这个转换函数将帮你节省大量的开发时间。建议收藏本文方便后续查阅和使用。6. 风险提示数据准确性风险本文提供的转换代码仅实现格式层面的统一不同数据源MiniQMT 与 AkShare在复权计算、数据修正、时间戳精度等方面可能存在固有差异转换后的数据不保证与 AkShare 原始数据 100% 一致。实盘交易前务必对数据进行多维度交叉验证。量化交易风险量化交易存在较高的市场风险、策略失效风险和技术风险。历史回测收益不代表未来实盘表现任何策略都可能在市场环境变化时出现大幅亏损。投资者应根据自身风险承受能力谨慎使用量化交易工具。系统稳定性风险MiniQMT 客户端、网络连接、券商服务器等环节均可能出现故障导致数据下载失败、策略中断或交易指令无法执行。建议建立完善的监控和应急机制避免因系统问题造成不必要的损失。合规性风险投资者使用 MiniQMT 进行交易时必须严格遵守中国证监会、证券交易所及所属券商的相关规定不得利用量化工具进行内幕交易、操纵市场、频繁撤单等违法违规行为。代码使用风险本文提供的代码仅供学习和研究使用不构成任何投资建议。投资者在实盘使用前务必进行充分的模拟测试和代码审查自行承担因代码缺陷导致的所有风险。
MiniQMT 与 AkShare 数据源无缝切换:格式转换全攻略 + 可运行代码
发布时间:2026/6/4 6:38:57
文章摘要在量化交易开发中AkShare凭借简洁的 API 和标准的 DataFrame 返回格式成为很多投资者获取行情数据的首选工具。而MiniQMT作为券商官方提供的量化交易终端拥有稳定合规的实时数据源、极速交易通道和完整的实盘支持但原生数据格式与 AkShare 存在明显差异导致大量基于 AkShare 开发的策略无法直接复用。本文将详细讲解如何将 MiniQMT 的原生数据格式1:1 转换为 AkShare 标准的 DataFrame 格式实现策略代码零修改迁移。文章包含完整的转换逻辑、可直接运行的 Python 代码、常见问题排查帮助你大幅降低学习迁移成本同时兼顾 MiniQMT 的交易优势和 AkShare 的代码生态。1. 为什么要做 MiniQMT 与 AkShare 的数据源转换1.1 两者的核心优势互补工具核心优势核心劣势AkShare开源免费、API 简洁、返回标准 DataFrame 格式、社区生态完善、支持全球多市场数据实时数据稳定性差、无交易通道、高频数据获取受限、存在 IP 封禁风险MiniQMT券商官方数据源、实时行情稳定、支持 Tick 级全量数据、自带极速交易通道、合规性强原生数据格式特殊、API 学习成本高、已有 AkShare 策略无法直接复用1.2 格式不兼容的核心痛点股票代码格式不同AkShare 使用纯数字代码如000001MiniQMT 需要带交易所后缀如000001.SZ复权类型命名不同AkShare 用qfq/hfqMiniQMT 用front/back字段名不同MiniQMT 返回英文字段AkShare 返回中文字段时间格式不同MiniQMT 返回毫秒级时间戳AkShare 返回YYYY-MM-DD格式字符串数据结构不同MiniQMT 返回嵌套字典AkShare 直接返回扁平化 DataFrame通过统一格式你可以 ✅ 直接复用所有基于 AkShare 开发的策略代码 ✅ 同时享受 MiniQMT 的稳定数据和极速交易 ✅ 大幅降低量化系统的重构成本 ✅ 实现 回测用 AkShare实盘用 MiniQMT 的无缝切换2. 核心转换步骤详解我们将整个转换过程拆解为6 个标准化步骤确保转换后的数据与 AkShare 完全一致2.1 股票代码格式转换根据股票代码前缀自动添加对应的交易所后缀以0/3开头 → 深交所.SZ以6开头 → 上交所.SH以8/9开头 → 北交所.BJ2.2 复权类型映射建立 AkShare 与 MiniQMT 的复权类型对应关系AkShare 复权参数MiniQMT 复权参数说明/nonenone不复权qfqfront前复权hfqback后复权2.3 历史数据下载MiniQMT 需要先将历史数据下载到本地缓存才能进行查询。这一步是必须的否则会返回空数据。2.4 市场数据获取调用 MiniQMT 的get_market_data_ex接口获取指定股票、指定周期、指定时间段的行情数据。2.5 字段映射与数据重构将 MiniQMT 返回的英文字段映射为 AkShare 标准的中文字段并重构为扁平化的 DataFrame。2.6 时间戳格式处理将 MiniQMT 返回的毫秒级时间戳转换为 AkShare 标准的YYYY-MM-DD格式字符串并按日期升序排序。3. 完整可运行转换代码3.1 前置依赖安装首先确保你已经安装了必要的 Python 库pip install pandas xtquant注意xtquant是 MiniQMT 的 Python SDK需要先安装 MiniQMT 客户端并登录后才能使用。3.2 完整转换函数from xtquant import xtdata import pandas as pd import time def stock_zh_a_hist_miniqmt(symbol, start_date, end_date, adjust): 将MiniQMT的A股历史数据转换为AkShare标准格式的DataFrame 参数 symbol: 股票代码纯数字如000001 start_date: 开始日期格式YYYYMMDD如20250101 end_date: 结束日期格式YYYYMMDD如20250930 adjust: 复权类型可选值(不复权), qfq(前复权), hfq(后复权) 返回 pd.DataFrame: 与AkShare stock_zh_a_hist 接口返回格式完全一致的DataFrame # -------------------------- 步骤1转换股票代码格式 -------------------------- if symbol.startswith((0, 3)): xt_code f{symbol}.SZ elif symbol.startswith(6): xt_code f{symbol}.SH elif symbol.startswith((8, 9)): xt_code f{symbol}.BJ else: print(f无法识别的股票代码: {symbol}) return pd.DataFrame() # -------------------------- 步骤2设置复权类型 -------------------------- dividend_type none if adjust qfq: dividend_type front elif adjust hfq: dividend_type back try: # -------------------------- 步骤3下载历史数据 -------------------------- print(f开始下载 {symbol} 的历史数据...) xtdata.download_history_data(xt_code, 1d, start_date, end_date) # 等待数据下载完成根据网络情况调整等待时间 time.sleep(3) # -------------------------- 步骤4获取市场数据 -------------------------- print(f获取 {symbol} 的市场数据...) market_data_dict xtdata.get_market_data_ex( field_list[open, high, low, close, volume, amount], stock_list[xt_code], period1d, start_timestart_date, end_timeend_date, dividend_typedividend_type, count-1 ) if market_data_dict is None or xt_code not in market_data_dict: print(f未获取到 {symbol} 的数据。) return pd.DataFrame() stock_data market_data_dict[xt_code] # -------------------------- 步骤5字段映射与数据重构 -------------------------- # 建立MiniQMT字段到AkShare字段的映射关系 field_mapping { time: 日期, open: 开盘, high: 最高, low: 最低, close: 收盘, volume: 成交量, amount: 成交额 } result_data {} for xt_field, ak_field in field_mapping.items(): if hasattr(stock_data, columns) and xt_field in stock_data.columns: result_data[ak_field] stock_data[xt_field].values elif isinstance(stock_data, dict) and xt_field in stock_data: result_data[ak_field] stock_data[xt_field] df pd.DataFrame(result_data) if df.empty: print(转换后的DataFrame为空) return df # -------------------------- 步骤6处理时间格式 -------------------------- if 日期 in df.columns: # 将毫秒级时间戳转换为YYYY-MM-DD格式 if df[日期].dtype in [int, float]: df[日期] pd.to_datetime(df[日期], unitms) df[日期] df[日期].dt.strftime(%Y-%m-%d) # 添加股票代码列 df[股票代码] symbol # 按日期升序排序 if 日期 in df.columns: df df.sort_values(日期).reset_index(dropTrue) return df except Exception as e: print(f处理股票 {symbol} 时发生错误: {e}) import traceback traceback.print_exc() return pd.DataFrame()4. 使用示例与测试效果4.1 基本使用方法if __name__ __main__: # 测试用例不同股票、不同复权类型 test_cases [ (000001, 20250101, 20250930, ), # 平安银行不复权 (600519, 20250101, 20250930, qfq), # 贵州茅台前复权 (834765, 20250101, 20250930, hfq) # 康乐卫士后复权北交所 ] for symbol, start, end, adj in test_cases: print(f\n{*50}) print(f正在测试: {symbol} | 时间段: {start} ~ {end} | 复权: {adj}) print(f{*50}) df stock_zh_a_hist_miniqmt(symbol, start, end, adjustadj) print(df.head(10)) print(f\n数据总行数: {len(df)})4.2 输出效果示例 正在测试: 600519 | 时间段: 20250101 ~ 20250930 | 复权: qfq 开始下载 600519 的历史数据... 获取 600519 的市场数据... 日期 开盘 最高 最低 收盘 成交量 成交额 股票代码 0 2025-01-02 1685.00 1702.50 1678.00 1695.00 2156800.0 3.652340e09 600519 1 2025-01-03 1692.00 1710.00 1688.00 1705.00 2345100.0 3.987650e09 600519 2 2025-01-06 1703.00 1720.00 1695.00 1715.00 2567900.0 4.321090e09 600519 ... 数据总行数: 182可以看到输出格式与 AkShare 的stock_zh_a_hist接口完全一致你可以直接替换原有代码中的 AkShare 调用无需修改任何策略逻辑。5. 常见问题与避坑指南5.1 数据下载失败或返回空数据确保 MiniQMT 客户端已经登录并且网络连接正常检查股票代码是否正确不要带交易所后缀适当增加time.sleep(3)的等待时间确保数据下载完成如果是历史较早的数据可以分多次下载5.2 复权数据与 AkShare 不一致不同数据源的复权计算方式可能存在细微差异这是正常现象建议在实盘前用同一时间段的数据对比两者的差异确保策略逻辑不受影响5.3 支持其他周期的数据吗本代码默认支持日线数据period1d如果需要分钟线数据只需修改period参数即可如1m表示 1 分钟线注意分钟线数据的下载时间会更长建议按需下载5.4 如何实现实时数据转换对于实时数据可以使用 MiniQMT 的订阅接口xtdata.subscribe_quote收到实时行情推送后使用相同的字段映射逻辑进行转换即可6. 总结通过本文介绍的格式转换方法你可以轻松实现MiniQMT 与 AkShare 数据源的无缝切换。这不仅能让你复用大量已有的策略代码还能同时享受 MiniQMT 稳定的官方数据源和极速交易通道。本文核心价值提供了1:1 兼容 AkShare 格式的转换函数代码可直接运行详细拆解了转换的每一个步骤方便你根据自己的需求进行修改总结了常见问题和避坑指南帮助你快速上手实现了 回测用 AkShare实盘用 MiniQMT 的最佳实践如果你正在从 AkShare 迁移到 MiniQMT 进行实盘交易这个转换函数将帮你节省大量的开发时间。建议收藏本文方便后续查阅和使用。6. 风险提示数据准确性风险本文提供的转换代码仅实现格式层面的统一不同数据源MiniQMT 与 AkShare在复权计算、数据修正、时间戳精度等方面可能存在固有差异转换后的数据不保证与 AkShare 原始数据 100% 一致。实盘交易前务必对数据进行多维度交叉验证。量化交易风险量化交易存在较高的市场风险、策略失效风险和技术风险。历史回测收益不代表未来实盘表现任何策略都可能在市场环境变化时出现大幅亏损。投资者应根据自身风险承受能力谨慎使用量化交易工具。系统稳定性风险MiniQMT 客户端、网络连接、券商服务器等环节均可能出现故障导致数据下载失败、策略中断或交易指令无法执行。建议建立完善的监控和应急机制避免因系统问题造成不必要的损失。合规性风险投资者使用 MiniQMT 进行交易时必须严格遵守中国证监会、证券交易所及所属券商的相关规定不得利用量化工具进行内幕交易、操纵市场、频繁撤单等违法违规行为。代码使用风险本文提供的代码仅供学习和研究使用不构成任何投资建议。投资者在实盘使用前务必进行充分的模拟测试和代码审查自行承担因代码缺陷导致的所有风险。