做量化没有实时数据怎么行?我找到一个超级好用的Python库,速度还贼快!

作为一个量化交易的"苦逼"搬砖人,你有没有遇到过这样的窘境:

  • 想写个量化策略,数据卡到起飞?
  • 找了半天数据接口,收费的贼贵,免费的贼慢?
  • 本来准备大展拳脚,结果光是爬数据就累得半死?

别急!今天我给大家推荐一个高效、免费、速度还贼快的 Python 库------pytdx

1. pytdx 是啥?

pytdx 是一款纯Python语言开发的类似TradeX的行情数据接口的实现。最重要的是,它速度快,还不用花钱!

2. pytdx 安装指南

安装过程相当简单,直接用 pip 一把梭:

bash 复制代码
pip install pytdx

如果下载速度感人,可以试试国内源:

bash 复制代码
pip install pytdx -i https://pypi.tuna.tsinghua.edu.cn/simple

3. 连接行情服务器

要获取数据,咱们得先连上 TDX 的行情服务器,代码如下:

python 复制代码
from pytdx.hq import TdxHq_API

# 创建 API 对象
api = TdxHq_API()

# 连接服务器
if api.connect('119.147.212.81', 7709):
    print("连接成功!")
    # 做一些操作
    api.disconnect() #关闭连接
else:
    print("连接失败!")

这里花姐推荐使用 with 语法,可以省略disconnect()语句

python 复制代码
with api.connect('119.147.212.81', 7709):
     # 做一些操作

这里的 119.147.212.81:7709 是一个 TDX 行情服务器,你可以换成其他可用的服务器。

💡提示: 估计99%的人到这里就被卡住了,disconnect()直接连接失败,主要是 119.147.212.81:7709 这个 TDX 行情服务器不可用了。

4. 核心机密:如何找到可用的 TDX 行情服务器IP

多数博主估计不会告诉你,今天花姐就手把手教大家如何获取这个行情ip

1. 使用pytdx提供的行情ip

查看pytdx源码,我们看到里面已经写好了许多ip池,但是许多已经不能用了

通过以下代码可以找到可用的行情服务器ip

python 复制代码
from pytdx.util.best_ip import select_best_ip
best_ip = select_best_ip()
print(f"最优服务器:IP={best_ip['ip']}, 端口={best_ip['port']}")

2. 通过代码获取通达信软件的行情ip

花姐独家获取方式 先安装 通达信 软件,然后打开 接下来运行该代码就可以获得通达信的行情ip了

python 复制代码
import psutil
import subprocess

def get_tdx_pid():
    """通过进程名或路径特征获取通达信进程的PID"""
    for proc in psutil.process_iter(['pid', 'name', 'exe']):
        try:
            # 匹配条件1:精确匹配进程名(考虑Windows大小写不敏感特性)
            if proc.info['name'] and 'tdxw.exe' == proc.info['name'].lower():
                return proc.pid
            
            # 匹配条件2:路径特征匹配(适配不同安装位置的通达信客户端)
            exe_path = proc.info['exe'] or ''
            if 'new_tdx' in exe_path and 'tdxw.exe' in exe_path:
                return proc.pid
                
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            # 处理进程已结束或权限不足的情况,继续遍历其他进程
            continue
    return None

def find_ip_by_pid(pid, port):
    """通过PID和端口号查找对应的网络连接信息"""
    
    # 构建命令:查找指定PID和端口的网络连接
    cmd = f'netstat -ano | findstr "{pid}" | findstr "{port}"'
    try:
        # 执行命令并捕获输出
        result = subprocess.check_output(cmd, shell=True, text=True)
        # 按行分割并解析每部分信息
        lines = [line.split() for line in result.strip().split('\n')]
        return [{
            'proto': parts[0],      # 协议类型(TCP/UDP)
            'local': parts[1],       # 本地地址:端口
            'remote': parts[2],      # 远端地址:端口(即行情服务器地址)
            'state': parts[3],       # 连接状态(ESTABLISHED等)
            'pid': parts[4]          # 进程ID(用于二次验证)
        } for parts in lines]
    except subprocess.CalledProcessError:
        # 未找到匹配结果时返回空列表
        return []

# 主执行流程
if __name__ == "__main__":
    # 步骤1:获取通达信客户端PID
    pid = get_tdx_pid()
    
    # 步骤2:查找该PID与7709端口(通达信默认行情端口)的连接信息
    ip_port = find_ip_by_pid(pid, 7709)
    
    # 步骤3:处理查询结果
    if len(ip_port):
        for part in ip_port:
            print("通达信行情服务器为:", part['remote'])
    else:
        print("未找到通达信行情服务器")

运行结果如下:

5. 获取实时行情数据

连接上服务器后,我们就可以拉取实时行情数据了,比如查询 贵州茅台(600519) 的数据:

python 复制代码
# 获取单只股票的实时行情
stock_data = api.get_security_quotes(1, '600519')
print(stock_data)

重要知识点:

  • 1 代表上海证券交易所 (6开头的股票,688、689 也填1)
  • 0 代表深证证券交易交所 (3、0 开头的股票)
  • 2 代表北京证券交易所 (4、8、9 开头的股票)

如果要获取多个股票的代码使用如下格式数据: [ (市场代码1, 股票代码1),(市场代码2, 股票代码2) ... (市场代码n, 股票代码n) ]

返回值解析

返回值是一个数组,数组里是OrderedDict格式的数据,OrderedDictPythoncollections 模块提供的一种字典子类,它 ​保持键值对的插入顺序。与普通字典(dict)不同,OrderedDict 在遍历时会按照键值对插入的顺序返回数据,而不是随机顺序。 可以通过stock_data[0]['open'] 的形式获取具体的值

开盘、最高、最低、收盘、成交量、成交额、买盘报价、卖盘报价都有非常不错。

python 复制代码
[OrderedDict(
[ 
    ('market', 1), ('code', '600519'), ('active1', 2999),
    ('price', 1518.98), ('last_close', 1505.98), ('open', 1503.0), 
    ('high', 1528.36), ('low', 1503.0), ('servertime', '13:30:00.018'), 
    ('reversed_bytes0', 13300003), ('reversed_bytes1', -151898), 
    ('vol', 27472), ('cur_vol', 38), ('amount', 4162208768.0), 
    ('s_vol', 12340), ('b_vol', 15132), ('reversed_bytes2', 18), 
    ('reversed_bytes3', 379117), ('bid1', 1518.93), ('ask1', 1518.99),
    ('bid_vol1', 2), ('ask_vol1', 1), ('bid2', 1518.91), ('ask2', 1519.0), 
    ('bid_vol2', 8), ('ask_vol2', 17), ('bid3', 1518.84), ('ask3', 1519.03), 
    ('bid_vol3', 7), ('ask_vol3', 2), ('bid4', 1518.82), ('ask4', 1519.91), 
    ('bid_vol4', 8), ('ask_vol4', 1), ('bid5', 1518.8), ('ask5', 1520.0), 
    ('bid_vol5', 9), ('ask_vol5', 18), ('reversed_bytes4', (1356,)), 
    ('reversed_bytes5', 0), ('reversed_bytes6', 0), ('reversed_bytes7', 0),
    ('reversed_bytes8', 0), ('reversed_bytes9', -0.13), ('active2', 2999)
]
 )
]

5. 获取 K 线数据

量化交易少不了 K 线数据,看看 pytdx 怎么搞定它:

python 复制代码
# 获取日 K 线数据
k_data = api.get_security_bars(9, 1, '600519', 0, 10)
print(k_data)

这里的 9 表示日 K 线,1 代表上交所,'600519' 是股票代码,0, 10 代表从 0 开始获取 10 条数据,最多可获取800根K线。

想获取不同周期的 K 线数据?直接改第一个参数就行:

复制代码
K线种类
0 5分钟K线 
1 15分钟K线 
2 30分钟K线 
3 1小时K线 
4 日K线
5 周K线
6 月K线
7 1分钟
8 1分钟K线 
9 日K线
10 季K线
11 年K线

返回值解析 返回值是一个数组,数组里是OrderedDict格式的数据 为了方便数据计算,可以通过以下方法转换成Dataframe格式

python 复制代码
df = api.to_df(k_data)
print(df)

返回值如下,这样数据就看的清晰多了 注意: 获取的行情数据是不复权的

yaml 复制代码
      open    close     high      low      vol        amount  year  month  day  hour  minute          datetime
0  1488.00  1479.07  1499.52  1474.00  34743.0  5.157907e+09  2025      2   24    15       0  2025-02-24 15:00
1  1470.01  1454.00  1473.39  1452.00  28387.0  4.142814e+09  2025      2   25    15       0  2025-02-25 15:00
2  1455.45  1460.01  1464.96  1445.00  26366.0  3.835949e+09  2025      2   26    15       0  2025-02-26 15:00
3  1460.02  1485.56  1489.90  1454.00  49762.0  7.368003e+09  2025      2   27    15       0  2025-02-27 15:00
4  1485.50  1500.79  1528.38  1482.00  56128.0  8.475738e+09  2025      2   28    15       0  2025-02-28 15:00
5  1502.60  1487.02  1520.99  1481.50  31595.0  4.736680e+09  2025      3    3    15       0  2025-03-03 15:00
6  1485.00  1470.11  1486.00  1465.21  25211.0  3.710676e+09  2025      3    4    15       0  2025-03-04 15:00
7  1472.00  1466.37  1474.00  1460.10  24605.0  3.606932e+09  2025      3    5    15       0  2025-03-05 15:00
8  1474.00  1505.98  1510.20  1472.08  42167.0  6.297117e+09  2025      3    6    15       0  2025-03-06 15:00
9  1503.00  1520.36  1528.36  1503.00  31216.0  4.730871e+09  2025      3    7    15       0  2025-03-07 15:00

6. 获取分笔成交数据

如果你的策略依赖盘口数据,分笔成交数据是个不错的选择:

python 复制代码
# 获取最近 10 条分笔成交数据
transaction_data = api.get_transaction_data(1, '600519', 0, 10)
print(api.to_df(transaction_data))
yaml 复制代码
 time    price  vol  num  buyorsell
0  14:53  1520.92    9    8          0
1  14:53  1520.90    5    4          1
2  14:53  1520.98    6    5          1
3  14:53  1520.98    9    9          1
4  14:53  1521.00    4    4          0
5  14:53  1520.97    8    8          1
6  14:54  1520.97   19   18          0
7  14:54  1520.82   29   29          1
8  14:54  1520.90   18   18          2
9  14:54  1520.83   19   14          1

7. 断开连接

用完 API 记得断开连接,不然连接数太多可能会被服务器"拉黑" 😂

python 复制代码
api.disconnect()

总结

今天咱们介绍了 pytdx 这个神奇的库,重点包括:

✅ 安装 pytdx

✅ 连接 TDX 服务器

✅ 获取实时行情数据

✅ 获取 K 线数据

✅ 获取分笔成交数据

总之,pytdx 是一个速度快、免费、易用的量化利器,适合 A 股量化交易的同学们使用。如果你还在为数据发愁,赶紧试试吧!🚀

相关推荐
蹦蹦跳跳真可爱5896 分钟前
Python----计算机视觉处理(Opencv:道路检测之提取车道线)
python·opencv·计算机视觉
徐小黑ACG7 分钟前
GO语言 使用protobuf
开发语言·后端·golang·protobuf
zhougl9961 小时前
html处理Base文件流
linux·前端·html
花花鱼1 小时前
node-modules-inspector 可视化node_modules
前端·javascript·vue.js
HBR666_1 小时前
marked库(高效将 Markdown 转换为 HTML 的利器)
前端·markdown
Tanecious.2 小时前
机器视觉--python基础语法
开发语言·python
ALe要立志成为web糕手2 小时前
SESSION_UPLOAD_PROGRESS 的利用
python·web安全·网络安全·ctf
战族狼魂3 小时前
CSGO 皮肤交易平台后端 (Spring Boot) 代码结构与示例
java·spring boot·后端
careybobo3 小时前
海康摄像头通过Web插件进行预览播放和控制
前端
Tttian6224 小时前
Python办公自动化(3)对Excel的操作
开发语言·python·excel