文章目录
第1关:基于总体规模与投资效率指标的上市公司综合评价
#********** Begin **********#
#1.读取上市公司总体规模与投资效率方面指标数据"data.xlsx",字段信息依次为:
# 股票代码、会计期间、营业收入、营业利润、利润总额、净利润、资产总计、
# 固定资产净额、资产收益率、每股净资产、每股资本公积、每股收益
# 基于数据,对2016年上市公司进行综合排名,找出优质公司股票。
#2.筛选指标值大于0的数据以及去掉空值
#3.数据标准化,这里可以采用均值-方差法
#4.对标准化后的数据进行主成成分分析,要求累计贡献率在95%以上,并提取主成分
#5.计算综合得分:所提取的主成分与其贡献率乘积之和
#6.读取上市公司基本信息表:“TRD_Co.xlsx”,字段名称依次为:股票代码、股票简称
#7.返回两种形式的排名结果Fscore1和Fscore2,数据结构均为序列,数据结果排序均为降序
# 其中第1种形式的index为股票代码,值为综合得分。
# 第2种形式的index为股票简称,值为综合得分。
def return_values():
import pandas as pd
#1 读取数据
data=pd.read_excel('data.xlsx')
data2=data.iloc[data.iloc[:,1].values=='2016-12-31',[ 0,2,3,4,5,6,7,8,9,10,11]]
data2=data2[data2>0]
data2=data2.dropna()
from sklearn.preprocessing import StandardScaler
X=data2.iloc[:,1:]
scaler = StandardScaler()
scaler.fit(X)
X=scaler.transform(X)
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)))
for i in range(len(gxl)):
f=Y[:,i]*gxl[i]
F=F+f
fs1=pd.Series(F,index=data2['Stkcd'].values)
Fscore1=fs1.sort_values(ascending=False) #降序,True为升序
co=pd.read_excel('TRD_Co.xlsx')
Co=pd.Series(co['Stknme'].values,index=co['Stkcd'].values)
Co1=Co[data2['Stkcd'].values]
fs2=pd.Series(F,index=Co1.values)
Fscore2=fs2.sort_values(ascending=False) #降序,True为升序
return (Fscore1,Fscore2)
#********** End **********#
第2关:投资组合构建及收益率计算
#********** Begin **********#
# -*- coding: utf-8 -*-
# 1.在上一关的基础上,获得综合排名前30个股票代码,并构建投资组合
# 2.投资组合持有期为2017-05-01日至2017-12-31日,计算其收益率。
# 3.读取2017年股票日交易数据表“trd_2017.xlsx”,其字段信息如下:
# 股票代码、交易日期、收盘价、考虑现金红利再投资的收盘价可比价、
# 不考虑现金红利再投资的收盘价可比价
# 4.注意事项:
# 4.1 每只股票的收益率计算方法为:
# 以该股票持有期内首个交易日考虑现金红利再投资的收盘价可比价p1买入,
# 持有期内最后交易日的考虑现金红利再投资的收盘价可比价p2卖出,
# 收益率计算公式为:(p2-p1)/p1
# 4.2 投资组合的收益率为该组合内所有股票收益率之和
# 5.返回投资组合总收益率: r_total
def return_values():
import pandas as pd
import step7_13
trd=pd.read_excel('trd_2017.xlsx')
re = step7_13.return_values()
Fscore1=re[0]
#预定义每个股票的收益率序列
r_list=[]
for i in range(30):
#获取排名第i个股票代码
code=Fscore1.index[i]
#获取排名第i个股票代码的交易数据
dt=trd.iloc[trd.iloc[:,0].values==code,:]
#获取排名第i个股票代码2017年度的交易数据,并按交易日期升序排序
I1=dt['Trddt'].values>='2017-05-01'
I2=dt['Trddt'].values<='2017-12-31'
dtt=dt.iloc[I1&I2,:].sort_values('Trddt')
#数据是否为空条件判断
if len(dtt)>1: