企业微信

为什么你需要通达信历史数据API

做股票复盘、期货回测,或者写个量化策略,第一步永远是搞到靠谱的历史数据。通达信是国内散户用得最多的行情软件,它本地缓存了大量历史数据,而且提供了接口让你能直接读取。很多人不知道,这些数据不用花钱买,就在你电脑里躺着。

通达信数据到底存在哪里

安装通达信后,打开安装目录,找到 vipdoc 文件夹。里面按市场分了子文件夹:sh 是上海,sz 是深圳,ds 是期货和期权。每个股票或合约的日线数据存在 lday 文件夹下,分钟线在 minline 文件夹。文件后缀是 .day 和 .lc1、.lc5。

这些文件是二进制格式,不能直接用记事本打开。但结构很规整,每条记录32个字节,对应一天或一分钟的行情。你只要按固定偏移量读,就能把开盘、最高、最低、收盘、成交量、成交额全部抠出来。

用Python直接读本地文件

不依赖任何第三方库,纯Python就能解析。日线文件每条记录结构如下:前4字节是日期(YYYYMMDD的整数),接着4字节开盘价(分),4字节最高价,4字节最低价,4字节收盘价,然后4字节成交额(元),4字节成交量(股),最后4字节保留。价格都是整数,单位是分,读出来除以100就行。

通达信历史数据API怎么获取股票期货数据?

代码示例:


import struct

def read_day_file(filepath):

    data = []

    with open(filepath, 'rb') as f:

        buf = f.read()

    for i in range(0, len(buf), 32):

        record = buf[i:i+32]

        if len(record) < 32:

            break

        date, open_p, high, low, close, amount, vol, _ = struct.unpack('<IIIIIIII', record)

        data.append({

            'date': date,

            'open': open_p / 100.0,

            'high': high / 100.0,

            'low': low / 100.0,

            'close': close / 100.0,

            'amount': amount,

            'volume': vol

        })

    return data

期货数据在 ds 文件夹下,结构略有不同,但同样是32字节一条。注意期货价格单位可能是元,需要根据合约乘数换算。

更省事的办法 pytdx库

自己解析文件虽然自由,但遇到除权、复权、分钟线合并就很麻烦。pytdx是一个开源库,直接连接通达信的行情服务器,拉取历史数据。它支持股票、期货、指数,还能取实时行情。

安装:pip install pytdx

拉取股票日线:


from pytdx.hq import TdxHq_API

api = TdxHq_API()

with api.connect('119.147.212.81', 7709):

    data = api.get_security_bars(9, 0, '000001', 0, 100)

    for item in data:

        print(item['datetime'], item['open'], item['close'])

参数说明:第一个9代表日线,0是市场代码(0深圳,1上海),'000001'是股票代码,0是起始位置,100是数量。期货市场代码用2(上海期货)或3(大连期货)等。

pytdx的好处是自动处理了数据格式,返回的是字典列表,直接能用。坏处是服务器连接不稳定,批量拉取要加延时,不然会被封IP。

期货历史数据的特殊处理

期货和股票不一样,有主力合约换月、夜盘、不同交易所规则。通达信本地文件里,每个合约单独存一个文件,比如 rb2310.day。你要做连续主力合约,得自己拼接。

拼接逻辑:每天选持仓量最大的合约作为主力,把它的行情接上。换月那天,价格会出现跳空,需要用前复权或后复权处理。很多量化平台直接提供主力连续合约,但如果你自己从通达信抠数据,这一步绕不开。

夜盘数据在分钟线里,日线文件会把夜盘算到第二个交易日。比如周五晚上21点的夜盘,日线日期显示下周一。回测时要注意这个细节,不然信号会错位。

数据清洗与存储建议

原始数据拿下来不能直接用。停牌日没有记录,需要补空值或者跳过。涨跌停板的价格有时候是无效的,要过滤。成交量单位是股,期货是手,别搞混。

存成CSV最省事,但数据量大了读取慢。用SQLite或者Parquet格式,查询快,压缩率高。按品种和周期分表,比如 stock_day、future_min5。每次增量更新,只拉最新几天,不用全量重下。

常见坑与避坑指南

通达信服务器有多个,不同服务器数据完整性不一样。多试几个IP,找到稳定的。分钟线数据本地文件通常只保留最近几个月,想要更早的分钟线,只能通过pytdx从服务器拉,但服务器也只给最近有限条数。

除权数据在通达信里是单独的 T0002 文件夹下的 hq_cache 里,自己解析除权信息很麻烦。建议用pytdx的 get_xdxr_info 接口,直接拿除权除息记录,然后自己算复权价。

最后提醒一句:通达信的数据仅供个人研究,别拿去做商业分发。量化交易用历史数据回测,一定要考虑滑点和手续费,不然曲线好看,实盘亏钱。