资讯动态

基于TDX数据构建板块指数复盘系统:联动分析与可视化实践

发布时间:2026/10/3 9:33:06 来源:尧图企业网站定制
做复盘的人最怕的不是找不到数据而是数据到处都是却对不上。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, weightsNone): daily_prices: 行索引为日期列名为个股代码值为收盘价 weights: 可选传入市值权重None则等权 returns daily_prices.pct_change().fillna(0) if weights is None: sector_returns returns.mean(axis1) else: sector_returns (returns * weights).sum(axis1) 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% RS1.6 领涨股A、B 联动状态正常 备注宽度健康联动结构未衰减跟踪龙头持续性这段结论会连同图表一起存入复盘记录。月底回看时我可以把所有历史结论拉出来对照实际走势检验自己当时的复盘判断是否有效再反过来修正指标参数。这个过程让复盘系统本身也在不断进化。这段时间跑下来最大的体会是复盘系统的价值不在于图表多好看、指标多复杂而在于它让我每天用同一套标准审视市场结构所有判断都可回看、可对比。板块-个股联动分析给我带来的最大认知变化是学会在个股异动时先问一句“它是板块共振还是独立行为”这个问题本身就值回搭建系统所花的时间。6. 常见问题与排查技巧6.1 数据不准先查这五个地方复盘系统报出的数据如果和行情软件对不上十有八九不是软件问题而是数据解析问题。我踩过太多坑总结出一套排查顺序第一看文件读取的字节序有的数据源是Big-Endian默认解析就会反第二看价格小数位不同品种可能不同第三看板块成分快照日期有没有用今天成分算历史指数第四看停牌股票处理缺失值填0还是用前收填充第五看复权口径前复权还是未复权。这五处全部确认无误数据基本就可靠了。不要嫌检查麻烦数据层的错误会传导到所有指标上而且会被图表的美化掩盖掉看起来越漂亮的图越要小心它背后的数据源有没有脏数据。我自己就出过一回糗板块指数完美地上涨趋势结果回头一查是老子没处理停牌股指数序列里每个月都凭空多出一截不存在的涨幅。6.2 联动指标“失灵”的三个原因如果你发现联动指标的信号和市场实际对不上大概率是三个原因。第一个是板块分类口径变了成份股大换血导致指标突变所以快照机制必须做到日级。第二个是极端行情下样本失真大面积涨停或跌停时宽度指标会失真到接近极值相关系数也没太大意义这种情况要把复盘重心放到成交额和换手率。第三个是成分股数量太少一个只有5只股票的板块宽度和相关系数天然波动剧烈这时候看单日数值没有意义得看趋势。理解了这三个原因之后就不会盲目迷信任何单一指标。我也是在实际使用中慢慢悟到联动指标更适合做“体检”而不是做“天气预报”。它能告诉你身体哪个部位可能有异常但不会替你决定要不要吃药。6.3 可视化性能与中文字体问题最后再聊两个比较实际的小问题。第一个是性能全市场数据做热力图时如果逐日逐板块遍历计算一次可能要跑几分钟。我的解决思路是在数据层做预聚合板块指数、宽度、RS这些指标算好之后直接缓存到本地每天收盘后只增量更新当天数据。这样打开系统几乎是秒开不再需要重复全量计算。第二个是中文字体问题matplotlib默认字体显示中文会变成方框。需要在代码里显式设置中文字体比如用系统里的宋体或黑体。另外要注意一下颜色习惯国内行情软件通常红涨绿跌如果参考国外资料很容易下意识用成绿涨红跌复盘系统里务必统一用一个习惯不然连续看几天很容易把自己搞晕。图表配色保持固定还有个好处就是回头看历史复盘图时不会因为颜色不一致产生误读。如果你准备动手搭一套自己的板块指数复盘系统我的建议是从最小的闭环开始先搞定单板块的指数计算和一张主图跑到全市场再加联动指标最后做工作台。去网上随便找个现成的全功能大项目来改远不如自己按需一步步搭建因为复盘系统的核心不是展示而是你真正用它去理解市场的结构变化。当你某天在图上看到指数新高与宽度背离同时出现再去看板块内个股的分化表现那种“用数据看懂联动”的体验是单纯盯K线很难获得的。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑