
做盘后复盘这件事我吃了很久的苦头。每天收盘后对着行情软件来回切板块、翻个股靠肉眼对比谁在领涨、谁在拖后腿再用Excel手工记流水账一套流程下来至少一个小时而且第二天还要重来。后来我干脆自己动手做了一套TDX板块指数复盘系统把板块指数、成分股行情、个股与板块的联动关系全部落到本地数据库再用ECharts搭成交互式复盘看板。这篇文章是这套系统从需求拆解、数据落地到可视化实现、联动分析落地的完整记录适合和我一样每天需要做板块轮动复盘的投资者、小团队投研人员也适合想入门金融数据可视化与板块-个股联动分析的开发者。1. 复盘系统的三个核心痛点为什么软件自带功能不够用1.1 内置板块指数只能“看”不能“算”行情软件里的板块指数虽然每天在更新但它本质上是个“黑盒”。我复盘时经常遇到的问题是想知道某个板块今天到底是被权重股拉的还是普涨推起来的想知道板块指数这波上涨里哪些个股贡献最大。这时候内置指数给不了答案因为它不暴露成分股权重也没有提供自定义计算的接口。历史回溯更麻烦。软件里板块指数的历史走势能看但我要做的是把“某一天板块内前十大贡献个股”这个快照记录下来作为日后复盘和回测的依据内置功能没法批量导出这类结构化数据。所以第一步就得把板块分类、成分股清单、每日行情数据全部拉到自己这边形成可控的数据底座。1.2 板块和个股的联动关系只能凭感觉短线复盘的灵魂是“板块-个股联动”龙头先动、板块跟随、后排补涨。但人的记忆是有限的今天觉得“地产动了”再过一周根本说不清是哪些票先启动的联动是真实的还是情绪脉冲。我可以量化它板块指数日内分时曲线和个股分时曲线叠加计算它们的相关系数再算个股对板块涨跌的贡献度持续跟踪谁是板块里的稳定核心。有了这些指标复盘从“我觉得”变成“数据显示”。1.3 手工流程不可复用很多人的复盘流程是打开软件截图然后粘贴到笔记工具里完了。这套流程最大的问题是不可检索、不可计算、不可回测。截图是像素不是数据。我想实现的是任何一天的板块涨幅排名、任意板块的成分股贡献排行、任何时间段的联动强度曲线都能按条件快速调出来。这只能靠沉淀结构化数据加一套查询与可视化界面来解决。于是系统的设计目标定了三件事第一把TDX终端的板块成分和行情数据定时落地到本地第二自己计算板块指数和联动指标不依赖软件黑盒第三用ECharts做一套可交互的可视化面板支撑日常盘后复盘。2. 数据底座设计板块成分与行情序列的本地化整理2.1 板块分类和成分股清单怎么获取TDX终端的板块体系主要分两类行业板块和概念板块。行业板块相对稳定概念板块变动频繁比如“AIGC”“低空经济”这类新概念随时会新增。我的处理方式是定期全量抓取板块列表再抓取每个板块的成分股清单存成带日期的快照表。表结构设计上我用两张表板块表 fields: 板块代码、板块名称、板块类型行业/概念、更新时间成分快照表 fields: 板块代码、股票代码、纳入日期、快照日期为什么强调“快照日期”因为板块成分会定期调整股票也会被调入调出。如果不留历史快照等成分改了之后再去回溯历史板块走势数据就对不上了。这是我踩过的一个很现实的坑后面在3.3节还会详细展开。2.2 行情数据落地与对齐行情数据我用的是日线和分钟线两层日线用于板块指数历史回算和联动强度的长期统计分钟线用于盘后分时叠加和日内联动分析。数据落地时字段标准化为股票代码、日期/时间戳、开高低收、成交量、成交额、复权因子列表。对齐是这里最容易出问题的地方。个股因为停牌、新上市、退市交易日序列天然不齐。我建了一张交易日历表然后所有个股行情都左连接到这个日历上。缺失的行视情况填0还是不参与计算要看指标定义——计算指数时停牌股不参与计算成交额占比时停牌股自然就是0。2.3 三个数据坑停牌、新股与成分调整先说停牌。板块指数如果直接按成分股平均涨跌幅计算停牌股复牌当天涨幅特别大的话会让指数虚高。我的做法是计算前把停牌个股剔除只对正常交易股票做聚合。判断停牌的标准是当日成交量或成交额为零配合行情数据里的状态标识。再说新股。新股上市初期波动巨大有些策略会把上市不足60个交易日的股票直接剔除出指数计算样本否则指数会被几天的剧烈波动污染。我这里也沿用了这个规则算是行业里做指数合成的常见做法。成分调整的问题最隐蔽。假设某只股票因为连续涨停被调入某概念板块如果直接用今日成分回算历史板块历史指数会被这只股票的过去走势污染。我的解法是计算历史指数时只使用“当时就在板块内且已上市满N天”的股票用成分快照表限定样本范围。经过这三层清洗数据底座才算是建结实了。3. 板块指数计算内核指数“话语权”必须在自己手里3.1 等权指数与流通市值加权复盘场景选哪种市面上的指数很多是市值加权比如用流通市值做权重盘子大的股票对指数影响大。这种方式在表征“大盘走势”时合理但在复盘“板块情绪”时有个明显问题板块里的巨无霸一旦涨1%可能比十只小票涨停对指数的影响还大板块的真实赚钱效应被掩盖。我做复盘更看重板块内整体赚钱效应所以默认采用等权指数每个成分股对指数的贡献相同指数涨跌反映的是板块内股票的平均表现。具体算法上我用的还是相对稳健的连乘模式先算当日所有参与计算的成分股的平均涨跌幅再把指数点位乘上1 平均涨跌幅。相比直接累加涨跌幅连乘模式在长期序列上更接近真实收益率不会因算术累加产生漂移。同时我把流通市值加权指数也保留了下来用于对比。复盘时我会同时看两张图等权指数反映情绪加权指数反映资金真实流向。两个指数拉开差距的时候往往意味着板块内权重股与中小票走势背离。3.2 前复权、后复权对历史连续性的影响没有复权的数据算不了历史指数。分红送转会让价格出现断崖式跳空如果不复权收益率序列是错的。我的处理原则计算历史收益率序列时统一使用后复权价格因为后复权不改变历史数据形态过去是涨就是涨不会因为最新股价变化而篡改历史。展示时再切换到前复权方便和行情软件里的图形对照。具体的复权因子我是从行情数据的每日复权因子表里读取的然后对原始日线价格做乘法换算。在没有专业级数据库的情况下前复权价格由于会把历史价格负数化极端情况所以要给K线展示模块设置一个最小展示阈值避免复权后价格为负导致图表异常。3.3 指数计算实现骨架板块指数的计算我用Python加Pandas实现核心逻辑是import pandas as pd def calc_industry_index(day, snapshot, price_table, ruleequal_weight): # snapshot: 当日板块成分快照包含股票代码列表 # price_table: 当日所有个股的日行情数据已经复权、去停牌、去新股 df price_table[price_table[stock_code].isin(snapshot[stock_code])].copy() # 等权所有股票收益率求平均 if rule equal_weight: daily_return df[pct_chg].mean() # 流通市值加权按昨日流通市值比例加权 else: total_mv df[float_mv].sum() df[weight] df[float_mv] / total_mv daily_return (df[pct_chg] * df[weight]).sum() # 指数点位前一交易日点位 * (1 daily_return) prev_close index_series.loc[day - 1] index_series.loc[day] prev_close * (1 daily_return)这个骨架清晰展示了指数计算的必要参数快照、复权价格、停牌标记、市值数据。把数据喂进来指数就能从零开始自己跑了。4. ECharts可视化把表格变成复盘作战地图4.1 三层可视化设计全局热度、板块K线、轮动时序数据计算完成之后最大的挑战是怎么呈现。一张表格列出100多个板块的涨跌幅人是看不完的。我参考了企业级数据可视化项目里常用的分层思路把面板拆成三层。全局层是板块热度热力图。横轴是行业/概念分组纵轴是具体板块格子颜色映射当日涨跌幅红涨绿跌。这样打开面板的第一眼就能扫出今天资金集中在哪些方向。ECharts的heatmap在这个场景表现非常稳定颜色渐变加上视觉缩放组件百来个板块都能一屏放下。板块层是K线图。点击热力图中任意板块主区域切换成该板块指数的日K线叠加成交量和均线。ECharts的candlestick组件做K线很顺手配合dataZoom实现历史区间缩放。时序层是轮动视图。我想看清“这波行情里板块的顺序”于是画了一张散点加折线的轮动图横轴是日期纵轴是板块排名每一条线是一个板块线往上走说明排名上升。ECharts的graphic和自定义series可以帮助实现这类图表复盘时能直观看到资金从一个板块切到另一个板块的节奏。4.2 关键交互设计时间轴联动和数据钻取光有图表还不够交互才是复盘效率的关键。我的设计是底部一条全局时间轴拖动时间范围时热度图、K线、轮动图、联动分析面板全部同步刷新。ECharts的connect功能可以把多个图表实例绑定在一起实现dispatchAction联动这个在企业级可视化大屏项目里是标配效果也确实稳定。数据钻取指的是从热力图点击板块进入板块详情后再次点击板块内某只个股右侧弹出该股的K线和分时以及它与板块指数的联动指标。这样复盘路径变成资金在哪 → 什么板块在涨 → 谁在领涨从宏观到微观一条线捋下去十几秒就能把一天的市场结构过一遍。4.3 图表性能优化数据量大的时候怎么做取舍复盘系统跑久了板块指数历史K线是几千根分时叠加图可能是几百只股票叠加在一个坐标系里。ECharts在数据点上万时渲染会明显变慢这时候需要做优化。第一招是采样。折线和面积图开启sampling属性用lttb算法在保持趋势特征的前提下减少绘制点肉眼几乎无差别。第二招是懒加载K线组件里的dataZoom拖到哪个区间ECharts只请求对应区间的数据接口避免一次性把全部数据塞进前端。第三招是把不参与当前联动的个股分时线默认隐藏在legend里按需勾选显示不然几百条线叠在一起画面乱到没法看。5. 板块-个股联动分析把“龙头带飞”变成可量化指标5.1 贡献度拆解找出谁在拉指数、谁在拖后腿板块指数涨了1%但这是普涨还是个别股票拉的贡献度拆解可以回答这个问题。计算公式很简单板块指数贡献度 个股涨跌幅 × 个股在指数中的权重比如等权指数里有30只成分股某只股票涨9%它对指数的贡献就是 9% × (1/30) 0.3%。把每天所有成分股的贡献度排序就能得到一张“今日板块涨跌归因榜”。我把这个榜做成了柱状图正向贡献绿色柱子从上往下排负向贡献红色柱子从下往上排一眼就能看出谁在拖累板块。复盘时这个图我几乎每天都看因为很多板块表面上在涨实际全靠一两只股票撑着这种板块的持续性要打个问号。5.2 个股与板块的分时叠加对比联动分析另一块重要内容是个股分时与板块指数分时的叠加。行情软件里只能看个股分时但看不出它和板块的步调是否一致。我把板块指数分钟线按等权方式从成分股分钟线聚合出来然后画到同一张图里再叠加个股分时线归一化到同一坐标原点。这里有个细节集合竞价阶段和午后开盘的瞬间个股和板块的数据时间戳要对齐我统一把分钟线按自然时间戳左连接缺失值做了填充否则画出来会错位。有了叠加图之后个股是“先于板块启动”还是“跟随板块被动上涨”就很清楚了。配合我在2.2里落地的分钟线数据这类日内分析可以做到每一分钟都可回溯。5.3 联动强度评分识别真联动还是伪联动最后一步是量化联动强度。我选了三个维度滚动相关系数个股分时与板块分时最近60分钟的皮尔逊相关系数值越高说明联动越紧Beta强度个股对板块指数的回归斜率体现的是个股对板块涨跌的敏感程度领涨滞后性个股日内峰值时间与板块日内峰值时间的时间差领先者更可能是龙头。把三个指标归一化后加权成一个0到100的联动分低于60分说明这只票今天基本不跟板块走。这个分数会随每日数据写入库中我就可以在复盘时快速筛选“今天板块里联动性最强的票”也可以按历史日期回看某些强势股启动初期的联动分变化轨迹。联动分的应用场景特别实用复盘不再需要把板块内每一只股票都翻一遍排序列表直接就能抓到核心标的然后针对性地去看焦点个股的K线位置和分时形态效率提升非常明显。整个系统从数据清洗、指数计算到可视化呈现、联动归因已经跑了大半年。我最大的体会是复盘工具的价值不在于界面多炫而在于把那些原本存在脑子里的模糊印象变成可以回溯、可以计算、可以对比的结构化数据。你不需要一开始就把所有功能做全先把今天的板块贡献度榜单拉出来再逐步加上轮动视图和联动分一个能陪你长期迭代的复盘系统就会慢慢成型。最后提醒一句历史成分快照和数据质量是这套系统的命根子宁可每天多跑一遍数据校验也不要在脏数据上盖楼。