作為一個量化交易的“苦逼”搬磚人,你有沒有遇到過這樣的窘境:
- 找了半天數(shù)據接口,收費的賊貴,免費的賊慢?
- 本來準備大展拳腳,結果光是爬數(shù)據就累得半死?
別急!今天我給大家推薦一個高效、免費、速度還賊快的 Python 庫——pytdx!
1. pytdx 是啥?
pytdx
是一款純Python語言開發(fā)的類似TradeX的行情數(shù)據接口的實現(xiàn)。最重要的是,它速度快,還不用花錢!
2. pytdx 安裝指南
安裝過程相當簡單,直接用 pip 一把梭:
pip install pytdx
如果下載速度感人,可以試試國內源:
pip install pytdx -i https://pypi.tuna./simple
3. 連接行情服務器
要獲取數(shù)據,咱們得先連上 TDX 的行情服務器,代碼如下:
from pytdx.hq import TdxHq_API
# 創(chuàng)建 API 對象
api = TdxHq_API()
# 連接服務器
if api.connect('119.147.212.81', 7709):
print('連接成功!')
# 做一些操作
api.disconnect() #關閉連接
else:
print('連接失?。?#39;)
這里花姐推薦使用 with
語法,可以省略disconnect()
語句
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
多數(shù)博主估計不會告訴你,今天花姐就手把手教大家如何獲取這個行情ip
1. 使用pytdx提供的行情ip
查看pytdx源碼,我們看到里面已經寫好了許多ip池,但是許多已經不能用了
通過以下代碼可以找到可用的行情服務器ip
from pytdx.util.best_ip import select_best_ip
best_ip = select_best_ip()
print(f'最優(yōu)服務器:IP={best_ip['ip']}, 端口={best_ip['port']}')
2. 通過代碼獲取通達信軟件的行情ip
花姐獨家獲取方式先安裝 通達信 軟件,然后打開 接下來運行該代碼就可以獲得通達信的行情ip了
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):
# 處理進程已結束或權限不足的情況,繼續(xù)遍歷其他進程
continue
return None
def find_ip_by_pid(pid, port):
'''通過PID和端口號查找對應的網絡連接信息'''
# 構建命令:查找指定PID和端口的網絡連接
cmd = f'netstat -ano | findstr '{pid}' | findstr '{port}''
try:
# 執(zhí)行命令并捕獲輸出
result = subprocess.check_output(cmd, shell=True, text=True)
# 按行分割并解析每部分信息
lines = [line.split() for line in result.strip().split('\n')]
return [{
'proto': parts[0], # 協(xié)議類型(TCP/UDP)
'local': parts[1], # 本地地址:端口
'remote': parts[2], # 遠端地址:端口(即行情服務器地址)
'state': parts[3], # 連接狀態(tài)(ESTABLISHED等)
'pid': parts[4] # 進程ID(用于二次驗證)
} for parts in lines]
except subprocess.CalledProcessError:
# 未找到匹配結果時返回空列表
return []
# 主執(zhí)行流程
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. 獲取實時行情數(shù)據
連接上服務器后,我們就可以拉取實時行情數(shù)據了,比如查詢 貴州茅臺(600519) 的數(shù)據:
# 獲取單只股票的實時行情
stock_data = api.get_security_quotes(1, '600519')
print(stock_data)
重要知識點:
1
代表上海證券交易所 (6開頭的股票,688、689 也填1)2
代表北京證券交易所 (4、8、9 開頭的股票)
如果要獲取多個股票的代碼使用如下格式數(shù)據:[ (市場代碼1, 股票代碼1),(市場代碼2, 股票代碼2) ... (市場代碼n, 股票代碼n) ]
返回值解析
返回值是一個數(shù)組,數(shù)組里是OrderedDict
格式的數(shù)據,OrderedDict
是 Python
中 collections
模塊提供的一種字典子類,它 保持鍵值對的插入順序。與普通字典(dict
)不同,OrderedDict
在遍歷時會按照鍵值對插入的順序返回數(shù)據,而不是隨機順序。 可以通過stock_data[0]['open']
的形式獲取具體的值
開盤、最高、最低、收盤、成交量、成交額、買盤報價、賣盤報價都有非常不錯。
[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 線數(shù)據
量化交易少不了 K 線數(shù)據,看看 pytdx 怎么搞定它:
# 獲取日 K 線數(shù)據
k_data = api.get_security_bars(9, 1, '600519', 0, 10)
print(k_data)
這里的 9
表示日 K 線,1
代表上交所,'600519'
是股票代碼,0, 10
代表從 0
開始獲取 10
條數(shù)據,最多可獲取800
根K線。
想獲取不同周期的 K 線數(shù)據?直接改第一個參數(shù)就行:
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線
返回值解析返回值是一個數(shù)組,數(shù)組里是OrderedDict
格式的數(shù)據 為了方便數(shù)據計算,可以通過以下方法轉換成Dataframe格式
df = api.to_df(k_data)
print(df)
返回值如下,這樣數(shù)據就看的清晰多了注意: 獲取的行情數(shù)據是不復權的
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. 獲取分筆成交數(shù)據
如果你的策略依賴盤口數(shù)據,分筆成交數(shù)據是個不錯的選擇:
# 獲取最近 10 條分筆成交數(shù)據
transaction_data = api.get_transaction_data(1, '600519', 0, 10)
print(api.to_df(transaction_data))
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 記得斷開連接,不然連接數(shù)太多可能會被服務器“拉黑” ??
api.disconnect()
總結
今天咱們介紹了 pytdx 這個神奇的庫,重點包括:
? 安裝 pytdx ? 連接 TDX 服務器 ? 獲取實時行情數(shù)據 ? 獲取 K 線數(shù)據 ? 獲取分筆成交數(shù)據
總之,pytdx 是一個速度快、免費、易用的量化利器,適合 A 股量化交易的同學們使用。如果你還在為數(shù)據發(fā)愁,趕緊試試吧!??