第1关
#1.读取上市公司总体规模与投资效率方面指标数据"data.xlsx",字段信息依次为:
# 股票代码、会计期间、营业收入、营业利润、利润总额、净利润、资产总计、
# 固定资产净额、资产收益率、每股净资产、每股资本公积、每股收益
#2.筛选指标值大于0的数据以及去掉空值
#3.数据标准化,这里可以采用均值-方差法
#4.对标准化后的数据进行主成成分分析,要求累计贡献率在95%以上,并提取主成分
#5.计算综合得分:所提取的主成分与其贡献率乘积之和
#6.读取上市公司基本信息表:“TRD_Co.xlsx”,字段名称依次为:股票代码、股票简称
#7.返回两种形式的排名结果Fscore1和Fscore2,数据结构均为序列
# 其中第1种形式的index为股票代码,值为综合得分。
# 第2种形式的index为股票简称,值为综合得分。
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA
def return_values():
# 1 数据读取及清洗
data = pd.read_excel('data.xlsx')
# 筛选出2016-12-31的数据,并选取除会计期间外的其他列
data2 = data[data.iloc[:, 1] == '2016-12-31'].iloc[:, [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]]
# 筛选指标值大于0的数据
data2 = data2[data2>0]
# 去掉空值
data2 = data2.dropna()
# 2.数据标准化(均值方差法)
X = data2.iloc[:, 1:]
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 3.主成分分析(累计贡献率设置95%以上)
pca = PCA(n_components=0.95)
X_pca = pca.fit_transform(X_scaled)
# 获取各主成分的贡献率
explained_variance_ratio = pca.explained_variance_ratio_
# 4.计算综合得分F
F = (X_pca * explained_variance_ratio).sum(axis=1)
# 5.结果整理
fs1 = pd.Series(F, index=data2.iloc[:, 0].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.iloc[:, 0].values]
fs2 = pd.Series(F, index=Co1.values)
Fscore2 = fs2.sort_values(ascending=False) # 降序,True为升序
return (Fscore1, Fscore2)
Fscore1, Fscore2 = return_values()
第2关
# -*- 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
# 读取 2017 年股票日交易数据表
trd = pd.read_excel('trd_2017.xlsx')
# 获取综合排名前 30 的股票代码
re = step7_13.return_values()
Fscore1 = re[0]
# 预定义每个股票的收益率序列
r_list = []
for i in range(30):
# 获取排名第 i 个股票代码
code = Fscore1.index[i]
# 获取排名第 i 个股票代码的交易数据
dt = trd[trd.iloc[:, 0] == code]
# 获取排名第 i 个股票代码 2017-05-01 至 2017-12-31 的交易,并按交易日期升序排序
dt = dt[(dt.iloc[:, 1] >= '2017-05-01') & (dt.iloc[:, 1] <= '2017-12-31')].sort_values(by=dt.columns[1])
# 注意判断获取的数据是否为空,如果非空,则计算其收益率
if not dt.empty:
# 获取持有期内首个交易日考虑现金红利再投资的收盘价可比价 p1
p1 = dt.iloc[0, 3]
# 获取持有期内最后交易日的考虑现金红利再投资的收盘价可比价 p2
p2 = dt.iloc[-1, 3]
# 计算收益率
r = (p2 - p1) / p1
r_list.append(r)
# 计算总收益率
r_total = sum(r_list)
return r_total
1184

被折叠的 条评论
为什么被折叠?



