用Python语言读取通达信本地日线数据,仅使用自带模块。通达信版本 8.27
下面是精简的例子,正常使用时应该将其封装到自定义函数之中。
假设通达信安装在 D盘 TDX 文件夹。
import structdata = []读取的数据 = open(r"D:\TDX\vipdoc\sh\lday\sh600000.day", 'rb').read()# 计算记录条数,每条记录占32字节条数 = len(读取的数据) // 32for i in range(条数): start = i * 32 end = start + 32 记录 = 读取的数据[start:end] # 解析二进制数据 日期, 开盘, 高, 低, 收盘, 成交额, 成交量, reserved = struct.unpack('<IIIIIfII', 记录) # 价格数据需要除以100 data.append({ '日期': 日期, '开盘': 开盘 / 100.0, '高': 高 / 100.0, '低': 低 / 100.0, '收盘': 收盘 / 100.0, '成交量': 成交量, # 股数 '成交额': 成交额, # 成交额(元) 'reserved': reserved # 保留字段,期货数据时为持仓量 })print("显示末尾的5条数据:")print(data[-5:])本地数据
日线保存在通达信安装位置的vipdoc目录里。每个股票一个文件,增量更新。
比如,假设通达信安装在D盘的TDX目录,那么上海在:
D:\TDX\vipdoc\sh\lday
深圳:
D:\TDX\vipdoc\sz\lday
北交所:
D:\TDX\vipdoc\bj\lday
记录的是原始数据,也就是无复权的数据。
周、月、年线是由日线计算出来的,没有数据文件。
指数跟个股是一样存储的,比如:深成sz399001.day 上证sh000001.day 创业sz399006.day
复权:
数据保存在 TDX\T0002\hq_cache 目录里面 gbbq 和 gbbq.map 两个文件中
记录的是每次的股本和股息变动(比如每次送几股配几股之类),需要根据这些变动记录,来计算前复权和后复权。这个算法特别复杂,并且各个厂商还不一样。仅通达信一家就有两套算法,在系统设置里,有"复权使用等比方式"的选项(7.x版叫精确复权),选中之后的数据能准确一些。
以600000为例,不启用"等比方式"前复权时,2007年前的价格是负数。其它厂商的软件,有一些的前复权也会出现负数的现象。
我最初就是看到负数问题,才发现复权这个深坑。这方面,目前还在研究。
代码解释
数据文件中,每天的信息占32个字节,共8段,按顺序分别是:
日期, 开盘, 高, 低, 收盘, 成交额, 成交量, reserved
其中,除了成交额(元)是浮点类型之外,其它都是整数(所以价格要除以100)。
最后的reserved是个保留字段,在日线和指数数据中含义不明,在期货数据时似乎用来存储持仓量
解析数据时,以32字节为跨度,取出每天的记录。然后通过 struct.unpack 对8段数据进行解析,并分别存储到相关的变量中。最后把每天的数据保存到字典变量里。
另:本例中的 struct.unpack 可以直接使用 'IIIIIfII' 格式符进行解析,但是官方建议在解析时指定字节序,以避免默认模式下的自动对齐、自动填充字节等行为。
版本影响
通达信不同版本的数据文件略有差别,本例是基于8.27版验证的。网上很多早期资料都是针对 7.x版的。
其它问题
通达信本地数据中,似乎没有已经退市的条目。
