上市公司高送转预测在线实验闯关

第1关 基于股票交易数据检测年度“高送转“”行为,构造标识因变量Y

'''读取“2018年股票日交易数据.xlsx",其字段名称如下:

Stkcd(股票代码)、Trddt(交易日期)、Clsprc(收盘价),

设计一个简单算法,用于检测上市公司在2017年度报告中是否有“高送转”行为,

同时获得上市公司高送转标识数据,其中有高送转行为的记为1,否则为0。

返回结果用一个数据框B1来表示,其中列名分别为a_code(股票代码)、b(高送转标识:1-有高送转,0-无高送转)

说明:考虑日收盘价格跌幅在35%以上的,视为该股票存在高送转行为,其跌幅是由于股票价格除权所致

'''

def return_values():

    import pandas as pd

    A=pd.read_excel('2018年股票日交易数据.xlsx')

    code=list(A['Stkcd'].unique())

    code_list=[]

    z_list=[]

    for i in range(len(code)):

        temp=A.iloc[A['Stkcd'].values==code[i],:]

        temp=temp.sort_values('Trddt')

        p1=temp['Clsprc'].values[:-1]

        p2=temp['Clsprc'].values[1:]

        t=(p2-p1)/p1

        if len(t[t<-0.35])>0:

            code_list.append(code[i])

            z_list.append(1)

        else:

            code_list.append(code[i])

            z_list.append(0)

    D1={'a_code':code_list,'b':z_list}

    B1=pd.DataFrame(D1)

    return B1

第2关 构建及计算影响年度高送转行为因素指标X

'''基于2017年三季度的数据,其数据表如下:

1."每股指标数据.xlsx",其主要字段说明如下:

Stkcd(股票代码)、Accper(会计期间)、Indcd(行业代码)、F090101B(每股收益)、

F091001A (每股净资产)、F091301A (每股资本公积)、F091501A(每股未分配利润)

其他字段未使用,不作说明。

2.“净利润增长率.xlsx”,其字段说明如下:

Stkcd    (股票代码)、Accper(会计期间)、F081002B(净利润增长率)

3.“月交易数据.xlsx”,其字段说明如下:

Stkcd    (股票代码、Trdmnt(交易月份)、Mclsprc(月收盘价)、

Msmvosd(月流通市值:单位元)、Msmvttl(月总市值:单位元)

其他字段未使用,不作说明

构建影响年度高送转行为因素指标,包括每股收益、每股公积金、每股净资产、每股未分配利润、

净利润增长率、股价、流通股本、总股本共8个指标。

请根据以上提供的3个数据表,计算获得以上8个指标数据,作为自变量X。

返回结果用一个数据框B2来表示,其中字段名称为:

a_code(股票代码,与上一关对应),8个指标的字段名称依次用c、d、e、f、g、h、i、j来表示

并与上一关活动的B1,以股票代码为键,进行内连接,

获得完整的自变量和因变量的数据集Data,其中Data为数据框,

要求去掉空值的记录,同时index重新按默认值排序

'''

def return_values():

    import pandas as pd

    import numpy as np

    import step3_1

    B1=step3_1.return_values()

    code=B1.iloc[:,0].values

    B=pd.read_excel('每股指标数据.xlsx')

    C=pd.read_excel('净利润增长率.xlsx')

    G=pd.read_excel('月交易数据.xlsx')

    A0=[]

    A1=[]

    A2=[]

    A3=[]

    A4=[]

    A5=[]

    A6=[]

    A7=[]

    for i in range(len(code)):

        temp=B.iloc[B['Stkcd'].values==code[i],:]

        if len(temp)>0:

            I1=temp['Accper'].values=='2017-09-30'

            t=temp.loc[I1,['F090101B','F091001A','F091301A','F091501A']]

            if len(t)>0:

                A0.append(t.values[0,0])

                A1.append(t.values[0,1])

                A2.append(t.values[0,2])

                A3.append(t.values[0,3])

            else:

                A0.append(np.nan)

                A1.append(np.nan)

                A2.append(np.nan)

                A3.append(np.nan)

        else:

            A0.append(np.nan)

            A1.append(np.nan)

            A2.append(np.nan)

            A3.append(np.nan)

        temp=C.iloc[C['Stkcd'].values==code[i],:]

        if len(temp)>0:

            I1=temp['Accper'].values=='2017-09-30'

            if len(temp.iloc[I1,2])>0:

                A4.append(temp.iloc[I1,2].values[0])

            else:

                A4.append(np.nan)

        else:

            A4.append(np.nan)

        temp=G.iloc[G['Stkcd'].values==code[i],:]

        I1=temp['Trdmnt'].values=='2017-09'

        t=temp.loc[I1,['Mclsprc','Msmvosd','Msmvttl']]

        if len(t)>0:

            A5.append(t.values[0,0])

            A6.append((t.values[0,1]/t.values[0,0])/100000000)

            A7.append((t.values[0,2]/t.values[0,0])/100000000)

        else:

            A5.append(np.nan)

            A6.append(np.nan)

            A7.append(np.nan)

    D2={'a_code':code,'c':A0,'d':A1,'e':A2,'f':A3,'g':A4,'h':A5,'i':A6,'j':A7}

    B2=pd.DataFrame(D2)

    Data=pd.merge(B1,B2,how='inner',on='a_code')

    Data=Data.dropna()

    Data.index=range(len(Data))

    return Data

第3关 基于逻辑回归的股票高送转行为识别模型构建

'''由于高送转公司和非高送转公司这两类数量差异较大,在上一关返回数据结果基础上,

对非高送转公司进行随机抽样,使得其数量与高送转公司数量一致。

进一步地,获得自变量数据X(8个指标)和因变量数据Y(高送转标识)

按80%训练,20%测试,划分训练集和测试集,构建逻辑回归模型,

输出模型的准确率rv和测试样本的预测准确率rs

'''

def return_values():

    import step3_2

    import pandas as pd

    Data=step3_2.return_values()

    Data_1=Data.iloc[Data.iloc[:,1].values==1,:]

    Data_0=Data.iloc[Data.iloc[:,1].values==0,:]

    Data_0=Data_0.sample(n=len(Data_1), replace=True,   random_state=10, axis=0)

    Data=pd.concat([Data_1, Data_0], axis = 0)

    X=Data.iloc[:,2:].values

    Y=Data['b'].values

    from sklearn.model_selection import train_test_split

    x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.2,random_state=4)

    from sklearn.linear_model import LogisticRegression as LR

    clf = LR()   #创建逻辑回归模型类

    clf.fit(x_train, y_train)

    rv=clf.score(x_train, y_train);

    y1=clf.predict(x_test) #对测试数据进行预测,并获得预测结果

    r=y1-y_test            #预测值与真实值相减

    rs=len(r[r==0])/len(y1)  #预测值与真实值相减为0,即预测准确,统计其准确率

    return (1,1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值