
股票直播内容里经常出现市场温度、泡沫、估值高低这类说法。对做数据分析和工程实现的开发者来说真正有价值的问题不是“温度到底是多少度”而是“温度是怎么算出来的、需要哪些数据、怎么验证它是否合理、人在计算时会在哪里出错”。这篇文章围绕 A 股和港股市场温度的计算链路展开重点讲量化指标构建、数据清洗、分位数计算、温度合成和可视化核心产出是一套可以放在本地跑通的最小实现。文章定位是工程方法研究不是行情预测。所有指标只用于描述历史统计状态不构成任何投资建议。读者可以是量化分析入门者、数据开发工程师也可以是想把直播里听到的模糊概念落地成代码的技术人员。读完这篇文章你会掌握一套从公开行情数据到市场温度展示的完整流程并且知道每一步为什么这么做、哪里容易出错、生产环境还需要补什么。1. 市场温度是什么以及为什么需要一套可计算的指标体系“市场温度”不是交易所发布的官方指标也不是某个行情软件里的固定字段。它是把一组市场统计信息加工成一个直观数值的复合指标。之所以直播、研报和财经内容里都喜欢用温度这个词是因为它能把复杂的估值状态、交易热度、涨跌分布压缩成“冷”或“热”的感知普通人容易理解。但从工程角度看温度必须能复算才值得被当作一个指标体系来建设。1.1 把模糊概念拆成可以计算的子指标温度本身是一个合成概念。合成之前要先把它拆成可量化的子指标。最常见的几类子指标如下。子指标计算基础表达含义数据频率市盈率 PE 及历史分位市值 / 净利润当前估值相对历史的位置日频市净率 PB 及历史分位市值 / 净资产净资产定价的相对位置日频股债利差指数盈利收益率 - 10年国债收益率股票相对债券的性价比日频成交量温度当前成交量 / 近 N 日均量资金参与热度日频或分钟级上涨下跌家数比上涨家数 / 下跌家数市场广度日频换手率分位成交额 / 流通市值筹码交换活跃度日频这些子指标各有偏向。市盈率对盈利波动敏感的行业会失真股债利差反映的是大类资产比价成交量温度和换手率更像情绪指标。单看任何一个都有局限所以温度通常是把多个子指标归一化后再加权。工程实现上第一步不是急着写加权公式而是先把每个子指标的原始数据、计算口径、时间区间定义清楚。同一个“市盈率”用静态市盈率还是滚动市盈率结果差异可能很大。同一个“成交量”用成交股数还是成交金额也要明确。定口径这事越早做后面对账和排错越省力。1.2 为什么用“历史分位”而不是直接用 PE 数值直接对比 PE 数值会有一个问题不同市场、不同行业的 PE 中枢差别很大。银行股长期 PE 在 5 到 8 倍科技股可能长期在 30 倍以上直接拿绝对值横向对比没有意义。历史分位解决的是“当前值在过去一段时间里排第几”的问题。它的计算方式是把过去 N 个交易日的 PE 序列排序然后看当前 PE 大于历史上多少比例的数据点。比如过去五年共约 1200 个交易日当前 PE 高于其中 960 个那么分位数大约是 80%。这表示当前估值在过去五年里处于偏高水平。用分位数也有代价。它依赖时间窗口窗口选 3 年、5 年还是 10 年结果会不同。市场结构发生变化后历史区间太长老样本反而会干扰判断。所以正式实现时不能只写一个分位函数还要记录窗口参数、数据起止日期、指标版本号这样后续出图或复盘时才能追溯。1.3 温度合成的核心逻辑归一化与加权子指标之间量纲不同。PE 是倍数股债利差是百分比上涨家数比是比例必须统一到同一尺度才能相加。最常用的归一化有两种。一种是 min-max 归一化。normalized (value - min_value) / (max_value - min_value)另一种是把子指标先转成历史分位再用分位数值参与加权。后者更常用因为分位天然在 0 到 1 之间对异常值不如 min-max 敏感。合成温度的基本公式如下。CompositeTemp w1 * percentile(PE) w2 * percentile(PB) w3 * normalized(EquityBondSpread) w4 * normalized(VolumeHeat)权重 w1 到 w4 之和为 1具体取值属于参数配置不是数学推导出来的。不同策略团队对权重的偏好不同做工程系统时应该把权重做成配置文件而不是写死在代码里。温度是一个统计描述指标不是一个能预测涨跌的公式。同样的温度出现在不同宏观环境下后续走势可能完全不同。这一点在使用和向别人解释时要格外注意。2. 数据获取与清洗市场温度的地基在数据质量上指标算得再漂亮数据错了结果就没有意义。市场温度计算涉及两类数据一类是指数行情和成分股财务数据另一类是宏观利率数据。公开渠道能拿到日线数据但财务数据披露频率低计算时需要处理财报更新滞后的情况。2.1 数据源选型与接口风险常见公开数据源包括金融数据终端、交易所官网、财经网站接口和开源数据包。工程上选择数据源要重点考虑四个问题数据是否可回溯、字段是否齐全、接口是否有频率限制、是否有稳定的官方发布渠道。数据需求推荐来源类型注意事项指数日线行情交易所官网、数据终端注意除权除息调整成分股权重指数公司发布文件权重调整有公告日期A 股个股财务数据财报公告、数据终端注意报告期与发布日期港股个股行情港交所披露、数据终端港股没有涨跌停但流动性差异大10 年期国债收益率官方金融数据发布平台利率数据本身是日频使用任何公开接口前都要先看对方服务条款和更新频率不要在生产环境里依赖个人维护的临时接口。历史回溯测试时尤其要注意接口提供的“当前数据”和“历史某日应该看到的数据”不是一回事后者需要快照数据才能还原。2.2 A 股和港股数据的处理差异A 股和港股在数据结构上有很多差异直接套用同一套清洗逻辑会出错。A 股有涨跌停板停牌股票需要剔除或单独标记。港股没有涨跌停但存在大量低流动性股票单日成交额可能只有几万港元计算指数换手率时这些股票会产生极端值。A 股市值分为总市值和流通市值指数加权方式不同计算 PE 时要和指数编制规则对齐。港股还存在同股不同权、部分公司财报币种非港币等情况折算汇率要统一。维度A 股港股交易时间上午下午分别连续竞价早市、午市、收市竞价涨跌限制有涨跌停无涨跌停汇率影响人民币计价港元计价部分公司报表币种为人民币财报披露按季度披露部分公司按半年度披露流动性差异相对均衡差异极大在聚合到市场层面计算温度时建议先做一次流动性过滤把日成交额长期过低的股票排除出样本避免少数仙股价格波动影响整体统计。2.3 清洗规则从拿到数据到可以计算很多初学者拿到行情数据后直接计算 PE忽略了脏数据问题。下面是一套最小清洗流程。import pandas as pd def clean_market_data(df): # 1. 统一日期时间格式 df[trade_date] pd.to_datetime(df[trade_date]) # 2. 剔除停牌和无成交记录 df df[df[volume] 0].copy() # 3. 剔除明显异常值 df df[df[close] 0].copy() df df[df[market_cap] 0].copy() # 4. 财务数据使用报告期对齐而不是使用当前最新值 df df.sort_values([stock_code, trade_date]).reset_index(dropTrue) # 5. 标记缺失财务数据的记录 df[has_financial_data] df[net_profit_ttm].notna() return df这段代码只是基础框架。实际项目中还要处理复权因子、汇率日期、财报发布日对齐等问题。清洗的目的是让后面的聚合计算不因为个别脏数据整体失真。关于前复权和后复权计算指数行情时通常直接用指数点位指数本身已经处理过成分股分红。计算个股估值时如果用价格乘以股本算市值不需要做复权处理因为市值应该反映当前真实价格。如果要用历史价格算收益率则必须考虑复权否则分红会导致收益率被低估。2.4 财务数据滞后问题计算 PE 时分子是市值分母是净利润。净利润来自财报财报不是实时更新的。A 股年报披露截止时间是次年 4 月底三季报披露结束是 10 月底。如果使用“最新报告期净利润”在 1 月份到 4 月份之间最新报告期其实是三季报并不包含年报数据。滚动市盈率 TTM 的做法是使用最近四个季度净利润之和这能缓解季节性因素。工程实现上需要一张财报公告日期表确保某一天的 PE 使用的是“当时市场上已经公开的财报数据”而不是现在才能看到的最终调整数据。这样历史回溯时才不会出现未来函数。3. 核心指标计算从行情数据到与温度相关的统计量清洗完成之后进入指标计算阶段。这一阶段的产出是每个子指标的历史序列以及对应的历史分位。3.1 市盈率与市净率的计算口径计算 PE 最常用的口径是 TTM即 Trailing Twelve Months。PE_TTM 总市值 / 最近四个季度净利润之和在 Python 中如果已经在股票基础数据表里维护了净利润字段可以按下述思路聚合。def calc_pe_ttm(market_cap_series, net_profit_ttm_series): pe_ttm market_cap_series / net_profit_ttm_series # 净利润为负时PE 无意义或为负数需要特殊处理 pe_ttm pe_ttm.where(net_profit_ttm_series 0) return pe_ttm这里要特别说明负值处理。净利润为负的公司PE 为负数在估值分位统计里没有直接含义。处理办法通常有两种一种是把负 PE 样本剔除后再统计市场估值中位数另一种是使用 PB 代替 PE。构建指数层面估值时建议同时计算正 PE 公司市值占比避免少数亏损公司干扰。PB 的计算相对简单分子是总市值分母是归母净资产。净资产为负的公司同样需要剔除。3.2 历史分位数计算的边界处理分位数计算看起来就是一行pd.Series.quantile但边界条件很多。第一样本数量过少时分位不稳定。比如只用最近 20 个交易日计算 PE 分位任何一天出现极端行情都会让分位大幅跳动。窗口建议至少取 1 年以上常见配置是 3 年或 5 年。第二数据中有缺失值直接调用 quantile 会忽略 NaN但如果你没有提前去掉 NaN得到的可能不是你想要的排序结果。第三分位计算时要明确“当前值包含在历史样本中”还是“当前值不包含在历史样本中”。统计意义上建议使用“当前值参与排序”这样结果更直观当前值在过去 N 日里高于多少比例。def calc_percentile(series, current_value): valid series.dropna() if len(valid) 2: return None # 计算当前值在历史序列中的分位 percentile (valid current_value).mean() return percentile这里的逻辑是把当前值与历史每一天比较计算小于等于当前值的天数占比。这样得到的值天然在 0 到 1 之间不需要额外归一化。3.3 股债利差与成交量温度股债利差也叫股权风险溢价一种常见计算方式是EquityBondSpread 指数盈利收益率 - 10年期国债收益率 其中指数盈利收益率 1 / PE_TTM股债利差越高表示股票相对债券的性价比越高通常对应市场情绪偏冷。但这句话属于统计经验描述不是保证。计算时要注意 PE 的口径要与指数一致国债收益率要用相同日期的数据不能混用不同日期。成交量温度常用“量比”概念。VolumeRatio 当日成交额 / 过去 N 日平均成交额量比大于 1 表示放量小于 1 表示缩量。在 A 股和港股都适用但 N 的选择要注意A 股有长假效应春节、国庆前后成交额会明显下降如果窗口太小节后第一天量比会非常夸张。简单做法是取过去 20 个交易日平均并剔除当前周的前后异常窗口。3.4 上涨家数比和市场广度市场广度是一个经常被低估的指标。指数点位可能被少数权重股拉动但上涨家数与下跌家数的比值能反映市场参与面是扩散还是收缩。AdvanceDeclineRatio 上涨股票数量 / 下跌股票数量在计算 A 股全市场广度时要用全部 A 股而不是只看指数成分股。港股则要对股票池做流动性过滤避免仙股集中涨停跌停式波动扭曲数据。广度指标的标准做法是绘制涨跌家数差值的累计曲线用来观察趋势。但在温度系统里直接使用当日 ADR 的历史分位更简洁。4. 温度合成与可视化把多个分位变成一张可读的图子指标都算完后进入合成层。这一层负责三件事权重配置、温度映射、可视化展示。4.1 权重配置与合成公式权重可以直接写在配置文件中不要写死在代码里。{ indicator_weights: { pe_percentile: 0.3, pb_percentile: 0.2, equity_bond_spread: 0.2, volume_ratio: 0.15, advance_decline_ratio: 0.15 }, history_window: 750, temperature_scale: 0-100 }这里取 750 个交易日大约是 3 年窗口。权重配置的意义在于当数据源变化或策略团队调整指标偏好时不需要改代码只要改配置并重新生成一次历史序列即可。合成时要注意不同子指标的方向可能不一致。PE 分位越高通常表示估值越热股债利差越高通常表示性价比越高也就是温度越低。因此股债利差在参与合成前要做方向反转。reverse_spread 1 - normalized_spread如果不做反转最终温度的含义会出现混乱。这是实现时最容易出错的地方建议在代码里把每个子指标的方向单独配置。4.2 温度映射函数为什么是 0 到 100把合成结果映射到 0 到 100不只是为了好看。0 到 100 的尺度让不同市场之间、不同历史时期之间的温度可以在同一张图上对比也方便设置经验阈值。温度区间命名只会影响描述不影响计算。具体区间划分建议做成配置。温度区间描述习惯说明0 - 20低温区统计指标处于历史低位20 - 40偏冷区统计指标低于历史中枢40 - 60中性区统计指标接近历史中枢60 - 80偏热区统计指标高于历史中枢80 - 100高温区统计指标处于历史高位温度区间和“适不适合买入卖出”是两件事。高温不代表马上下跌低温不代表马上上涨。只作为历史统计状态参考。4.3 用热力图和曲线展示历史温度可视化在工程系统里承担两个作用一是把计算结果快速呈现给使用者二是帮助开发者发现数据异常。比如某天温度从 50 突然跳到 85如果不是因为真实行情变化而是因为分母净利润数据更新导致 PE 跳变在曲线上会非常明显。import matplotlib.pyplot as plt def plot_temperature(df, titleMarket Temperature): fig, ax plt.subplots(figsize(12, 5)) ax.plot(df[trade_date], df[temperature], color#2E86AB, linewidth1.2) ax.axhline(80, color#C0392B, linestyle--, linewidth0.8) ax.axhline(20, color#2ECC71, linestyle--, linewidth0.8) ax.set_title(title) ax.set_ylabel(Temperature (0-100)) plt.xticks(rotation45) plt.tight_layout() return fig除了曲线图用最近 12 个月温度构造热力图也很直观。可以按“年-月”为行温度数值为颜色深浅。实现时可以参考imshow或pcolormesh然后通过色带映射展示。4.4 用雷达图对比多市场温度A 股、港股、美股或其他市场也可以放在同一坐标系下对比但要注意不同市场的估值中枢差异。对比时建议对比分位而不是对比 PE 绝对值。import numpy as np import matplotlib.pyplot as plt def plot_radar(labels, values, titleMulti-Market Temperature): angles np.linspace(0, 2 * np.pi, len(labels), endpointFalse).tolist() values values[:1] angles angles[:1] fig, ax plt.subplots(figsize(8, 8), subplot_kw{polar: True}) ax.plot(angles, values, linewidth1.2) ax.fill(angles, values, alpha0.15) ax.set_xticks(angles[:-1]) ax.set_xticklabels(labels) ax.set_ylim(0, 100) ax.set_title(title) return fig雷达图适合展示多个市场的温度结构但要控制指标数量超过 6 个市场后图例和标签会变得拥挤可读性下降。5. 最小可运行实现从数据到温度展示的完整链路下面用一个最小示例串联前面所有步骤。示例会从本地 CSV 文件读取伪造或导出的数据因此你可以先用少量数据跑通流程再替换成真实数据源。5.1 项目结构market_temperature/ ├── config/ │ └── temperature_config.json ├── data/ │ ├── index_daily.csv │ └── bond_yield.csv ├── src/ │ ├── data_loader.py │ ├── indicators.py │ ├── temperature.py │ └── visualize.py ├── output/ │ └── temperature_history.csv └── main.py这个结构适合学习和个人研究。生产环境建议增加数据库、任务调度和日志模块。5.2 数据加载假设index_daily.csv包含以下字段trade_date, index_code, close, pe_ttm, volume_amount。import pandas as pd def load_index_data(path): df pd.read_csv(path, parse_dates[trade_date]) df df.sort_values(trade_date).reset_index(dropTrue) return df def load_bond_yield(path): df pd.read_csv(path, parse_dates[trade_date]) df df.sort_values(trade_date).reset_index(dropTrue) return df字段名称直接影响后续代码建议入场前先做字段映射统一成内部命名规范例如close_price、pe_ttm、turnover_amount。5.3 指标计算import pandas as pd def calc_pe_percentile(df, window750): df df.copy() df[pe_rank] df[pe_ttm].rolling(window).apply( lambda x: (x.iloc[-1] x).mean() if x.notna().sum() window else None ) return df这个写法依赖rolling.apply性能不算最优但逻辑清晰。处理百万级数据时可以用rank结合窗口方式优化。示例里保留可读性优先的写法。5.4 温度合成import json def load_config(pathconfig/temperature_config.json): with open(path, r, encodingutf-8) as f: return json.load(f) def compose_temperature(df, config): weights config[indicator_weights] df df.copy() df[temperature] ( weights[pe_percentile] * df[pe_rank] weights[volume_ratio] * df[volume_ratio_norm] # 其他指标按相同方式加入 ) df[temperature] (df[temperature] * 100).clip(0, 100) return df这里只写了两项指标的合成实际项目要按配置把每个子指标加入。注意将所有子指标都归一化到 0 到 1 之后加权和再乘 100 才落在 0 到 100 范围内。5.5 主流程from src.data_loader import load_index_data, load_bond_yield from src.indicators import calc_pe_percentile from src.temperature import load_config, compose_temperature from src.visualize import plot_temperature def main(): config load_config() index_df load_index_data(data/index_daily.csv) bond_df load_bond_yield(data/bond_yield.csv) # 合并指数和债券数据 df index_df.merge(bond_df, ontrade_date, howleft) # 计算指标 df calc_pe_percentile(df, windowconfig[history_window]) # 合成温度 df compose_temperature(df, config) # 保存结果 df.to_csv(output/temperature_history.csv, indexFalse) # 展示 fig plot_temperature(df) fig.savefig(output/temperature_history.png) print(Temperature history generated.) if __name__ __main__: main()这个最小闭环可以直接运行但要注意 CSV 文件不是真实行情数据源。把 CSV 替换成数据库或接口后主流程结构不用大改。5.6 运行和验证运行后需要看三样东西。第一temperature_history.csv中温度字段是否都在 0 到 100 之间。第二可视化图中的虚线阈值是否正常显示。第三选取一个已知样本点人工核对 PE 分位计算是否合理。python main.py如果是首次跑输出文件生成成功但没有任何校验说明程序只是“跑通”了不代表计算正确。建议在代码里加一个 assert 检查。assert df[temperature].between(0, 100).all(), Temperature out of range6. 常见问题与排查链路市场温度系统的报错通常不在语法层面而在数据语义层面。下面列出几个高频问题每个都按“现象、可能原因、检查方式、解决办法”展开。6.1 温度长期在极端区间不变现象温度曲线长时间停在 90 以上或 10 以下无论行情怎么变化都没有反应。可能原因分位计算窗口太小每次样本更新后当前值一直处于最高位或者 min-max 归一化时最大值和最小值来自不稳定样本导致数据被固定到边界。检查方式输出每天的pe_rank原始值看它是缓慢变化还是长期为 1。如果是长期为 1说明当前 PE 一直高于历史窗口内所有数据分位对高位变化不敏感。解决办法扩大历史窗口或对极端值做缩尾处理。不要直接改温度区间那样会让图表失真。6.2 某个交易日温度出现断崖式跳变现象温度从前一天 55 跳到第二天 82但当天指数涨跌幅很小没有任何消息面变化。可能原因财报数据更新PE 分母改变PE 序列出现跳变或者债券收益率数据某一天缺失合并后出现缺失值填充逻辑错误。检查方式对比 PE 序列和债券利率序列在跳变日期前后查看原始数据是否有新财报披露。A 股财报季尤其容易出现这种情况。解决办法对财务数据增加“公告日期”字段使用公告日期而不是报告期做时间对齐对债券利率缺失值不要直接前向填充要先确认缺失原因。6.3 港股市场温度与 A 股明显不同步现象同一套代码跑 A 股和港股温度结果经常方向相反或者港股温度长期偏高。可能原因两个市场的股票池、流动性特征、估值中枢不同直接用同一组阈值和权重不科学港股大量低流动性股票会把成交量指标拉向极端。检查方式单独输出港股各子指标的分位图看是 PE 分位异常还是成交量指标异常。检查股票池是否包含了流动性很低的股票。解决办法按市场分别配置权重和阈值对港股股票池做流动性过滤不要追求“两个市场用同一套参数”这种表面统一。6.4 计算结果和财经软件对不上现象自己算出的 A 股整体 PE 与财经软件显示的 PE 不同。可能原因软件用的是静态 PE你用的是滚动 TTM PE软件用整体法计算你用的是中位数法软件的股票池范围与你不一致比如是否包含科创板、北交所股票。检查方式先确认口径。再确认股票池。最后确认数据源。解决办法记录并公开口径。工程系统里要把口径常量写入配置并保存指标版本。这样以后复查时能知道当时为什么结果会和某个软件不同。问题现象常见原因检查方式处理建议温度长期不变化分位窗口太小或归一化边界异常输出原始分位序列扩大窗口或缩尾处理温度断崖跳变财报更新或缺失值填充错误检查 PE 序列和公告日期用公告日期对齐港股和 A 股不同步股票池和参数未按市场配置分别输出子指标分位图分市场配置参数和财经软件不一致口径、股票池、算法不同确认 PE 计算口径记录指标版本和口径7. 生产环境需要注意的事项从本地最小实现到生产服务中间还隔着数据调度、存储、监控、权限和异常恢复。这些内容在任何指标系统里都通用但市场温度系统有几个特殊点。7.1 数据调度必须考虑交易日历股票市场不是每天都交易。A 股和港股的节假日不同跨市场数据合并时必须使用交易日历表对齐日期不能简单用自然日。只用工作日填充会出现一个坑A 股国庆长假期间港股可能还在交易。如果两个市场数据按工作日对齐A 股假期那几天会出现大量空值。推荐做法是维护一张交易日历表包含日期、市场、是否交易三个字段然后按市场分别关联。7.2 指标版本管理温度指标会因为权重改版、数据源更换、财报数据修正而改变。每次变更都应该落一个版本号并把计算配置一起保存。temperature_20250101_v1.2.csv temperature_20250101_v1.3.csv这样出图后如果发现历史曲线与之前不同可以定位是配置变化还是数据变化。没有版本管理的指标系统复盘时很难说清楚某一张图用的什么参数。7.3 权限与发布流程市场温度系统即使只是内部研究工具也要遵循数据发布流程。结果对外展示前要有数据核对人和口径变更记录。避免因为一次权重调整让图表使用者误以为市场状态发生了根本变化。行情数据源可能涉及授权问题下载和重新分发数据前要检查服务条款是否允许。7.4 检查清单发布或升级温度系统前对照下面的清单逐项确认。检查项确认标准交易日历A 股和港股使用各自交易日历节假日不产生空值财报对齐PE 计算使用公告日期不使用未来数据缺失值处理缺失值不静默填充有日志可查权重配置权重在配置文件里有版本号方向一致性反向指标已做反转高温方向统一温度区间温度输出限制在 0 到 100超出有告警股票池过滤港股已做流动性过滤历史回溯可以使用历史快照数据复算不依赖当前数据8. 从温度系统到更完整的市场研究基础设施温度系统只是市场研究链路里的一环。把温度做出来之后可以继续扩展的方向非常多但也需要先理解哪里容易过度工程化。8.1 可以扩展的相邻能力第一个方向是行业温度。全市场温度会被权重股主导银行股和新能源股的表现可能互相抵消。按行业分别计算 PE 分位和温度能更细地观察结构性冷热。第二个方向是风格温度。按大盘成长、大盘价值、小盘成长、小盘价值分组计算温度能观察资金在不同风格之间的偏好变化。第三个方向是温度与基本面事件的归因。每次温度大幅变化时自动记录当日的财报披露数量、债券利率变化、指数涨跌幅度方便后续复盘时快速定位。第四个方向是温度与其他量化因子的相关性分析。比如温度变化率是否与未来 20 日波动率变化有关这类研究可以单独做但不要得出过于强硬的因果结论。8.2 容易过度设计的地方不要一开始就追求实时计算。市场温度是日频指标按日或按周更新已经足够。不要为了展示效果加入太多无解释意义的图表。每个图表的每个元素都应该能回答“这个信息给谁用、怎么用”的问题。不要在没有历史快照数据的情况下直接用当前成分股和当前权重去回溯历史指数估值。这种回溯会产生幸存者偏差让历史温度曲线失真。正确做法是使用指数公司发布的回溯数据或者明确说明你的历史曲线是“基于当前成分股近似计算”。8.3 对初学者最重要的练习建议如果要从零开始复现一套类似系统建议按周安排进度。第一周只做 A 股单指数估值温度选沪深 300 或中证 500不扩大范围先把 PE 分位和 PB 分位算清楚。第二周加入债券利率计算股债利差并手动验证某一日的数值。第三周加入成交量和市场广度把温度合成完整跑通。第四周再把港股放进来这时重点体会两个市场在股票池、流动性、交易日历上的差异。先在一个指数上把口径和数据链路打通再扩展市场范围。摊子铺太大最后往往只能得到一个出图很快但数据不可追溯的表层系统。