首页 > 编程知识 正文

全自动量化股票交易系统,量化选股

时间:2023-05-04 07:46:18 阅读:112990 作者:4032

量化交易软件(15 )自行进行所有量化AI框架的股东选定设计

之前我们学习了单株分析、回测功能。 接下来,我们开始设计股线和量化分析的功能。

在设计撑杆之前,学习一些python的基本操作技巧。

一、股票代码处理技术

1、数字类型转换

获取的数据格式都不同。 特别是股票代码,有的带有数字1、字母1、’60000.sh’、’000001.SZ’、’000001.xshe’、’000300.xshg’等后缀。 无论如何,我们都很容易转换成所有标准的股票代码格式。

深圳股票代码:“‘000001.SZ”

上海股票代码:“‘600000.SH”

指数代码:“‘000300.ZS”

各种数据转换函数命令如下:

#将数字int转换为字符串strs_code=str(n_code )字符串str转换为数字intn_code=int ) s_code代码演示文稿:

n_code=10#数字int是字符串strs_code=str(n_code ) print (s_code,type ) s _ code ) )字符串str是数字intn_code=int

10类‘str’

10类‘int’

2 .字符串处理

可以看到字符串“10”。 不够长6。 必须在前面补充’0’。

在字符串中的数字前面添加0,然后使用函数zfill (查看以下演示代码和结果。

s_code='10'#字符串数字前加上0s_code=s_code.zfill(6)输出结果:

000010 class‘str’

3、添加股票后缀

请看下面的股票代码演示:

#全股代码转换defttsn(s ) : s=s.strip ) if ) len )6 and len(s ) s )0) : s=s.zfill(6)6).SZ' if len(s ) 宽股代码转换defjqsn(s ) : s=s.strip ) if(len ) s )6andl lsn==6: ifs [ 0:1 ]=='0' : s=s '.xshe '

pandas基于numpy构建,支持时间序列分析。 pandas有两种主要的数据结构: Series和DataFrame。

Series类似于一维数组和词典(map )数据结构的组合。 它由一组数据和一组与数据相对应的数据标签(索引索引)组成。 此数据和索引标签的基础都是一维ndarray数组。 索引可以理解为行索引。 Series表示索引为左,数据为右。

DataFrame是一种类似于表的数据结构,索引包含列索引和行索引,而每一列都包含一组排序的列,可以是不同的值类型(数字、字符串、布尔值等)。 DataFrame中的每一行和每一列都是Series,该Series的name属性是当前行索引名/列索引名。

股票数据一般存储在pandas包的数据框架中。

上述方法无法处理数据帧的所有列数据。 在循环操作中又充分发挥了Python速度慢的弱点,所以可以使用一些Python的技巧来提高速度。

可以通过以下命令立即对DataFrame数组进行股票格式转换:

#短字符串补全快速运算base.code=['0'*(6-len ) x ) ) xforxinbase.code.astype(str ) ]三、股票代码运算

我们通过一些算法,如财务数据和技术指标等战略,筛选出了一系列数据。 如何从这些数据构建我们的目标替代股票池。 完成股票池之间的逻辑运算。

例如股票池合并、黑名单过滤等运算。 充分利用Python的特点和优势,快速进行股票池的计算。

我们可以充分利用这些不同的数据特性,快速完成所需的工作。

1、pandas与numpy数据的相互转换

以下是DataFrame股票代码列表的示例。 重点是看说明记住例子。 演示代码如下。

importpandasaspdimportnumpyasnpimporthp _ dataa shp #业绩报告数据' ' report_data返回数据格式如下: code,代码name,名称esp,每股利润esp

its_yoy,净利润同比(%)distrib,分配方案report_date,发布日期'''#获取获取2015年第4季度的业绩报告数据t2015=hp.get_report_data(2015,4) #选取eps_yoy,每股收益同比(%)的排名前20位股票数据。top20=t2015.sort_values(by='eps_yoy',ascending=False).head(20)#获取股票代码的Series序列,带原始数据索引S_code=top20.code#dataframe重建索引,从0开始顺序S_code2 = S_code.reset_index(drop=True)#将股票代码Series序列转为列表list数据l_code=S_code.tolist()#将列表list转为array序列数据,与Series序列区别是无索引。a_code=np.array( l_code)#将array序列数据转为 Series序列,增加了从0开始顺序自然索引。S_code3= pd.Series(a_code, name = 'code')#部分数据内容输出结果print('n----S_code-----获取股票代码的Series序列,带原始数据索引')print(S_code)print('n----S_code2-----重建索引,从0开始顺序')print(S_code2)print('n----l_code-----将股票代码Series序列转为列表list数据')print(l_code)print('n----a_code-----将列表list转为array序列数据,与Series序列区别是无索引。')print(a_code)print('n----S_code3-----将array序列数据转为 Series序列,增加了从0开始顺序自然索引。')print(S_code3)

程序运行结果如下图:

2、列表(list)和集合(set)相互转换
Python数据格式有列表(list)和集合(set)。
列表有重复数据,并且 有序。
集合无重复数据,并且无序。
我们可以利用集合(set)的无重复特性,将股票代码转化为集合(set),能够快速完成股票代码去掉重复,股票代码池的合并,剔除股票黑名单等运算。
(1) 列表运算

#假定我们通过策略1筛选出股票池列表bk1bk1=['600000', '600001', '600002', '600003', '600004', '000001', '000010']#我们通过策略2筛选出股票池列表bk2,我们可以看到前面3个数据重复。bk2=['600000', '600001', '600002','600981', '600080', '600191']#给bk1查入数据数据,list.insert(i, 数据) bk1=bk1.insert(1, '300751') #在指定位置插入元素#给bk2增加数据bk2=bk2.append('600390')#删除bk2最后一个数据bk2=bk2.pop() #将最后一位的元素删除#删除bk1中间第3个数据。bk1=bk1.pop(3) #删除指定位置的元素

(2) 集合运算
python的set和其他语言类似, 是一个无序不重复元素集, 基本功能包括关系测试和消除重复元素. 集合对象还支持union(联合), intersection(交), difference(差)和sysmmetric difference(对称差集)等数学运算。
sets 支持 x in set, len(set),和 for x in set。作为一个无序的集合,sets不记录元素位置或者插入点。因此,sets不支持 indexing, slicing, 或其它类序列(sequence-like)的操作。
集合t,s支持一系列标准操作,包括并集、交集、差集和对称差集,例如:
a = t | s # t 和 s的并集
b = t & s # t 和 s的交集
c = t – s # 求差集(项在t中,但不在s中)
d = t ^ s # 对称差集(项在t或s中,但不会同时出现在二者中)
下面给出集合运算的演示。

#建立集合st1,st2print('n----st1----')st1=set(['002027', '600061', '600080','600659'])print(st1)print('n----st2----')st2=set(['000001', '600061', '600088','000002'])print(st2)#集合中增加可以通过列表list增加,再转换为集合set。#也可以通过集合并集运算来增加元素。print('n----st1---- st1中增加600090')st1=st1.union(set(['600090']))print(st1)print('n----a = st1 | st2-----')#集合运算a = st1 | st2 # st1 和 st2的并集print(a)print('n----b = st1 & st2 -----')b = st1 & st2 # st1和 st2的交集print(b)print('n----c = st1 - st2 -----')c = st1 - st2 # 求差集(项在st1中,但不在st2中)print(c)print('n----d = st1 ^ st2-----')d = st1 ^ st2 # 对称差集(项在st1或st2中,但不会同时出现在二者中)print(d)print('n----st2 remove 600088-----')#集合元素删除st2=st2.difference(set(['600088']))print(st2)print(type(st1),type(st2))

程序运行结果如下图:

(3)列表和集合转换
我们根据算法需要,利用列表和集合的特性,来实现我们的要求

#假定我们通过策略1筛选出股票池列表bk1,但又股票重复bk1=['600000', '600001', '600002', '600001', '600000', '000001', '000010','000002']print('n-----列表bk1----')print(bk1)print('n-----集合A----')#转换为集合A来去掉重复A=set(bk1)print(A)print('n-----列表bk2----')#将结果转为列表bk2bk2=list(A)print(bk2)print('n-----列表bk2排序----')#对bk2进行排序bk3=bk2.sort()print(bk2)

程序运行结果如下图:

今天我给大家介绍了关于股票代码和股票板块运算的基本知识。下次开始设计有关选股器画面的设计。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。