使用Pandas DataFrame将价格序列按起始时间点标准化至指数值100
如何将Pandas股票数据归一化到初始时刻的百分比
我懂你要做的是什么——把每只股票的价格都锚定到初始时刻(t=0)的数值,转换成百分比形式,这样能直观看到股价相对于起点的涨跌幅,这个在量化分析里太常用了。
先说说你之前代码报错的原因
你用df[0:] / df[0:1]出错,是因为df[0:1]返回的是单行DataFrame,而df[0:]是整个数据集,直接做除法时,Pandas的索引对齐机制会因为维度不匹配出问题(尤其是你的实际索引是datetime类型时,还会触发索引匹配逻辑,导致计算异常)。
正确的解决方法
下面几种方法都能完美实现你的需求,按自己的习惯选就行:
方法1:用iloc获取初始行做广播(最直观)
直接取第一行的数值(也就是t=0的价格),然后让整个DataFrame按列做除法,最后乘以100转成百分比:
import pandas as pd # 假设你的原始DataFrame是df,索引已经是datetime类型 initial_prices = df.iloc[0] # 获取第一行的所有股票初始价格 df_norm = (df / initial_prices) * 100
运行后就能得到你想要的结果:每一行的数值都是当前价格相对于t=0价格的百分比。
方法2:用transform函数实现
如果之后需要扩展到分组场景(比如多板块股票),用transform会更灵活,单组数据也适用:
df_norm = df.transform(lambda col: (col / col.iloc[0]) * 100)
针对datetime索引的小提示
如果你的实际索引是类似20170101 09:30:00的字符串格式,记得先转成datetime类型:
df.index = pd.to_datetime(df.index)
转完之后上面的方法依然有效,因为iloc[0]是按位置取第一行,和索引的具体格式无关。
验证结果
用你给出的示例数据测试,方法1会输出:
| datetime | Stock A | Stock B |
|---|---|---|
| t=0 | 100 | 100 |
| t=1 | 120 | 150 |
| t=2 | 160 | 125 |
| t=3 | 80 | 100 |
(注:你示例里t=2的Stock A写的是140,应该是笔误,按公式8/5*100正确结果是160)
内容的提问来源于stack exchange,提问作者eternity1
相关产品推荐
相关产品推荐

