
通达信API到底能拿到什么数据
很多刚接触量化交易的散户,第一个想到的工具就是通达信。看盘习惯了,公式编辑器也玩得转,自然就想用通达信API直接抓数据跑策略。问题来了,通达信官方并没有一个公开的、文档齐全的API接口。市面上说的“通达信API”,通常指两种东西。一种是通达信软件自身提供的DLL动态链接库,通过公式语言调用外部函数,另一种是第三方开发者逆向工程后封装的Python库,像pytdx这类。
这两种方式能拿到的数据截然不同。官方DLL主要面向公式指标计算,能拿到当前股票的历史K线、实时行情、财务数据。板块信息不在标准输出里。第三方库pytdx能连接通达信服务器,获取行情列表、K线、分时成交,板块数据需要额外解析服务器返回的特定字段。
板块信息对股票期货交易到底有多重要
做股票的人都知道板块轮动。今天新能源涨,明天半导体涨,后天消费复苏。如果策略只看个股价格,忽略板块效应,很容易买在板块退潮的节点。期货市场同样有板块概念,黑色系、化工系、农产品系,这些板块内部品种相关性极高。螺纹钢涨,热卷大概率跟涨,铁矿石也会被带动。
量化策略里有一个经典因子叫“板块动量”。计算方式不复杂,把同一板块所有股票或期货品种的收益率加权平均,得到一个板块指数。当板块指数突破均线,策略就做多该板块内最强的个股或期货合约。这个因子的有效性在A股市场被反复验证过。没有板块信息,这个因子根本跑不起来。

通达信板块数据的实际获取路径
本地文件解析法
通达信安装目录下有一个T0002文件夹,里面藏着板块数据。blocknew文件夹存放自定义板块,block.dat文件记录行业板块和概念板块的映射关系。这些文件是二进制格式,需要写解析程序。好处是数据完整,不需要联网。坏处是每次通达信更新板块,文件结构可能微调,解析代码要跟着维护。
用Python读取block.dat的大致逻辑是这样。文件头部有板块数量,每个板块记录包含板块名称、板块类型、成分股代码列表。解析时按固定字节偏移量读取,遇到中文编码用GBK解码。代码不复杂,但需要耐心调试。
import struct
def parse_block_dat(filepath):
with open(filepath, 'rb') as f:
data = f.read()
# 头部偏移量根据通达信版本可能不同
block_count = struct.unpack('<H', data[0:2])[0]
offset = 2
blocks = []
for _ in range(block_count):
name_len = struct.unpack('<B', data[offset:offset+1])[0]
offset += 1
name = data[offset:offset+name_len].decode('gbk')
offset += name_len
stock_count = struct.unpack('<H', data[offset:offset+2])[0]
offset += 2
stocks = []
for _ in range(stock_count):
code = data[offset:offset+6].decode('ascii')
offset += 6
stocks.append(code)
blocks.append({'name': name, 'stocks': stocks})
return blocks
这段代码只是示意,实际文件里还有板块类型、市场标识等字段。不同版本的通达信,偏移量有差异。
pytdx连接服务器法
pytdx是一个开源项目,通过模拟通达信客户端与官方行情服务器通信,获取数据。它提供get_security_list方法拉取股票列表,但没有直接的get_block方法。板块信息藏在get_security_quotes返回的扩展字段里,需要抓包分析协议。
更实用的做法是用pytdx获取全市场股票列表,然后自己维护板块映射表。映射表来源可以是通达信本地文件,也可以是第三方数据供应商。这种混合方案稳定性最高。
行情软件导出法
通达信软件里有一个“数据导出”功能。进入板块指数页面,右键选择“导出数据”,可以生成Excel或CSV文件。手动操作适合回测历史数据,实盘策略不能依赖手动导出。写一个自动化脚本,用pywinauto模拟鼠标点击,也能实现定时导出。这种方案最笨,但最不容易被封IP。
期货板块数据的特殊性
期货板块和股票板块逻辑不同。股票板块由交易所或数据商定义,期货板块更多是约定俗成。黑色系包括螺纹钢、热卷、铁矿石、焦炭、焦煤。化工系包括PTA、甲醇、塑料、PP。这些分类没有官方文件,不同期货公司划分标准略有差异。
通达信API对期货板块的支持更弱。期货行情服务器返回的数据里,板块字段基本为空。做期货量化的人通常自己维护品种到板块的映射字典。
futures_blocks = {
'黑色系': ['RB', 'HC', 'I', 'J', 'JM'],
'化工系': ['TA', 'MA', 'L', 'PP', 'V'],
'农产品': ['M', 'Y', 'P', 'C', 'CS'],
'有色系': ['CU', 'AL', 'ZN', 'PB', 'NI']
}
这个字典需要人工更新。新品种上市,比如碳酸锂、工业硅,要手动加进去。
量化策略里板块信息的用法
股票板块轮动策略
每天收盘后计算所有板块的5日收益率。选出收益率最高的三个板块。第二天开盘买入这三个板块内市值最小的两只股票。持有五天,然后重新计算板块排名。这个策略在震荡市和结构性行情里表现不错。
关键点在于板块数据的时效性。通达信本地文件更新有延迟,通常收盘后半小时才写入。pytdx获取的实时行情没有板块分类。折中方案是每天收盘后解析本地文件,生成板块映射表,第二天盘中用实时行情计算板块指数。
期货跨品种套利
同一板块内品种价差有均值回归特性。螺纹钢和热卷的价差,长期在-200到200之间波动。当价差突破300,做空螺纹钢做多热卷。这个策略的触发条件依赖板块内品种配对。没有板块信息,手动配对效率极低。
用通达信API获取期货主力合约价格,结合自维护的板块字典,可以自动扫描所有板块内品种的价差。价差超过2倍标准差就开仓。
绕不开的合规与稳定性问题
通达信官方对API调用没有明确授权。第三方库pytdx连接服务器,本质上是模拟客户端。高频请求可能触发服务器限流,IP被封。实盘策略不能把数据源完全押在通达信上。
稳妥的做法是双数据源。通达信本地文件用于回测和板块映射,实时行情用CTP接口或者第三方付费数据。股票可以用AkShare、Tushare作为备份。期货用CTP直连交易所,稳定性最高。
板块信息本身也有生存偏差。通达信的概念板块经常调整,今天把某只股票放进“人工智能”板块,明天可能就移除了。回测时要用历史板块成分,不能用当前成分。通达信本地文件不保存历史板块快照,需要自己每天备份。
给散户的实操建议
不要一上来就追求全自动。先用通达信手动导出板块数据,跑一个简单的板块动量回测。验证策略逻辑有效,再考虑自动化。
数据获取环节,优先用本地文件解析。写一个每天收盘后运行的脚本,解析block.dat,把板块映射存进SQLite数据库。日积月累,就有了历史板块数据。
期货板块字典自己维护。用Excel管理,品种代码、板块名称、上市日期、退市日期。策略读取Excel生成映射。
实盘交易用券商或期货公司的官方接口。通达信API只做数据辅助,不做交易执行。这样即使通达信接口出问题,也不会影响持仓。