一、为什么需要本地数据管理
在量化交易的策略开发过程中,数据是一切分析与回测的基础。然而,依赖在线数据源进行回测时,您可能会遇到以下诸多痛点:
1. MiniQMT数据源的局限性
传统的回测方式依赖MiniQMT作为数据源,虽然MiniQMT提供了丰富的行情数据接口,但在实际使用中存在诸多限制:
- 依赖MiniQMT登录状态:回测前必须启动MiniQMT客户端并保持登录状态。周末或节假日期间,MiniQMT服务器可能会进行维护,导致无法获取数据,回测工作被迫中断。
- 本地DAT文件格式封闭:MiniQMT将行情数据以二进制DAT格式存储在本地,这种格式是封闭的、不可读的,用户无法直接访问和解析,只能通过MiniQMT的API间接读取。
- 数据读取效率不高:每次回测都需要通过MiniQMT的API逐笔读取数据,尤其在查询大量股票或长时间段数据时,效率较低,速度较慢。
- 难以进行数据管理:由于DAT格式的封闭性,用户很难高效地知道本地已有哪些数据、缺失哪些数据,在进行增量补充、断点续传、数据完整性检测等操作时存在明显障碍。
2. DuckDB本地存储的优势
为了彻底解决上述问题,看海量化V3.2版本引入了基于DuckDB的本地数据存储与管理模块。相比MiniQMT的DAT格式,DuckDB为您的策略回测带来了质的飞跃:
- 脱离MiniQMT依赖:数据一次性导入后,后续回测完全不依赖MiniQMT登录状态,周末维护期间也可正常回测,真正实现离线可用。
- 开放的数据格式: DuckDB是开源的列式数据库,数据存储格式透明,用户可以自由访问、查询、导出,完全掌控自己的数据。
- 高效的查询性能:相比MiniQMT的DAT格式,DuckDB的列式存储和索引机制使得查询速度大幅提升,尤其在处理大量股票和长时间段数据时,性能优势明显。
- 完善的数据管理: DuckDB天然支持SQL查询,可以轻松实现数据完整性检测、缺失数据识别、增量补充、断点续传等高级功能,告别DAT格式的”黑盒”状态。
- 一次导入,永久使用:数据长期保存在本地硬盘,避免重复下载,节省时间和网络流量。
3. 模块定位
本地数据管理模块的核心目标是:为策略回测提供高性能、高可靠性的本地数据支撑。通过一次性导入历史行情数据,构建属于您自己的本地数据库,从而在后续的回测工作中,享受极速的数据访问体验,专注于策略逻辑的优化与改进。
二、快速入门:启动数据管理器
1. 功能入口
在开始使用本地数据管理模块前,需要先在主界面的设置中切换数据源为DuckDB:
- 在看海量化主界面顶部菜单栏,点击【设置】按钮,打开设置对话框,点击【客户端设置】。
- 在设置界面中找到“数据源选择”配置项。
- 将数据源从默认的”MiniQMT在线数据”切换为“DuckDB本地数据库”。
- 点击【确定】保存设置。

完成数据源切换后,点击工具栏的【数据管理】,即可打开本地数据管理器窗口。
2. 界面总览
数据管理器的界面布局清晰,分为以下几个区域:
- 工具栏:位于窗口顶部,包含三大核心功能按钮:
- 【从MiniQMT导入数据】:从在线数据源批量导入历史行情。
- 【定时补充】:设置定时任务,自动补充最新数据。
- 【统计信息】:查看本地数据库的整体状态和存储情况。
- 左侧面板:股票树形列表,按市场(上海、深圳、北京)分组展示已导入的股票,并显示每只股票已有的数据周期及条数。
-
右侧面板:分为上下两部分:
- 上半部分:查询条件设置区域,可选择股票代码、周期、日期范围、复权类型等。
- 下半部分:查询结果展示区域,以表格或图表形式展示数据。
- 状态栏:位于窗口底部,显示操作进度条和实时提示信息。
3. 第一次使用:数据目录配置
在首次使用本地数据管理模块前,需要先配置数据根目录,这是本地数据库存储的位置。
配置步骤
- 在看海量化主界面顶部菜单栏,点击【设置】按钮,打开设置对话框。
- 在设置界面中找到“DuckDB数据路径”配置项。
- 点击【浏览】按钮,选择一个磁盘空间充足的目录作为数据存储路径。
- 默认路径为软件安装目录下的
./stock_data文件夹。 - 强烈建议选择非系统盘(如
D:\stock_data、E:\stock_data)以节省C盘空间。
- 默认路径为软件安装目录下的
- 点击【确定】保存设置。
重要提示:全量数据下载完毕后,数据库体积可能超过100GB(包含全市场股票的日线+分钟线+5分钟线数据)。如果还需要导入Tick数据,存储空间会更大。因此,强烈建议所选路径所在磁盘有至少200GB以上的可用空间,避免后续存储空间不足。
首次打开数据管理器
配置好数据路径后,点击【工具】→【数据管理】打开数据管理器:
- 初始状态下,数据库为空,左侧股票树和右侧查询面板均无内容。
- 系统会在数据根目录下自动创建市场文件夹(
SH/、SZ/、BJ/)和元数据库文件(metadata.db)。 - 您需要先通过【从MiniQMT导入数据】功能导入数据,才能开始使用查询等功能。
三、工具栏功能详解
工具栏的三大功能按钮是数据管理器的核心操作入口。下面逐一详细介绍它们的使用方法。
3.1 从MiniQMT导入数据
功能说明
【从MiniQMT导入数据】是最常用的功能,它允许您从在线数据源(MiniQMT)批量导入历史行情数据到本地数据库。导入对话框提供两种导入模式,分别适用于不同的使用场景。
前置条件
在使用此功能前,请确保MiniQMT客户端已启动并成功登录(由您的券商提供)。如果未启动MiniQMT或未登录,导入时会提示”无法连接MiniQMT”,请先启动并登录MiniQMT客户端。
打开导入对话框
点击工具栏的【从MiniQMT导入数据】按钮,弹出导入对话框。对话框顶部有两个Tab页选项卡:
- 全量增量补充:一键扫描所有预设板块,自动补充缺失数据,适合日常维护和大规模数据更新。
- 自定义补充数据:灵活选择股票池和数据范围,适合针对性导入特定股票或时间段的数据。
模式一:全量增量补充
适用场景:
- 首次导入,需要建立完整的本地数据库。
- 定期维护,自动检测并补充缺失的数据段。
- 大规模数据更新,覆盖全市场股票。
功能特点:
- 预设板块全覆盖:自动扫描沪深A股、上证A股、深证A股、沪深300、上证50、中证500、创业板、科创板、沪深ETF、沪深转债、T0型ETF、常用指数等12个预设板块,覆盖数千只股票。
- 智能缺失检测:系统自动检测每只股票在指定时间范围内的缺失数据段,只下载缺失部分,避免重复下载。
- 断点续传:支持中途停止,下次启动时可继续上次未完成的任务,无需从头开始。
操作步骤:
步骤1:切换到”全量增量补充”Tab页
打开导入对话框后,默认显示”全量增量补充”页面(如果不是,请点击顶部Tab页切换)。
步骤2:设置数据周期和时间范围
对话框提供4种数据周期,每种周期可独立设置起止日期:
- 日线(1d):
- 默认时间范围:近10年(如2015-01-01至2025-01-05)
- 默认勾选:✅
- 说明:数据量小,建议全量导入
- 1分钟(1m):
- 默认时间范围:近1年(如2024-01-01至2025-01-05)
- 默认勾选:✅
- 说明:数据量较大,建议按需设置时间范围
- 5分钟(5m):
- 默认时间范围:近1年(如2024-01-01至2025-01-05)
- 默认勾选:✅
- 说明:数据量中等,适合短周期策略
- Tick数据:
- 默认时间范围:近1个月(如2024-12-05至2025-01-05)
- 默认勾选:❌(数据量极大,默认不导入)
- 说明:仅在高频策略开发时勾选
您可以根据实际需求调整每种周期的起止日期,或取消勾选不需要的周期。

步骤3:开始扫描并补充
点击【开始扫描并补充】按钮(绿色醒目按钮),系统开始执行以下流程:
- Phase 1 – 扫描阶段:遍历所有预设板块,获取股票列表。
- Phase 2 – 检测阶段:逐一检测每只股票在各周期的数据完整性,识别缺失数据段。
- Phase 3 – 下载阶段:并行下载缺失的数据,并保存到本地数据库。
步骤4:进度监控
导入过程中,界面实时显示以下信息:
- 总进度条:显示整体完成百分比。
- 状态标签:显示当前阶段(如”Phase 1: 扫描板块”、”Phase 2: 检测缺失”、”Phase 3: 下载数据”)。
- 任务统计:显示总任务数、已完成数。
- 倒计时估算:显示剩余时间(ETA)。
- 执行日志:实时滚动显示详细的下载日志,包括成功、失败、跳过等信息。
步骤5:中途停止与恢复
- 如需中途停止,点击【停止】按钮,系统会保存当前进度到
full_increment_progress.json文件。 - 下次打开导入对话框时,如检测到进度文件,会自动提示是否继续上次未完成的任务。点击【继续】即可断点续传,无需从头开始。
步骤6:完成
所有任务完成后,点击【关闭】按钮退出对话框。左侧股票树会自动刷新,显示新导入的数据。
【截图占位】:全量增量补充页面,展示周期设置和进度信息。
模式二:自定义补充数据
适用场景:
- 针对性导入特定股票池(如仅导入沪深300成分股)。
- 补充特定时间段的数据(如只补充2024年的数据)。
- 测试导入流程(先导入少量股票验证)。
功能特点:
- 灵活选股:支持三种选股方式 —— 预设板块、从文件导入、手动输入。
- 精准控制:可自由设置股票范围、周期类型、日期范围。
- 快速验证:适合小规模测试,避免大规模下载浪费时间。
操作步骤:
步骤1:切换到”自定义补充数据”Tab页
打开导入对话框后,点击顶部的”自定义补充数据”Tab页切换到此模式。
步骤2:选择股票
对话框提供三种选股方式,通过单选按钮切换:
方式1:预设板块(默认)
- 勾选需要导入的板块,如【沪深300】、【上证50】、【沪深ETF】等。
- 可同时勾选多个板块,系统会合并去重后导入。
- 适合按板块批量导入。
方式2:从文件导入
- 点击【浏览…】按钮,选择一个CSV文件,文件中每行一个股票代码。
- CSV文件格式示例:
000001.SZ 600000.SH 300750.SZ - 适合已有股票池清单文件的用户。
方式3:手动输入
- 在文本框中手动输入股票代码,每行一个。
- 支持纯数字(如
000001)或带市场后缀(如000001.SZ)。 - 示例:
000001.SZ 600000 300750 - 适合少量股票的快速导入或测试。
步骤3:选择数据周期
勾选需要导入的周期:
- 日线(1d)
- 1分钟(1m)
- 5分钟(5m)
- Tick数据
可多选,系统会依次导入选中的周期。
步骤4:设置日期范围
- 起始日期:数据导入的开始时间,例如
2021-01-01。 - 结束日期:数据导入的结束时间,例如
2024-12-31。
建议:根据回测需求设置,避免导入过多无用数据。例如,回测只需近3年数据,就无需导入更早的数据。
步骤5:开始导入
点击【开始导入】按钮,系统启动多进程并行下载。
步骤6:进度监控
导入过程中,对话框实时显示:
- 总进度条:显示整体完成百分比,如”45% (23/50)”。
- 状态标签:显示当前导入状态。
- 倒计时估算:显示剩余时间(ETA)。
- 详细日志窗口:实时滚动显示每只股票的导入状态:
- 成功:”600000 浦发银行 1d: 成功导入 1250 条”
- 失败:”000001 平安银行 1d: 失败,数据源无数据”
- 跳过:”600009 上海机场 1d: 已存在,跳过”
步骤7:完成导入
所有股票导入完毕后,进度条显示100%,点击【关闭】按钮退出对话框。左侧股票树会自动刷新。
3.2 定时补充数据
功能说明
【定时补充】功能允许您设置定时任务,让系统在指定时间自动检测并补充最新的交易日数据。这对于需要长期使用本地数据库的用户来说,是非常实用的日常维护功能。
使用场景
- 日常维护:每个交易日收盘后(如16:00),自动更新当日最新数据,保持本地数据库与市场同步。
- 保持同步:避免手动导入的繁琐,确保本地数据库始终处于最新状态,随时可用于回测。
操作方式
步骤1:打开定时补充设置
点击工具栏的【定时补充】按钮,弹出定时任务设置对话框。
步骤2:配置定时任务
- 执行时间:选择每日执行的时间点,建议设置为15:30(A股收盘后),确保当日数据已生成。
- 股票范围:选择要补充数据的股票:
- 【全部股票】:补充本地数据库中所有已导入股票的最新数据。
- 【指定股票池】:仅补充特定股票池的数据,节省时间。
- 补充周期:勾选要补充的周期(1d/1m/5m),可多选。
步骤3:保存设置
点击【确定】保存设置。系统会在每日指定时间自动运行补充任务。
补充策略
- 当日数据更新:定时补充任务会在每日指定时间自动下载当日最新的交易数据,确保本地数据库与市场同步。系统会针对所选股票池,获取当日的最新行情数据并存储到本地数据库。
-
自动执行:任务在设定的时间点自动触发,无需手动操作。系统会智能跳过非交易日(周末、节假日),仅在交易日执行数据补充。
-
最小化到托盘:在定时任务运行期间,点击数据管理器的【关闭】按钮,可以选择将窗口最小化到系统托盘,让任务在后台静默运行,不干扰您的正常使用。任务完成后,会在日志中记录补充结果。
提示:定时补充功能依赖于MiniQMT客户端的持续在线。如果MiniQMT未启动或未登录,补充任务会失败。
3.3 统计信息
功能说明
【统计信息】功能提供了本地数据库的整体状态概览,帮助您快速了解数据库的覆盖范围、存储空间占用情况等关键信息。
操作方式
点击工具栏的【统计信息】按钮,弹出统计信息对话框。
展示内容
1. 总体统计
- 总股票数量:本地数据库中已导入的股票总数,例如”总股票数:327″。
- 总存储大小:数据库文件占用的磁盘空间,自动换算为MB或GB,例如”总存储大小:1.25 GB”。
2. 市场分布
按市场分组统计股票数量:
- 上海市场(SH):如”上海:180只(55%)”。
- 深圳市场(SZ):如”深圳:140只(43%)”。
- 北京市场(BJ):如”北京:7只(2%)”。
3. 周期统计
按数据周期统计已导入数据的股票数量:
- 日线(1d):如”日线:327只”。
- 分钟线(1m):如”分钟线:50只”。
- 5分钟线(5m):如”5分钟线:0只”。
- Tick数据:如”Tick:0只”。
用途
- 了解覆盖范围:快速查看本地数据库已覆盖哪些股票、哪些周期,便于规划后续导入工作。
- 规划存储空间:根据总存储大小,评估是否需要清理旧数据或扩容磁盘空间。例如,如果发现数据库已占用数十GB,但回测只需要近3年数据,可以考虑删除更早的数据以释放空间。
- 确认数据完整性:例如,如果您预期导入了100只股票的日线数据,但统计显示只有90只,说明有10只股票导入失败或被跳过,需要进一步检查。
四、数据查询与管理
数据导入完成后,就可以利用数据管理器的查询功能,随时浏览、检查和导出本地数据了。
4.1 数据浏览与查询
4.1.1 左侧股票树导航
树形结构
左侧的股票树以三级树状结构组织数据:
- 一级节点:市场分组,如”SH(上海)”、”SZ(深圳)”、”BJ(北京)”。
- 二级节点:股票代码和名称,例如”600000 浦发银行”、”000001 平安银行”。
- 三级节点:该股票已有的数据周期及条数,例如:
- “1d (1250条)”
- “1m (48000条)”
- “5m (0条)” —— 表示尚未导入5分钟线数据
快速浏览
- 展开/折叠:点击节点前的三角图标,展开或折叠下级节点。
- 点击加载:点击某个周期节点(如”1d (1250条)”),右侧查询面板会自动加载该股票该周期的全部数据,无需手动设置查询条件。这是快速预览数据的最便捷方式。
4.1.2 搜索功能
位置:左侧面板顶部的搜索框。
功能:输入股票代码或名称,实时筛选匹配的股票,帮助您快速定位目标股票。
示例:
- 输入”平安“,股票树会自动筛选并高亮显示所有名称中包含”平安”的股票,如”平安银行”、”中国平安”等。
- 输入”600“,股票树会显示所有代码以”600″开头的沪市股票。
提示:搜索支持模糊匹配,输入部分代码或名称即可。清空搜索框后,股票树恢复显示所有股票。
4.1.3 右侧查询面板
右侧查询面板分为条件设置区和结果展示区两部分。
查询条件设置
- 股票代码:下拉选择已导入的股票,或手动输入股票代码。
- 下拉框会列出所有已导入的股票,格式为”600000 浦发银行”。
- 周期选择:选择要查询的数据周期:
- 1d:日线数据
- 1m:分钟线数据
- 5m:5分钟线数据
- tick:逐笔成交数据(Tick数据)
- 日期范围:
- 起始日期:查询的开始时间,例如
2024-01-01。 - 结束日期:查询的结束时间,例如
2024-12-31。 - 留空:如果留空,则查询该股票的全部数据。
- 起始日期:查询的开始时间,例如
- 复权类型(仅K线数据,即1d/1m/5m):
- 不复权(none):原始价格,未经任何调整。
- 前复权(front):以当前价格为基准,向历史调整,保持当前价格真实。
- 后复权(back):以上市价为基准,向未来调整,保持历史价格真实。
- 等比前复权(front_ratio):在前复权基础上保持相对涨跌幅不变。
- 等比后复权(back_ratio):在后复权基础上保持相对涨跌幅不变。
- (复权详解请参见”五、高级特性说明”部分)
- 字段筛选(可选):可勾选只显示特定字段,例如仅显示开、高、低、收、量,减少数据传输量,加快查询速度。
-
【查询】按钮:点击后执行查询,结果显示在下方的结果展示区。
查询结果展示
查询结果以Tab页的形式展示:
- 数据表格Tab页:
- 以表格形式展示查询结果,每行代表一条数据记录。
- 列头显示字段名,如
time(时间)、open(开盘价)、high(最高价)、low(最低价)、close(收盘价)、volume(成交量)等。 - 支持上下滚动浏览,如果数据量大,可使用滚动条快速翻页。
- 统计信息Tab页:
- 显示该股票该周期的数据统计,包括:
- 数据条数:如”共 1250 条记录”。
- 时间范围:如”最早:2021-01-04,最晚:2024-12-31″。
- 价格统计:如”最高价:15.68,最低价:8.45″。
- 显示该股票该周期的数据统计,包括:
4.2 数据完整性检查
功能位置
查询面板中的【完整性检查】按钮,位于查询条件设置区的底部。
功能说明
数据完整性检查是一个非常实用的功能,用于检测指定时间范围内是否存在缺失的交易日数据。这对于确保回测数据的完整性至关重要。
检测原理
- 系统首先生成目标时间范围内的所有交易日列表(自动排除周末和法定节假日,使用中国A股交易日历)。
- 然后对比本地数据库中已有的日期。
- 最后找出缺失的交易日,并计算完整性百分比。
详细操作步骤
步骤1:选择股票和周期
在查询面板中,选择要检查的股票代码和周期(1d/1m/5m)。
步骤2:设置目标时间范围
- 起始日期:检查范围的开始时间,例如
2024-01-01。 - 结束日期:检查范围的结束时间,例如
2024-12-31。
提示:建议设置为您的回测时间范围,确保回测所需数据完整。
步骤3:点击【完整性检查】
点击【完整性检查】按钮,系统开始检测。
步骤4:查看检查结果
弹窗显示检查结果,包括:
- 已有数据日期:列出本地数据库中已存在的所有交易日,例如:
2024-01-02, 2024-01-03, ..., 2024-12-30, 2024-12-31 - 缺失数据日期:列出缺失的交易日,例如:
2024-03-15, 2024-03-18, 2024-03-19, ...(共12个交易日) - 完整性百分比:已有数据占应有数据的比例,例如:
数据完整性:95% (238/250个交易日) 缺失:12个交易日
后续操作
- 如果发现缺失数据,您可以记录缺失的日期范围,然后通过【从MiniQMT导入数据】功能,精准设置缺失日期范围进行补充。
-
建议:在回测前,对股票池中的所有股票逐一执行完整性检查,确保数据100%完整。这样可以避免回测过程中因数据缺失导致的异常结果。
4.3 数据导出
功能位置
查询面板中的【导出CSV】按钮,位于查询条件设置区的底部。
导出内容
导出的是当前查询结果,即您在查询面板中设置条件后查询到的数据。
操作步骤
步骤1:执行数据查询
首先在查询面板中设置好查询条件(股票、周期、日期范围、复权类型等),点击【查询】,获取想要导出的数据。
步骤2:点击【导出CSV】
点击【导出CSV】按钮,弹出导出设置对话框。
步骤3:设置导出选项
- 选择字段:勾选要导出的字段。可以全选(导出所有字段),也可以只选择部分字段(如仅导出时间、开、高、低、收、量)。
-
保存路径:点击【浏览】按钮,选择保存路径和文件名,例如
D:\export\600000_1d_2024.csv。
步骤4:确定导出
点击【确定】,系统开始导出。导出完成后,弹窗提示”导出成功”,并显示文件路径。
用途
- 导出到Excel:CSV文件可直接用Excel打开,进行进一步的数据分析、图表制作等。
- 用于外部工具:如Python、R、MATLAB等,进行自定义的数据分析或机器学习建模。
- 数据备份:将本地数据库中的重要数据导出备份,防止数据丢失。
- 共享数据:与团队成员或朋友共享特定股票的历史数据。
五、高级特性说明
5.1 复权数据处理深度解析
什么是复权?
在A股市场中,股票会因为分红、送股、配股等公司行为,产生除权除息。除权除息日,股价会相应调整,导致K线图上出现跳空缺口。
例如,某股票昨日收盘价10元,今日进行10送10分红,那么今日开盘价会自动调整为5元左右(除权后价格)。这种价格跳空并非市场行为,而是会计规则导致的,会对技术分析造成干扰。
复权就是对历史价格进行调整,消除这些非市场因素导致的价格跳空,使K线图连贯,便于进行技术分析和趋势判断。
五种复权类型对比
看海量化的本地数据库支持五种复权类型,满足不同的分析需求:
| 复权类型 | 英文标识 | 调整基准 | 适用场景 | 价格特点 |
|---|---|---|---|---|
| 不复权 | none | 无调整 | 查看真实历史价格 | 除权日有跳空,价格为真实成交价 |
| 前复权 | front | 当前价格 | 技术分析,关注当前价位 | 当前价格真实,历史价格向下调整 |
| 后复权 | back | 上市价 | 长期收益分析 | 上市价真实,后续价格向上调整 |
| 等比前复权 | front_ratio | 当前价格+涨跌幅 | 保持相对收益率的技术分析 | 相对涨跌幅完全准确 |
| 等比后复权 | back_ratio | 上市价+涨跌幅 | 长期收益率精确计算 | 相对涨跌幅完全准确 |
详细说明:
- 不复权(none):显示真实的历史成交价格,未经任何调整。K线图上会看到除权日的跳空缺口。适用于需要查看真实历史价格的场景,如财务分析。
-
前复权(front):以当前最新价格为基准,向历史调整。当前价格保持不变(真实价格),历史价格向下调整。这是最常用的复权方式,适合技术分析和趋势判断,因为可以直观看到当前价格在历史中的位置。
-
后复权(back):以上市首日价格为基准,向未来调整。上市价格保持不变,后续价格向上调整。适合长期投资者分析累计收益,可以看到从上市至今的真实涨幅。
-
等比前复权(front_ratio):在前复权的基础上,进一步保持相对涨跌幅不变。确保每日涨跌幅百分比与不复权时完全一致。适用于需要精确计算收益率的量化策略。
-
等比后复权(back_ratio):在后复权的基础上,保持相对涨跌幅不变。适用于长期收益率的精确计算。
查询时如何选择?
在查询面板的”复权类型“下拉框中选择所需的复权方式,查询结果会自动返回对应复权后的价格字段。
- 例如,选择”前复权(front)”,查询结果中的
open、high、low、close字段,实际返回的是open_front、high_front、low_front、close_front字段的值,即前复权后的价格。
存储优势
看海量化的本地数据库在数据导入时,会自动计算并存储所有5种复权方式的价格。
- 查询时直接读取:无需实时计算复权价格,查询速度极快。
- 灵活切换:可以在查询时随意切换复权类型,无需重新导入数据。
- 完整存储:K线表共26个字段,包含原始价格(不复权)以及4种复权方式的价格,数据完整且冗余度低。
5.2 Tick逐笔数据特性
什么是Tick数据?
Tick数据是股票交易的最小颗粒度数据,记录每一笔成交或盘口变化的瞬时快照。与K线数据(日线、分钟线)相比,Tick数据的时间精度达到毫秒级,能够捕捉到市场的每一次微小波动。
例如,某只股票在09:30:00.123时刻,最新成交价为10.56元,买一价为10.55元,卖一价为10.57元,买一量为10000股,卖一量为12000股……这些信息都会被记录在一条Tick数据中。
数据量警告
重要提示:Tick数据量极大,单只股票单个交易日可达数万条,全年数据可达数百万条。请谨慎查询和导入,避免占用过多存储空间和内存。
- 单日数据量:一只活跃股票,单个交易日的Tick数据可达2-5万条。
- 全年数据量:一只股票全年的Tick数据可达约500万-1000万条,存储空间约100-500MB。
- 内存占用:查询大量Tick数据会占用大量内存,可能导致系统卡顿。
推荐使用场景
Tick数据并非日常回测必需,仅在以下场景中使用:
- 高频策略开发:如日内T+0策略、高频套利策略,需要精确到秒或毫秒的成交时间和价格。
- 盘口研究:如大单追踪、主力行为分析、盘口动量因子构建,需要实时的买卖盘口数据。
- 精细化回测:如需要模拟真实的盘口撮合、滑点计算,Tick数据可以提供最接近真实市场的数据。
提示:对于绝大多数趋势策略、价值策略、日线策略,使用日线或分钟线数据即可,无需导入Tick数据。
特有字段
Tick数据包含丰富的字段,除了基本的成交信息,还包括5档买卖盘口数据:
5档买卖盘口:
- askPrice1-5:五档卖价(卖一价、卖二价、…、卖五价)
- bidPrice1-5:五档买价(买一价、买二价、…、买五价)
- askVol1-5:五档卖量(卖一量、卖二量、…、卖五量)
- bidVol1-5:五档买量(买一量、买二量、…、买五量)
成交信息:
- lastPrice:最新成交价
- volume:成交量
- amount:成交额
- transactionNum:成交笔数
期货字段(仅期货品种):
- openInt:持仓量
- lastSettlementPrice:昨结算价
查询建议
- 缩小日期范围:尽量只查询1-5个交易日的Tick数据,避免一次性查询数月或全年数据。
- 只查询必要字段:在字段筛选中,只勾选需要的字段(如时间、最新价、买一价、卖一价),减少数据传输量。
- 及时释放内存:大规模查询Tick数据后,及时关闭数据管理器窗口,释放内存。
5.3 数据存储结构说明
了解本地数据库的存储结构,有助于您更好地管理和维护数据。
文件组织方式
数据根目录(默认./stock_data)/
├── SH/ # 上海市场文件夹
│ ├── 600000.db # 浦发银行数据库文件
│ ├── 600009.db # 上海机场
│ ├── 600016.db # 民生银行
│ └── ... # 其他沪市股票(每只股票一个.db文件)
├── SZ/ # 深圳市场文件夹
│ ├── 000001.db # 平安银行
│ ├── 000002.db # 万科A
│ └── ... # 其他深市股票
├── BJ/ # 北京市场文件夹(新三板精选层)
│ └── ...
├── metadata.db # 全局元数据库
└── config.json # 配置文件
单股票数据库说明
- 每只股票对应一个独立的.db文件,文件名为股票代码(如
600000.db代表浦发银行)。 - 一个.db文件内包含该股票的所有周期数据,采用多表结构:
- kline_1d表:日线数据
- kline_1m表:分钟线数据
- kline_5m表:5分钟线数据
- tick表:逐笔成交数据
- stock_info表:股票基本信息(如股票名称、市场代码等)
元数据库(metadata.db)
- stock_list表:记录所有已导入的股票及其数据状态,包括股票代码、名称、市场、已有周期、最后同步时间等。
- sync_log表:记录每次导入操作的日志,包括导入时间、导入股票、导入周期、成功条数、错误信息等,便于追溯历史操作。
存储空间估算(单只股票)
下表提供了单只股票各周期数据的存储空间参考:
| 数据类型 | 每年数据量估算 | 存储空间(每年) |
|---|---|---|
| 日线(1d) | 约250条 | 约50KB |
| 分钟线(1m) | 约48,000条 | 约10MB |
| 5分钟线(5m) | 约10,000条 | 约2MB |
| Tick数据 | 约100-500万条 | 约100-500MB |
示例计算:
- 100只股票,各5年日线:100 × 5年 × 50KB = 25MB
- 50只股票,各1年分钟线:50 × 1年 × 10MB = 500MB
- 10只股票,各1年Tick数据:10 × 1年 × 300MB = 3GB
规划建议:
- 日线数据:几乎不占空间,全市场导入(数千只股票)也仅需几百MB。
- 分钟线数据:按需导入,只导入策略真正需要的股票,避免浪费空间。
- Tick数据:极其占用空间,仅在高频策略开发时导入,且只导入必要的股票和时间范围。
六、与策略回测的集成应用
本地数据管理模块的最终目的,是为策略回测提供高性能的数据支撑。本章将详细介绍如何将本地数据无缝集成到回测流程中。
6.1 回测前的数据准备
看海量化V3.2版本的回测系统内置了智能数据检测机制,在启动回测时会自动检测并加载本地DuckDB数据。虽然系统能够自动处理大部分情况,但为确保回测顺利进行,仍建议您提前做好数据准备工作。
基本准备流程
步骤1:确定回测需求
在导入数据前,先明确回测的具体需求:
- 股票池:策略要交易哪些股票?例如,沪深300成分股、中证500成分股、或自选的50只股票。
- 回测时间范围:例如,2020-01-01 到 2024-12-31。
- 所需周期:策略使用日线(1d)、分钟线(1m)、还是5分钟线(5m)?
步骤2:导入数据
- 打开数据管理器:主界面【工具】→【数据管理】。
- 点击【从MiniQMT导入数据】按钮。
- 根据回测需求,选择合适的导入模式:
- 全量增量补充:适合首次导入或大规模数据更新
- 自定义补充数据:适合针对性导入特定股票池
- 设置股票范围、数据周期和时间范围。
- 点击【开始导入】或【开始扫描并补充】,等待导入完成。
提示:首次导入建议从少量股票开始,确认流程无误后,再进行大规模导入。
重要提示:策略所需数据范围
请特别注意:策略在指定回测时段运行时,所需的数据范围往往大于回测时段本身。
例如,您的策略需要计算60日均线,那么即使回测时段是2024-01-01至2024-12-31,您也需要导入2023-11-01之前的数据(至少60个交易日),否则策略在2024年初无法计算出有效的均线指标。
建议做法:
- 预留缓冲期:导入数据时,起始日期应比回测开始日期提前3-6个月(或更多,取决于策略所需的最长指标周期)。
- 完整性检查不等于数据就位:即使完整性检查显示回测时段的数据100%完整,也不代表策略所需的历史数据已经到位。您需要根据策略逻辑,确认是否已导入足够的历史数据。
可选:数据完整性检查
导入完成后,如需确认数据完整性,可对关键股票执行完整性检查:
- 在数据管理器的查询面板选择股票和周期。
- 设置检查的时间范围(建议设置为回测开始日期前推6个月至回测结束日期)。
- 点击【完整性检查】,查看是否有缺失的交易日。
- 如有缺失,使用【从MiniQMT导入数据】功能补充缺失的日期范围。
6.2 配置策略使用本地数据
自动检测机制
看海量化回测系统内置了自动检测机制,无需手动配置,即可实现本地数据的自动加载:
- 启动回测时,系统会自动检测本地DuckDB数据库是否存在。
- 如果检测到本地数据,系统优先使用本地数据,实现极速加载(相比在线下载,速度提升10-100倍)。
- 无需修改策略代码或回测配置,完全透明切换,对策略开发者友好。
验证方法
启动回测后,查看回测日志输出:
- 如果日志中显示”检测到本地数据库,使用本地数据加速回测“,说明成功启用本地数据。
- 回测启动速度明显加快,数据加载阶段几乎无等待时间(秒级完成)。
七、附录:数据表结构详解
本附录提供K线表和Tick表的完整字段说明,供高级用户参考。
7.1 K线表字段说明(26个字段)
K线表(kline_1d、kline_1m、kline_5m)共包含26个字段,涵盖原始价格、复权价格、成交信息等。
| 字段名 | 数据类型 | 说明 | 示例值 |
|---|---|---|---|
| time | INTEGER | 时间戳(主键,毫秒) | 1609459200000 |
| open | REAL | 开盘价 | 10.52 |
| high | REAL | 最高价 | 10.68 |
| low | REAL | 最低价 | 10.45 |
| close | REAL | 收盘价 | 10.60 |
| volume | REAL | 成交量(股) | 5000000 |
| amount | REAL | 成交额(元) | 53000000 |
| preClose | REAL | 前收盘价 | 10.50 |
| suspendFlag | INTEGER | 停牌标记(0正常,1停牌) | 0 |
| settelementPrice | REAL | 结算价(期货) | – |
| openInterest | REAL | 持仓量(期货) | – |
| open_front | REAL | 前复权开盘价 | 8.42 |
| high_front | REAL | 前复权最高价 | 8.54 |
| low_front | REAL | 前复权最低价 | 8.36 |
| close_front | REAL | 前复权收盘价 | 8.48 |
| open_back | REAL | 后复权开盘价 | 15.28 |
| high_back | REAL | 后复权最高价 | 15.52 |
| low_back | REAL | 后复权最低价 | 15.18 |
| close_back | REAL | 后复权收盘价 | 15.40 |
| open_front_ratio | REAL | 等比前复权开盘价 | 8.43 |
| high_front_ratio | REAL | 等比前复权最高价 | 8.55 |
| low_front_ratio | REAL | 等比前复权最低价 | 8.37 |
| close_front_ratio | REAL | 等比前复权收盘价 | 8.49 |
| open_back_ratio | REAL | 等比后复权开盘价 | 15.29 |
| high_back_ratio | REAL | 等比后复权最高价 | 15.53 |
| low_back_ratio | REAL | 等比后复权最低价 | 15.19 |
| close_back_ratio | REAL | 等比后复权收盘价 | 15.41 |
| dividend_type | TEXT | 复权类型标识 | front |
| update_time | TEXT | 更新时间 | 2024-01-01 16:00:00 |
字段说明:
- time:Unix时间戳(毫秒),为主键,保证唯一性。
- open/high/low/close:原始价格(不复权),即真实成交价。
- volume/amount:成交量(股)和成交额(元)。
- preClose:前一交易日收盘价,用于计算涨跌幅。
- suspendFlag:停牌标记,0表示正常交易,1表示停牌。
- settelementPrice/openInterest:期货特有字段,股票数据中通常为空。
- open_front/high_front/low_front/close_front:前复权价格。
- open_back/high_back/low_back/close_back:后复权价格。
- open_front_ratio/high_front_ratio/low_front_ratio/close_front_ratio:等比前复权价格。
- open_back_ratio/high_back_ratio/low_back_ratio/close_back_ratio:等比后复权价格。
- dividend_type:复权类型标识,用于内部管理。
- update_time:该条记录的更新时间,用于追踪数据新鲜度。
7.2 Tick表字段说明(22个字段)
Tick表(tick)共包含22个字段,包含逐笔成交信息和5档盘口数据。
| 字段名 | 数据类型 | 说明 | 示例值 |
|---|---|---|---|
| time | INTEGER | 时间戳(主键,毫秒) | 1609459200123 |
| lastPrice | REAL | 最新成交价 | 10.56 |
| open | REAL | 开盘价 | 10.52 |
| high | REAL | 最高价 | 10.68 |
| low | REAL | 最低价 | 10.45 |
| lastClose | REAL | 昨收价 | 10.50 |
| amount | REAL | 成交额 | 53000000 |
| volume | REAL | 成交量 | 5000000 |
| pvolume | REAL | 持仓量 | – |
| stockStatus | INTEGER | 交易状态 | 0 |
| openInt | REAL | 持仓量(期货) | – |
| lastSettlementPrice | REAL | 昨结算价(期货) | – |
| askPrice1 | REAL | 卖一价 | 10.57 |
| askPrice2 | REAL | 卖二价 | 10.58 |
| askPrice3 | REAL | 卖三价 | 10.59 |
| askPrice4 | REAL | 卖四价 | 10.60 |
| askPrice5 | REAL | 卖五价 | 10.61 |
| bidPrice1 | REAL | 买一价 | 10.56 |
| bidPrice2 | REAL | 买二价 | 10.55 |
| bidPrice3 | REAL | 买三价 | 10.54 |
| bidPrice4 | REAL | 买四价 | 10.53 |
| bidPrice5 | REAL | 买五价 | 10.52 |
| askVol1 | REAL | 卖一量 | 10000 |
| askVol2 | REAL | 卖二量 | 15000 |
| askVol3 | REAL | 卖三量 | 20000 |
| askVol4 | REAL | 卖四量 | 25000 |
| askVol5 | REAL | 卖五量 | 30000 |
| bidVol1 | REAL | 买一量 | 12000 |
| bidVol2 | REAL | 买二量 | 18000 |
| bidVol3 | REAL | 买三量 | 22000 |
| bidVol4 | REAL | 买四量 | 28000 |
| bidVol5 | REAL | 买五量 | 32000 |
| transactionNum | INTEGER | 成交笔数 | 1523 |
字段说明:
- time:Unix时间戳(毫秒),精确到毫秒级,为主键。
- lastPrice:最新成交价,即当前这一笔的成交价格。
- open/high/low:当日开盘价、最高价、最低价(截至当前时刻)。
- lastClose:昨日收盘价。
- amount/volume:累计成交额和成交量(截至当前时刻)。
- pvolume/stockStatus/openInt/lastSettlementPrice:期货特有字段,股票数据中通常为空或0。
- askPrice1-5/bidPrice1-5:五档卖价和五档买价,反映当前盘口挂单价格。
- askVol1-5/bidVol1-5:五档卖量和五档买量,反映当前盘口挂单数量。
- transactionNum:成交笔数,即从开盘至当前时刻的累计成交笔数。









