日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

做量化沒有實時數(shù)據怎么行?我找到一個超級好用的Python庫,速度還賊快!

 靈榮軒書齋 2025-03-21 發(fā)布于北京

作為一個量化交易的“苦逼”搬磚人,你有沒有遇到過這樣的窘境:

  • 想寫個量化策略,數(shù)據卡到起飛?
  • 找了半天數(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)
  • 0 代表深證證券交易交所 (3、0 開頭的股票)
  • 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ā)愁,趕緊試試吧!??


    本站是提供個人知識管理的網絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多