使用KernelPCA重构道琼斯指数时重构值长度不匹配报错
问题根因定位
- 最核心的问题是两套数据的时间窗口完全错位:PCA计算用到的成分股数据是2017年1月1日到12月31日的样本,经过24小时频率重采样、非交易日价格填充后,刚好得到报错里提到的361个长度的重构值;但用来做对比的目标DJIA数据是2021年1-2月的14个交易日样本,两边数据没有任何时间交集,自然会出现长度不匹配的报错。
- 接口调用存在明显误用:你调用Alpha Vantage的
get_intraday(symbol='DIA',interval='1min', outputsize='full')拉取的是DIA交易型开放式指数基金的1分钟级高频数据,既不是道琼斯工业平均指数的日线数据,也和Quandl拉取的成分股日线数据维度完全不匹配;且代码中缺失djia_2020_weird的赋值逻辑,当前14行的目标数据框和PCA计算用的样本完全没有关联。 - PCA计算流程存在逻辑偏差:拟合KernelPCA时输入的是2017年经过z-score标准化的成分股数据,但transform环节传入的是未做标准化的原始成分股值,不符合KernelPCA的输入要求,计算出的重构值本身也存在系统性偏差。
修复方案
- 第一步:统一数据时间范围:明确你需要做重构对比的具体时间区间,修改Quandl拉取成分股的
start_date、end_date参数,让它和目标DJIA数据的时间范围完全一致。比如你要对比2021年1月21日到2月3日的样本,就把成分股的拉取时间改成这个区间,不要混用2017年的旧数据。 - 第二步:对齐数据维度和来源
- 把Alpha Vantage的接口调用从
get_intraday改为get_daily,拉取目标标的的日线收盘价,去掉1分钟级别的冗余高频样本,和成分股的日线数据保持同一时间维度。 - 拉取数据后用日期索引做内连接,只保留成分股和目标指数都有交易记录的共同交易日,从根源上避免两边样本长度不一致。
- 注意Quandl的
WIKI/数据集已经停止实时更新,如果拉取遇到空值,可以对缺失的非交易日价格做前向/后向填充,保证每个交易日都有有效样本。
- 把Alpha Vantage的接口调用从
- 第三步:修正PCA计算逻辑
- 把同时间窗口的成分股数据先做z-score标准化,再传入KernelPCA模型拟合,不要直接拿原始值拟合。
- transform环节同样传入标准化后的同窗口样本,不要传入未标准化的原始价格,避免计算偏差。
- 计算完重构值后,把它绑定和目标数据完全一致的日期索引,封装为pandas的Series对象再合并到目标数据框,不要直接传入裸numpy数组做列赋值,减少硬匹配长度带来的报错。
内容的提问来源于stack exchange,提问作者Revolucion for Monica
相关产品推荐
相关产品推荐

