尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

通达信Day文件解析:从二进制到CSV的跨市场量化数据转换指南

发布时间:2026/9/2 18:15:03

资讯中心
01
ARTICLE

通达信Day文件解析:从二进制到CSV的跨市场量化数据转换指南

通达信Day文件解析:从二进制到CSV的跨市场量化数据转换指南
简介一份专为通达信本地数据使用者准备的小型转换工具面向需要将day行情转化为CSV的股票、基金及港股分析者。它覆盖上证、深证与港股目录针对股票、基金及港股在字段结构上的差异逐一适配解析后输出整洁的CSV可显著减少手工二进制解析与格式兼容成本。压缩包共2个文件仅8KB内含一个免安装的stock.exe和一个C语言源文件exe适合直接下载后复制到对应行情目录即用源码则方便开发者理解转换逻辑、自行调整字段或移植到其他场景。目前已有6251人学习浏览足见其在量化备数、盘后复盘等场景下的实用需求。通过这版小工具用户既能快速完成通达信day文件到通用表格数据的批量转换也能从C源码中掌握不同市场、不同品种的底层格式差异为后续扩展或独立开发打下基础。 打开通达信的数据目录你会看到一堆后缀为.day的文件。很多人在本地做量化回测、迁移历史数据、或者把通达信数据喂给别的软件时第一道坎就是怎么把这堆二进制文件转成自己能用的格式。这个需求看似基础但真做起来牵扯的细节不少尤其是当你面对的不只是A股还有港股、场内基金这些品种时很多通用脚本会直接翻车。我自己在处理这批文件时踩过不少坑也把格式和转换流程完整摸了一遍。这篇文章就从格式结构、转换方案、实操代码到问题排查把通达信day文件转换这件事一次说透。1. 项目概述与整体设计思路1.1 核心需求解析day文件也叫日线数据文件是通达信本地存储K线数据的主要格式之一。它记录了一只股票或基金从上市以来的每一个交易日开盘价、最高价、最低价、收盘价、成交量、成交额等核心信息。对于做策略回测、数据迁移、或是多平台数据同步的人来说这些文件是最原始也是最可靠的数据源。但问题在于通达信的day文件是二进制格式不是我们常见的CSV或者JSON直接用文本编辑器打开全是乱码。而且不同市场沪深A股、港股、基金的数据字段含义和处理细节有差异一个不留神就会解析出错误的价格和成交量。这个项目的核心目标就很清晰写一个健壮的转换程序把通达信的.day二进制文件解析成通用格式通常是CSV同时兼容A股、港股和基金三类品种并且处理掉成交量单位、价格精度、复权标记这些容易踩坑的细节。1.2 为什么需要自行转换而非导出有人会问通达信软件本身不就能导出数据吗确实能但局限性很大。通达信自带的“数据导出”功能在菜单里操作一次只能导出一只股票而且导出的是当前界面显示的周期。如果你有几百只股票的历史日线要导出手动操作会让人崩溃。更关键的是导出的数据往往经过了软件层面的处理比如复权计算、格式化精度你拿到的不是最原始的底层数据。而直接解析.day文件有几大优势一次脚本批量处理所有股票拿到的是最底层、未经过多处理的原始数据不依赖通达信软件是否运行可以精确控制输出格式和字段这个方案本质上是一个“二进制解析格式转换”的项目核心难点不在于写代码本身而在于理解通达信的数据存储规则。下面深入拆解。2. day文件二进制格式深入解析2.1 day文件基础结构通达信day文件的格式是公开的秘密网上流传的资料不少我实测核对后确认结构如下。每一条记录固定占用32个字节按顺序排列偏移量长度字节字段名数据类型说明04日期int32实际日期 该值 1900年1月1日的偏移天数44开盘价int32实际价格 该值 / 10084最高价int32实际价格 该值 / 100124最低价int32实际价格 该值 / 100164收盘价int32实际价格 该值 / 100204成交额float32单位元244成交量int32单位股A股284保留字段int32通常为0我最初在解析时有个误区以为日期字段是Unix时间戳直接转就出错了。后来才确认它存的是一个相对天数基准日是1900年1月1日。所以要将它转换成“YYYY-MM-DD”格式需要做一步换算。比如文件中日期字段的十进制值是43831那么实际日期就是1900-01-01加上43831天计算出来是2020-01-02。注意这个计算不是直接用Excel的日期序列号规则而是以1900年1月1日为基准的累计天数。2.2 不同市场的字段差异如果只用上面这套结构去解析所有文件很快就会发现不对劲。因为港股和基金的day文件在某些细节上跟A股不一样。先说成交量单位。A股和场内基金的成交量day文件里记录的是“股”或“份”这一点比较直观。但港股不一样港股交易单位是按“股”记录的但很多股票的面值、每手股数差异很大例如腾讯控股每手100股而有些港股每手是1000股甚至2000股。在.day文件中港股的成交量字段记录的是“股”数这一点跟A股没有本质区别。不过真正要小心的是价格单位。A股价格精确到分所以存的是“元”乘以100后的整数。港股因为价格跨度大有些股票股价上千元比如腾讯曾到过700多港元有些仙股只有几分钱但day文件的规则同样是乘以100后存整数。这里有个风险一旦某个股票价格超过一定范围或者有3位小数的情况比如某些港股报价是0.125港元直接除以100能得到正确结果但如果遇到5位小数的港股比如部分涡轮和牛熊证单纯除以100就不够了这类数据在普通股票日线里碰不到不需要过度担心。但对于做港股衍生品研究的人来说day文件可能不一定覆盖到还是要提醒一句。再说份额和单位的问题。不少人在转换基金文件时发现成交量数字大得离谱以为是解析错了。其实场内基金的成交量字段单位和A股股票一样是“份”比如某ETF一天成交了1亿份字段值就是100000000不需要额外处理。但如果你希望输出到其他软件时是“手”为单位那就需要在脚本里做一次除以100的换算。2.3 复权标记的真相关于day文件是否包含复权信息这是一个高频疑问。我的实测结论是标准的.day文件里没有复权因子它存的是不复权的原始价格。通达信界面默认显示的前复权、后复权价格是软件在读取day文件之后实时计算的计算依据是另一个文件通常叫gbbq即股本变迁文件里的除权除息记录。这意味着你用脚本直接解析day文件拿到的价格如果期间有分红送股看到的价格是不连续的跳变。比如某股票10转10之前价格100元转增后开盘价可能是50元day文件里记录的就是这个50元而不会自动处理成复权后的连续价格。所以如果你的量化策略需要复权数据在解析day文件之后还需要额外加载除权除息数据做复权计算。这个点后面会在常见问题部分详细说。在网上搜索“通达信股本变迁文件(gbbq)解密”也能看到很多人在研究这个正因为它是复权计算的关键。3. 转换方案选型与工具准备3.1 方案对比Python脚本、通达信导出、第三方工具做这个转换本质上有三条路可以走方案优点缺点适用场景Python自写解析脚本灵活、支持批量、可定制输出格式需要会写代码主力方案推荐通达信自带导出简单、无需编程一次只能导一只、效率低临时导一两只用第三方转换工具开箱即用安全风险不明、格式不可控不推荐有脚本风险我自己最终采用的是Python方案。原因很简单第一我需要批量处理整个股票池几千个文件第二我需要输出成特定格式供其他程序读取第三后续要做复权处理自己写脚本可以无缝衔接。3.2 Python环境准备这一步没有任何特殊之处核心依赖只有两个Python 3.6任何较新版本都可以pandas用于CSV输出和处理数据表如果你不愿意装pandas纯用csv模块也可以但pandas会让后续的过滤、排序、去重操作高效很多。pip install pandas然后就没了。解析二进制文件用的是Python内置的struct模块不需要额外安装。3.3 数据文件准备在动手之前先明确你要解析哪些文件。通达信的安装路径通常是类似C:\new_tdx\vipdoc\sh\lday\ C:\new_tdx\vipdoc\sz\lday\ C:\new_tdx\vipdoc\hk\lday\其中sh目录放上交所股票日线sz目录放深交所股票日线hk目录放港股日线文件命名规则是市场代码证券代码.day。例如sh600000.day是浦发银行sz000001.day是平安银行hk00700.day是腾讯控股。基金和股票的存放位置一样文件名也一样比如sz159915.day是易方达创业板ETF。需要提醒一下如果你在软件里看不到港股数据本地可能没有hk目录或者目录为空。这个跟通达信版本和数据下载范围有关不是你的脚本有问题。4. 实操过程与核心代码实现4.1 单文件解析核心函数先把最核心的解析函数写出来。这个函数负责把.day文件二进制内容读出来套用struct的解包格式逐条解析成可读的数据行。import struct import pandas as pd from datetime import datetime, timedelta def parse_day_file(filepath): # 32字节一条记录 record_size 32 results [] with open(filepath, rb) as f: data f.read() # 文件总长度必须是32的倍数否则文件可能损坏或不是day文件 record_count len(data) // record_size for i in range(record_count): offset i * record_size record data[offset:offset record_size] date_raw, open_raw, high_raw, low_raw, close_raw, amount_raw, volume_raw, _ struct.unpack(IIIIIIfI, record) # 注意成交额是float成交量是int顺序不要搞反 # 日期换算 date datetime(1900, 1, 1) timedelta(daysdate_raw) date_str date.strftime(%Y-%m-%d) # 价格换算 open_price open_raw / 100.0 high_price high_raw / 100.0 low_price low_raw / 100.0 close_price close_raw / 100.0 results.append({ date: date_str, open: open_price, high: high_price, low: low_price, close: close_price, amount: amount_raw, # 成交额单位元 volume: volume_raw, # 成交量 }) return pd.DataFrame(results)这段代码就完成了最核心的解析工作。简单测试一下df parse_day_file(sh600000.day) print(df.head())如果解析正确你会看到类似这样的输出date open high low close amount volume 0 1999-11-10 29.50 29.80 29.01 29.18 1.191912e09 10000000 1 1999-11-11 29.00 29.30 28.80 29.10 1.000000e09 9800000这里有一个先易后难的经验第一次解析时先用一只最近上市的新股测试确保数据量少、容易核对。如果新股的解析结果跟软件显示一致说明格式肯定没错再去跑老股票。4.2 批量转换与跨市场兼容单个文件解析没问题之后批量转换就是水到渠成的事。但这里需要处理一个问题港股成交量单位与A股可能不同至少要做到不搞错。A股和基金的成交量单位是股/份港股也是股但如果你的下游系统要求统一为手就按100股/手换算。不过我建议默认不做换算保留最原始的数据把换算留给下游处理。写一个批量转换函数import os import glob def batch_convert(source_dir, output_dir, market_typesh): os.makedirs(output_dir, exist_okTrue) # 匹配所有.day文件 pattern os.path.join(source_dir, *.day) day_files glob.glob(pattern) for filepath in day_files: filename os.path.basename(filepath) # 例如 sh600000.day code filename.split(.)[0] # 例如 sh600000 try: df parse_day_file(filepath) if df.empty: continue # 输出CSV以代码命名 output_path os.path.join(output_dir, f{code}.csv) df.to_csv(output_path, indexFalse, float_format%.3f) print(f转换完成: {code} - {output_path}共{len(df)}条记录) except Exception as e: print(f解析失败: {filepath}错误: {e})这个脚本对sh、sz、hk目录均适用只要传入对应的source_dir即可。唯一需要留意的点是不要在循环里用print输出太多日志几千个文件全打印会拖慢速度。如果文件量很大建议最后统一汇总生成一个转换报告。4.3 输出格式设计与数据校验输出CSV只是最基础的做法。实际项目中我通常会在CSV基础上增加几个字段方便下游使用。扩展后的输出包括date交易日期code证券代码open, high, low, close四价格volume成交量A股/基金单位是股/份港股是股amount成交额元pct_change日涨跌幅可选日涨跌幅可以直接在转换时算出来df[pct_change] df[close].pct_change() * 100为什么建议加这个字段因为很多量化框架入参加载数据时都要求有涨跌幅你在转换阶段算好后面省一次遍历。关于校验有一个非常实用的小技巧检查解析出的数据末尾日期是否和通达信软件最新交易日一致。如果不一致说明day文件没更新需要先在通达信里下载完整日线数据。另外价格字段的数值范围可以用来判断单位换算是否正确——如果出现某只股票收盘价超过10000元而它明明不可能是这个价那大概率是文件没找对或解析字节顺序错了。5. 常见问题与排查技巧实录5.1 日期相差8小时或完全错乱这个问题非常典型。当你用datetime.fromtimestamp()直接把日期字段当Unix时间戳解析时得到的结果会时区错乱或者日期明显不对。解决方案就是回到格式本身去理解不要猜。日期字段是相对1900年1月1日的天数偏移不是Unix时间戳。正确做法是date datetime(1900, 1, 1) timedelta(daysdate_raw)如果这样还错检查一下你读取文件时是否用了二进制模式。Windows下如果你用文本模式打开.day文件会被做换行符转换导致字节错位解析结果完全乱掉。5.2 成交量单位是股还是手这个问题我在前面提过但值得再强调。不少人在转换时习惯性把成交量除以100理由是“交易软件里显示的是手”。但这个观念是错误的通达信day文件里存的就是股精确到1股A股不是手。你直接除以100反而把数据搞小了。什么时候需要除以100只有当你确认下游系统要求以“手”为单位时才需要。而且港股的“每手股数”因股票而异有些是100有些是500有些是2000绝对不能用统一的100来除。我觉得最稳妥的做法是day文件解析后保持原始股数涉及单位换算的交给下游系统处理。5.3 复权数据怎么处理前面说过day文件里是裸价格不含复权因子。但有很多人拿到数据后发现某天的价格跳变巨大就来问是不是解析错了。这里要分两种情况如果跳变正好发生在某次分红送股除权日那说明解析完全正确。那天的价格本身就出现了台阶是市场行为不是程序bug。如果你确实需要复权后的连续价格那必须去解析gbbq文件股本变迁文件。这是一个代价更高的解析任务gbbq文件的格式比day文件复杂得多涉及送股比例、配股比例、分红金额等多个字段。具体做法是先加载gbbq按日期排序用前复权或后复权公式一行一行修正价格。网上关于“通达信股本变迁文件(gbbq)解密方法”的讨论也很多核心原理都一样就是要读懂这个文件的二进制结构。5.4 遇到加密或损坏文件正常情况下day文件没有加密。如果你用上面的代码解析某些文件时报错或者发现文件长度不是32的倍数有几个可能文件下载不完整。在通达信里重新下载一次日线数据。文件根本不是day文件比如你把day和其他的文件弄混了。通达信版本升级导致格式变化。目前主流版本V7.x实测都能用这套结构解析但不排除未来版本调整的可能。遇到解析异常我的建议是别急着改代码先用16进制编辑器打开文件看看开头32字节是否符合预期结构。这个排查方法最直接。5.5 参数速查表参数A股港股场内基金成交量单位股股份价格精度0.01元0.01港元0.001元day文件目录vipdoc/sh/ldayvipdoc/hk/ldayvipdoc/sz/lday文件命名sh600000.dayhk00700.daysz159915.day日期基准1900-01-01同左同左6. 项目经验总结这套转换脚本我现在还在持续使用不管是做策略回测、跨平台数据同步还是生成自定义格式的历史数据它都是最底层的那个工具。回想整个开发过程有几点经验值得分享第一二进制解析类项目格式理解大于一切。网上能搜到很多版本的day格式说明但搜到之后一定要自己做一次验证。我的核对方法是拿一只刚上市不久的股票用通达信软件看某一天的数据再对比脚本解析出来的数据完全一致才算通过。第二兼容性设计考虑得越早越好。如果只是转换上证A股代码可以写得非常简洁但一旦加上港股和基金就必须在单位换算、价格精度上做分区处理。我的实现方式是在批量转换函数里增加market_type参数针对不同市场的特性做差异化处理而不是把逻辑写死。第三数据安全要做好。虽然转换脚本只是读取文件不修改原始文件但我还是建议在操作前把整个vipdoc目录复制一份备份。数据无价尤其是在做历史回测时原始数据的完整性直接影响策略验证的可靠性。如果后续打算继续深入可以在这个项目基础上增加两个扩展方向一是接入gbbq文件的解析实现真正的复权计算二是打通“通达信data文件转CSV”的通道把分钟级数据也纳入转换体系。这些我后面实际跑通了再单独写一篇文章展开。本文还有配套的精品资源点击获取
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。