环球军事
数据字典实例(Python读取通达信本地日线数据的示例 以及一些相关经验)

用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:])


Python读取通达信本地日线数据的示例 以及一些相关经验nerror="javascript:errorimg.call(this);">


本地数据

日线保存在通达信安装位置的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版的。


其它问题

通达信本地数据中,似乎没有已经退市的条目。


顶一下()     踩一下()

热门推荐

发表评论
0评