通达信日线数据本地解析:从.day文件到量化回测的Python实践

发布时间:2026/11/12 2:56:38

通达信日线数据本地解析:从.day文件到量化回测的Python实践 简介这是一个面向量化投资初学者与Python数据分析用户的通达信日线数据读取脚本核心解决从通达信TDX本地安装目录中解析非标准行情文件、提取日线历史数据的问题无需依赖网络API或付费数据源。脚本基于Python3编写通过配置通达信安装路径来定位数据文件使用pandas、struct等库读取.dat或.txt等格式将日期、开盘、收盘、最高、最低、成交量等字段转换为规整的DataFrame方便后续技术指标计算与策略回测。资源打包为RAR压缩包仅包含1个py脚本文件体积约2KB轻量紧凑核心逻辑涵盖路径处理、固定宽度与二进制解析、数据清洗和异常处理易于阅读和二次修改。已有2192人学习说明这套读取方案被不少用户验证过对希望在本地搭建行情感知流程的读者有实际参考价值。通过这份脚本用户可以省去手动从通达信复制数据的重复劳动同时更直观地理解通达信数据文件的内部结构是学习Python文件解析和本地金融数据处理的一个简洁起点。1. 通达信日线数据为什么值得直接从本地.day文件解析做量化回测的人十有八九卡在第一步历史日线数据从哪来。抓网页接口有频率限制等通达信实时数据推送又只能照顾当前行情真到了复盘最稳的反而是客户端本地那份文件。安装目录的vipdoc\sh\lday、vipdoc\sz\lday下面每只股票一个.day文件从上市第一天到最近收盘的日线全在里面。readFile.rar是通达信论坛流传的一套Python解析工具入口readFile.py负责把二进制文件读成行记录tentmev模块再把行记录整理成K线矩阵很适合离线回测、选股指标验证、历史数据补全。整个过程不依赖通达信服务器的推送也不用去公式源码里绕弯子。下面按我自己常用的路径展开先看懂文件结构再跑通批量读取转成DataFrame做量化分析最后解决增量更新的问题。2. readFile要读懂的tdx日线文件结构2.1 .day文件是定长二进制记录不是表格通达信本地日线数据的核心是32字节定长记录每条记录按顺序放4字节无符号整数日期、开盘价、最高价、最低价、收盘价、4字节浮点成交额、4字节无符号整数成交量、4字节保留字段。日期格式是yyyymmdd例如20240101代表2024年1月1日。价格字段全部是整数要除以100才是真实价格比如3251实际是32.51元。成交量单位是股不是手。偏移长度类型字段示例值04unsigned int日期2024010144unsigned int开盘价×100325184unsigned int最高价×1003310124unsigned int最低价×1003220164unsigned int收盘价×1003288204float成交额元123456789.0244unsigned int成交量股1234567284unsigned int保留字段0这个结构是tdx数据格式的公开事实readFile.rar里的解析代码本质上就是围绕这张表做的。2.2 readFile.py解析逻辑和struct.unpack的对应readFile.rar里的readFile.py核心工作就是按上面这张表用struct.unpack把二进制拆出来。我自己写最小实现长这样import os import struct def parse_day(filepath): records [] size os.path.getsize(filepath) if size % 32 ! 0: # 文件被截断或混入非day文件直接返回空列表 return records with open(filepath, rb) as f: data f.read() for i in range(0, size, 32): seg data[i:i 32] # 小端序通达信本地文件按x86的字节序存储 date, open_, high, low, close, amount, volume, _ \ struct.unpack(IIIIIfII, seg) records.append((date, open_ / 100, high / 100, low / 100, close / 100, amount, volume)) return records参数说明表示小端序这是解析tdx本地文件最容易忽略的一点用默认的大端序读出来的价格全乱。IIIIIfII依次对应日期、开盘、最高、最低、收盘、成交额、成交量、保留字段其中f是4字节float其余都是4字节无符号整数。readFile.py在论坛流传的版本里一般就是这套逻辑的封装区别在于它把每一条记录包装成更方便访问的结构tentmev模块则在readFile输出之上把多只股票打包成“日期×价格×量额”的嵌套数组方便后面直接画K线。2.3 三个容易翻车的地方第一个是文件大小。.day文件必须能被32整除如果size % 32 ! 0说明文件被截断或复制的时候坏了直接跳过比硬解析好。第二个是日期排序。通达信客户端正常写入时按日期升序但手动拷过数据或做过合并的目录可能乱序解析后最好records.sort(keylambda x: x[0])。第三个是除权标记。.day文件存的是不复权原始价32字节里没有任何除权因子字段别在保留字段上找——那是空的。复权数据需要单独处理到第4章展开。提示解析前先用文件大小做一次判断比在读取时报错再去排查要省事得多。3. 用readFile批量读取日线数据的最小命令3.1 先把readFile.rar本地化这个压缩包没有在PyPI上发行不要尝试pip install readFile。常见做法是解压到项目根目录让readFile.py和tentmev相关文件保持同一层。前提是Python环境装好了python安装、vscode配置python这些步骤不赘述Python 3.8以上即可标准库就能跑不需要额外装第三方包。目录结构大致这样quant/ ├── readFile.py ├── tentmev.py ├── vipdoc/ │ ├── sh/ │ │ └── lday/ │ │ ├── sh600000.day │ │ └── sh600519.day │ └── sz/ │ └── lday/ │ └── sz000001.day └── main.pyvipdoc目录直接从通达信安装目录复制即可路径一般是通达信安装目录\vipdoc。注意市场前缀上海市场文件名以sh开头深圳市场以sz开头解析时要根据前缀判断该走哪个子目录。3.2 单文件读取readFile.rar各个版本暴露的函数名不完全一样但通常都会有一个接收文件路径、返回行记录列表的入口。我一般这么调用import os import readFile def load_single(code): # code形如 sh600000 market code[:2] path fvipdoc/{market}/lday/{code}.day if not os.path.exists(path): print(f文件不存在: {path}) return [] data readFile.read_tdx_day(path) # 常见版本的入口 return data关键参数是path的拼装规则market取前两位lday是日线目录名文件扩展名固定.day。read_tdx_day是我在多个版本里见过的入口函数名如果你的包里名字不同换成readFile.main或readFile.str_to_list即可。调用前先判断文件存在性因为选股列表里经常混入已退市或停牌的代码直接读会抛FileNotFoundError。3.3 批量扫描目录实际做量化分析时不会只读一只股票而是要把整个vipdoc扫一遍。用os.walk遍历按文件命名规则过滤import os import readFile def scan_vipdoc(rootvipdoc): result {} for dirpath, _, filenames in os.walk(root): for fn in filenames: if not fn.endswith(.day): continue code fn[:-4] # 去掉.day后缀 path os.path.join(dirpath, fn) size os.path.getsize(path) if size % 32 ! 0: # 跳过损坏文件 continue result[code] readFile.read_tdx_day(path) return result这里result是字典key是股票代码value是该股票的日线列表。os.walk会自动递归进入sh/lday和sz/lday不需要手动分市场。加上32字节对齐判断后基本不会因为个别坏文件中断整个扫描。3.4 全量解析还是按需读取方式内存占用适用场景建议全量解析高全市场约几万只股票记录数上千万建离线数据库、全市场回测一次性跑完结果存CSV或SQLite按需读取低盘中选股、单票分析每次只读需要的代码读完即释放增量缓存低每日定时任务用文件修改时间判断见第5章如果只是做当日选股不需要把整段历史都留在内存里读取后直接data[-250:]只保留最近一年能省下大量内存。4. readFile读完后把日线数据转成DataFrame做量化分析4.1 readFile输出转DataFrame很多通达信量化教程到“取到数据”就断了其实关键在进制转换之后的操作。readFile返回的是元组列表直接算指标很别扭我一般第一步就转成pandas DataFrameimport pandas as pd def to_frame(data): df pd.DataFrame(data, columns[ date, open, high, low, close, amount, volume]) df[date] pd.to_datetime(df[date], format%Y%m%d) df df.set_index(date).sort_index() return df[[open, high, low, close, amount, volume]]注意两点。第一date列必须转成datetime类型否则后续画图时x轴全是数值字符串横坐标挤成一团完全没有可读性。第二价格列在readFile阶段已经除以100这里不要再除一次。如果后面要用matplotlib画K线把df.index设置成datetime类型后x轴刻度会自动按时间间隔分布。4.2 复权处理前复权与后复权公式.day文件不带除权因子复权需要外部数据。常见做法有两种一是解析通达信的权息文件二是用价格跳变近似计算。对回测而言前复权最常用因为它保证了最新价格和实际行情一致不会引入未来数据。类型调整方式适用场景前复权除权日之前的价格乘以因子回测、策略信号计算后复权除权日之后的价格除以因子长周期趋势分析、收益率计算如果没有权息文件可以用跳变检测做近似def estimate_factors(df): # 检测除权跳变返回 (日期, 因子) 列表 factors [] prev_close None for day, row in df.iterrows(): if prev_close is not None: ratio row[close] / prev_close - 1 if ratio -0.19: # 排除跌停一般除权缺口更大 factor prev_close / row[close] factors.append((day, factor)) prev_close row[close] return factors这段代码的逻辑是除权当天股价会从母强除权后的价格重新计算导致收盘价相对前一日出现超过19%的向下跳变跌停最多10%所以用-0.19作为阈值能避开大部分误判。拿到因子后把该日期之前的所有价格乘上因子就是前复权价。这个方法对送股、配股混合的场景会漏正式项目里还是优先解析权息文件但用来快速验证readFile读出的数据是否正常足够了。4.3 缺失交易日和异常行处理通达信本地数据偶尔会缺行比如长期停牌的股票在停牌期间没有记录。做策略回测前需要补齐# 生成连续交易日索引这里以该股自身日期范围为边界 full_index pd.date_range(startdf.index.min(), enddf.index.max(), freqB) df df.reindex(full_index) # 停牌日填前值成交量填0避免NaN df[[open, high, low, close, amount]] \ df[[open, high, low, close, amount]].ffill() df[volume] df[volume].fillna(0)freqB是工作日频率注意它不剔除法定的休市日严格做法是用全市场的日期集合去重作为交易日历。最后再过滤一次异常行把close 0或volume 0的记录删掉这些数据一旦混进回测会让资金曲线出现荒谬的跳变。5. 增量更新缓存并验证日线数据一致性5.1 用文件mtime做增量缓存daily任务每天收盘后跑一次全量扫描晚些时候数据会更新但重复解析几千个.day文件太浪费时间。我一般维护一个mtime缓存只解析有变化的文件import json import os class DayCache: def __init__(self, cache_pathday_cache.json): self.cache_path cache_path self.mtimes self._load() def _load(self): if os.path.exists(self.cache_path): with open(self.cache_path) as f: return json.load(f) return {} def is_fresh(self, code, path): return self.mtimes.get(code) int(os.path.getmtime(path)) def mark(self, code, path): self.mtimes[code] int(os.path.getmtime(path)) with open(self.cache_path, w) as f: json.dump(self.mtimes, f) # 使用只有is_fresh为False才调用readFilemtime精度是秒盘中文件写入过程中读取可能拿到半条记录所以这个缓存只建议在收盘后或文件大小保持10分钟不变后再跑。读取前仍然要做32字节对齐检查防止意外截断。5.2 对账技巧用30天随机抽样验证增量缓存最怕的是“静默错误”——数据更新了但解析结果不对。我的验证方法是写一个对账脚本随机抽10只股票、每只抽3个交易日和通达信客户端的不复权收盘价对比允许1分钱误差。对比前先看尾部20条记录检查日期是否连续、有没有0值或价格突然翻倍的情况。如果发现连续缺失不要继续信任缓存直接删掉对应文件的缓存记录做全量重扫。实践中我还会在每次增量解析后打印新增的行数和最后交易日连续三天无异常再让下游策略信任这份数据。本文还有配套的精品资源点击获取
延伸阅读

更多相关文章

2026/11/9 16:51:33

CS自学指南:从数学基础到领域纵深的一套完整课程路径

CS自学指南:从数学基础到领域纵深的一套完整课程路径 【免费下载链接】cs-self-learning 计算机自学指南 项目地址: https://gitcode.com/GitHub_Trending/cs/cs-self-learning 打开 CS自学指南 仓库,你会看到几十门名校计算机课程按模块排好&…

2026/11/9 15:56:03

Java随机数生成器原理与应用详解

1. Java随机数生成器核心原理剖析java.util.Random是Java标准库中最基础的伪随机数生成器实现,它采用线性同余算法(LCG)作为核心生成机制。这个48位的随机数生成器在Java 1.0时代就已引入,其设计参考了Donald Knuth在《计算机程序设计艺术》中提出的经典…

2026/11/12 2:54:15

阜平县电工证报名考试良心建议:想上岗找工作先拿证

阜平县电工证报名考试良心建议:想上岗找工作先拿证 你现在是不是正愁找不到工作?别急,很多企业招聘时都明确要求 特种作业操作证 ,尤其是 电工证 ,没有证根本没法上岗。别以为是走后门能解决,现在的用工制度越来越规范, 电工证 成了硬门槛。…

2026/11/12 2:54:15

东昌府低压电工证怎么考 通过率揭秘

东昌府低压电工证怎么考 通过率揭秘 之前考的证在外省能不能转过来?这是很多电工朋友最关心的问题。别急,今天我来给你讲讲东昌府低压电工证到底怎么考、能不能转、通过率到底有多少。咱们不绕弯子,直接上干货。 东昌府低压电工证到底能干啥…

2026/11/12 2:54:15

南开区高低压电工证多久拿证?别被中介忽悠,看这篇就够了

南开区高低压电工证多久拿证?别被中介忽悠,看这篇就够了 不知道去哪报名怕被中介坑?别急,南开区高低压电工证考试,其实并不难搞懂。很多人都在问:“南开区高低压电工证多久拿证?”答案其实就在流程和准备上。今天我以洛阳中小施工企业负责人的视角,来…

2026/11/12 2:54:15

新兴考电工证合格标准与通过率:电子证书怎么拿才靠谱

新兴考电工证合格标准与通过率:电子证书怎么拿才靠谱 怕考不过白交培训费?别急,今天咱们就来说说新兴考电工证的那些事儿,帮你搞清楚怎么拿电子证书,少走弯路。 一、新兴考电工证到底值不值?别被忽悠了…

2026/11/12 2:49:15

电工太忙没时间复习?龚彪电工证保姆级教程帮你搞定

电工太忙没时间复习?龚彪电工证保姆级教程帮你搞定 工地太忙根本没时间复习考试,这几乎是所有电工师傅的心声。尤其是像济源这样的建筑大市,项目赶工期、人手紧张,很多电工在岗位上忙得脚不沾地,根本没空复习考试。但问题是, 龚彪电工证…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑