☰
基于TDX数据构建板块指数复盘系统:联动分析与可视化实践
2026/10/3 9:32:58 网站建设 项目流程

做复盘的人,最怕的不是找不到数据,而是数据到处都是却对不上。K线图谁都会画,但要把当天活跃的板块指数拉出来,再把板块指数和内部成分个股的涨跌同步关系放在同一张图上,直接讲清楚“这个板块为什么强、强在哪些个股上”,现成的工具还真不多。我今年花了不少周末,基于TDX数据格式做了一套板块指数复盘系统,核心就两件事:金融数据可视化,以及板块与个股联动分析。

如果你也做过类似复盘,应该能理解我的痛点:软件里能看个股K线,也能看板块指数,但两个东西往往是分开的。你可能要手动切换好几个页面,才能知道某只票到底是被板块带起来的,还是自己走出来的。盯着盘面凭感觉复盘,数据一多就乱。这套系统想解决的,就是把“盘后复盘”变成一个结构化、可回看、可对比的数据流程。

这篇文章我会完整拆解整个系统的设计思路、数据层处理、联动指标构建、可视化方案,以及我在实际搭建过程中踩过的坑。适合对金融数据感兴趣、想自己搭一套复盘工具的开发者看,也适合想搞清楚“板块指数和个股联动到底怎么量化”的投研型选手。先说明一点,这套系统的定位是研究复盘工具,不构成任何投资建议,所以我后面讲到的所有指标,都只用来辅助复盘,不做行情预测。

1. 板块指数复盘系统到底要解决什么问题

1.1 复盘的核心:把盘面语言翻译成可比较的数据

复盘这件事,很多人理解为“看看今天涨了什么、跌了什么”。但真正的复盘,是在提炼结构信息:资金在哪些板块之间流动、板块内部是分歧还是共振、哪些个股是主动走强而不是被动跟涨。传统软件只给原始行情,这些结构信息都得人脑现场算,遇到行情波动大的日子,光盯个股就够呛,更别说横向对比几十个板块。

所以我的第一想法是,能不能把复盘变成一套标准的流水线:数据从本地行情文件中取出,自动完成板块划分、指数计算、联动指标计算,最后生成图表和复盘结论。这套流水线定下来之后,不管行情多复杂,我打开系统只需要看输出结果,然后结合自己的判断去验证,而不是从头到尾翻数据。

我现在用的这套系统,本质上是一个离线数据处理框架加可视化看板,名字就叫TDX板块指数复盘系统。它不连实时行情,也不做自动交易,所有分析都基于收盘后的日线数据。这样做有意为之:复盘需要的是确定性,实时接口波动大、字段不完整,盘后反而能拿到全市场干净的数据。

1.2 板块与个股联动:为什么单独看个股总是看不全

只看个股K线,很容易产生一种错觉:这个股票涨得好,是因为它自己强。但把它放回所属板块里一看,可能整个板块都涨了4%,它才涨4%。这种情况说明它赚的是板块的Beta,不是个股的Alpha。反过来,如果板块整体涨幅只有0.5%,它独立涨了4%,那才是真正的个股主动性行情。

这个区别在复盘里非常关键。很多新手看盘只盯自选股,涨了觉得自己选股厉害,跌了怪大盘,唯独没有想过板块内部的联动结构。我做联动分析,就是想用数据把“板块带动的部分”和“个股自身的部分”分开。这样复盘时,你会更清楚一只股票上涨的可复制性有多强。

板块-个股联动分析,本质上是在算一个结构上的远近关系:某个板块指数在动,里面的股票是不是跟着动、动到什么程度、有没有股票拒绝跟随。这个关系用肉眼很难准确判断,需要量化指标来刻画。所以我在这套系统里先做了几个基础的联动指标,后面第3部分会详细展开。

1.3 为什么选TDX数据作为数据底座

现在做金融数据,很多人第一时间想到爬互联网接口。但我个人不太推荐把它作为复盘系统的主要数据源,原因有三个:第一,接口字段不稳定,今天能拿到的字段明天说不定就变了;第二,实时接口通常拿不到足够长的历史数据,做历史回溯很吃力;第三,频率限制多,跑一次全市场复盘可能要分很多次请求,慢且麻烦。

TDX这种本地数据目录就好在它是一次性落地到硬盘上的离线文件,读取速度快、数据结构稳定、历史数据连续。它不是一个特定软件的私有格式,而是很多行情软件都兼容的一种数据组织方式,核心是日线文件和板块成分文件。只要你的数据来源合规合法,导出本地数据后,整个复盘过程可以不依赖网络。

当然,TDX数据也远非完美。不同券商提供的目录组织方式会有差异,日线文件里价格的小数位、成交量的单位都可能不一样,甚至板块成分文件还有加密或半加密的情况。所以做这套系统时,我花了不少时间做数据探查和清洗,这也是为什么我建议想复刻这套工具的人,先花两天时间彻底搞清楚你的数据文件结构,再开始写分析逻辑。

2. 数据层搭建:从TDX原始数据到能画图的指标

2.1 TDX数据文件里到底存了什么

先把TDX的数据落地方式讲清楚。通常一个本地行情目录里,会按市场、按品种类型放很多文件,其中日线文件是最核心的,它按固定长度记录保存每一根日K线,记录里包含日期、开盘价、最高价、最低价、收盘价、成交额、成交量等字段。这些字段是连续存储的,读取时要用二进制方式按记录长度切分。

我用Python写了一个最小读取函数,用来解析这种日线文件,字段的精度先按常见的整型来处理:

import struct from pathlib import Path def read_tdx_day_file(filepath): """ 读取TDX兼容的日线数据文件 每条记录32字节:日期、开、高、低、收、额、量、保留字段 """ records = [] with open(filepath, "rb") as f: while chunk := f.read(32): if len(chunk) < 32: break date, open_, high, low, close, amount, volume, _ = struct.unpack("IIIIIIII", chunk) records.append({ "date": date, "open": open_ / 100, "high": high / 100, "low": low / 100, "close": close / 100, "amount": amount, "volume": volume, }) return records

这里要提醒一句:这个读取函数是以“价格用整数存、除以100得到正常价格”为前提的,我实测过的数据源大多是这样。但不同数据源之间差异很大,有的指数品种小数点位数不是2位,有的成交额单位不一样。所以拿到新数据源,第一件事是抽样打印几条记录,和行情软件里的历史数据做交叉验证,确认字节序、字段顺序、精度全部一致,再进行批量处理。

2.2 板块指数计算:加权方式决定你看到的世界

板块指数通常不是行情软件直接给你的,而是需要用板块成分股计算。市面上常见的计算方式有等权法和市值加权法两种。等权法是把板块内所有股票的日涨跌幅取平均,再用这个平均涨跌幅滚动累乘出一个指数;市值加权法则是按流通市值或总市值配权重,大权重股对指数的影响更大。

两种方法各有适用场景。等权指数更能反映板块内“大多数股票”的表现,对复盘宽度判断有参考价值;市值加权指数更接近资金真实体感,因为大市值的波动对盘面影响更大。我的系统默认用等权指数,因为我要做的是板块-个股联动分析,更关注成分股整体的同步性,而不是被几个大权重股绑架。

核心计算思路我用一段简化的代码说明:

import pandas as pd def calc_sector_index(daily_prices: pd.DataFrame, weights=None): """ daily_prices: 行索引为日期,列名为个股代码,值为收盘价 weights: 可选,传入市值权重,None则等权 """ returns = daily_prices.pct_change().fillna(0) if weights is None: sector_returns = returns.mean(axis=1) else: sector_returns = (returns * weights).sum(axis=1) index = (1 + sector_returns).cumprod() * 1000 return index

注意,这里有个隐藏的大坑:pct_change()遇到停牌股票会出现缺失值,如果直接fillna(0),会把停牌股当成“不涨不跌”处理,这在大多数场景下是可接受的;但如果某只股票停牌前连续大涨,复牌后补跌,它停牌期间的“不涨不跌”就会扭曲板块指数的连续性。更稳妥的做法是用前收盘价把停牌日补齐,或者明确标注样本变化区间。另外,概念板块的成分股是动态调整的,今天纳入、明天剔除的情况很常见,所以我在系统里每天都会保存一份板块成分快照,复盘历史数据时必须用对应日期的快照,而不是用今天的成分去回算三个月前的指数。

2.3 复权处理与数据对齐:复盘精度的大敌

如果直接用未复权的收盘价去算日收益率,除权除息当天价格会突然下一个台阶,K线图上出现一根莫名其妙的大阴线,板块指数也会被带偏。解决方法是先做前复权处理。前复权的基本逻辑是保留最新价格不变,把历史价格按除权因子统一折算,这样算出来的涨跌幅才真实。

在实际操作中,我优先使用数据源自带的前复权字段,实在没有的时候,才用除权除息信息自己构建因子。千万不要在未复权数据上直接做pct_change,然后安慰自己说“误差不大”。在联动分析里,板块指数和个股收益率要放在一起比较,复权口径不一致,算出来的相关系数全是噪声。

数据对齐同样重要。各个股票的交易日历应该是一致的,但停牌会导致某只股票在某些日期没有记录。板块指数计算前,我要先把所有成分股的数据外连接到一个统一的交易日索引上,缺失的收益率统一填0,或者用前收盘价补齐,不能简单dropna,否则指数序列会少一段,图上的曲线也接不上。

3. 联动分析模型:把“感觉”变成可以量化的数字

3.1 涨跌同步率:最直观的板块宽度指标

联动分析第一个要解决的问题是:板块指数涨了,是不是所有成分股都在涨?我管这个叫板块宽度,计算方法很简单,就是当日板块内上涨股票数量占总成分股数量的比例。板块指数涨2%,但如果宽度只有40%,意味着指数被少数权重股拉起来了,大多数股票其实在跌,这个“涨”就有点虚。

实际使用中,我通常看滚动宽度,也就是过去5个交易日宽度的平均值,或者看宽度趋势线。宽度持续上升、指数同步上行,是板块内部共振走强的表现;指数还在创新高、宽度却持续下行,就是典型的量价结构背离。这种背离信号,单靠看指数K线很难发现,但联动分析能把它直接暴露出来,这也是我觉得这套系统最值钱的地方。

我还会在复盘工作台上把宽度数据转换成颜色,宽度在80%以上标深色,50%到80%中间色,50%以下浅色。这样扫描板块的时候,视线会自然被高宽度的板块吸引过去。顺便说一句,宽度指标不要只看一天,单日数据受个股消息面影响很大,拉长到一周看,结构信号稳定很多。

3.2 相对强度与领涨股判定

联动分析的第二步,是看板块相对基准的强弱。相对强度RS的计算很简单,用板块指数区间涨跌幅除以大盘指数的区间涨跌幅,大于1说明板块跑赢市场,小于1说明跑输。实际操作中,我会用板块指数和大盘指数的比值曲线来看趋势,也就是RS线。RS线持续向上,说明资金在持续流入该板块,方向比单日数值更重要。

领涨股的判定又是一个关键点。我用的方法是计算每只成分股的“超额收益”,也就是个股收益率减去板块指数收益率,这个差值持续为正的个股,就可以视为板块内的主动领涨力量。再结合成交额放大率一起看,如果一个股票超额收益高、成交额也同步放大,那它大概率是资金的主攻方向。

这里有一个值得注意的点:领涨股是会变的。同一只股票不一定永远领涨,所以系统里我只保留最近5个交易日的领涨股名单,并且输出一个简单的连续上榜次数,次数越多说明它在板块内部的地位越稳定。用这个名单做复盘,可以更高效地找到板块的核心观察标的。

3.3 联动衰减信号:什么时候板块带不动个股了

联动分析最进阶的应用,是识别板块对个股的带动作用正在减弱。我构造了一个信号组合:板块指数30日滚动涨幅、板块宽度30日均线、板块指数和成分股收益率滚动相关系数的30日均值。当指数涨幅还在高位,但宽度和相关系数同时下滑,就说明板块内部开始分化,联动效应在衰减。

这种信号的实质,是资金从“做多整个板块”转向“只做龙头”,或者干脆撤退。它不会告诉你明天一定跌,但会提醒你不要再把板块内所有股票同等对待。历史回测里,很多板块见顶前都出现过宽度和联动性的连续背离。我用这个信号主要是为了复盘时增加一个思考维度,而不是作为交易切入点。

需要强调的是,我所有的联动指标都是相对概念,它们的作用是描述结构,不是预测方向。我在系统界面里也明确标注了“复盘研究数据,不构成投资建议”,这个边界一定要守住。

4. 可视化界面设计:让数据自己开口说话

4.1 主图设计:板块K线叠加个股异动

可视化是这个系统最有成就感的部分。我的主图思路是:上方画板块指数的K线,叠加一条基准指数的走势线;中间画板块宽度柱状图;下方画相对强度RS线。这三层信息共用一个时间轴,复盘时上下对照,很多结论一眼就能看出来。

例如板块指数收出长阳线时,我会下意识去看中间区域的宽度柱。如果宽度柱同步拉高,说明板块普涨,这个阳线质量高;如果宽度柱是萎缩的,说明是少数权重股拉动的指数,那复盘的重点就要转向这批权重股后续能否持续。主图不追求花哨,信息密度和对照关系才是核心。

我在绘制主图时用的是matplotlib,虽然性能不算强,但胜在灵活。每根K线、每个柱状图都能精确控制颜色和位置。如果你也打算做类似系统,不建议一开始就上Web大前端,先把静态图表做明白、把分析逻辑验证好,再考虑交互界面,效率会高很多。

4.2 联动热力图与板块雷达图

板块多了之后,逐个翻主图效率太低,所以我还做了两张总览图。第一张是联动热力图:横轴是日期,纵轴是各个板块,格子颜色表示当日的板块宽度或涨幅。这张图可以非常直观地看出,过去一段时间哪些板块持续共振、哪些板块已经分化。颜色从浅到深,一眼扫过去就能聚焦到结构健康的板块。

第二张是板块雷达图,用来给每个板块做画像。雷达图的五个轴分别是:5日涨幅、20日相对强度、5日平均宽度、成交额占比、领涨股连续上榜数。通过雷达图可以横向对比两个板块的强弱结构。比如A板块涨幅高但宽度低,B板块涨幅中等但宽度高,雷达图上一对比,资金质量和稳健程度就有直观呈现。

雷达图在这个场景里其实是一种信息压缩手段,它牺牲了精确数值,换来了多板块快速对比的效率。追求精确的时候,我会点击进入该板块的详情页,直接看数值和时序曲线。

4.3 复盘工作台布局:一屏完成当日复盘

系统最终沉淀为一个复盘工作台,整体是三栏布局。左栏是板块列表和雷达图,中栏是选中板块的主图,右栏是板块成分股的联动排名。联动排名按“超额收益、成交额放大率、连续上榜次数”综合排序,排名靠前的标出来,复盘时直接从这里切入。

这个布局是我反复调整后才定下来的。一开始我把所有图堆在一屏,发现信息过载,看半小时也形不成结论。后来改成“先看板块排行,再下钻到个股”的层级,复盘流程才顺畅起来。现在每天收盘后,我花大约15分钟就能完成全市场板块扫描和重点板块结构确认。

工作台还有一个我很看重的功能:一键导出复盘记录。每张图、每个板块的指标数据都支持导出CSV,我也会在系统里保存一份当天的复盘结论模板,格式很固定:“板块名称、指数涨幅、宽度、RS值、领涨股、联动状态、个人备注”。月底回头翻这些记录,比看任何复盘笔记都有价值,因为它是一手量化数据,不是印象流。

5. 实操流程:我用这套系统完成一次完整复盘

5.1 准备环境与读取TDX日线数据

先准备好最基本的Python环境,需要pandas、numpy、matplotlib这三个库就够用。数据方面,我从行情终端导出全市场日线数据和板块成分数据到本地目录,目录结构大概是这样的:

  • data/day/存放个股日线二进制文件
  • data/block/存放板块定义和成分股列表
  • output/存放系统生成的所有图表和CSV

读取日线文件的方法就是第2部分写的那个函数。读完之后,我会把所有股票数据统一转成DataFrame,索引是日期,列是股票代码,值统一用前复权收盘价。板块成分文件通常比较复杂,我的做法是解析之后保存为一个JSON快照,每天一个文件,这样后续回溯历史板块指数时,可以按日期找到当时真实的成分范围。

from pathlib import Path import pandas as pd day_dir = Path("data/day") frames = {} for f in day_dir.glob("*.day"): code = f.stem records = read_tdx_day_file(f) df = pd.DataFrame(records).set_index("date") frames[code] = df["close"] prices = pd.DataFrame(frames).sort_index()

上面这段代码把所有股票合并成了一个宽表,行是日期,列是股票代码。这是最方便的方式,但也会吃掉不少内存,全市场几千只股票几年日线大概会到几十万行乘几千列的量级,普通电脑要跑一阵。我实测下来,数据量太大时可以先做预聚合,只保留最近一年参与复盘活跃的股票,可以显著加快后续计算。

5.2 计算板块指数并生成联动指标

数据准备好之后,就是调用第2部分的指数计算函数,对每个板块按快照成分计算等权指数。我默认参数如下:

指标默认参数含义
板块宽度5日均值过滤单日噪声
相对强度RS20日区间反映中期强弱
滚动相关系数30日窗口观察联动稳定性
领涨股超额收益5日累计捕捉主动性个股

我选择这些参数的理由是:复盘关心的是中期趋势,不是日内噪音,5日、20日、30日分别对应短中期观察窗口。但这不是标准答案,你要是想做短线复盘,可以把窗口缩短;做长线分析,可以适当拉长。参数调整有一个原则:一次只调一个参数,并且记录下来,这样才能搞清楚哪个变量在影响结果。

生成联动指标后,我会运行一个排行榜输出,把当日板块涨幅榜、宽度榜、RS榜都列出来。这三个榜单交叉看,基本就能锁定当天的核心板块。比如涨幅榜第一宽度也高,那这个板块就是真普涨;如果宽度榜前列的板块涨幅并不大,说明资金在低位板块里做“温和吸筹”,这种行情背景下,追高就要谨慎。

5.3 可视化输出与复盘结论模板

所有图表生成后,我通常先看全市场热力图,再看重点板块主图,最后打开雷达图对比三五只候选板块。每天复盘结束前,我要求在系统里留下一段结构化结论,模板如下:

板块:半导体 指数涨幅:2.8% 宽度:78% RS:1.6 领涨股:A、B 联动状态:正常 备注:宽度健康,联动结构未衰减,跟踪龙头持续性

这段结论会连同图表一起存入复盘记录。月底回看时,我可以把所有历史结论拉出来对照实际走势,检验自己当时的复盘判断是否有效,再反过来修正指标参数。这个过程让复盘系统本身也在不断进化。

这段时间跑下来,最大的体会是:复盘系统的价值不在于图表多好看、指标多复杂,而在于它让我每天用同一套标准审视市场结构,所有判断都可回看、可对比。板块-个股联动分析给我带来的最大认知变化,是学会在个股异动时先问一句“它是板块共振还是独立行为”,这个问题本身,就值回搭建系统所花的时间。

6. 常见问题与排查技巧

6.1 数据不准:先查这五个地方

复盘系统报出的数据如果和行情软件对不上,十有八九不是软件问题,而是数据解析问题。我踩过太多坑,总结出一套排查顺序:第一看文件读取的字节序,有的数据源是Big-Endian,默认解析就会反;第二看价格小数位,不同品种可能不同;第三看板块成分快照日期,有没有用今天成分算历史指数;第四看停牌股票处理,缺失值填0还是用前收填充;第五看复权口径,前复权还是未复权。

这五处全部确认无误,数据基本就可靠了。不要嫌检查麻烦,数据层的错误会传导到所有指标上,而且会被图表的美化掩盖掉,看起来越漂亮的图,越要小心它背后的数据源有没有脏数据。我自己就出过一回糗:板块指数完美地上涨趋势,结果回头一查是老子没处理停牌股,指数序列里每个月都凭空多出一截不存在的涨幅。

6.2 联动指标“失灵”的三个原因

如果你发现联动指标的信号和市场实际对不上,大概率是三个原因。第一个是板块分类口径变了,成份股大换血导致指标突变,所以快照机制必须做到日级。第二个是极端行情下样本失真,大面积涨停或跌停时,宽度指标会失真到接近极值,相关系数也没太大意义,这种情况要把复盘重心放到成交额和换手率。第三个是成分股数量太少,一个只有5只股票的板块,宽度和相关系数天然波动剧烈,这时候看单日数值没有意义,得看趋势。

理解了这三个原因之后,就不会盲目迷信任何单一指标。我也是在实际使用中慢慢悟到:联动指标更适合做“体检”,而不是做“天气预报”。它能告诉你身体哪个部位可能有异常,但不会替你决定要不要吃药。

6.3 可视化性能与中文字体问题

最后再聊两个比较实际的小问题。第一个是性能,全市场数据做热力图时,如果逐日逐板块遍历计算,一次可能要跑几分钟。我的解决思路是在数据层做预聚合:板块指数、宽度、RS这些指标算好之后直接缓存到本地,每天收盘后只增量更新当天数据。这样打开系统几乎是秒开,不再需要重复全量计算。

第二个是中文字体问题,matplotlib默认字体显示中文会变成方框。需要在代码里显式设置中文字体,比如用系统里的宋体或黑体。另外要注意一下颜色习惯,国内行情软件通常红涨绿跌,如果参考国外资料很容易下意识用成绿涨红跌,复盘系统里务必统一用一个习惯,不然连续看几天很容易把自己搞晕。图表配色保持固定还有个好处,就是回头看历史复盘图时不会因为颜色不一致产生误读。

如果你准备动手搭一套自己的板块指数复盘系统,我的建议是从最小的闭环开始:先搞定单板块的指数计算和一张主图,跑到全市场,再加联动指标,最后做工作台。去网上随便找个现成的全功能大项目来改,远不如自己按需一步步搭建,因为复盘系统的核心不是展示,而是你真正用它去理解市场的结构变化。当你某天在图上看到指数新高与宽度背离同时出现,再去看板块内个股的分化表现,那种“用数据看懂联动”的体验,是单纯盯K线很难获得的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询