先抛一个会让很多人皱眉的判断------
在一套 AI 选股系统里,"今天上证涨了多少"这个数字,几乎没有可建模的价值。指数进系统不是用来"预测涨跌"的,是用来"定位环境"的。把它当预言机,从字段设计的第一步就错了。
每天行情最上面那一排数字,你大概都瞄过。但如果有人问你"创业板指和深证成指是什么关系",你能立刻答出来吗?大多数人答不出来------而这恰恰说明,我们对天天在看的东西,其实没搞清它在测什么。这一讲不讲交易代码:源文里没有任何回测、胜率、阈值,我也不会硬凑。我讲的是一件更靠前的事:一个系统该怎样消费"指数"这种数据,又怎样小心地不被那排数字骗。
一、先认清这几个指数各自在测什么
它们的名字很像,量程却完全不同。先把对象搞清楚,再谈建模------
- 上证指数(000001) :上海交易所所有股票的整体表现,全样本(含 ST 股、新股)。市值加权,银行、石油、保险这种巨无霸权重极高,几大行一联动,指数就动。
- 深证成指(399001) :深圳交易所部分代表性股票(500 只)的表现,含主板和创业板的大票,风格更杂。
- 创业板指(399006) :创业板里 100 只代表性股票。它是深证成指的一个子集,但更纯粹地反映"小盘 + 科技 + 成长"。
- 沪深 300(000300) :从沪深两市挑出市值最大、流动性最好的 300 只单独编制,代表核心资产、白马、大盘股。北向资金主要就买它和中证 500。
- 中证 500 / 1000 / 2000:相对中盘、小盘、超小盘的代表。
- 北证 50(899050) :北交所 50 只代表性股票,定位"专精特新",是一个完全不同的物种。
二、最容易把系统带歪的三个误读
误读一:上证指数 ≈ 整个 A 股。 不是。它只是上交所的票,不含深圳(主板、创业板)、不含北交所。所谓"上证涨了 0.5%"只是上交所的整体表现,且因为权重股拉指数、中小票普跌,经常出现"上证红、个股一片绿"。拿它当"大盘"的唯一代理,是量程用错了。
误读二:深证成指 = 创业板指。 不是。创业板指是深证成指的一部分,但权重和侧重不同。判断"创业板今天强不强"看创业板指,判断"深圳市场整体"看深证成指。
误读三:沪深 300 = 上证 + 深证。 不是。它是从两市单独挑 300 只重编的指数,代表的是核心资产那一块,跟"把两个指数加起来"完全是两回事。
这三个误读有一个共同病根------把不同量程的温度计,当成了同一支来读。
三、把"指数的角色"写成约束,而不是写成预测器
源文最硬核的一句话是:指数不是用来"预测"的,是用来"定位"的。 这句话翻译成工程语言,就是------指数在系统里的第一身份是"状态描述符",不是"信号发生器"。 它回答的是三个定位问题,每一个都对应一个明确的下游用途:
| 看哪类指数 | 回答的定位问题 | 在系统里的角色 |
|---|---|---|
| 宽基指数(沪深 300、中证 500) | 当前是什么 regime(牛/熊/震荡) | 决定同一只票的胜率分布该用哪一套 |
| 板块指数 | 钱在往哪些方向流 | 资金偏好输入 |
| 风格指数(成长/价值、大盘/小盘) | 风格有没有在切换 | 中线趋势的锚点 |
注意这张表里没有一个"预测明天涨跌"的格子------因为没有任何一个指数能干这件事。它们都是状态描述,不是预测器。
四、一段诚实的伪 schema
如果把上面的认知落成代码,最先该写的不是策略,是一个指数定位的数据结构 。下面是一段草图------请注意它里面没有任何数值、阈值、胜率,因为源文不提供这些,凭空写出来就是欺骗。
python
from dataclasses import dataclass
from enum import Enum
class Regime(Enum):
"""用宽基指数定位的市场状态------描述,不是预测"""
BULL = "牛市"
BEAR = "熊市"
SHAKE = "震荡市"
class IndexFamily(Enum):
"""一只票'血缘最近'的指数族------决定它该被哪种环境解释"""
SSE_WEIGHT = "上证权重(银行/石油/保险等大盘蓝筹)"
HS300_CORE = "沪深300核心资产"
GEM_GROWTH = "创业板指(小盘+科技+成长)"
CSI1000_SMALL= "中证1000及以下小盘"
BSE_SPECIAL = "北证50(专精特新,独立生态)"
@dataclass
class MarketContext:
regime: Regime # 先定位环境,再谈个股
style_drift: str # 成长↔价值 / 大盘↔小盘 的切换方向
sector_flow_hint: str # 板块指数透露的资金偏好
@dataclass
class StockAnchor:
family: IndexFamily # 这只票'血缘最近'的指数,而不是默认拿上证套
is_independent_ecosystem: bool # 是否北证这类需单独建模的生态
# ------ 显式声明 ------
# 本结构【不含】任何指数点位阈值、涨跌幅预测、胜率。
# 指数仅用于【定位 regime / 风格 / 资金偏好】,绝不用于预测个股次日涨跌。
# 'family' 字段的全部意义:禁止用上证指数去解释一只创业板小票。
这段 schema 的全部价值,在于它把源文那几条认知翻译成了字段约束------
family这个字段的存在,就是为了对抗"拿上证指数解释我手里的创业板小票"这种错配。源文说得很直白:看你的票,要看跟它"血缘最近"的指数。 你买的是创业板里的小盘,对你最有意义的是创业板指和中证 1000,不是上证。is_independent_ecosystem这个布尔位,是为了把北证 50 从"四大指数之一"里摘出来。它规模小、流动性弱、单日波动 ±15%~20% 不稀奇,是一个完全不同的生态,不能跟创业板平等对待。regime永远是个枚举状态,不是一个"会涨/会跌"的预测值------这是整段代码最关键的纪律。
五、两个常被工程师忽略的"指数陷阱"
陷阱一:上证指数"长期不涨"会污染你的基准。 上证是老编制、吸收新股方式粗糙、银行石油这类长期估值压缩的板块权重过高、分红除权也没完全调整回指数。如果你拿它当长期基准去算超额收益,会得出失真的结论。改看"上证全收益指数",长期回报跟 GDP 比其实没那么离谱。选错基准,整个评价体系都是歪的。
陷阱二:指数本身有"幸存者偏差"。 指数会定期调样------表现差的剔除、表现好的新股纳入。这意味着指数走势其实被人为优化过,单只股票的真实平均表现,比指数差。 如果你用指数收益当"随便买能拿到的基准",会系统性高估散户的真实期望。
六、给系统的三条纪律(也是给人的)
- 分清你说的"大盘"是谁。 上证、深证、创业板、沪深 300,是四支测不同地方的温度计。系统里不能有一个含糊的
market_up: bool。 - 给每只票绑定"血缘最近"的指数。 不要用一个全局指数去解释所有票。错配的解释,比没有解释更危险。
- 指数只定位,不预测。 判断"是不是牛市"要看宽基指数(沪深 300、中证 500)是不是一起强,不能只看创业板涨------那可能只是结构性行情,少数赛道在炒,大盘没真起来。
七、思考题
- 如果让你给
StockAnchor再加一个字段,去防住"结构性行情被误判成牛市"这种错误,你会加什么?它对抗的是哪种直觉? - 源文说指数有"幸存者偏差"。如果你要在系统里量化这种偏差对"基准收益"的影响,你会怎么设计一个对照?
- 北证 50 被单列为"独立生态"。你认为系统应该完全不碰它,还是给它一套单独的流动性约束再纳入?为什么?
风险提示:本文为系统科普与个人思考分享,不构成任何投资建议。指数数据仅反映过往表现,不代表未来收益。投资有风险,入市需谨慎。