一、背景
在证券市场股票很多,就比如在我们国内某证券市场就有三千多只股票,那如何作为一个新手,我们如何从这三千多只股票中选出几只优质股票进行投资呢?如果我们一个一个的去了解每只股票对应公司的资产,营收情况等情况显然很费事,并且不容易综合比较出优质股。那么这时就计算机帮忙,帮我们选出优质股票。具体怎么帮呢?这就涉及到了我们今天要说的内容PCA优质股票推荐
二、主成分分析PCA原理
主成分分析PCA本质是用来选取主要成分的,即主要特征的。并不是用来做优质股票选取的。那我们如何就使用PCA来完成优质股票推荐呢?
1.PCA作用
我们拿到一堆预先处理好的数据(即做过空值填充,分布不平衡处理等)后,首先取其中与我们特定任务有关的一部分字段(即部分数据,如:X1,X2,X3,X4),这些数据之间可能存在着相关性,即数据之间存在着内部联系。 那么这些字段我们是不能直接拿来用的,要先去掉他们的相关性。那如何去掉这些相关性呢?常见的一种手段就是PCA
PCA的思路是保持特征尽量不变(主体成分,这里一般指方差)的情况下,用一些不存在相关性的字段(Y1,Y2,Y3)代替原来的字段(X1,X2,X3,X4)。其中Y1,Y2,Y3保留的特征(即方差)依次从大到小。在大多数情况下,原来可能一百多个字段X,PCA分析后,只需要几个字段Y就能保留原来大部分的特征。
那怎么就能使用PCA来做排名呢?比如收入有很多因素构成,原来用X1,X2,X3,X4,因素之间存在着相关性,我们现在用Y1,Y2,Y3来表达。那现在看哪个城市人的收入高,把每个城市对应的Y1,Y2,Y3值加起来就可以表示该城市的收入情况了,但前面我们又说过他们三字段保留的特征多少不一样,Y1更重要些,所以我们不能直接让他三相加,而是把他三乘以PCA得到的他三权重值再求和,这样就可以表达每个城市的收入情况了,从而进行排名。
三、数据获取
我们这里从Tushare金融大数据社区获取数据。这里的数据我们不能直接离线下载。需要使用代码去获取(前提我们要在该网站注册了,有一定的积分)。
我们首先去Tushare网站注册并完善资料,就有了120积分,就可以有权限下载数据了
其次,我们在python开发环境中安装对应的Tushare库,即pip install tushare
接下来我们就可以写代码去获取数据了(获取每个公司的营收,资产和财务的部分字段)
import tushare as ts
import pandas as pd
#tushare API 初始化
#you token就是我们在tushare注册后,tushare给我们的一个下载币,登陆网站找到自己的下载币名字
ts.set_token('you token')
#构造一个实例对象,去获取社区中的数据
pro = ts.pro_api()
#股票基本信息获取,并保持为Excel文件 fields就是指定需要哪些字段
stkcode = pro.stock_basic(exchange='', list_status='L',
fields='ts_code,symbol,name,area,industry')
stkcode.to_excel('stkcode.xlsx')
#从利润表中获取营业收入、营业利润、利润总额、净利润指标数据
income= pro.income_vip(period='20221231',
fields='ts_code,revenue,operate_profit,total_profit,n_income_attr_p')
income=income.drop_duplicates(subset=['ts_code'])
#从资产负债表中获取资产总计、固定资产指标数据
balance = pro.balancesheet_vip(period='20221231',
fields='ts_code,total_assets,fix_assets')
balance=balance.drop_duplicates(subset=['ts_code'])
#从财务指标表中获取净资产收益率、每股净资产、每股资本公积、每股收益指标数据
indicator=pro.fina_indicator_vip(period='20221231',
fields='ts_code,roe,bps,capital_rese_ps,eps')
indicator=indicator.drop_duplicates(subset=['ts_code'])
#数据集成,以代码为键,内连接,并把集成后的数据导出Excel
tempdata=pd.merge(income,balance,how='inner',on='ts_code')
Data=pd.merge(tempdata,indicator,how='inner',on='ts_code')
Data.to_excel('Data.xlsx')
有了这些字段以后,我们就可以使用PCA来完成优质股票的推荐了
#读取数据,其中第0列为标识列(股票代码)
import pandas as pd
data=pd.read_excel('Data.xlsx')
#筛选指标值大于0的数据以及去掉nan值
data=data[data>0]
data=data.dropna()
#数据标准化,注意标准化的数据需要去掉第0列(股票代码,标识列),这里数据标准化方法采用均值-方差法,
from sklearn.preprocessing import StandardScaler
X=data.iloc[:,1:]
scaler = StandardScaler()
scaler.fit(X)
X=scaler.transform(X)
#对标准化之后的指标数据X做主成分分析,提取其主成分,要求累计贡献率在95%以上
from sklearn.decomposition import PCA
pca=PCA(n_components=0.95) #累计贡献率为95%
Y=pca.fit_transform(X) #满足累计贡献率为95%的主成分数据
gxl=pca.explained_variance_ratio_ #贡献率
#综合得分等于提取的各个主成分与其贡献率的加权求和
import numpy as np
F=np.zeros((len(Y))) #预定义综合得分数组F
for i in range(len(gxl)):
f=Y[:,i]*gxl[i] #第i个主成分与第i个主成分贡献率的乘积
F=F+f #数组累积求和
fs1=pd.Series(F,index=data['ts_code'].values) #构建序列,值为综合得分F,index为股票代码
Fscore1=fs1.sort_values(ascending=False) #结果排名,降序