为什么你需要关心数据获取这件事
做股票或者期货交易,不管你是手动盯盘还是写程序自动跑策略,第一步永远绕不开数据。没有数据,你连过去发生了什么都不知道,更别提判断接下来可能发生什么。通达信是国内很多人看盘的老朋友,界面熟悉,数据也全。可它的数据默认锁在软件里,你想批量导出、想接入自己的Python脚本,直接操作并不方便。pytdx这个库就是来解决这个问题的。它像一个翻译官,把通达信服务器的数据翻译成Python能看懂的数字,让你能在自己的代码里随意调用。
pytdx到底是什么,能帮你拿到什么
pytdx是一个开源项目,用Python写成。它的核心作用是模拟通达信的客户端协议,直接跟通达信的行情服务器通信。你不需要打开通达信软件,也不需要登录账号,只要网络通畅,就能拉取数据。
它能拿到的数据分几类。历史K线数据,包括日线、周线、分钟线,股票和期货都支持。实时行情数据,也就是当前最新的价格、成交量、买卖盘口。还有财务数据,比如股本、每股收益这些基本面指标。对于做量化回测或者写简单监控脚本的人来说,这些已经够用了。

安装这一步没什么好怕的
打开你的命令行,输入一行命令就行:
pip install pytdx
如果网络慢,可以加个国内镜像源。装完之后,在Python里导入试试:
from pytdx.hq import TdxHq_API
api = TdxHq_API()
没有报错就说明安装成功了。
连接服务器是第一个关键动作
pytdx需要连接通达信的行情服务器。官方提供了一些公开的服务器地址,但这些地址有时会失效。比较稳妥的做法是维护一个服务器列表,挨个尝试连接。
from pytdx.hq import TdxHq_API
api = TdxHq_API()
# 常用的服务器地址,可以多准备几个
servers = [
('119.147.212.81', 7709),
('218.108.98.244', 7709),
('123.125.108.14', 7709),
]
connected = False
for ip, port in servers:
if api.connect(ip, port):
connected = True
print(f'已连接到 {ip}:{port}')
break
if not connected:
print('所有服务器都连不上,检查网络或者换一批地址')
连接成功后,你后续所有操作都通过这个api对象进行。用完记得断开:api.disconnect()。
拉取股票历史K线
假设你想看浦发银行(代码600000)的日线数据。通达信里股票代码需要加上市场标识,上海市场是1,深圳市场是0。
# 获取600000从2024年1月1日到2024年6月30日的日线数据
# category参数:9代表日线,8代表周线,7代表月线
# start和count控制从第几个位置开始拿多少条
data = api.get_security_bars(9, 1, '600000', 0, 100)
for item in data:
print(item)
返回的每一条数据包含开盘价、最高价、最低价、收盘价、成交量、成交额。你拿到之后可以直接存进CSV或者数据库,方便后面回测用。
期货数据怎么拿
期货的代码格式跟股票不一样。比如螺纹钢主力合约,在通达信里代码是RB000或者RB主连。市场标识也不同,期货在上海期货交易所是8,大连是5,郑州是6,中金所是9。
# 获取螺纹钢主力合约的日线数据
# 市场代码8代表上海期货交易所
# 品种代码需要根据实际调整
data = api.get_security_bars(9, 8, 'RB000', 0, 100)
for item in data:
print(item)
期货数据要注意合约换月的问题。主力合约会切换,历史数据里不同时间段可能对应不同合约。如果你的策略需要连续价格,得自己做拼接处理。
实时行情怎么抓
历史数据用来回测,实时数据用来监控或者实盘信号。pytdx获取实时行情用get_security_quotes方法。
# 同时获取多只股票的实时行情
# 参数是列表,每个元素是(市场代码, 股票代码)
quotes = api.get_security_quotes([(1, '600000'), (0, '000001')])
for q in quotes:
print(f"代码: {q['code']}, 最新价: {q['price']}, 成交量: {q['vol']}")
实时行情返回的数据字段很多,包括买卖五档价格和挂单量。做盘口分析或者高频监控会用到这些细节。
用的时候得留几个心眼
数据延迟这个问题绕不开。通达信免费服务器本身就不是为高频交易设计的,行情推送有几秒延迟很正常。你要是做日内高频,这个延迟可能致命。解决办法是找更稳定的数据源,或者用付费的level-2行情。
服务器稳定性也很重要。公开的服务器地址经常变化,今天能用明天可能就断了。最好写个自动检测程序,定期扫描可用服务器列表,把能连上的存下来。
通达信对单次请求的数据条数有限制,通常一次最多拿800条左右。想拿长周期数据需要分页,写个循环反复请求,把数据拼起来。
拿数据只是第一步
有了pytdx,你等于有了一条从通达信到Python的数据管道。股票期货的历史和实时数据都能进到你的程序里。但数据拿到手只是开始,怎么清洗、怎么对齐时间、怎么处理缺失值、怎么构造因子,这些才是真正决定策略好坏的部分。工具永远只是工具,想清楚你要用数据回答什么问题,比纠结用哪个库更重要。