文章目录
第1关:基于总体规模与投资效率指标的上市公司综合评价
#********** Begin **********#
#1.读取上市公司总体规模与投资效率方面指标数据"data.xlsx",字段信息依次为:
# 股票代码、会计期间、营业收入、营业利润、利润总额、净利润、资产总计、
# 固定资产净额、资产收益率、每股净资产、每股资本公积、每股收益
# 基于数据,对2016年上市公司进行综合排名,找出优质公司股票。
#2.筛选指标值大于0的数据以及去掉空值
#3.数据标准化,这里可以采用均值-方差法
#4.对标准化后的数据进行主成成分分析,要求累计贡献率在95%以上,并提取主成分
#5.计算综合得分:所提取的主成分与其贡献率乘积之和
#6.读取上市公司基本信息表:“TRD_Co.xlsx”,字段名称依次为:股票代码、股票简称
#7.返回两种形式的排名结果Fscore1和Fscore2,数据结构均为序列,数据结果排序均为降序
# 其中第1种形式的index为股票代码,值为综合得分。
# 第2种形式的index为股票简称,值为综合得分。
def return_values():
import pandas as pd
#1 读取数据
data=pd.read_excel('data.xlsx')
data2=data.iloc[data.iloc[:,1].values=='2016-12-31',[ 0,2,3,4,5,6,7,8,9,10,11]]
data2=data2[data2>0]
data2=data2.dropna()
from sklearn.preprocessing import StandardScaler
X=data2.iloc[:,1:]
scaler = StandardScaler()
scaler.fit(X)
X=scaler.transform(X)
from sklearn.decomposition import PCA
pca=PCA(n_components=0.95) #累计贡献率为95%
Y=pca.fit_transform(X) #满足累计贡献率为95%的主成分数据
gxl=pca.explained_variance_ratio_ #贡献率
import numpy as np
F=np.zeros((len(Y)))
for i in range(len(gxl)):
f=Y[:,i]*gxl[i]
F=F+f
fs1=pd.Series(F,index=data2['Stkcd'].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['Stkcd'].values]
fs2=pd.Series(F,index=Co1.values)
Fscore2=fs2.sort_values(ascending=False) #降序,True为升序
return (Fscore1,Fscore2)
#********** End **********#
第2关:投资组合构建及收益率计算
#********** Begin **********#
# -*- 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
trd=pd.read_excel('trd_2017.xlsx')
re = step7_13.return_values()
Fscore1=re[0]
#预定义每个股票的收益率序列
r_list=[]
for i in range(30):
#获取排名第i个股票代码
code=Fscore1.index[i]
#获取排名第i个股票代码的交易数据
dt=trd.iloc[trd.iloc[:,0].values==code,:]
#获取排名第i个股票代码2017年度的交易数据,并按交易日期升序排序
I1=dt['Trddt'].values>='2017-05-01'
I2=dt['Trddt'].values<='2017-12-31'
dtt=dt.iloc[I1&I2,:].sort_values('Trddt')
#数据是否为空条件判断
if len(dtt)>1:
#获取排名第i个股票代码的
#首个和最后一个交易日的考虑现金红利再投资的收盘价可比价
p1=dtt.iloc[0,3]
p2=dtt.iloc[len(dtt)-1,3]
#计算排名第i个股票代码的收益率,并添加到r_list中
r_list.append((p2-p1)/p1)
r_total=sum(r_list) #计算总收益率
return r_total
#********** END **********#
第3关:移动平均线指标的计算
#今有部分股票交易数据表“trd_data”,字段名称为:
# Stkcd 、Trddt、开盘价、最高价、最低价、收盘价、交易量、交易金额
# 读取股票代码601668,2017-01-01至2018-01-01的交易数据,
# 计算收盘价5、10、20日移动平均价格,
# 返回计算结果,结果用一个数据框ma表示,第1-3列依次为5、10、20日移动平均价格
def return_values():
import pandas as pd
data=pd.read_excel('trd_data.xlsx')#题目数据
d=data[data.iloc[:,0].values==601668]
d=d[d.iloc[:,1].values>='2017-01-01']
d=d[d.iloc[:,1].values<='2018-01-01']
d.index=range(len(d)) #索引重新排序
#2.移动平均线指标的计算
ma5=d['收盘价'].rolling(5).mean() #计算5日的移动平均
ma10=d['收盘价'].rolling(10).mean() #计算10日的移动平均
ma20=d['收盘价'].rolling(20).mean() #计算20日的移动平均
#3.合并数据并保存Excel表
ma={'MA5':ma5,'MA10':ma10,'MA20':ma20}
ma=pd.DataFrame(ma)
return ma
第4关:指数平滑异同平均线指标的计算
#今有部分股票交易数据表“trd_data”,字段名称为:
# Stkcd 、Trddt、开盘价、最高价、最低价、收盘价、交易量、交易金额
# 读取股票代码601668,2017-01-01至2018-01-01的交易数据,
# 计算MACD指标,公式参考书本
# 返回计算结果,结果用一个数据框macd表示。
#注意:读取的交易数据表,需按照日期的升序进行排序
def return_values():
import pandas as pd
data=pd.read_excel('trd_data.xlsx')#题目数据
d=data[data.iloc[:,0].values==601668]
d=d[d.iloc[:,1].values>='2017-01-01']
d=d[d.iloc[:,1].values<='2018-01-01']
d.index=range(len(d)) #索引重新排序
#2.平滑异同平均线MACD指标值
import numpy as np
#指数平滑移动平均
ema12=pd.DataFrame.ewm(d['收盘价'],span=12).mean()
ema26=pd.DataFrame.ewm(d['收盘价'],span=26).mean()
dif=ema12-ema26
dea=np.zeros((len(dif))) #以dif为长度做全为0的数组
macd=np.zeros((len(dif)))
for t in range(len(dif)):
if t==0:
dea[t]=dif[t]
if t>0:
dea[t]=(2*dif[t]+8*dea[t-1])/10
macd[t]=2*(dif[t]-dea[t])
#3.合并数据并保存Excel表
macd={'MACD':macd}
macd=pd.DataFrame(macd)
return macd
第5关:随机指标K、D、J的计算
#今有部分股票交易数据表“trd_data”,字段名称为:
# Stkcd 、Trddt、开盘价、最高价、最低价、收盘价、交易量、交易金额
# 读取股票代码601668,2017-01-01至2018-01-01的交易数据,
# 计算KDJ指标,公式参考书本
# 返回计算结果,结果用一个数据框KDJ表示,
# 其中第1列为交易日期,2-4列分别为K、D、J指标值
#注意:读取的交易数据表,需按照日期的升序进行排序
def return_values():
import pandas as pd
A = pd.read_excel('trd_data.xlsx')#题目数据
d=A[A.iloc[:,0].values==601668]
d=d[d.iloc[:,1].values>='2017-01-01']
d=d[d.iloc[:,1].values<='2018-01-01']
d.index=range(len(d)) #索引重新排序
#2.平滑异同平均线MACD指标值
#计算移动周期内的最大值和最小值
import numpy as np
Lmin=d['最低价'].rolling(9).min() #周期数为9
Lmax=d['最高价'].rolling(9).max()
rsv=(d['收盘价'].values-Lmin)/(Lmax-Lmin)
K=np.zeros((len(rsv)))
D=np.zeros((len(rsv)))
J=np.zeros((len(rsv)))
for t in range(9,len(d)):
if t==0:
K[t]=rsv[t]
D[t]=rsv[t]
if t>0:
K[t]=2/3*K[t-1]+1/3*rsv[t]
D[t]=2/3*D[t-1]+1/3*K[t]
J[t]=3*D[t]-2*K[t]
#3.合并数据并保存Excel表
kdj={'D':D,'J':J,'K':K}
kdj=pd.DataFrame(kdj)
date={'交易日期':d['Trddt'].values}
date=pd.DataFrame(date)
KDJ=date.join(kdj)
return KDJ
第6关:计算相对强弱RSI指标
# -*- coding: utf-8 -*-
#今有部分股票交易数据表“trd_data”,字段名称为:
# Stkcd 、Trddt、开盘价、最高价、最低价、收盘价、交易量、交易金额
# 读取股票代码601668,2017-01-01至2018-01-01的交易数据,
#计算出的三个指标RSI6、RSI12、RSI24用数据框Data储存
#Data的前三列的指标数分别为 交易日期、 RSI6、RSI12、RSI24,
'''注意:读取的交易数据表,需按照日期的升序进行排序,即:2017年开始日期到结束日期,不按照命名要求进行命名
则无法检测答题结果是否准确'''
def return_values():
import pandas as pd
A = pd.read_excel('trd_data.xlsx')#题目数据
a1=A['Trddt'].values>='2017-01-01'
a2=A['Trddt'].values<='2017-12-31'
data1=A.iloc[a1&a2,:].sort_values('Trddt')
data1=data1.loc[data1['Stkcd']==601668,:]
data1.index=range(len(data1)) #规范索引
#预定义涨跌标识向量z
import numpy as np
z=np.zeros(len(data1)-1)
#涨跌标识向量赋值
z[data1.iloc[1:,5].values-data1.iloc[0:-1,5].values>=0]=1 #涨
z[data1.iloc[1:,5].values-data1.iloc[0:-1,5].values<0]=-1 #跌
#涨情况统计
zhang=pd.Series(z==1) #转化为序列
#6天移动计算涨数
zhang1=zhang.rolling(6).sum()
zhang1=zhang1.values #转化为数组
#12天移动计算涨数
zhang2=zhang.rolling(12).sum()
zhang2=zhang2.values #转化为数组
#24天移动计算涨数
zhang3=zhang.rolling(24).sum()
zhang3=zhang3.values #转化为数组
#跌情况统计
die=pd.Series(z==-1) #转化为序列
#6天移动计算跌数
die1=die.rolling(6).sum()
die1=die1.values #转化为数组
#12天移动计算跌数
die2=die.rolling(12).sum()
die2=die2.values #转化为数组
#24天移动计算跌数
die3=die.rolling(24).sum()
die3=die3.values #转化为数组
#RSI指标计算
rsi6=np.zeros((len(data1)))
rsi12=np.zeros((len(data1)))
rsi24=np.zeros((len(data1)))
for t in range(6-1,len(data1)-1):
rsi6[t]=zhang1[t]/(zhang1[t]+die1[t])
for i in range(12-1,len(data1)-1):
rsi12[i]=zhang2[i]/(zhang2[i]+die2[i])
for j in range(24-1,len(data1)-1):
rsi24[j]=zhang3[j]/(zhang3[j]+die3[j])
#将计算出的指标与交易日期利用字典整合起来
rsi={'RSI6':rsi6,'RSI12':rsi12,'RSI24':rsi24}
rsi=pd.DataFrame(rsi)
date={'交易日期':data1['Trddt'].values}
date=pd.DataFrame(date)
RSI=date.join(rsi)
return RSI
第7关:乖离率指标BIAS的计算
#今有部分股票交易数据表“trd_data”,字段名称为:
# Stkcd 、Trddt、开盘价、最高价、最低价、收盘价、交易量、交易金额
# 读取股票代码601668,2017-01-01至2018-01-01的交易数据
#计算出的三个指标Bias5、Bias10、Bias520用数据框Data储存
#Data的前三列的指标数分别为Bias5、Bias10、Bias520,请按照左侧提供的公式进行计算。
#注意:读取的交易数据表,需按照日期的升序进行排序
def return_values():
import pandas as pd
A = pd.read_excel('trd_data.xlsx')#题目数据
data=A
a1=data['Trddt'].values>='2017-01-01'
a2=data['Trddt'].values<='2017-12-31'
data1=data.iloc[a1&a2,:].sort_values('Trddt')
data1=data1.loc[data1['Stkcd']==601668,:]
data1.index=range(len(data1))
#预定义乖利率指标
import numpy as np
bias5=np.zeros((len(data1)))
bias10=np.zeros((len(data1)))
bias20=np.zeros((len(data1)))
#计算5天移动平均价格和BIAS指标计算
man5=data1.iloc[:,5].rolling(5).mean()
for t in range(5-1,len(data1)):
bias5[t]=(data1.iloc[t,5]-man5[t])/man5[t]
#计算10天移动平均价格和BIAS指标计算
man10=data1.iloc[:,5].rolling(10).mean()
for i in range(10-1,len(data1)):
bias10[i]=(data1.iloc[i,5]-man10[i])/man10[i]
#计算20天移动平均价格和BIAS指标计算
man20=data1.iloc[:,5].rolling(20).mean()
for j in range(20-1,len(data1)):
bias20[j]=(data1.iloc[j,5]-man20[j])/man20[j]
#将计算出的指标与交易日期利用字典整合起来
bias={'BIAS5':bias5,'BIAS10':bias10,'BIAS20':bias20}
bias=pd.DataFrame(bias)
Data = bias
return Data
第8关:能量潮指标OBV的计算
#今有部分股票交易数据表“trd_data”,字段名称为:
# Stkcd 、Trddt、开盘价、最高价、最低价、收盘价、交易量、交易金额
# 读取股票代码601668,2017-01-01至2017-12-31的交易数据
#计算能量潮OBV指标,请根据左边所提供的公式来进行计算
#能量潮指标OBV的计算结果用一个数据框L来表示,
#注意:读取的交易数据表,需按照日期的升序进行排序
def result():
import pandas as pd
A = pd.read_excel('trd_data.xlsx')#题目数据
data=A
a1=data['Trddt'].values>='2017-01-01'
a2=data['Trddt'].values<='2017-12-31'
data1=data.iloc[a1&a2,:].sort_values('Trddt')
data1=data1.loc[data1['Stkcd']==601668,:]
data1.index=range(len(data1))
#预定义能量潮指标
import numpy as np
obv=np.zeros((len(data1)))
for t in range(len(data1)):
if t==0:
obv[t]=data1['交易量'].values[t]
if t>0:
if data1['收盘价'].values[t]>=data1['收盘价'].values[t-1]:
obv[t]=obv[t-1]+data1['交易量'].values[t]
if data1['收盘价'].values[t]<data1['收盘价'].values[t-1]:
obv[t]=obv[t-1]-data1['交易量'].values[t]
#将计算出的能量潮指标与交易日期利用字典整合起来
obv={'OBV':obv}
obv=pd.DataFrame(obv)
L=obv
return L
第9关:涨跌趋势指标的定义及计算
#今有部分股票交易数据表“trd_data”,字段名称为:
# Stkcd 、Trddt、开盘价、最高价、最低价、收盘价、交易量、交易金额
# 读取股票代码601668,2017-01-01至2018-01-01的交易数据
'''计算出涨跌趋势指标其方法如下:下一日收盘价减去当日收盘价,
若大于0,则下日股价呈现上涨趋势,用1表示,反之则股价呈现下跌趋势,用-1表示'''
#计算结果用数据框Y进行储存,
#注意:读取的交易数据表,需按照日期的升序进行排序
def result():
import pandas as pd
A = pd.read_excel('trd_data.xlsx')#题目数据
data=A
a1=data['Trddt'].values>='2017-01-01'
a2=data['Trddt'].values<='2017-12-31'
data1=data.iloc[a1&a2,:].sort_values('Trddt')
data1=data1.loc[data1['Stkcd']==601668,:]
data1.index=range(len(data1))
#预定义因变量y和标识变量z
import numpy as np
y=np.zeros((len(data1)))
z=np.zeros((len(y)-1))
for t in range(len(z)):
z[data1.iloc[1:,5].values-data1.iloc[0:-1,5].values>0]=1 #涨
z[data1.iloc[1:,5].values-data1.iloc[0:-1,5].values==0]=0 #平
z[data1.iloc[1:,5].values-data1.iloc[0:-1,5].values<0]=-1 #跌
y[t]=z[t]
Y={'涨跌趋势':y}
Y=pd.DataFrame(Y)
return Y
第10关:基于技术指标的股票价格涨跌趋势预测模型构建(支持向量机模型)
#请结合前几题所计算出的各种技术分析指标,构建出股票价格涨跌趋势预测模型
#技术分析指标为自变量,涨跌趋势指标为因变量
##提取训练(1-11月)和测试数据(12月)
#数据标准化
#支持向量机模型
#计算模型准确率和预测准确率分别用sc和Rs储存,模型使用支持向量机模型
#若不按照命名要求进行命名则无法检测答题结果是否准确
def result():
import pandas as pd
data1=pd.read_excel('Y.xlsx') #跌涨趋势指标
data1.drop('Unnamed: 0', axis=1, inplace=True)
data2=pd.read_excel('MA.xlsx') #移动平均线指标
data2.drop('Unnamed: 0', axis=1, inplace=True)
data3=pd.read_excel('MACD.xlsx') #平滑异同平均线指标
data3.drop('Unnamed: 0', axis=1, inplace=True)
data4=pd.read_excel('KDJ.xlsx') #随机指标
data4.drop('Unnamed: 0', axis=1, inplace=True)
data5=pd.read_excel('RSI.xlsx') #相对强弱指标
data5.drop('Unnamed: 0', axis=1, inplace=True)
data6=pd.read_excel('BIAS.xlsx') #乖离率指标
data6.drop('Unnamed: 0', axis=1, inplace=True)
data7=pd.read_excel('OBV.xlsx') #能量潮指标
data7.drop('Unnamed: 0', axis=1, inplace=True)
#将指标与交易日期以及股价的涨跌趋势整合起来
zh=pd.concat([data3,data4,data5,data6,data7,data1],axis=1)
zh.drop('交易日期',axis=1,inplace=True)
zh=pd.concat([data2,zh],axis=1)
zh1=zh.dropna()
#提取训练和测试数据
x1=zh1['交易日期']<='2017-11-30'
index=x1.values==True
index1=x1.values==False
x_train=zh1.iloc[index,1:15]
y_train=zh1.iloc[index,15]
x_test=zh1.iloc[index1,1:15]
y_test=zh1.iloc[index1,15]
#数据标准化
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(x_train)
x_train=scaler.transform(x_train)
x_test=scaler.transform(x_test)
#支持向量机模型
from sklearn import svm
clf= svm.SVC(kernel='rbf', C=5)
clf.fit(x_train,y_train)
sc=clf.score(x_train,y_train)
result=clf.predict(x_test)
Z=result-y_test
Rs=len(Z[Z==0])/len(Z)
return [sc,Rs]