上市公司综合能力聚类分析与量化投资检验在线实验闯关

第1关 基于总体规模与投资效率指标的上市公司综合能力聚类分析

# 1.去掉指标值小于0和存在空值的记录

# 2.去掉存在异常值的记录,指标取值大于或等于8倍均值视为异常值

# 3.对指标值进行均值-方差标准化处理

# 4.对标准化后的指标值进行k-均值聚类分析,k=5,即聚为5类

# 5.返回聚类结果,用序列Fs来表示,index为股票代码、值为聚类标签值(0~4),

#  并按聚类标签值从小到大排序

def return_values():

    import pandas as pd

    import numpy as np

    from sklearn.cluster import KMeans

    from sklearn.preprocessing import StandardScaler

    #1.数据读取,清洗掉<0,nan

    dta=pd.read_excel('data.xlsx')

    dta=dta.iloc[:,[0,2,3,4,5,6,7,8,9,10,11]]

    dta=dta[dta>0]

    dta=dta.dropna()

    #data2=dta.values

    data2=dta.to_numpy()

    for i in range(1,11):

        data2=data2[data2[:,i]<8*np.mean(data2[:,i]),:]

    X=data2[:,1:]

    scaler = StandardScaler()

    scaler.fit(X)

    X=scaler.transform(X)

   

    # 4.k均值聚类分析

    model = KMeans(n_clusters=5, random_state=0,max_iter = 1000)

    model.fit(X)

    c=model.labels_   #类标签

    Fs=pd.Series(c,index=data2[:,0])

    Fs=Fs.sort_values(ascending=True)

    return Fs

第2关 基于聚类结果构建投资组合及量化投资检验

# 读取2016年5-12月股票交易数据表"trd.xlsx",字段名称为:

# 股票代码、交易日期、考虑现金红利再投资的收盘价可比价

# 任务如下:

# 1.在上一关基础上,以每一类股票作为投资组合,计算各投资组合持有期为2016-05-01~2016-12-31日的收益率。

#  其中股票的收益率=(持有期最大交易日的收盘价-持有期最小交易日的收盘价)/持有期最小交易日的收盘价。

#  投资组合的收益率=投资组合中持有期内各股票收益率之和。

#  收盘价采用考虑现金红利再投资的收盘价可比价进行计算。

# 2.返回各投资组合收益率,用一个列表R来表示(注:有5个元素)

def return_values():

    import pandas as pd

    import step9_1

    def get_prices(stock_code, trd):

       

        filtered_trd = trd[(trd['Stkcd'] == stock_code)]

        # 按交易日期排序

        sorted_trd = filtered_trd.sort_values(by='Trddt')

        # 获取考虑现金红利再投资的收盘价可比价

        prices = sorted_trd['Adjprcwd'].tolist()

        return prices

    Fs=step9_1.return_values()

    trd=pd.read_excel('trd.xlsx')

    R=[]

    for i in range(5):

        Fs_i=Fs[Fs==i]

        code_i=list(Fs_i.index)

        r_i=0

        for t in range(len(code_i)):

            #计算r_i,即每类股票投资组合的收益率

            p = get_prices(code_i[t], trd)

            if len(p)>0:     #条件判断

                p1=p[0]

                p2=p[len(p)-1]

                r=(p2-p1)/p1

                r_i=r_i+r

        R.append(r_i)  

             

    return R

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值