当前位置: 首页 > news >正文

第十一章 降维 案例:沪深300指数成分股收益率的主成分分析

案例:沪深300指数成分股收益率的主成分分析

案例背景

本小节的内容讲解如何使用Python对数据进行PCA主成分分析,使用到的数据有2022年4月到9月的沪深300成分股数据和沪深300指数数据

  • 沪深300成分股数据:data.csv
  • 沪深300指数数据:HS300.csv

内容主要包括两个部分:

  • 对沪深300成分股数据进行PCA分析,得到各个成分股的线性组合系数
  • 可视化对比沪深300成分股经过线性组合系数加权求和后的整体行情趋势与沪深300指数

数据读取与划分

首先导入pandas库读取数据

# 导入 pandas 库importpandasaspd
# 读取股票数据stock_data=pd.read_csv('data.csv')stock_data
Tradedate12636669100157166301...688036688065688111688126688169688363688396688561688599688981
02022-04-1215.9220.1722.2411.127.364.846.984.4713.61...87.8399.78179.3022.12528.10105.8048.6053.6349.9043.89
12022-04-1315.8020.5022.0010.747.234.776.794.4213.30...86.0495.75177.7022.30511.02102.5046.8051.8048.7443.51
22022-04-1416.0421.0022.3310.887.554.806.864.4514.07...89.0095.33184.1022.80533.00114.6848.2052.6848.3743.67
32022-04-1516.4221.3022.6910.497.644.766.684.3913.76...87.4993.27181.3622.50516.61116.0048.6051.2148.2043.25
42022-04-1815.9020.5323.1710.447.134.766.564.3313.66...94.6692.60185.4522.78531.17119.4349.7052.5553.9043.69
..................................................................
952022-08-2912.4215.5724.089.175.334.245.834.1421.01...70.6372.57163.0020.00316.00141.9752.1849.2473.6040.08
962022-08-3012.4815.8924.509.235.404.205.844.1520.23...69.6470.03173.9620.17313.82145.4352.4049.2473.4440.10
972022-08-3112.7516.6324.509.085.354.155.774.1819.26...68.2669.46180.1220.60320.03143.0552.4049.7771.4940.21
982022-09-0112.6116.8424.039.135.324.085.824.2018.81...67.1369.40190.6120.05325.81139.9651.1649.7073.1239.95
992022-09-0212.5116.8024.279.265.164.105.824.1619.16...67.2069.45188.3520.16313.36141.4851.6450.4672.8040.40

100 rows × 301 columns

接下来对数据进行清洗,处理数据中的异常值。对于整列缺失的数据,也就是全部数据丢失的股票,整列删除;对于其他列中缺失的个别数据,用前一个非缺失的数据来填充。

stock_data=stock_data.dropna(axis=1,how='all')stock_data.fillna(method='pad',inplace=True)

主成分分析(PCA)

importnumpyasnp

前面所读取的数据是一段时间内沪深300成分股的收盘价,我们通过某天和前一天的收盘价可以计算当天的对数收益率。将当天的收盘价记作pricetprice_{t}pricet,前一天的收盘价记作pricet−1price_{t-1}pricet1,则对数收益率的计算公式为

ln(pricetpricet−1)=ln(pricet)−ln(pricet−1)ln(\frac{price_{t}}{price_{t-1}}) = ln(price_{t}) - ln(price_{t-1})ln(pricet1pricet)=ln(pricet)ln(pricet1)

stock_returns=stock_data.copy()stock_returns.iloc[:,1:]=stock_returns.iloc[:,1:].apply(np.log).diff(1)

导入sklearn库进行PCA分析

fromsklearn.decompositionimportPCA
# 数据的第一行是第一天的数据,收益率无法计算为空值,应该去掉stock_returns=stock_returns[1:]# 数据的第一列是日期,进行PCA只需保留除了日期列之外的股票数据pca=PCA(1).fit(stock_returns.iloc[:,1:])

数据可视化

导入matplotlib库将PCA的结果可视化

importmatplotlib.pyplotasplt
y_index=stock_data.columns[1:]

以股票代码为横坐标,各个股票的线性组合系数为纵坐标,可以将各个股票所占的比重可视化,数值越高的股票在沪深300成分股中的重要性越高

pc1=pd.Series(index=y_index,data=pca.components_[0])pc1.plot(figsize=(10,6),xticks=[],grid=True)plt.tight_layout()

PCA主成分分析获得了沪深300成分股票各自的线性组合系数,每个系数绝对值除以所有系数绝对值之和,计算出各个股票在沪深300全体股票中的权重比例。对各个股票的收益率按照该权重比例进行加权求和,结果可以反映沪深300全体股票的行情变化。之后按照日期先后顺序进行可视化。

# 根据主成分分析结果计算各个股票的权重比例weights=abs(pc1)/sum(abs(pc1))# 对全体股票收益率进行加权求和myrs=(weights*stock_returns[y_index]).sum(1)# 从求和结果计算收益情况并可视化myrs.cumsum().apply(np.exp).plot(figsize=(10,6))

结果验证

沪深300指数是由中国证券指数公司基于上海证券交易所上市公司和深圳证券交易所上市公司股票数据编制的指数,反映股票市场整体走势。其数值来自于证券指数公司的专家根据各只股票的重要性制定每只股票的权重参数,并根据参数对成分股票的数据进行加权求和。影响力越大、越重要的股票对沪深300指数所起的作用越大。

为了说明沪深300成分股按照线性组合系数加权求和后的整体行情趋势与沪深300指数的关系,将沪深300指数收盘价可视化

# 读取沪深300指数数据HS300=pd.read_csv("HS300.csv")# 收盘价数据作为纵坐标y_data=HS300['close']# 可视化沪深300指数收盘价HS300_close=pd.Series(index=range(100),data=HS300['close'])HS300_close.plot(figsize=(10,6),xticks=[])

对比沪深300成分股经过线性组合系数加权求和后的整体行情趋势和沪深300指数的数据图像,可以发现虽然数值单位不同,但曲线各个部位的变化趋势、极点是相同的。这是因为经过PCA分析后得到的线性组合系数能够从数值上反映各个成分对总体指标所产生的影响,因此根据线性组合系数对成分股进行加权求和能够表达沪深300指数中的大部分信息。但由于沪深300指数的实际计算过程还需要考虑其他因素,因此两者并不完全相同,而只是有着大致相近的变化趋势。

http://www.zskr.cn/news/1450569.html

相关文章:

  • 别再傻傻分不清了!用Python实战案例帮你彻底搞懂准确率、召回率和精确度
  • 量子模拟技术解析:非简谐振荡器的VQE实现
  • 从 LangGraph 到小说 Agent Runtime:用 flashNovel 实现章节级工作流、上下文记忆与人工确认
  • 在线 UML 制图神器:用例图、时序图、流程图一键生成非常好用
  • Translumo:Windows平台实时屏幕翻译工具完全指南
  • 06-02 · LLM 最新论文速览
  • 如何构建面向企业研发协作的规范化设计走查表与设计还原度优化设计系统与视觉资产库流程
  • 如何重新掌控你的数字记忆:WeChatMsg让聊天记录成为你的个人数字资产
  • 抖音无水印视频批量下载工具深度解析与实战指南
  • 惠州市阿特拉斯的空压机代理多少钱? - myqiye
  • Esper——核心概念
  • Ubuntu20系统启动失败别慌!手把手教你用U盘‘试用模式’无损修复(保留/home和软件)
  • 基于Arduino与555定时器的智能钢琴:超声波触发自动演奏系统设计
  • 2026如何挑选真正实用的材料进销存管理系统?
  • CS Demo Manager:从游戏回放到战术洞察的专业分析工具
  • 推荐靠谱的彩钢复合板品牌,鹏晨新材如何? - myqiye
  • 告别‘只读’烦恼:保姆级教程教你用macFUSE+ntfs-3g挂载移动硬盘到指定文件夹
  • 保姆级教程 | Codex 接入 DeepSeek V4,亲测有效
  • 选用 NativeWebView 必须从 Avalonia11 升级 Avalonia12
  • 如何用Python自动化脚本轻松抢到心仪演唱会门票:大麦网抢票终极指南
  • Ubuntu 20.04 下遇到 ‘System has not been booted with systemd‘ 报错?别慌,这可能是你的 WSL 或 Docker 环境在捣鬼
  • Veo 2提示词失效真相大揭秘:底层token映射机制拆解+动态权重调优公式(附Python校验脚本)
  • 终极OpenCore配置指南:如何用OpCore-Simplify快速构建Hackintosh系统
  • 6种现代压缩算法加持,7-Zip-zstd如何让文件处理效率提升300%
  • 中文医疗对话数据集的战略价值:构建下一代AI医疗基础设施的核心资产
  • 如何快速掌握163MusicLyrics:免费音乐歌词提取终极指南
  • 终极神界原罪2模组管理器:告别模组冲突,享受流畅游戏体验
  • 2026年6月各大token费用比较------无缓存命中版本
  • 2026最新!写会议纪要总熬夜加班?这5款免费实用神器,亲测10分钟搞定好用到哭!
  • QKeyMapper:打破设备壁垒,重塑Windows输入体验