N18 股票价格形态聚类与收益分析(上)
来源 I 数据实践笔记RENA 2020-10-18 20:11:35
7 0 0

N18 股票价格形态聚类与收益分析

---数据获取与股票价格形态特征提取

本节介绍证券投资技术分析的另外一个分支,即形态分析。本章首先介绍了股票价格走势中的关键价格点概念及提取方法、基于关键价格点的形态特征计算方法,其次介绍了基于形态特征的自动聚类技术和投资收益分析,最后给出了结合基本面与形态聚类技术的量化投资模型及策略实现。

案例背景

投资者通过实战经验,总结出了各种各样的股票价格走势形态以辅助投资决策。例如,常见的头肩形、倒头肩形、三重顶、三重底、M头、W底等,如图所示:

本案例通过实际的股票交易数据,提取价格形态特征,采用聚类分析的方法,对其形态特征数据进行自动聚类分析,并根据聚类的结果计算每类股票未来持有期为一个月的平均收益率。然后将类平均收益率排名前5的股票记为+1类,其余股票记为-1类,作为训练样本,采用支持向量机模型进行训练。最后,利用训练好的支持向量机模型对新的股票价格形态特征数据进行预测。如果预测结果为+1,表示该只股票在未来一个月内会得到较好的投资回报率,即设计一个量化投资策略:以未来一个月为持有周期,以期初收盘价买入,期末收盘价卖出,计算其收益率。这里采用基于总体规模与投资效率指标的综合评价方法,获取其排名前400的股票作为研究样本;用于聚类的股票价格数据周期取三个月。

每类股票平均收益率=该类中各个股票收益率之和/该类股票总数,

单只股票的收益率=(该股票期末收盘价-该股票期初收盘价)/该股票期初收盘价

案例实现思路如下:

数据获取

案例获取的数据包括中国股票市场A股2017年度日行情交易数据(DA.xlsx)、交易日历数据表.xlsx、沪深300指数交易数据表(index300.xlsx)。

由于聚类的股票价格数据周期取三个月,其交易日期一般都在60日以上,如果以收盘价数据直接进行聚类,则数据维度较高。如果周期取半年、一年或者更长,其维度更高,会严重影响聚类的效果,因此在进行聚类之前需要做降维处理。降维的方法是取能代表股票价格走势的关键价格点,并基于提取的关键价格点计算股票价格走势形态特征,从而进行聚类。

1.关键价格点概念以及提取方法

通过分析我们可以发现,股票价格走势主要由一些关键价格点构成,因此我们选择其关键的价格点作为聚类特征即可。

提取原则为:xi-1,xi,xi+1构成的序列模式,|xi-(xi-1+xi+1)/2|越大,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即为对应的下标序列。

关于关键点提取算法函数的理解如下:(只用作理解,不适用于案例算法)

#已经省略x的计算过程x=pd.Series(dt.values,index=range(len(dt)))num=10import pandas as pd import numpy as np  #计算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()

2.案例

取股票代码为600000的股票2017年6月1日—2017年8月31日的收盘价数据,提取10个关键点,并在同一坐标轴上绘制原始价格点与关键价格点拟合图

def get_keydata(x,num): import pandas as pd import numpy as np #计算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() return keydata#其中函数输入参数为价格数组X、提取的关键点个数num,返回值为关键点序列(index为下标,value为对应的关键价格点)。作为一个例子,取股票代码为600000的股票2017年6月1日—2017年8月31日的收盘价数据,提取10个关键点,并在同一坐标轴上绘制原始价格点与关键价格点拟合图,示例代码如下:
import pandas as pdimport syssys.path.append(r"D:study程序与数据第10章 综合案例3:股票价格形态聚类与收益分析")import dfimport matplotlib.pyplot as pltdata=pd.read_excel(’D:study程序与数据第10章 综合案例3:股票价格形态聚类与收益分析\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*--’)

输出结果:runfile(’D:/study/关键点提取.py’, wdir=’D:/study’)

[4. 5. 6. 2. 4. 6. 4. 4. 4.]

基于关键点价格的形态特征表示及提取

1.表示

关键价格点的提取降低了维度,但是直接用价格点进行聚类还是存在较大的误差,因此我们需要对关键价格点的走势情况进行特征化表示,采用两个关键价格点之间连线的斜率确定其涨跌情况,即特征化表示为两个关键点连线之间的夹角θ的tan值,其计算公式为

其中p1和p2分别表示前后两个关键点,x1和x2分别为关键点对应的下标。涨跌幅的划分标准如下:

上涨幅度大:tan值>0.5

上涨幅度较大:tan值介于0.2~0.5

上涨:tan值介于0.1~0.2

上涨: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

特征化表示函数如下(函数也定义在df.py文件中):

def get_tz(keydata): import numpy as np 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&i2  i1=T>-0.2 i2=T<=-0.1 I3=i1&i2  i1=T>=-0.5 i2=T<=-0.2 I2=i1&i2  I1=T<-0.5  T[I1]=1 T[I2]=2 T[I3]=3 T[I4]=4 T[I5]=5 T[I6]=6 T[I7]=7 return T
T=df.get_tz(keydata)print(T)

2.提取

前面我们分析了股票价格走势中的关键价格点问题以及相关的特征提取算法,下面我们根据基于总体规模与投资效率指标的综合评价方法,获取2016年排名前400的股票作为研究样本,并提取其交易数据区间在2017年5月1日—2017年7月31日的股票关键价格点和形态特征。首先基于总体规模与投资效率指标的综合评价方法,获取2016年排名前400的股票,包括其股票代码和股票简称

import pandas as pdimport fundta=pd.read_excel(’D:study程序与数据第10章 综合案例3:股票价格形态聚类与收益分析\ddata.xlsx’)r=fun.Fr(dta,’2016’)c=r[0][0:400]cn=r[1][0:400]code=list(c.index) #将股票代码转化为列表的形式

执行如下:

其次确定在2017年5月1日—2017年7月31日之间的交易所实际交易天数M,示例代码如下:

td=pd.read_excel(’D:study程序与数据第10章 综合案例3:股票价格形态聚类与收益分析\交易日历数据表.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)

最后计算400只股票样本的关键价格点数据和对应的下标,并根据关键价格点和对应下标数据计算形态特征,如果存在股票交易天数不足M天,则做剔除处理。关键点价格数据和对应的下标及计算形态特征均通过调用前面定义的get_keydata、get_tz函数实现。

import dfimport numpy as npnum=10p=-1DA=pd.read_excel(’D:study程序与数据第10章 综合案例3:股票价格形态聚类与收益分析\DA.xlsx’)#预定义股票价格走势特征化数据,第0列为股票代码,其余为特征化数据(num−1个)Data=np.zeros((len(code),num))#预定义股票价格走势关键点数据,第0列为股票代码,其余为关键点数据(num个)KeyData=np.zeros((len(code),num+1))#预定义股票价格走势关键点下标,第0列为股票代码,其余为关键点下标(num个)KeyData_index=np.zeros((len(code),num+1))#对每一个股票代码,提取其关键点数据,计算其特征化数据,同时对关键点数据标准化处理(极差法)for t in range(len(code)): data=DA.loc[DA.iloc[:,0].values==code[t],[’Trddt’,’Clsprc’]] I1=data[’Trddt’].values>=’2017-05-01’ I2=data[’Trddt’].values<=’2017-07-31’ I=I1&I2 #提取第t个股票代码的价格数据,同时下标重排,从0开始 dt=data.loc[I,[’Clsprc’]][’Clsprc’] dt=pd.Series(dt.values,index=range(len(dt))) if len(dt)==M: p=p+1 keydata=df.get_keydata(dt,num) T=df.get_tz(keydata) y=keydata KeyData[p,0]=code[t] Data[p,0]=code[t] Data[p,1:]=T KeyData_index[p,0]=code[t] #对关键点数据做极差化处理  KeyData[p,1:]=(y.values-min(y.values))/(max(y.values)-min(y.values)) KeyData_index[p,1:]=y.indexData=Data[0:p,:]KeyData=KeyData[0:p,:]KeyData_index=KeyData_index[0:p,:]

最终得到股票形态特征数据Data、关键价格点数据KeyData、关键价格点数据对应的序号KeyData_index。其中关键价格点数据KeyData已做极差化处理,即数据标准化为[0,1]之间。部分结果如图所示:形态特征数据Data(350,10)、关键价格点数据KeyData(350,11)、关键价格点数据对应的序号KeyData_index(350,11)。



本节最后一个程序框21-36行代码存在疑惑,不理解p的设定。

扫二维码,关注我的学习笔记

公众号|数据实践笔记RENA

个人微信|Gemini_Rena

入门Python,欢迎商讨与交流


0人打赏
发表评论
请先 注册 / 登录 后参与评论
评论
推荐阅读
"华为实验室起火"?官方回应
东莞市委宣传部回应第一财经记者表示:今天下午,一个在建的项目着火,没有人员伤亡。该建筑与实验室并无关系,正在装修和建设之中,没有投入使用。9月25日下午消息,网友爆料称华为位于东莞的松山湖实验室突然起火,火势不小,现场浓烟滚滚。据报道,松山湖消防救援站已经赶往救援。从网友发布的视频来看,着火的是一栋大楼,现场烟雾强烈,整个视频画面中都是黑色的烟雾,看起来火势不小。据了解,华为松山湖基地是华为终端公
2020-09-26 00:47
《关于改革社会组织管理制度促进社会组织健康有序发展的意见》
中共中央办公厅 国务院办公厅印发《关于改革社会组织管理制度促进社会组织健康有序发展的意见》近日,中共中央办公厅、国务院办公厅印发了《关于改革社会组织管理制度促进社会组织健康有序发展的意见》,并发出通知,要求各地区各部门结合实际认真贯彻执行。《关于改革社会组织管理制度促进社会组织健康有序发展的意见》主要内容如下。为深入贯彻党的十八大和十八届二中、三中、四中、五中全会精神,进一步加强社会组织建设,激发
昨天 21:55
数据实践笔记RENA
3000块一桌,就吃这?一群百万大V傻眼
为什么我们既需要袁隆平,也需要李子柒
华为“断供”十日:“绝版”产品被热炒
一家四口同日死亡?连云港警方通报

推荐阅读

谁在定义“被害人有罪论”?
“甩锅秀”秀出美政客政治操守无底线
"华为实验室起火"?官方回应
《关于改革社会组织管理制度促进社会组织健康有序发展的意见》

推荐作者

纸上建筑
算法的牢笼甚于差评的阴影
麟剑28
【世界民族文明史系列】坎纳拉人与印度遮娄其王朝
杨昇说说
骑手不只是困在系统里,更是活在系统里