上市公司综合排名及投资组合构建、收益率计算在线实验闯关

第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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值