版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第10章
股票价格形态聚类与收益分析关键价格点概念及提取算法基于关键价格点的形态特征表示基于关键价格点的形态特征提取关键价格点概念及提取算法第10章
股票价格走势主要由一些关键价格点构成,因此我们选择其关键的价格点作为聚类特征即可。构成的序列模式,值越大,xi成为关键点的可能性就越大。关键价格点提取算法如下:输入:原始价格序列x=(x1,x2,……,xp),提取关键点个数num。输出:关键价格点序列、对应下标序列。step1:对x2,…,x(p-1)按公式计算其与相邻两个价格点均值的绝对值大小,并按从大到小
进行排序,取排名前num-2对应的价格点,记为L1,对应的下标序列记为S1。step2:x1,xp对应的价格点记为L2,对应的下标序列记为S2。step3:记L=L1∪L2,S=S1∪S2,并按S从小到大进行排序,则L即为关键价格点序列,
S即为对应的下标序列。关键价格点概念及提取算法第10章
defget_keydata(x,num):
importpandasaspd
importnumpyasnp
#计算x2,…,x(p-1)各点减去相邻两点平均值的绝对值
d=abs(x[1:len(x)-1].values-(x[0:len(x)-2].values+x[2:len(x)].values)/2)
#以d为值,对应的下标为index,构建序列,并按降序排序
Sd=pd.Series(d,index=np.arange(1,len(x)-1)).sort_values(ascending=False)
L1=Sd[0:num-2]
L2=pd.Series([x[0],x[len(x)-1]],index=[0,len(x)-1])
L=L1.append(L2)
keydata=x[L.index].sort_index()
returnkeydata函数输入参数为价格数组X、提取的关键点个数num,返回值为关键点序列(index为下标,value为对应的关键价格点)关键点提取算法函数如下(函数定义在df.py文件中)关键价格点概念及提取算法第10章
股票代码为600000的股票2017年6月1日—2017年8月31日的收盘价数据,提取10个关键点,并在同一坐标轴上绘制原始价格点与关键价格点拟合图,importpandasaspdimportdfimportmatplotlib.pyplotaspltdata=pd.read_excel('DA.xlsx')I1=data['Trddt'].values>='2017-06-01'I2=data['Trddt'].values=<'2017-08-31'I=I1&I2data1=data.iloc[I,:]#提取代码600000的收盘价dt=data1.loc[data1['Stkcd']==600000,['Clsprc']]['Clsprc']#收盘价序列的index重排,从0开始dt=pd.Series(dt.values,index=range(len(dt)))keydata=df.get_keydata(dt,10)plt.plot(dt.index,dt.values)plt.plot(keydata.index,keydata.values,'r*--')关键价格点(keydata.values)为:[12.9212.5312.8613.7613.5513.4513.6713.4412.4712.71]对应的下标(keydata.index)为:[0,27,29,32,33,36,37,44,60,65]基于关键价格点的形态特征表示第10章
关键价格点的提取降低了维度,但是直接用价格点进行聚类还是存在较大的误差,因此我们需要对关键价格点的走势情况进行特征化表示,采用两个关键价格点之间连线的斜率确定其涨跌情况,即特征化表示为两个关键点连线之间的夹角
的tan值:其中p1和p2分别表示前后两个关键点,x1和x2分别为关键点对应的下标。涨跌幅的划分标准如下:上涨幅度大:
tan值>0.5上涨幅度较大:
tan值介于0.2~0.5上涨:
tan值介于0.1~0.2平缓:
tan值介于−0.1~0.1下跌:
tan值介于−0.2~−0.1下跌幅度较大:
tan值介于−0.5~−0.2下跌幅度大:
tan值<−0.5分别记为:7、6、5、4、3、2、1基于关键价格点的形态特征表示第10章
特征化表示函数如下(函数也定义在df.py文件中)defget_tz(keydata):
importnumpyasnp
y1=keydata.values[1:]
y2=keydata.values[0:-1]
x1=keydata.index[1:]
x2=keydata.index[0:-1]
#计算tan值
tan=list((y2-y1)/(x2-x1))
T=np.array(tan)
I7=T>0.5
i1=T>0.2
i2=T<=0.5
I6=i1&i2
i1=T>0.1
i2=T<=0.2
I5=i1&i2
i1=T>-0.1
i2=T<=0.1
I4=i1&i2i1=T>-0.2i2=T<=-0.1I3=i1&i2i1=T>=-0.5i2=T<=-0.2I2=i1&i2I1=T<-0.5T[I1]=1T[I2]=2T[I3]=3T[I4]=4T[I5]=5T[I6]=6T[I7]=7returnT函数输入参数为关键点序列,返回结果为特征化数组:T=df.get_tz(keydata)print(T)可以看到,前面所示关键点价格走势图其特征化表示为:[4.5.6.2.4.6.4.4.4.]基于关键价格点的形态特征提取第10章
根据第8章中基于总体规模与投资效率指标的综合评价方法,获取2016年排名前400的股票作为研究样本,并提取其交易数据区间在2017年5月1日—2017年7月31日的股票关键价格点和形态特征。首先基于总体规模与投资效率指标的综合评价方法,获取2016年排名前400的股票,包括其股票代码和股票简称。importpandasaspdimportfundta=pd.read_excel('ddata.xlsx')r=fun.Fr(dta,'2016')c=r[0][0:400]cn=r[1][0:400]code=list(c.index)#将股票代码转化为列表的形式基于关键价格点的形态特征提取第10章
其次确定在2017年5月1日—2017年7月31日之间的交易所实际交易天数Mtd=pd.read_excel('交易日历数据表.xlsx')I1=td['Clddt'].values>='2017-05-01'I2=td['Clddt'].values<='2017-07-31'I=I1&I2ddt=td.loc[I,['Clddt']]M=len(ddt)基于关键价格点的形态特征提取第10章
最后我们计算400只股票样本的关键价格点数据和对应的下标,并根据关键价格点和对应下标数据计算形态特征,这里需要说明的是如果存在股票交易天数不足M天,则做剔除处理。最终得到股票形态特征数据Data、关键价格点数据KeyData、关键价格点数据对应的序号KeyData_index。其中关键价格点数据KeyData已做极差化处理,即数据标准化为[0,1]之间。第10章
股票价格形态聚类与收益分析K-最频繁值聚类算法基于K-最频繁值聚类算法的股票价格形态聚类类平均收益率的计算K-最频繁值聚类算法第10章
K-均值聚类算法主要适用于数值特征数据,而本章中提取的股票价格形态特征数据是经过离散化的离散变量(名义变量),因此经典的K-均值聚类算法不再适用。本节借鉴K-均值聚类算法的思想,给出K-最频繁值聚类算法,该算法与K-均值聚类算法的不同之处主要体现在距离度量和类中心的更新方法上,其中距离度量函数采用海明距离,类中心的更新方法则选择类样本特征向量分量出现最多的值(最频繁值,经典的K-均值聚类算法采用的是平均值)作为类中心特征向量的分量。K-最频繁值聚类算法第10章
输入:特征数据集,聚类个数K。输出:特征数据集及其类标签。Step1:随机初始化K个聚类中心,即K个类中心向量。Step2:对每个样本,计算其与各个类中心向量的距离,并将该样本指派给距离最小的类,
这里的距离采用海明距离,其计算公式如下:K-最频繁值聚类算法:Step3:更新每个类的中心向量,更新的方法为取该类所有样本的特征向量的最频繁值。Step4:直到各个类的中心向量不再发生变化为止,并输出类标签。Python中没有现成的函数可以调用,故本节给出其函数的具体定义。这里仅介绍基本结构defK_mean(data,knum):#输入:data--聚类特征数据集,要求为数据结构要求为numpy数值数组#输入:knum--聚类个数#返回值为类别标签列基于K-最频繁值聚类算法的股票价格形态聚类第10章
利用K-最频繁值聚类算法对股票价格形态进行聚类,输入为股票形态特征数据集Data,输出为每个股票代码的聚类结果.为了后续使用的方便,对形态特征数据Data、关键价格点数据KeyData、关键点价格数据对应的序号数据KeyData_index,都在数据集的最后加上一列,即聚类结果列。添加聚类结果列后,数据集分别记为:Data_c、KeyData_c、KeyData_index_cimportkmean#导入自定义的K最频繁值聚类算法c=kmean.K_mean(Data[:,1:],20)#调用K最频繁值聚类算法,聚为20个类,并返回结果cKeyData_c=np.hstack((KeyData,c.reshape(len(c),1)))KeyData_index_c=np.hstack((KeyData_index,c.reshape(len(c),1)))Data_c=np.hstack((Data,c.reshape(len(c),1))类平均收益率的计算第10章
根据聚类结果,对每一类股票计算该类股票的平均收益率,持有期为2017年8月1日—2017年8月31日,即考察未来一个月的平均收益率。也就是说,这种形态出现之后,未来一个月的市场表现如何。第10章
股票价格形态聚类与收益分析函数定义及使用方法训练样本与预测样本的构建量化投资策略设计函数定义及使用方法第10章
将以上介绍的股票价格形态特征提取定义为函数FR1defFR1(DA,t_trd1,t_trd2,num):
#输入:
#DA--2017年股票交易数据
#t_trd1--聚类数据区间开始日期
#t_trd2--聚类数据区间结束日期
#num--基于总体规模与投资效率指标的综合评价方法提取样本个数
#输出:
#Data--形态特征数据
#KeyData--关键价格点数据
#KeyData_index--关键价格点对应序号函数定义及使用方法第10章
将以上介绍的形态特征聚类与收益率计算定义为函数FR2defFR2(DA,Data,KeyData,KeyData_index,s_trd1,s_trd2,class_num):
#输入:
#DA--2017年股票交易数据
#Data--形态特征数据
#KeyData--关键价格点数据
#KeyData_index--关键价格点对应序号
#s_trd1--收益率计算持有期开始日期
#s_trd2--收益率计算持有期结束日期
#class_num--聚类个数
#输出:
#Data_c--形态特征数据+聚类结果列
#KeyData_c--关键价格点数据+聚类结果列
#KeyData_index_c--关键价格点对应序号+聚类结果列
#D--每只股票代码、所属聚类类别、收益率组成的数据框
#list_cr--每类股票的总收益训练样本与预测样本的构建第10章
选用2017年5月1日—2017年7月31日和2017年6月1日—2017年8月31日两个计算周期的交易数据提取股票价格形态特征进行聚类,并分别以2017年8月1日—2017年8月31日和2017年9月1日—2017年9月30日两个持有期计算每个类别的平均收益率,如果类平均收益率排名前5,则该类中所有股票记为+1类,否则记为−1类,并以此构建训练样本。importpandasaspdDA=pd.read_excel('DA.xlsx')R1=FR1(DA,'2017-05-01','2017-07-31',400)R2=FR2(DA,R1[0],R1[1],R1[2],'2017-08-01','2017-08-31',20)dt1=R2[0]
#2017年5月1日至2017年7月31日的股票价格形态特征数据+聚类结果列cr1=pd.Series(R2[4])#对应每类的平均收益率crr=cr1.sort_values(ascending=False)#对类平均收益率序列cr1按降序排序cr=list(crr.index)
#取对应的类编号(排序后的数据)foriinrange(len(crr)):
#类平均收益率排名前5的类中所有股票标记为1
ifi<5:
dt1[dt1[:,len(dt1[0,:])-1]==cr[i],len(dt1[0,:])-1]=1
#(聚类结果列变为因变量+1)dt1[dt1[:,len(dt1[0,:])-1]!=1,len(dt1[0,:])-1]=-1
#(聚类结果列变为因变量-1)训练样本与预测样本的构建第10章
R1=FR1(DA,'2017-06-01','2017-08-31',400)R2=FR2(DA,R1[0],R1[1],R1[2],'2017-09-01','2017-09-30',20)dt2=R2[0]
#2017年6月1日至2017年8月31日的股票价格形态特征数据+聚类结果列cr2=pd.Series(R2[4])crr=cr2.sort_values(ascending=False)cr=list(crr.index)foriinrange(len(crr)):ifi<5:dt2[dt2[:,len(dt2[0,:])-1]==cr[i],len(dt2[0,:])-1]=1
#(聚类结果列变为因变量+1)dt2[dt2[:,len(dt2[0,:])-1]!=1,len(dt2[0,:])-1]=-1
#(聚类结果列变为因变量-1)#构造训练样本importnumpyasnpdt=np.vstack((dt2,dt1))x=dt[:,1:-1]#训练样本的Xy=dt[:,len(dt[0,:])-1]#训练样本的Y训练样本与预测样本的构建第10章
对于预测样本,选用的是2017年7月1日—2017年9月30日的交易数据计算形态特征,这里调用前面定义的FR1函数来实现。#预测样本的构建R1=FR1(DA,'2017-07-01','2017-09-30',400)dt3=R1[0]x1=dt3[:,1:]#交易数据为2017年7月1日~2017年9月30日的股票价格形态特征数据量化投资策略设计第10章
根据前面构建的训练样本和预测样本,利用支持向量机模型进行训练和预测,如果预测结果为+1,表示该只股票在未来一个月内可能获得比较好的收益,对该只股票以持有期为2017年10月1日—2017年10月31日进行计算投资收益率(期初收盘价买入,期末收盘价卖出),最终将所有预测结果为+1的股票收益率求和,即得到投资策略的总收益率,并以同期的沪深300指数收益率作为基准进行比较。fromsklearnimportsvmclf=svm.SVC()clf.fit(x,y)res=clf.predict(x1)#支持向量机预测结果code=dt3[res==1,0]list_r=[]#预定义列表,用于存放预测结果为+1的股票收益率list_code=[]#预定义列表,用于存放预测结果为+1的股票代码foriinrange(len(code)):
I1=DA['Trddt'].values>='2017-10-01'
I2=DA['Trddt'].values<='2017-10-31'
I3=DA['Stkcd'].values==c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 食堂务工合同范例
- 学生租房合同模板
- 挂靠经营公司合同书
- 内江市重点中学2025届高三第六次模拟考试英语试卷含解析
- 电力线路及设备维护合同范本下载
- 2025届福建龙海市第二中学高三冲刺模拟英语试卷含解析
- 安徽省定远育才实验学校2025届高三(最后冲刺)英语试卷含解析
- 铁路轨道工程施工招标合同三篇
- 许昌学院《造型基础》2021-2022学年第一学期期末试卷
- 激励员工的服务意识与敬业精神计划
- 管理-制度疾控中心后勤管理制度
- 海地软件公路设计步骤
- 小区道路白改黑施工组织设计
- 电梯平衡系数测试记录表(参考)
- 汽车4S店客服月报工作总结计划ppt课件
- 自动电位滴定仪使用说明
- 小学六年级奥数简便运算(含答案)
- 小学生我运动我健康我快乐主题班会学习教案
- 大豆杂交育种技术ppt课件
- 二维机械滑台设计NJGCXY
- LemonTree中英文歌词
评论
0/150
提交评论