第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)