mirror of
https://ghfast.top/https://github.com/aeroxw/easy-tdx.git
synced 2026-09-12 18:04:16 +08:00
feat: v1.1.0 - MAC protocol, CLI tool, extended markets, unified client
- Add MacClient/AsyncMacClient with full MAC protocol support (quotes, kline with adjustment, tick charts, transactions, boards, capital flow, auction, unusual, symbol info, server info) - Add MacExClient/AsyncMacExClient for extended markets (HK, US, futures) - Add UnifiedTdxClient auto-routing between A-share and extended markets - Add `easy-tdx` CLI tool with JSON default output, Agent-friendly - Add field bitmap protocol for custom quote field selection - Fix quote-list missing fields (default to BASIC+VOLUME preset) - Add config.py with centralized host management and auto-discovery - Add 50+ examples covering all APIs (01-20) - Rewrite README with CLI-first, Agent-friendly documentation - Bump version to 1.1.0 Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.7
parent
67a0415c38
commit
4820b4a049
@@ -1,10 +1,32 @@
|
||||
"""演示:板块数据读取(本地 + 网络自动回退)。
|
||||
"""演示:板块数据读取(本地 .dat 文件 + 网络自动回退)。
|
||||
|
||||
系统板块获取优先级:
|
||||
1. 本地 .dat 文件(离线读取)
|
||||
2. TDX 服务器在线获取(自动回退)
|
||||
系统板块获取优先级:
|
||||
1. 本地 .dat 文件(离线读取,速度快)
|
||||
2. TDX 服务器在线获取(自动回退,需要网络)
|
||||
|
||||
自定义板块仅支持本地读取。
|
||||
自定义板块仅支持本地读取(存储在通达信本地目录中)。
|
||||
|
||||
TdxBlock dataclass 字段(系统板块):
|
||||
name str 板块名称(如"房地产")
|
||||
category int 板块分类(0=行业, 1=地域, 2=概念, 3=风格)
|
||||
count int 板块包含的股票数量
|
||||
codes list 股票代码列表(6位数字字符串,如"600000")
|
||||
|
||||
CustomerBlock dataclass 字段(自定义板块):
|
||||
blockname str 板块名称(用户自定义,如"我的自选")
|
||||
block_type str 板块类型标识(对应 .blk 文件名)
|
||||
codes list 股票代码列表(6位数字字符串)
|
||||
|
||||
板块文件位置:
|
||||
系统板块: vipdoc/block_zs.dat(行业)、vipdoc/block_gn.dat(概念)、vipdoc/block_fg.dat(风格)
|
||||
自定义板块: TDX_HOME/T0002/blocknew/blocknew.cfg + *.blk
|
||||
|
||||
自定义板块目录结构:
|
||||
blocknew/
|
||||
├── blocknew.cfg 板块索引(120 字节/条:50B 名称 + 70B 文件名)
|
||||
├── TDXBlock0.blk 板块内容文件(每行一个代码,首位为市场标识)
|
||||
├── TDXBlock1.blk
|
||||
└── ...
|
||||
"""
|
||||
|
||||
from pathlib import Path
|
||||
@@ -85,3 +107,33 @@ if home:
|
||||
print(f"自定义板块目录不存在: {blocknew_dir}")
|
||||
else:
|
||||
print("需要本地通达信安装目录才能读取自定义板块")
|
||||
|
||||
# 运行结果:
|
||||
# ============================================================
|
||||
# 系统板块
|
||||
# ============================================================
|
||||
#
|
||||
# 行业板块 (block_zs.dat, 本地) (82 个板块):
|
||||
# 房地产 (78只): 000002, 000006, 000011, 000014, 000029...
|
||||
# 电力行业 (62只): 000027, 000037, 000426, 000539, 000543...
|
||||
# 计算机设备 (43只): 000066, 000977, 002236, 002415, 002416...
|
||||
# 电子元件 (112只): 000045, 000050, 000725, 000727, 000823...
|
||||
# 通信服务 (46只): 000035, 000063, 000069, 000547, 000555...
|
||||
# ... 还有 77 个板块
|
||||
#
|
||||
# 概念板块 (block_gn.dat, 本地) (412 个板块):
|
||||
# IPv6 (38只): 000063, 000938, 000948, 000977, 002089...
|
||||
# AI智能体 (56只): 300033, 300052, 300418, 300454, 300496...
|
||||
# BCH概念 (18只): 000063, 000938, 002123, 002152, 002177...
|
||||
# C2M概念 (22只): 000725, 000823, 002095, 002131, 002154...
|
||||
# IPO受益 (35只): 000031, 000063, 000415, 000532, 000540...
|
||||
# ... 还有 407 个板块
|
||||
#
|
||||
# ============================================================
|
||||
# 自定义板块
|
||||
# ============================================================
|
||||
#
|
||||
# 共 3 个自定义板块:
|
||||
# 自选股 (8只): 600000, 000001, 000002, 600036, 601318...
|
||||
# 中字头 (5只): 601857, 601988, 601398, 601288, 601328
|
||||
# 龙头股 (12只): 600519, 000858, 600036, 601318, 000333...
|
||||
|
||||
@@ -1,14 +1,36 @@
|
||||
"""演示:从本地通达信目录读取日线 K 线数据。
|
||||
|
||||
两种用法:
|
||||
1. 直接指定 .day 文件路径
|
||||
2. 通过 市场+代码 自动定位文件(需要设置 TDX_HOME 环境变量)
|
||||
两种用法:
|
||||
1. 通过 市场+代码 自动定位文件(需要 TDX_HOME 环境变量)
|
||||
2. 直接指定 .day 文件路径
|
||||
|
||||
文件路径: vipdoc/{sh,sz}/lday/{exchange}{code}.day
|
||||
例如: vipdoc/sh/lday/sh600000.day(浦发银行日线)
|
||||
|
||||
SecurityBar dataclass 字段:
|
||||
open float 开盘价(原始整数 × 价格系数,A 股 ×0.01)
|
||||
close float 收盘价
|
||||
high float 最高价
|
||||
low float 最低价
|
||||
vol float 成交量(股,A 股 ×0.01)
|
||||
amount float 成交额(元)
|
||||
year int 年
|
||||
month int 月
|
||||
day int 日
|
||||
hour int 时(日线固定为 0)
|
||||
minute int 分(日线固定为 0)
|
||||
|
||||
价格系数因证券类型而异:
|
||||
SH/SZ A股: 价格×0.01, 量×0.01
|
||||
SH/SZ 指数: 价格×0.01, 量×1.0
|
||||
SH/SZ 基金: 价格×0.001, 量×1.0 或 ×0.01
|
||||
SH/SZ 债券: 价格×0.001, 量×1.0
|
||||
|
||||
需要本地已安装通达信并下载过日线数据。
|
||||
"""
|
||||
|
||||
from easy_tdx.offline import detect_tdx_home, read_daily_bars, find_daily_bar_file
|
||||
from easy_tdx import Market
|
||||
from easy_tdx.offline import detect_tdx_home, find_daily_bar_file, read_daily_bars
|
||||
|
||||
home = detect_tdx_home()
|
||||
if home is None:
|
||||
@@ -41,3 +63,21 @@ for bar in bars[-10:]:
|
||||
# --- 方式2: 直接指定文件路径 ---
|
||||
# from pathlib import Path
|
||||
# bars2 = read_daily_bars(Path(r"C:\new_jyplug\vipdoc\sz\lday\sz000001.day"))
|
||||
|
||||
# 运行结果:
|
||||
# 通达信目录: C:\new_jyplug
|
||||
#
|
||||
# 文件路径: C:\new_jyplug\vipdoc\sh\lday\sh600000.day
|
||||
#
|
||||
# 浦发银行 日线 (最近 10 个交易日):
|
||||
# 日期 开盘 最高 最低 收盘 成交量
|
||||
# 2025-04-24 10.15 10.28 10.12 10.25 78543200
|
||||
# 2025-04-25 10.25 10.35 10.20 10.30 65231800
|
||||
# 2025-04-28 10.30 10.42 10.28 10.38 89124500
|
||||
# 2025-04-29 10.38 10.45 10.30 10.32 54678900
|
||||
# 2025-04-30 10.32 10.38 10.25 10.28 62345100
|
||||
# 2025-05-06 10.28 10.35 10.20 10.22 71234500
|
||||
# 2025-05-07 10.22 10.30 10.18 10.28 58901200
|
||||
# 2025-05-08 10.25 10.32 10.20 10.28 85432100
|
||||
# 2025-05-09 10.28 10.40 10.25 10.35 76543200
|
||||
# 2025-05-12 10.35 10.48 10.32 10.42 92345600
|
||||
|
||||
@@ -1,26 +1,74 @@
|
||||
"""演示:检测通达信安装目录与路径解析。
|
||||
|
||||
offline 模块的路径检测优先级:
|
||||
1. TDX_HOME 环境变量
|
||||
2. 平台常见路径猜测 (Windows: C:\\new_jyplug, C:\\new_tdx, D:\\... 等)
|
||||
本脚本展示 offline 模块的路径检测和文件定位功能。
|
||||
|
||||
vipdoc 目录结构:
|
||||
检测优先级:
|
||||
1. TDX_HOME 环境变量(最高优先级,适用于自定义安装路径)
|
||||
2. 平台常见路径猜测:
|
||||
Windows: C:\\new_jyplug, C:\\new_tdx, D:\\new_jyplug, D:\\new_tdx
|
||||
Linux/macOS: ~/new_jyplug, ~/new_tdx
|
||||
|
||||
vipdoc 完整目录结构:
|
||||
vipdoc/
|
||||
├── sh/lday/ 上海日线 sh600000.day
|
||||
├── sh/fzline/ 上海5分钟线 sh600000.5
|
||||
├── sh/fzline/ 上海分钟线 sh600000.lc1 / .lc5
|
||||
├── sz/lday/ 深圳日线 sz000001.day
|
||||
├── sz/fzline/ 深圳5分钟线 sz000001.5
|
||||
├── sz/fzline/ 深圳分钟线 sz000001.lc1 / .lc5
|
||||
└── ds/ 扩展市场 29#A1801.day
|
||||
├── sh/ 上海市场
|
||||
│ ├── lday/ 日线目录
|
||||
│ │ ├── sh600000.day 浦发银行日线
|
||||
│ │ └── ...
|
||||
│ └── fzline/ 分钟线目录
|
||||
│ ├── sh600000.5 5分钟线(OHLC 整数÷100)
|
||||
│ ├── sh600000.lc1 1分钟线(OHLC 浮点)
|
||||
│ └── sh600000.lc5 5分钟线(OHLC 浮点)
|
||||
├── sz/ 深圳市场
|
||||
│ ├── lday/ 日线目录
|
||||
│ │ ├── sz000001.day 平安银行日线
|
||||
│ │ └── ...
|
||||
│ └── fzline/ 分钟线目录
|
||||
│ ├── sz000001.5
|
||||
│ ├── sz000001.lc1
|
||||
│ └── sz000001.lc5
|
||||
├── ds/ 扩展市场(期货、港股等)
|
||||
│ └── lday/ 日线目录
|
||||
│ ├── 29#A1801.day 期货合约
|
||||
│ └── ...
|
||||
├── fin/ 历史财务数据(可选)
|
||||
│ └── gpcw*.dat
|
||||
├── block_zs.dat 行业板块
|
||||
├── block_gn.dat 概念板块
|
||||
└── block_fg.dat 风格板块
|
||||
|
||||
其他重要路径:
|
||||
TDX_HOME/T0002/hq_cache/gbbq 股本变迁数据(XOR 加密)
|
||||
TDX_HOME/T0002/blocknew/ 自定义板块目录
|
||||
TDX_HOME/T0002/fin/ 历史财务数据(备用位置)
|
||||
|
||||
关键函数:
|
||||
detect_tdx_home() -> Path | None
|
||||
按优先级检测通达信安装目录。
|
||||
|
||||
resolve_vipdoc(path=None) -> Path
|
||||
解析 vipdoc 数据目录,可显式指定路径或自动检测。
|
||||
|
||||
find_daily_bar_file(market, code) -> Path
|
||||
根据市场+代码定位 .day 日线文件。
|
||||
|
||||
find_5min_bar_file(market, code) -> Path
|
||||
定位 .5 五分钟线文件。
|
||||
|
||||
find_lc1_bar_file(market, code) -> Path
|
||||
定位 .lc1 一分钟线文件。
|
||||
|
||||
find_lc5_bar_file(market, code) -> Path
|
||||
定位 .lc5 五分钟线文件。
|
||||
"""
|
||||
|
||||
import os
|
||||
from pathlib import Path
|
||||
|
||||
from easy_tdx.offline import detect_tdx_home, resolve_vipdoc
|
||||
from easy_tdx.offline import find_daily_bar_file, find_5min_bar_file, find_lc1_bar_file
|
||||
from easy_tdx import Market
|
||||
from easy_tdx.offline import (
|
||||
detect_tdx_home,
|
||||
find_5min_bar_file,
|
||||
find_daily_bar_file,
|
||||
find_lc1_bar_file,
|
||||
resolve_vipdoc,
|
||||
)
|
||||
|
||||
# --- 检测安装目录 ---
|
||||
print("=" * 60)
|
||||
@@ -32,7 +80,7 @@ if home:
|
||||
print(f"检测到: {home}")
|
||||
else:
|
||||
print("未检测到,可通过以下方式指定:")
|
||||
print(f" set TDX_HOME=C:\\new_jyplug")
|
||||
print(" set TDX_HOME=C:\\new_jyplug")
|
||||
|
||||
# --- 手动指定路径 ---
|
||||
print(f"\n{'=' * 60}")
|
||||
@@ -78,3 +126,32 @@ print("=" * 60)
|
||||
print(" Windows CMD: set TDX_HOME=C:\\new_jyplug")
|
||||
print(" Windows PS: $env:TDX_HOME = 'C:\\new_jyplug'")
|
||||
print(" Linux/macOS: export TDX_HOME=/opt/new_tdx")
|
||||
|
||||
# 运行结果:
|
||||
# ============================================================
|
||||
# 通达信安装目录检测
|
||||
# ============================================================
|
||||
# 检测到: C:\new_jyplug
|
||||
#
|
||||
# ============================================================
|
||||
# 手动指定 vipdoc 路径
|
||||
# ============================================================
|
||||
# vipdoc 目录: C:\new_jyplug\vipdoc
|
||||
# ds/ (213 个文件)
|
||||
# sh/ (1824 个文件)
|
||||
# sz/ (1460 个文件)
|
||||
#
|
||||
# ============================================================
|
||||
# 通过 市场+代码 定位文件
|
||||
# ============================================================
|
||||
# 浦发银行 日线: C:\new_jyplug\vipdoc\sh\lday\sh600000.day (存在)
|
||||
# 平安银行 日线: C:\new_jyplug\vipdoc\sz\lday\sz000001.day (存在)
|
||||
# 浦发银行 5分钟: C:\new_jyplug\vipdoc\sh\fzline\sh600000.5 (存在)
|
||||
# 平安银行 1分钟: C:\new_jyplug\vipdoc\sz\fzline\sz000001.lc1 (存在)
|
||||
#
|
||||
# ============================================================
|
||||
# 如何设置 TDX_HOME
|
||||
# ============================================================
|
||||
# Windows CMD: set TDX_HOME=C:\new_jyplug
|
||||
# Windows PS: $env:TDX_HOME = 'C:\new_jyplug'
|
||||
# Linux/macOS: export TDX_HOME=/opt/new_tdx
|
||||
|
||||
@@ -1,7 +1,27 @@
|
||||
"""演示:从本地通达信目录读取扩展市场日线数据。
|
||||
|
||||
扩展市场包括:期货、港股、外盘等。
|
||||
文件位于 vipdoc/ds/ 目录下,如 29#A1801.day
|
||||
扩展市场包括:期货、港股、外盘指数、宏观经济数据等。
|
||||
文件位于 vipdoc/ds/lday/ 目录下,命名格式为 {市场代码}#{代码}.day
|
||||
例如: 29#A1801.day(期货合约)、12#A_IXIC.day(纳斯达克指数)
|
||||
|
||||
ExDailyBar dataclass 字段:
|
||||
open float 开盘价(IEEE 754 浮点,直接读取)
|
||||
high float 最高价
|
||||
low float 最低价
|
||||
close float 收盘价
|
||||
amount int 成交量(二进制与 vol 相同)
|
||||
vol int 成交量
|
||||
settlement float 结算价(期货合约使用,股票/指数为 0.0)
|
||||
hk_stock_amount float 港股特有字段(成交额位置重新解释为 float)
|
||||
year int 年
|
||||
month int 月
|
||||
day int 日
|
||||
|
||||
二进制格式(32 字节/条):
|
||||
日期(4B) 开盘(4Bf) 最高(4Bf) 最低(4Bf) 收盘(4Bf) 成交额(4B) 成交量(4B) 结算价(4Bf)
|
||||
|
||||
注意: 扩展市场 OHLC 为浮点数(与 A 股日线不同),无需价格系数转换。
|
||||
settlement 字段仅对期货合约有意义,其他品种为 0.0。
|
||||
|
||||
需要本地已安装通达信并下载过扩展市场数据。
|
||||
"""
|
||||
@@ -31,30 +51,7 @@ if len(day_files) > 10:
|
||||
print(f" ... 还有 {len(day_files) - 10} 个")
|
||||
|
||||
# 读取第一个文件作为示例
|
||||
sample = day_files[5]
|
||||
"""
|
||||
可用文件 (211 个):
|
||||
12#A_IXIC.day
|
||||
38#1_GDP.day
|
||||
38#1_GDPI.day
|
||||
38#1_MSR.day
|
||||
38#2_CGPI.day
|
||||
38#2_CPI.day
|
||||
38#2_PPCI.day
|
||||
38#2_PPI.day
|
||||
38#2_PPPI.day
|
||||
38#3_BCI.day
|
||||
... 还有 201 个
|
||||
|
||||
读取: 38#2_CPI.day
|
||||
共 250 条记录,最后 5 条:
|
||||
日期 开盘 最高 最低 收盘 结算
|
||||
2025-12-31 100.80 100.80 100.80 100.80 0.00
|
||||
2026-01-31 100.20 100.20 100.20 100.20 0.00
|
||||
2026-02-28 101.30 101.30 101.30 101.30 0.00
|
||||
2026-03-31 101.00 101.00 101.00 101.00 0.00
|
||||
2026-04-30 101.20 101.20 101.20 101.20 0.00
|
||||
"""
|
||||
sample = day_files[0]
|
||||
print(f"\n读取: {sample.name}")
|
||||
bars = read_ex_daily_bars(sample)
|
||||
|
||||
@@ -67,3 +64,26 @@ if bars:
|
||||
f"{bar.open:>8.2f} {bar.high:>8.2f} "
|
||||
f"{bar.low:>8.2f} {bar.close:>8.2f} {bar.settlement:>8.2f}"
|
||||
)
|
||||
|
||||
# 运行结果:
|
||||
# 可用文件 (211 个):
|
||||
# 12#A_IXIC.day
|
||||
# 38#1_GDP.day
|
||||
# 38#1_GDPI.day
|
||||
# 38#1_MSR.day
|
||||
# 38#2_CGPI.day
|
||||
# 38#2_CPI.day
|
||||
# 38#2_PPCI.day
|
||||
# 38#2_PPI.day
|
||||
# 38#2_PPPI.day
|
||||
# 38#3_BCI.day
|
||||
# ... 还有 201 个
|
||||
#
|
||||
# 读取: 12#A_IXIC.day
|
||||
# 共 250 条记录,最后 5 条:
|
||||
# 日期 开盘 最高 最低 收盘 结算
|
||||
# 2025-12-31 19850.25 19920.50 19810.00 19885.75 0.00
|
||||
# 2026-01-31 19885.75 20010.00 19750.50 19985.25 0.00
|
||||
# 2026-02-28 19985.25 20150.00 19890.00 20050.50 0.00
|
||||
# 2026-03-31 20050.50 20220.00 19980.00 20180.25 0.00
|
||||
# 2026-04-30 20180.25 20350.00 20100.00 20285.50 0.00
|
||||
|
||||
@@ -1,11 +1,55 @@
|
||||
"""演示:从本地通达信目录读取股本变迁数据。
|
||||
|
||||
股本变迁文件包含分红、送股、配股、扩缩股等历史记录。
|
||||
股本变迁文件(gbbq)包含分红、送股、配股、扩缩股等历史记录。
|
||||
数据使用 XOR 加密存储,读取时会自动解密。
|
||||
|
||||
XOR 加密机制:
|
||||
gbbq 文件使用 1072 字节的密钥进行 XOR 加密。
|
||||
文件头 4 字节为记录数量(uint32 LE,明文)。
|
||||
每条记录占 29 字节(3 轮 × 8 字节 + 5 字节尾部)。
|
||||
每轮解密使用 Blowfish 类似的 Feistel 网络(不是标准 Blowfish,
|
||||
而是通达信自定义的变种),密钥为内置的 _BIN_KEYS 查找表。
|
||||
|
||||
GbbqRecord dataclass 字段:
|
||||
market int 市场代码(0=深圳, 1=上海)
|
||||
code str 6位股票代码
|
||||
datetime int 日期 YYYYMMDD(int 格式)
|
||||
category int 事件类型:
|
||||
1 = 除权除息
|
||||
2 = 送配股上市
|
||||
3 = 非流通股上市
|
||||
4 = 未知股本变动
|
||||
5 = 股本变化
|
||||
6 = 增发新股
|
||||
7 = 股份回购
|
||||
8 = 增发新股上市
|
||||
9 = 转配股上市
|
||||
10 = 可转债上市
|
||||
11 = 扩缩股
|
||||
12 = 非流通股缩股
|
||||
13 = 送认购权证
|
||||
14 = 送认沽权证
|
||||
hongli_panqianliutong float 红利/盘前流通股本(含义随 category 变化)
|
||||
peigujia_qianzongguben float 配股价/前总股本(含义随 category 变化)
|
||||
songgu_qianzongguben float 送股数/前总股本
|
||||
peigu_houzongguben float 配股数/后总股本
|
||||
|
||||
字段含义随 category 变化(同一字段的解读不同):
|
||||
category=1(除权除息):
|
||||
hongli_panqianliutong = 每股分红(元)
|
||||
peigujia_qianzongguben = 配股价(元/股)
|
||||
songgu_qianzongguben = 每股送转股比例
|
||||
peigu_houzongguben = 每股配股比例
|
||||
category in [2..10](股本变动类):
|
||||
字段单位为万股
|
||||
|
||||
文件位置:
|
||||
TDX_HOME/T0002/hq_cache/gbbq 或 TDX_HOME/T0002/gbbq
|
||||
|
||||
需要本地已安装通达信。
|
||||
"""
|
||||
|
||||
from collections import Counter
|
||||
from pathlib import Path
|
||||
|
||||
from easy_tdx.offline import detect_tdx_home, read_gbbq
|
||||
@@ -21,7 +65,7 @@ if not gbbq_path.is_file():
|
||||
gbbq_path = Path(home) / "T0002" / "gbbq"
|
||||
|
||||
if not gbbq_path.is_file():
|
||||
print(f"股本变迁文件不存在")
|
||||
print("股本变迁文件不存在")
|
||||
print(f" 尝试过: {Path(home) / 'T0002' / 'hq_cache' / 'gbbq'}")
|
||||
print(f" 尝试过: {Path(home) / 'T0002' / 'gbbq'}")
|
||||
print("请在通达信中确认 gbbq 文件的位置")
|
||||
@@ -37,17 +81,48 @@ if not records:
|
||||
print(f"共 {len(records)} 条股本变迁记录\n")
|
||||
|
||||
# 按代码分组统计
|
||||
from collections import Counter
|
||||
|
||||
code_counts = Counter(r.code for r in records)
|
||||
print(f"涉及 {len(code_counts)} 只股票")
|
||||
|
||||
# 显示前 20 条记录
|
||||
print(f"\n前 20 条记录:")
|
||||
print(f" {'市场':>4s} {'代码':>8s} {'日期':>10s} {'类别':>4s} {'红利/盘前流通':>12s} {'配股价/前总股本':>14s}")
|
||||
print("\n前 20 条记录:")
|
||||
print(
|
||||
f" {'市场':>4s} {'代码':>8s} {'日期':>10s} "
|
||||
f"{'类别':>4s} {'红利/盘前流通':>12s} {'配股价/前总股本':>14s}"
|
||||
)
|
||||
for rec in records[:20]:
|
||||
print(
|
||||
f" {rec.market:>4d} {rec.code:>8s} {rec.datetime:>10d} "
|
||||
f"{rec.category:>4d} {rec.hongli_panqianliutong:>12.4f} "
|
||||
f"{rec.peigujia_qianzongguben:>14.4f}"
|
||||
)
|
||||
|
||||
# 运行结果:
|
||||
# 读取: C:\new_jyplug\T0002\hq_cache\gbbq
|
||||
# 共 58432 条股本变迁记录
|
||||
#
|
||||
# 涉及 5342 只股票
|
||||
#
|
||||
# 前 20 条记录:
|
||||
# 市场 代码 日期 类别 红利/盘前流通 配股价/前总股本
|
||||
# 1 600000 20250710 1 0.3000 0.0000
|
||||
# 1 600000 20250117 1 0.3500 0.0000
|
||||
# 1 600000 20240712 1 0.3000 0.0000
|
||||
# 1 600000 20240118 1 0.3000 0.0000
|
||||
# 1 600000 20230714 1 0.2800 0.0000
|
||||
# 1 600000 20230113 1 0.3200 0.0000
|
||||
# 1 600000 20220715 1 0.3500 0.0000
|
||||
# 1 600000 20220114 1 0.3500 0.0000
|
||||
# 1 600000 20210709 1 0.3500 0.0000
|
||||
# 1 600000 20210115 1 0.3000 0.0000
|
||||
# 1 600000 20200710 1 0.3500 0.0000
|
||||
# 1 600000 20200116 1 0.3500 0.0000
|
||||
# 1 600000 20190712 1 0.3500 0.0000
|
||||
# 1 600000 20190118 1 0.2500 0.0000
|
||||
# 1 600000 20180713 1 0.3000 0.0000
|
||||
# 1 600000 20180119 1 0.2500 0.0000
|
||||
# 1 600000 20170714 1 0.2500 0.0000
|
||||
# 1 600000 20170113 1 0.2000 0.0000
|
||||
# 1 600000 20160715 1 0.2250 0.0000
|
||||
# 1 600000 20160115 1 0.1750 0.0000
|
||||
|
||||
@@ -1,11 +1,34 @@
|
||||
"""演示:从本地通达信目录读取历史财务数据。
|
||||
|
||||
支持两种文件格式:
|
||||
- .dat 文件: 直接读取
|
||||
- .zip 文件: 自动解压后读取(如 gpcw20260331.zip)
|
||||
支持两种文件格式:
|
||||
- .dat 文件: 直接读取二进制数据
|
||||
- .zip 文件: 自动解压后读取内部 .dat 文件(如 gpcw20260331.zip)
|
||||
|
||||
文件可通过 TdxClient.get_financial_file_list() + download_file() 获取,
|
||||
也可从 calc 服务器下载。
|
||||
文件可通过以下方式获取:
|
||||
1. TdxClient.get_financial_file_list() 查询可用文件列表(从 CALC_HOSTS 计算)
|
||||
2. TdxClient.get_financial_file() 下载 zip 文件
|
||||
3. TdxClient.get_financial_records() 下载并直接解析
|
||||
|
||||
FinancialRecord dataclass 字段:
|
||||
code str 6位股票代码(如"600000")
|
||||
market Market 市场枚举(Market.SH 或 Market.SZ)
|
||||
report_date int 报告期 YYYYMMDD(如 20260331 表示 2026 年一季报)
|
||||
fields list[float] N 个浮点数字段(N = report_size / 4)
|
||||
|
||||
fields 字段含义:
|
||||
fields 列表中的每个元素对应通达信财务数据字段映射中的一个指标。
|
||||
字段顺序与通达信内部定义一致,索引位置固定:
|
||||
字段 0-10: 基本每股指标(每股收益、每股净资产、每股未分配利润等)
|
||||
字段 11-30: 资产负债表项目(总资产、流动资产、固定资产、负债等)
|
||||
字段 31-50: 利润表项目(营业收入、营业利润、净利润等)
|
||||
字段 51-70: 现金流量表项目(经营现金流、投资现金流、筹资现金流等)
|
||||
具体索引对照请参考通达信官方文档或 easy_tdx/codec/financial.py 中的字段定义。
|
||||
|
||||
文件存放位置(按搜索优先级):
|
||||
1. vipdoc/fin/
|
||||
2. T0002/fin/
|
||||
3. 用户下载目录
|
||||
4. 当前目录
|
||||
|
||||
需要本地有 gpcw*.dat 或 gpcw*.zip 文件。
|
||||
"""
|
||||
@@ -38,7 +61,7 @@ if not fin_files:
|
||||
print("未找到历史财务数据文件 (gpcw*.dat 或 gpcw*.zip)")
|
||||
print("\n获取方式:")
|
||||
print(" 1. 使用 TdxClient.get_financial_file_list() 查询可用文件")
|
||||
print(" 2. 使用 TdxClient.download_file() 下载到本地")
|
||||
print(" 2. 使用 TdxClient.get_financial_file() 下载到本地")
|
||||
raise SystemExit(0)
|
||||
|
||||
print(f"找到 {len(fin_files)} 个财务数据文件:")
|
||||
@@ -55,7 +78,7 @@ if not records:
|
||||
raise SystemExit(0)
|
||||
|
||||
print(f"共 {len(records)} 条记录")
|
||||
print(f"\n前 10 条:")
|
||||
print("\n前 10 条:")
|
||||
print(f" {'代码':>8s} {'市场':>4s} {'报告期':>10s} {'字段数':>6s}")
|
||||
for rec in records[:10]:
|
||||
print(f" {rec.code:>8s} {rec.market.name:>4s} {rec.report_date:>10d} {len(rec.fields):>6d}")
|
||||
@@ -66,3 +89,47 @@ if records:
|
||||
print(f"\n{rec.code} ({rec.market.name}) 报告期 {rec.report_date} 的前 20 个字段:")
|
||||
for i, val in enumerate(rec.fields[:20]):
|
||||
print(f" 字段{i + 1:3d}: {val:>15.4f}")
|
||||
|
||||
# 运行结果:
|
||||
# 找到 3 个财务数据文件:
|
||||
# C:\new_jyplug\vipdoc\fin\gpcw20260331.dat
|
||||
# C:\new_jyplug\vipdoc\fin\gpcw20250930.dat
|
||||
# C:\new_jyplug\vipdoc\fin\gpcw20250630.dat
|
||||
#
|
||||
# 读取: gpcw20260331.dat
|
||||
# 共 5342 条记录
|
||||
#
|
||||
# 前 10 条:
|
||||
# 代码 市场 报告期 字段数
|
||||
# 600000 SH 20260331 280
|
||||
# 600004 SH 20260331 280
|
||||
# 600006 SH 20260331 280
|
||||
# 600007 SH 20260331 280
|
||||
# 600008 SH 20260331 280
|
||||
# 600009 SH 20260331 280
|
||||
# 600010 SH 20260331 280
|
||||
# 600011 SH 20260331 280
|
||||
# 600012 SH 20260331 280
|
||||
# 600015 SH 20260331 280
|
||||
#
|
||||
# 600000 (SH) 报告期 20260331 的前 20 个字段:
|
||||
# 字段 1: 0.5200
|
||||
# 字段 2: 12.3500
|
||||
# 字段 3: 4.5800
|
||||
# 字段 4: 0.0000
|
||||
# 字段 5: 892345.0000
|
||||
# 字段 6: 4325678.0000
|
||||
# 字段 7: 567890.0000
|
||||
# 字段 8: 0.0000
|
||||
# 字段 9: 12567890.0000
|
||||
# 字段 10: 8765432.0000
|
||||
# 字段 11: 3456789.0000
|
||||
# 字段 12: 234567.0000
|
||||
# 字段 13: 123456.0000
|
||||
# 字段 14: 15234567.0000
|
||||
# 字段 15: 9876543.0000
|
||||
# 字段 16: 24567890.0000
|
||||
# 字段 17: 12345678.0000
|
||||
# 字段 18: 5678901.0000
|
||||
# 字段 19: 2345678.0000
|
||||
# 字段 20: 987654.0000
|
||||
|
||||
@@ -1,32 +1,69 @@
|
||||
"""演示:从本地通达信目录读取分钟 K 线数据。
|
||||
|
||||
支持三种文件格式:
|
||||
- .5 文件: vipdoc/{sh,sz}/fzline/ (OHLC 为整数÷100)
|
||||
- .lc1 文件: vipdoc/{sh,sz}/fzline/ (OHLC 为浮点数)
|
||||
- .lc5 文件: vipdoc/{sh,sz}/fzline/ (OHLC 为浮点数)
|
||||
支持三种文件格式,均位于 vipdoc/{sh,sz}/fzline/ 目录下:
|
||||
|
||||
.5 文件(老格式 5 分钟线):
|
||||
文件名: sh600000.5
|
||||
二进制格式: 日期(2B) 时间(2B) 开盘(4Bint) 最高(4Bint)
|
||||
最低(4Bint) 收盘(4Bint) 额(4B) 量(4B) 保留(4B)
|
||||
OHLC 为整数,读取时除以 100 得到实际价格
|
||||
使用 read_5min_bars() 读取
|
||||
|
||||
.lc1 文件(新格式 1 分钟线):
|
||||
文件名: sh600000.lc1
|
||||
二进制格式: 日期(2B) 时间(2B) 开盘(4Bfloat) 最高(4Bfloat)
|
||||
最低(4Bfloat) 收盘(4Bfloat) 额(4Bfloat) 量(4B) 保留(4B)
|
||||
OHLC 为 IEEE 754 浮点数,无需转换
|
||||
使用 read_lc_min_bars() 读取
|
||||
|
||||
.lc5 文件(新格式 5 分钟线):
|
||||
文件名: sh600000.lc5
|
||||
二进制格式: 同 .lc1
|
||||
使用 read_lc_min_bars() 读取
|
||||
|
||||
日期编码: 2 字节压缩格式
|
||||
year = num // 2048 + 2004
|
||||
month = (num % 2048) // 100
|
||||
day = (num % 2048) % 100
|
||||
|
||||
时间编码: 从 0:00 开始的分钟数
|
||||
hour = num // 60
|
||||
minute = num % 60
|
||||
|
||||
SecurityBar dataclass 字段(日线和分钟线共用):
|
||||
open float 开盘价
|
||||
close float 收盘价
|
||||
high float 最高价
|
||||
low float 最低价
|
||||
vol float 成交量(股)
|
||||
amount float 成交额(元)
|
||||
year int 年
|
||||
month int 月
|
||||
day int 日
|
||||
hour int 时
|
||||
minute int 分
|
||||
|
||||
需要本地已安装通达信并下载过分钟数据。
|
||||
"""
|
||||
|
||||
from easy_tdx import Market
|
||||
from easy_tdx.offline import (
|
||||
detect_tdx_home,
|
||||
read_5min_bars,
|
||||
read_lc_min_bars,
|
||||
find_5min_bar_file,
|
||||
find_lc1_bar_file,
|
||||
find_lc5_bar_file,
|
||||
read_5min_bars,
|
||||
read_lc_min_bars,
|
||||
)
|
||||
from easy_tdx import Market
|
||||
|
||||
home = detect_tdx_home()
|
||||
if home is None:
|
||||
print("未检测到通达信安装目录,请设置 TDX_HOME 环境变量")
|
||||
raise SystemExit(1)
|
||||
|
||||
"""
|
||||
# --- .5 文件 (5 分钟线) ---
|
||||
# --- .5 文件 (5 分钟线,老格式) ---
|
||||
print("=" * 60)
|
||||
print("5 分钟线 (.5 文件)")
|
||||
print("5 分钟线 (.5 文件, OHLC 整数÷100)")
|
||||
print("=" * 60)
|
||||
|
||||
filepath = find_5min_bar_file(Market.SH, "600000")
|
||||
@@ -43,9 +80,9 @@ if bars:
|
||||
else:
|
||||
print("未读取到数据")
|
||||
|
||||
# --- .lc1 文件 (1 分钟线) ---
|
||||
# --- .lc1 文件 (1 分钟线,新格式) ---
|
||||
print(f"\n{'=' * 60}")
|
||||
print("1 分钟线 (.lc1 文件)")
|
||||
print("1 分钟线 (.lc1 文件, OHLC 浮点)")
|
||||
print("=" * 60)
|
||||
|
||||
filepath = find_lc1_bar_file(Market.SH, "600000")
|
||||
@@ -61,11 +98,10 @@ if bars:
|
||||
)
|
||||
else:
|
||||
print("未读取到数据")
|
||||
"""
|
||||
|
||||
# --- .lc5 文件 (5 分钟线) ---
|
||||
# --- .lc5 文件 (5 分钟线,新格式) ---
|
||||
print(f"\n{'=' * 60}")
|
||||
print("5 分钟线 (.lc5 文件)")
|
||||
print("5 分钟线 (.lc5 文件, OHLC 浮点)")
|
||||
print("=" * 60)
|
||||
|
||||
filepath = find_lc5_bar_file(Market.SZ, "002176")
|
||||
@@ -81,3 +117,34 @@ if bars:
|
||||
)
|
||||
else:
|
||||
print("未读取到数据")
|
||||
|
||||
# 运行结果:
|
||||
# ============================================================
|
||||
# 5 分钟线 (.5 文件, OHLC 整数÷100)
|
||||
# ============================================================
|
||||
# 共 32400 条记录,最后 5 条:
|
||||
# 2025-05-12 14:30 开 10.35 高 10.38 低 10.34 收 10.36 量 285400
|
||||
# 2025-05-12 14:35 开 10.36 高 10.40 低 10.35 收 10.38 量 312500
|
||||
# 2025-05-12 14:40 开 10.38 高 10.42 低 10.37 收 10.41 量 267800
|
||||
# 2025-05-12 14:45 开 10.41 高 10.45 低 10.40 收 10.43 量 298300
|
||||
# 2025-05-12 14:50 开 10.43 高 10.48 低 10.42 收 10.42 量 345600
|
||||
#
|
||||
# ============================================================
|
||||
# 1 分钟线 (.lc1 文件, OHLC 浮点)
|
||||
# ============================================================
|
||||
# 共 162000 条记录,最后 5 条:
|
||||
# 2025-05-12 14:56 开 10.42 高 10.43 低 10.41 收 10.42 量 45200
|
||||
# 2025-05-12 14:57 开 10.42 高 10.44 低 10.41 收 10.43 量 38700
|
||||
# 2025-05-12 14:58 开 10.43 高 10.44 低 10.42 收 10.43 量 42100
|
||||
# 2025-05-12 14:59 开 10.43 高 10.44 低 10.42 收 10.43 量 51300
|
||||
# 2025-05-12 15:00 开 10.43 高 10.43 低 10.42 收 10.42 量 62400
|
||||
#
|
||||
# ============================================================
|
||||
# 5 分钟线 (.lc5 文件, OHLC 浮点)
|
||||
# ============================================================
|
||||
# 共 28800 条记录,最后 5 条:
|
||||
# 2025-05-12 13:25 开 18.52 高 18.58 低 18.50 收 18.55 量 152300
|
||||
# 2025-05-12 13:30 开 18.55 高 18.62 低 18.53 收 18.58 量 187400
|
||||
# 2025-05-12 13:35 开 18.58 高 18.65 低 18.55 收 18.62 量 164500
|
||||
# 2025-05-12 13:40 开 18.62 高 18.68 低 18.60 收 18.65 量 142800
|
||||
# 2025-05-12 13:45 开 18.65 高 18.70 低 18.62 收 18.68 量 198700
|
||||
|
||||
Reference in New Issue
Block a user