Mootdx A-share market data via TCP-direct 通达信 servers. Free, no API key, no IP rate limits. Use as the stable A-share OHLCV fallback when akshare's East Money s
复制下面这句话,粘贴给 Claude Code、Codex、Cursor 等 AI 编程工具,它会读取安装说明并在你确认后完成安装。
请阅读 https://ai.atlankj.com/install/asset/gh-mootdx-c96d5fddc022 ,按照其中的说明把「mootdx」安装到你(当前 AI 工具)中。执行前先告诉我将运行的命令和写入的位置,等我确认。
查看 AI 将读取的安装说明正在读取 GitHub 原文…
内容来自 GitHub 原始文件,由原作者维护。在 GitHub 查看
Mootdx talks the native 通达信 (TDX) binary protocol over TCP, bypassing the HTTP scrapers that periodically fail under load (akshare → East Money is the canonical example). Public market data only — no token, no per-IP throttling, no captcha.
pip install mootdx && pip install 'httpx>=0.28.1'Mootdx pins
httpx<0.26insetup.py, but only uses basichttpx.Client/getAPIs that are forward-compatible. The secondpip installrestores the modern httpx that the rest of Vibe-Trading (MCP server, fastmcp) needs.
from mootdx.quotes import Quotes
client = Quotes.factory(market="std") # std = 沪/深/京; ext = 期货/期权 (upstream-broken)
# Daily OHLCV with a date range (preferred API).
df = client.get_k_data(code="000001", start_date="2025-01-01", end_date="2025-02-01")
# Intraday — offset-from-latest only, no native date range.
df_15m = client.bars(symbol="600519", frequency=1, offset=800)
bars(frequency=N) uses integer codes from mootdx.consts:
| Code | Bar |
|---|---|
| 8 | 1m |
| 0 | 5m |
| 1 | 15m |
| 2 | 30m |
| 3 | 1H |
| 4 | 1D |
| 5 | 1W |
| 6 | 1M |
get_k_data() is daily only but accepts start_date / end_date. For intraday, bars() returns the latest N rows — the built-in loader over-fetches offset=800 then clips to the requested window.
| Method | Use | Returns |
|---|---|---|
get_k_data(code, start_date, end_date) | Daily OHLCV with date range | [open, close, high, low, vol, amount, date, code] |
bars(symbol, frequency, offset=800) | Intraday / weekly / monthly | [open, close, high, low, vol, amount, datetime, volume, ...] |
minute(symbol) | Current trading day 1m bars | Same schema as bars() |
quotes(symbol) | Real-time L1 snapshot | {price, bid, ask, volume, ...} |
stocks(market) | List all tickers on an exchange | DataFrame of code/name |
F10(symbol) / finance(symbol) | Fundamentals snapshot | Heterogeneous dict |
"000001", "600519", "835174" — mootdx auto-detects exchange from prefix:
60x / 68x → SH00x / 30x / 002 / 003 → SZ4x / 8x → BJ"000001.SZ", "600519.SH", "835174.BJ" and strips the suffix.get_k_data() returns lowercase English: open / close / high / low / vol / amount / date / code. The built-in loader renames vol → volume to match the project's OHLCV contract.
bars() returns the same OHLC columns plus a duplicate volume (alongside the legacy vol), a datetime string column, and decomposed year / month / day / hour / minute columns.
backtest/loaders/mootdx_loader.py is registered as the mootdx source. Fallback chain for a_share is [tushare, mootdx, akshare] — tushare wins when a token is present; mootdx wins when no token but TCP egress works; akshare is the broadest fallback.
from backtest.runner import run
result = run(strategy=..., source="mootdx") # explicit override
| Limitation | Workaround |
|---|---|
北交所 (BJ): get_k_data raises KeyError, bars() returns empty (upstream missing data) | Loader logs a warning and skips BJ symbols — use akshare or tushare |
| Extended market (futures/options) returns empty as of v0.11.7 (upstream issue) | Use tushare/akshare for futures |
Each bars() page is 800 rows; loader paginates back up to 25 pages (≈10y daily / ≈5y 1H / ≈3mo 1m) | For longer 1m history use tushare minute bars |
| Server selection has cold-start latency (first call picks the fastest server) | First call may be ~2s slower |
| Returns data in 前复权 by default — no API parameter for 不复权 | Use tushare/akshare if raw prices are required |