feat: add examples (01-08), fix index bars parsing, add ruff hook

- Add example scripts for all API categories (connection, market info,
  kline, minute, transaction, finance, block, fund flow)
- Fix GetIndexBarsCmd: index bar records have 4 extra bytes (advance/
  decline counts) that were not consumed, causing pos drift and
  corrupted dates/volumes for all records after the first
- Fix price_limits.py example (SecurityQuote has no name attr)
- Fix finance_info.py display (scientific notation -> formatted numbers)
- Add PostToolUse ruff hook (scripts/ruff_hook.py)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
GitHub
2026-05-21 18:36:50 +08:00
co-authored by Claude Opus 4.7
parent ace1099ab0
commit 7fd6e610cf
27 changed files with 735 additions and 47 deletions
+78
View File
@@ -0,0 +1,78 @@
"""演示:获取公司信息目录与各个分类的详细内容。"""
import pandas as pd
from xmtdx import TdxClient, Market
CODE = "600519"
NAME = "贵州茅台"
MARKET = Market.SH
# 要展示的分类,按需注释/取消注释
SHOW_CATEGORIES = [
"最新提示",
"公司概况",
"财务分析",
"股本结构",
"股东研究",
"机构持股",
"分红融资",
"高管治理",
"资金动向",
"资本运作",
"热点题材",
"公司公告",
"公司报道",
"经营分析",
"行业分析",
"研报评级",
]
def show_categories(categories):
"""显示公司信息目录。"""
df = pd.DataFrame([{
"目录名": cat.name,
"文件名": cat.filename,
"起始偏移": cat.start,
"内容长度": cat.length,
} for cat in categories])
print(f"{NAME} 公司信息目录:")
print(df.to_string(index=False))
def show_category_content(client, categories, category_name, max_chars=500):
"""获取并展示指定分类的内容。"""
cat = next((c for c in categories if c.name == category_name), None)
if not cat:
print(f" 未找到分类: {category_name}")
return
content = client.get_company_info_content(
MARKET, CODE, cat.filename, cat.start, cat.length
)
text = content.strip()
if len(text) > max_chars:
text = text[:max_chars] + f"\n... (共 {len(content.strip())} 字,仅显示前 {max_chars} 字)"
print(f"\n{'='*60}")
print(f"{cat.name}】 (共 {cat.length} 字节)")
print(f"{'='*60}")
print(text)
def show_all_categories(client, categories):
"""依次展示所有 SHOW_CATEGORIES 中列出的分类内容。"""
for name in SHOW_CATEGORIES:
show_category_content(client, categories, name)
with TdxClient.from_best_host() as c:
categories = c.get_company_info_category(MARKET, CODE)
# 1. 显示目录
show_categories(categories)
# 2. 显示所有分类内容(每个分类默认只显示前500字)
show_all_categories(c, categories)
# 3. 也可以单独获取某个分类的完整内容,例如:
# show_category_content(c, categories, "公司概况", max_chars=99999)
+21
View File
@@ -0,0 +1,21 @@
"""演示:获取最新财务数据。"""
import pandas as pd
from xmtdx import TdxClient, Market
with TdxClient.from_best_host() as c:
info = c.get_finance_info(Market.SH, "600519")
df = pd.DataFrame([
{"项目": "总股本(万股)", "数值": info.zong_guben},
{"项目": "流通股本(万股)", "数值": info.liutong_guben},
{"项目": "每股净资产", "数值": info.meigujing_zichan},
{"项目": "净利润(元)", "数值": info.jing_lirun},
{"项目": "主营收入(元)", "数值": info.zhuying_shouru},
{"项目": "主营利润(元)", "数值": info.zhuying_lirun},
{"项目": "净资产(元)", "数值": info.jing_zichan},
{"项目": "总资产(元)", "数值": info.zong_zichan},
{"项目": "股东人数", "数值": info.gudong_renshu},
{"项目": "上市日期", "数值": info.ipo_date},
])
print("贵州茅台 最新财务数据:")
print(df.to_string(index=False, formatters={"数值": lambda x: f"{x:,.0f}"}))
+23
View File
@@ -0,0 +1,23 @@
"""演示:计算个股涨跌停价格。"""
import pandas as pd
from xmtdx import TdxClient, Market
CODE = "600519"
NAME = "贵州茅台"
with TdxClient.from_best_host() as c:
quotes = c.get_security_quotes([(Market.SH, CODE)])
if quotes:
q = quotes[0]
limit_up, limit_down = c.get_price_limits(
Market.SH, CODE, NAME, q.pre_close
)
df = pd.DataFrame([{
"代码": CODE,
"名称": NAME,
"昨收": q.pre_close,
"涨停价": limit_up,
"跌停价": limit_down,
}])
print(df.to_string(index=False))
+17
View File
@@ -0,0 +1,17 @@
"""演示:获取除权除息历史记录。"""
import pandas as pd
from xmtdx import TdxClient, Market, XDXR_CATEGORY_NAMES
with TdxClient.from_best_host() as c:
records = c.get_xdxr_info(Market.SH, "600519")
df = pd.DataFrame([{
"日期": f"{r.year}-{r.month:02d}-{r.day:02d}",
"类型": XDXR_CATEGORY_NAMES.get(r.category, f"未知({r.category})"),
"每股分红(元)": r.fenhong,
"送转股比例": r.songzhuangu,
"配股价": r.peigujia,
"配股比例": r.peigu,
} for r in records])
print(f"贵州茅台 除权除息记录,共 {len(df)} 条:")
print(df.tail(10).to_string(index=False))