numpy数组与广播机制:矩阵世界的交通规则
我的掌握程度:
先掌握这个答案
ndarray:同类型、连续内存的多维数组,支持整体数学运算(list不支持:[1,2]+[3,4]是拼接不是相加)。广播规则:numpy自动扩展低维数组与高维对齐——(1000,5)−(5,):把(5,)当成每行都减的向量;(1000,5)−(1000,1):把(1000,1)当成每列都减的列向量。核心区分:(5,)是「行向量」会逐行匹配,(1000,1)是「列向量」会逐列匹配——横截面操作与时序操作的分界线。
先读结论,再核对下方使用边界;数字例题为教学情景,涉及实际行情与规则时请核对原始来源。
从理解到使用
本阶段实战方法 · 一条能复现的数据流水线
把接口返回的数据变成可用于因子研究的面板时,先处理时点、主键与单位。
- 建立数据字典:字段、单位、时区、交易日历、数据源、抓取时间、原始价与复权因子。
- 用(date, code)查重,区分停牌、未上市、窗口不足和真实缺失;不要用向后填充把未来值带回过去。
- 保存原始快照与清洗日志,固定随机种子和环境版本;接口字段变化时先核对官方文档。
使用边界
- 报告期不等于公告可用日,盘后公告通常不能用于当天收盘前决策。
- API输出名为“动态市盈率”时不能直接改名TTM;浏览器练习不支持任意原生库或行情抓取接口。
打开术语词典,随时查阅基础概念。
背景 · 从一个困惑说起
向量化思维要求你把数据看成矩阵。但矩阵世界里有自己的交通规则:两个形状不同的矩阵怎么运算?(1000,5)的收益率矩阵减去(5,)的每只股票均值——形状对不上,numpy却自动完成了。第一次见到的人要么觉得神奇,要么掉进坑里。
由此产生的问题
ndarray与list的本质区别是什么?广播(Broadcasting)的规则是什么?哪里是它最大的坑?
核心概念
ndarray:同类型、连续内存的多维数组,支持整体数学运算(list不支持:[1,2]+[3,4]是拼接不是相加)。广播规则:numpy自动扩展低维数组与高维对齐——(1000,5)−(5,):把(5,)当成每行都减的向量;(1000,5)−(1000,1):把(1000,1)当成每列都减的列向量。核心区分:(5,)是「行向量」会逐行匹配,(1000,1)是「列向量」会逐列匹配——横截面操作与时序操作的分界线。
为什么需要它
①量化双操作的物理基础:按日横截面标准化(每行减行均值)与按股票时序去均值(每列减列均值)只差一个reshape,理解广播=理解横竖方向;②内存与速度:ndarray连续内存+向量化指令,这是百倍速的来源;③读代码能力:所有pandas/numpy代码的隐式行为都由广播规则解释,报错「shapes not aligned」时能立刻定位。
实际应用场景
横截面去均值的两种写法:df.sub(df.mean(axis=1), axis=0)(pandas会自动广播)或 矩阵−均值[:,None](numpy手动广播);加权组合收益=returns @ weights(矩阵乘法,阶段6回测引擎的核心一行)。
与之前知识的联系
q-301的向量化思维在ndarray上落地;广播规则是阶段5「每天横截面标准化因子」的数学机制。下一题回到pandas层:DataFrame的双索引与groupby——矩阵世界与表格世界的桥梁。
⚠ 常见误解
- (5,)和(5,1)没区别:天壤之别!前者逐行广播、后者逐列广播,混用会产生整个矩阵错位的静默bug
- 广播是numpy自动的所以不用学:自动≠符合你的意图;错误形状的广播不报错但结果全错——最危险的静默错误
- pandas的DataFrame不是ndarray:DataFrame底层就是ndarray+索引,两者随时互转(.values/.to_numpy),两套API一套数学
🛠 本题实践任务
手造一个(5,4)的收益矩阵(5天×4股票),分别实现:①每只股票减自己的时序均值 ②每天减横截面均值。用结果的行/列均值是否为0验证方向正确。
💡 提示(先自己想5分钟再看)
①X-X.mean(axis=0);②X-X.mean(axis=1)[:,None];验证:col.mean(axis=0)≈0、row.mean(axis=1)≈0。
✅ 验收标准
两个方向的代码+两组零均值验证输出。这两个操作分别是「时序标准化」和「横截面标准化」的原型,阶段5天天用。
在你的浏览器内运行。首次需联网下载 Python;支持标准库和 Pyodide 提供的 NumPy、pandas 等包。行情抓取、系统文件访问和部分第三方库请在本地环境运行。输出自检仅比对结果关键词,不代替逻辑审查。
Python · 独立工作线程 · 执行限时10秒
🤖 AI导师
导师会先检查你的前置知识(向量化思维、DataFrame基础),再用案例、公式和代码帮助理解。此功能需要先启用服务。