版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第2章金融数据在量化交易中,作为一切交易和分析基础的金融数据,是在量化交易环节中最为重要的,而金融数据有不同的表现形式,例如:整数、浮点数、复数、字符串、列表、元组、字典和集合,等等。2.1金融数据类型2.1.1
数值类型变量数值类型是基本数据类型之一。在量化交易中,Python数值类型变量主要有四种:int:整型变量,是最常见的整数,例如,0、1、3000等。float:浮点型变量,是带有小数的数值,例如,3.14、100.0、5.67等。complex:复数型变量,由实数部分和虚数部分组成,例如,1+2j或通过complex(1,2)表示。Python变量在创建时,不需要变量类型声明;在指定一个数值后,变量的数据类型被确定了;判断变量的类型,可以通过Python内置函数type()查看。2.1金融数据类型1.变量类型示例#定义收盘价close_price=5.85#定义成交量volume=1000#分别输出数据类型print(type(close_price))print(type(volume))2.1金融数据类型输出结果:<class'float'><class'int'>在金融计算过程中,数据类型一般是整型、浮点型。例如:股票交易一般是以100股为单位,用整型变量表示;股票、期货价格一般都有小数位,用浮点型变量表示。如果以整型变量来表示浮点型变量,就会失去小数位,造成极大影响。对数据精度要求极高的金融数据,所以必须加强数据类型的学习。2.1金融数据类型2.布尔类型变量Python中布尔类型是整型子类。布尔类型变量有两个值:True和False,表示真和假。布尔类型变量是一种特殊的数字,True代表1,False代表0。布尔类型变量,通常与流程控制或条件判断进行结合使用。定义两个价格变量,一个代表当前价位current_price,一个代表目标价位target_price,通过一个trade变量来表示目标价位和当前价位的关系判断结果(真或假)。2.1金融数据类型#定义当前价位current_price=5.8#定义目标价位target_price=6.0trade=target_price>current_price#输出结果print(type(trade))<class'bool'>print(trade)True2.1金融数据类型False的布尔值是假之外,还有0和取值为空的数据类型(例如:空字符串“”或‘’,空的列表、字典或集合,以及None类型),其他的数据的结果都是True。判断一个变量是否的布尔值可以通过Python的内置函数bool()进行查看。2.1金融数据类型#定义一个空的字典var1={}print(bool(var1))False#定义一个空的列表var2=[]print(bool(var2))False2.1金融数据类型#定义一个空的元组var3=()print(bool(var3))False#定义一个None类型var4=Noneprint(bool(var4))False2.1金融数据类型#定义一个空字符串var5=''print(bool(var5))True#定义一个数值0var6=0print(bool(var6))False2.1金融数据类型2.1.2字符串类型变量在量化交易中,有些数据,例如:股票名称、证券所名称以及策略名称等,通过字符串类型变量表示。Python字符串类型变量是一串字符组合,用来表示文本数据,可以通过单引号‘’或双引号“”表示字符串。#定义一个字符串表示股票代码stock_id='sh000001'#定义一个字符串表示证券所exchange_name='SHFE'#定义一个字符串表示策略名称strategy_name='双均线策略'2.1金融数据类型字符串是由单个字符组合的数组,所以可以通过索引取出其中的部分字符。需要注意的是:字符串中每个字符的索引是从0开始,如图2-1所示。2.1金融数据类型索引方式是通过英文输入的方括号[]进行操作,代码如下:#定义一个字符串表示股票代码stock_id='sh000001'#从索引2的位置向后截取(包括位置2)stock_num=stock_id[2:]print(stock_num)#从索引0的位置到2的位置向后截取(不包括位置2)stock_num=stock_id[0:2]print(stock_num)2.1金融数据类型需要注意,在进行索引时开始位置是包括的,但是结束位置是不包括的,所以[0:2]实际上包含的是第0、1位置的字符,第2位置的字符不包括在内,所以输出结果是:000001sh除了从前向后的方式进行索引之外,也可以从后向前进行索引,只不过它们的索引位置要改变,如图2-2所示。2.1金融数据类型在进行字符串的反向索引时,最后面的字符索引位置是-1,为了得到和上面一样的输出结果,代码如下:#定义一个字符串表示股票代码stock_id='sh000001'#从索引-6的位置向后截取(包括位置-6)stock_num=stock_id[-6:]print(stock_num)#从索引-8的位置到-6的位置向后截取(不包括位置-6)stock_num=stock_id[-8:-6]print(stock_num)2.1金融数据类型反向索引时,索引的起始位置是包括在内,索引的结束位置不包括在内。除了索引之外,字符串很多内置函数可以直接调用,用来对字符串进行处理,下面以几个常见函数为例进行讲解。1.字符查找函数str.find()查找一个字符串中是否包含某个子字符串,使用find()函数实现。#定义一个字符串表示股票代码stock_id='sh000001'#查看是否包含01子字符串print(stock_id.find('01'))输出结果是01子字符串的开始位置6。2.1金融数据类型2.字符替换函数str.replace()替换一个字符串中某个子字符串,使用replace()函数实现。#定义一个字符串表示股票代码stock_id='sh000001'#替换01子字符串print(stock_id.replace('01','02'))输出结果是sh000002。2.1金融数据类型3.字符删除函数str.strip()删除一个字符串中包含的某个子字符串,使用strip()函数实现。#定义一个字符串表示股票代码stock_id='sh000001'#删除sh子字符串print(stock_id.strip('sh'))输出结果是000001。2.1金融数据类型#定义一个字符串name='hello
world\n'#删除开头的空格、结尾的空格和换行print(name.strip())输出结果是helloworld。2.1金融数据类型4.字符连接函数str.join()把列表中每个元素中间用一个字符连接,拼成一个字符串,使用join()函数实现。#定义一个列表stock_list=['sh000001','sh000002','sh000003']#用空格将上面列表中的元素连接起来print(''.join(stock_list))输出结果是sh000001sh000002sh000003。2.1金融数据类型5.字符统计函数str.count()计算一个字符串中包含某个子字符串的个数,使用count()函数实现。#定义一个字符串stock_id='sh000001'#计算子字符串出现的次数print(stock_id.count('0'))输出结果是5。2.1金融数据类型2.1.3列表类型变量列表类型数据变量用于数据存储,从交易所接收新的价格数据,首先需要存储价格数据,然后利用它们计算各种数据指标或用于分析。列表是一个很多元素组成的集合,元素可以是数值类型、字符串和列表。列表通过方括号[]创建,每个元素之间以逗号隔开。代码如下:2.1金融数据类型#定义一个列表表示价格序列price_list=[5.81,5.82,5.84,5.88,5.60,5.89,5.86]#定义一个列表表示股票代码列表stock_list=['sh000001','sh000002','sh000003']#定义一个时间列表datetime_list=['2019/10/01','2019/10/02','2019/10/03','2019/10/04']列表索引分为正向索引和反向索引,正向索引从0到n-1,反向索引从-n到-1,如图2-3所示。索引方式代码如下:2.1金融数据类型#定义一个列表表示价格序列price_list=[5.81,5.82,5.84,5.88,5.60,5.89,5.86]#索引位置2到5之间的数据(不包括位置5)print(price_list[2:5])#索引位置2到结尾的数据print(price_list[2:])#索引位置-4到结的数据(包括位置-4)print(price_list[-4:])#索引位置-6到-4的数据(不包括位置-4)print(price_list[-6:-4])2.1金融数据类型#输出结果[5.84,5.88,5.6][5.84,5.88,5.6,5.89,5.86][5.88,5.6,5.89,5.86][5.82,5.84]列表的内置函数可以直接调用,用于实现对列表的元素进行操作,介绍几种常见的内置函数。2.1金融数据类型1.追加元素函数append()向一个列表末尾追加元素,使用append()函数实现。#定义一个列表表示价格序列price_list=[5.81,5.82,5.84,5.88,5.60,5.89,5.86]#追加数据price_list.append(5.89)#输出追加数据之后的列表print(price_list)[5.81,5.82,5.84,5.88,5.6,5.89,5.86,5.89]2.1金融数据类型append()也可以追加列表,即列表嵌套。例如:股票市场中每个K线由开盘价、最高价、最低价和收盘价四个价位表示,将四个价位组成的列表追加到一个高开低收的列表中。#定义一个空的列表存放高开低收列表ohlc_list=[]#追加一个K线中的四个价位ohlc_list.append([5.81,5.88,5.77,5.84])#追加一个K线中的四个价位ohlc_list.append([5.82,5.89,5.80,5.83])2.1金融数据类型#输出结果print(ohlc_list)[[5.81,5.88,5.77,5.84],[5.82,5.89,5.8,5.83]]2.插入元素函数insert()append()函数是在列表末尾追加元素。在列表中指定位置追加元素,使用insert()函数实现。insert()函数需要传入两个参数,一个是要插入的位置,另一个是要插入的元素。2.1金融数据类型#定义一个列表表示价格序列price_list=[5.81,5.82,5.84,5.88,5.60,5.89,5.86]#在位置3处插入新的元素price_list.insert(3,5.90)#输出结果print(price_list)[5.81,5.82,5.84,5.9,5.88,5.6,5.89,5.86]append()函数和insert()函数是在原列表的基础上直接进行修改,所以没有返回值。2.1金融数据类型3.删除元素函数remove()和pop()删除一个列表中指定的元素使用remove()函数实现,传入要删除的元素作为参数。删除一个列表中指定位置的元素使用pop()函数实现,传入待删除元素的位置作为参数,如果没有传入参数,默认删除最后加入的元素。2.1金融数据类型#定义一个列表表示价格序列price_list=[5.81,5.82,5.84,5.88,5.60,5.89,5.86]#删除元素5.81price_list.remove(5.81)#输出结果print(price_list)[5.82,5.84,5.88,5.6,5.89,5.86]2.1金融数据类型#定义一个列表表示价格序列price_list=[5.81,5.82,5.84,5.88,5.60,5.89,5.86]#删除位置1的元素price_list.pop(1)#输出结果print(price_list)[5.81,5.84,5.88,5.6,5.89,5.86]2.1金融数据类型#定义一个列表表示价格序列price_list=[5.81,5.82,5.84,5.88,5.60,5.89,5.86]#删除最后加入的元素price_list.pop()#输出结果print(price_list)[5.81,5.82,5.84,5.88,5.6,5.89]2.1金融数据类型4.元素排序函数sort()对列表中的元素进行排序,使用sort()函数实现,需要传入一个参数reverse,表示是正向排序还是逆向排序,reverse传入的值是布尔值True或False。#定义一个列表表示价格序列price_list=[5.81,5.82,5.84,5.88,5.60,5.89,5.86]#列表正序排序price_list.sort(reverse=False)#输出排序后的结果print(price_list)[5.6,5.81,5.82,5.84,5.86,5.88,5.89]2.1金融数据类型#定义一个列表表示价格序列price_list=[5.81,5.82,5.84,5.88,5.60,5.89,5.86]#列表逆序排序price_list.sort(reverse=True)#输出排序后的结果print(price_list)[5.89,5.88,5.86,5.84,5.82,5.81,5.6]2.1金融数据类型在量化交易过程中,通过历史数据对策略进行回测,回测的过程就是对历史数据进行遍历,列表遍历通常和for循环搭配使用。#定义一个列表表示价格序列price_list=[5.81,5.82,5.84,5.88,5.60,5.89,5.86]#遍历列表forpriceinprice_list:#分别输出每个价格
print(‘当前的价格是’,price)2.1金融数据类型#输出遍历结果当前的价格是5.81当前的价格是5.82当前的价格是5.84当前的价格是5.88当前的价格是5.6当前的价格是5.89当前的价格是5.862.1金融数据类型2.1.4元组类型变量与列表相同,元组用于存储数据。与列表不同的是,元组一旦创建,元组中的元素不能进行追加、删除等操作,即元组的元素无法进行任何修改。另外,元组的元素可以是不同的元素。元组通过圆括号“()”创建,圆括号是一种运算符。为了区分只有一个元素的元组和圆括号运算符之间的区别,需要在只有一个元素的元组,其元素之后加一个逗号。2.1金融数据类型代码如下:#定义一个元组data=(‘strategy_parameter’,100.0,20,‘others’,500)#只有一个元素的元组one_data=(100,)元组的索引是通过方括号“[]”进行索引。print(data[0])print(data[:3])print(data[1:4])2.1金融数据类型#输出结果strategy_parameter('strategy_parameter',100.0,20)(100.0,20,'others')元组一旦创建,元组的元素无法进行任何修改,如果修改,程序就会报错。这一特点,适合存储一些策略的超参数等。2.1金融数据类型2.1.5
集合类型变量集合(set),是一种存储不重复元素的数据类型,通过大括号“{}”或通过内置函数set()传入一个列表进行创建。集合中的元素是无序的。一段时间内股市中涨停的股票或跌停的股票有哪些,通过集合创建。#定义一个列表stock_list=[‘600286’,‘600287’,‘600288’,‘600289’,‘600288’,‘600286’]2.1金融数据类型#定义一个列表stock_list=[‘600286’,‘600287’,‘600288’,‘600289’,‘600288’,‘600286’]#通过set()函数定义集合stock_set=set(stock_list)#输出结果print(stock_set)#不重复的元素,无序{'600288','600286','600287','600289'}2.1金融数据类型#通过大括号定义集合stock_set={‘600286’,‘600287’,‘600288’,‘600289’,‘600288’,‘600286’}#输出结果print(stock_set)#不重复的元素,无序{'600288','600286','600287','600289'}#add()函数添加元素stock_set.add(‘600300’)2.1金融数据类型#add()函数添加元素stock_set.add(‘600300’)#输出结果print(stock_set)#不重复的元素,无序{'600288','600289','600300','600287','600286'}2.1金融数据类型Update()函数向集合中添加新的元素,元素可以是迭代的,包括字符串、列表和元组等。Update()函数先对这些元素进行迭代,再通过集合对元素去重并添加。#update()函数添加字符串元素stock_set.update(‘sh000001’)#输出结果print(stock_set)#不重复的元素,无序{'600300','600286','h','600289','600287','600288','0','1','s'}2.1金融数据类型#update()函数添加列表元素stock_set.update([5.65,5.88,5.88])#输出结果print(stock_set)#不重复的元素,无序{'600300',5.65,5.88,'600286','h','600289','600287','600288','0','1','s'}2.1金融数据类型remove()函数、pop()函数、clear()函数删除集合中的元素。remove()函数删除集合中指定的一个元素,pop()函数随机删除集合中的一个元素,clear()函数清空整个集合。#通过大括号定义集合stock_set={'600286','600287','600288','600289','600288','600286'}#remove()函数删除一个元素stock_set.remove(‘600286’)2.1金融数据类型#输出结果print(stock_set){'600287','600289','600288'}#pop()函数删除一个元素stock_set.pop()#输出结果print(stock_set){'600289','600288'}2.1金融数据类型#clear()函数清空元素stock_set.clear()#输出结果print(stock_set)set()2.1.6
字典类型变量字典(dict)通过键值对的形式存储数据,字典中的元素是无序的。字典通过大括号“{}”进行创建,元素以key:value对的形式存储。2.1金融数据类型列表、元组通过下标的方式索引元素。字典通过键(中括号“[]”)索引元素。#定义一个字典stock_price={'stock_A':5.8,'stock_B':5.9,'stock_C':6.8,'stock_D':4.9}#输出结果print(stock_price['stock_A'])print(stock_price['stock_D'])5.84.92.1金融数据类型#keys()函数遍历字典,通过中括号“[]”索引元素forkeyinstock_price.keys():print(stock_price[key])#输出结果是键的值5.85.96.84.92.1金融数据类型#items()函数遍历字典foriteminstock_price.items():print(item)#输出结果是元组('stock_A',5.8)('stock_B',5.9)('stock_C',6.8)('stock_D',4.9)2.1金融数据类型2.1.7
数据类型之间的转换股票价格一般以字符串形式存储,对字符串数据无法进行数值运算。所以,需要对数据类型进行转换。1.字符串与数值类型变量之间的转换数据类型转换通过相应的内置函数实现,int()函数转换为整型数据,float()函数转换为浮点型数据,str()函数转换为字符型数据。2.1金融数据类型#定义字符串类型变量price='5.88'volumn='100'#转换为数值类型变量price=float(price)volumn=int(volumn)#输出转换后的数据类型print(type(price))print(type(volumn))<class'float'><class'int'>2.1金融数据类型#定义数值类型变量price=5.88volumn=100#转换为字符串类型变量price=str(price)volumn=str(volumn)#输出转换后的数据类型print(type(price))print(type(volumn))<class'str'><class'str'>2.1金融数据类型2.字符串与列表类型变量之间的转换文件中的每一行数据以字符串形式存储。读取文件时,需要对文件拆分,转换为列表形式。字符串通过内置函数split()转换为列表,字符串之间通过符号隔开;字符串通过内置函数list()分割为一个个的字符。列表通过内置函数join()转换为字符串,以一个连接符对列表中每个元素进行连接,将连接后的结果组成一个字符串。2.1金融数据类型#定义字符串类型变量stock_ids='sh000001sh000002sh000003sh000004sh000005sh000006'#字符串变量转换为列表变量stock_list=stock_ids.split('')#输出转换后的结果print(stock_list)['sh000001','','sh000002','','sh000003','','sh000004','','sh000005','','sh000006']2.1金融数据类型#定义字符串类型变量stock_ids='sh000001'#字符串变量转换为列表变量stock_list=list(stock_ids)#输出分割后的结果print(stock_list)['s','h','0','0','0','0','0','1']2.1金融数据类型#定义列表变量stock_list=['sh000001','sh000002','sh000003','sh000004','sh000005','sh000006']#列表转换为字符串变量,以空格连接stock_str=''.join(stock_list)#输出转换后的结果print(stock_str)sh000001sh000002sh000003sh000004sh000005sh0000062.2程序控制结构2.2.1
条件判断语句在量化交易中,尤其是编写策略,需要判断当前条件是否满足设定的要求以此来决定是否要进行交易。满足条件,发出交易指令;不满足条件,继续等待交易机会。1.逻辑运算数值运算是通过加减乘除对数值进行运算,结果是数值。逻辑运算是对布尔类型变量进行运算,结果是布尔值True或False。2.2程序控制结构#逻辑判断print(TrueandTrue)print(True
andFalse)print(notFalse)#表达式之间的逻辑运算price=5.85target_price=6.00position=02.2程序控制结构print(price
>
target_price
andposition==0)print(price>target_priceorposition==1)print(notprice>target_price)print((price
<
target_priceandprice>0)andposition==0)True2.2程序控制结构#输出结果TrueFalseTrueFalseFalseTrueTrue2.2程序控制结构2.if…else条件判断在量化交易中,if…else条件判断语句通常用来对交易入场时机进行判断,首先定义一个价格数据列表,再定义一个买入价格和卖出价格,以及是否持仓的布尔变量,最后通过for循环对列表进行遍历,用if…else语句来判断是否达到买入点。2.2程序控制结构#定义一个价格列表price_list=[5.78,5.80,5.81,5.82,5.85,5.87,5.80]#定义一个买入价位buy_price=5.80#定义一个卖出价位sell_price=5.85#定义是否持仓position=False2.2程序控制结构#for循环遍历价格forpriceinprice_list:
ifprice>buy_priceandnotposition:print('buyat',price)position=True
else:print('donothing')2.2程序控制结构#输出运行结果donothingdonothingbuyat5.81donothingdonothingdonothingdonothing2.2程序控制结构3.if…elif…else多个条件判断#定义一个价格列表price_list=[5.78,5.80,5.81,5.82,5.85,5.87,5.80]#定义一个买入价位buy_price=5.80#定义一个卖出价位sell_price=5.85#定义是否持仓position=False2.2程序控制结构#for循环遍历价格forpriceinprice_list:
ifprice>buy_priceandnotposition:print('buyat',price)position=True
elifprice>sell_priceandposition:print('sellat',price)position=False
else:print('donothing')2.2程序控制结构#输出运行结果donothingdonothingbuyat5.81donothingdonothingsellat5.87donothing2.2程序控制结构2.2.2
循环语句在量化交易中,用循环语句对历史数据进行回测以验证策略是否有效。在实盘交易中,用循环语句接收来自交易所的新数据。1.for循环for循环可以直接遍历价格列表,也可以通过内置函数len()和range()索引遍历价格列表,它们的作用分别是计算列表长度和生成一个指定的序列数。2.2程序控制结构#定义一个一维价格列表price_list=[5.78,5.80,5.81,5.82,5.85,5.87,5.80]#for循环直接遍历一维价格列表forpriceinprice_list: print(‘当前的价格是’,price)#for循环通过索引遍历一维价格列表foriinrange(len(price_list)):print(‘当前的价格是’,price_list[i])2.2程序控制结构#输出运行结果当前的价格是5.78当前的价格是5.8当前的价格是5.81当前的价格是5.82当前的价格是5.85当前的价格是5.872.2程序控制结构当前的价格是5.8当前的价格是5.78当前的价格是5.8当前的价格是5.81当前的价格是5.82当前的价格是5.85当前的价格是5.87当前的价格是5.82.2程序控制结构对存储高开低收价格的二维价格列表进行遍历,需要使用for循环嵌套。第一种方法是通过两个for循环进行遍历,第二种方法是通过内置函数len()和range()生成列表的索引序。#定义一个二维价格列表price_list=[[5.78,5.83,5.77,5.82],
[5.78,5.83,5.77,5.82],[5.72,5.80,5.71,5.82]]#for循环遍历二维价格列表forohlc_priceinprice_list:
forpriceinohlc_price:2.2程序控制结构print(‘当前的价格是’,price)#for循环通过索引遍历二维价格列表foriinrange(len(price_list)):forjinrange(len(price_list[i])):print('当前的价格是',price_list[i][j])2.2程序控制结构#输出运行结果当前的价格是5.78当前的价格是5.83当前的价格是5.77当前的价格是5.82当前的价格是5.78当前的价格是5.83当前的价格是5.77当前的价格是5.822.2程序控制结构当前的价格是5.78当前的价格是5.83当前的价格是5.77当前的价格是5.82当前的价格是5.78当前的价格是5.83当前的价格是5.772.2程序控制结构2.while循环#定义一个一维价格列表price_list=[5.78,5.80,5.81,5.82,5.85,5.87,5.80]#定义一个计数变量count=0#while循环遍历列表whilecount!=len(price_list)print('当前的价格是',price_list[count]) count+=12.2程序控制结构2.2.1
条件判断语句在量化交易中,尤其是编写策略,需要判断当前条件是否满足设定的要求以此来决定是否要进行交易。满足条件,发出交易指令;不满足条件,继续等待交易机会。1.逻辑运算数值运算是通过加减乘除对数值进行运算,结果是数值。逻辑运算是对布尔类型变量进行运算,结果是布尔值True或False。2.2程序控制结构#输出运行结果当前的价格是5.78当前的价格是5.8当前的价格是5.81当前的价格是5.82当前的价格是5.85当前的价格是5.87当前的价格是5.82.3函数在Python量化的过程中,将一段实现某个复杂功能的代码封装为函数,实现代码的重复利用,减少代码量,便于直接调用。在函数参数传递过程中,实参的个数和位置必须与函数中定义的形参一致。2.3函数#定义一个函数defprint_information(id,price):print('合约',id,'价格',price)#定义变量stock_id='rb1901'stock_price=3100#调用函数print_information(stock_id,stock_price)#输出运行结果合约rb1901价格31002.3函数通过内置函数sorted()对列表、字典排序。代码如下:#定义一个列表price_list=[3100,3120,3101,3111,3115,3128,3121]#sorted()函数升序sorted_price_list=sorted(price_list)#输出运行结果print(sorted_price_list)[3100,3101,3111,3115,3120,3121,3128]2.3函数通过内置函数sorted()对列表、字典排序。代码如下:#sorted()函数降序sorted_price_list=sorted(price_list,reverse=True)#输出运行结果print(sorted_price_list)[3128,3121,3120,3115,3111,3101,3100]2.3函数通过内置函数sorted(),分别对字典按照键进行排序、按照值进行排序。#定义一个字典future_dict={'rb1901':3100,'a1901':3200,'m19101':3300,'bu1901':2700}#按照键排序sorted_future_dict=sorted(future_dict.items(),key=lambdax:x[0])2.3函数#输出运行结果print(sorted_future_dict)[('a1901',3200),('bu1901',2700),('m19101',3300),('rb1901',3100)]#按照值排序sorted_future_dict=sorted(future_dict.items(),key=lambdax:x[1])#输出运行结果print(sorted_future_dict)[('bu1901',2700),('rb1901',3100),('a1901',3200),('m19101',3300)]2.4文件在Python量化交易的过程中,价格、指数等可以存储文件,方便数据存储、管理和检索。Python代码如下:importpandasaspdimportmatplotlibasmplimportwarningswarnings.filterwarnings("ignore")mpl.rcParams['font.sans-serif']=[u'SimHei']mpl.rcParams['axes.unicode_minus']=Falseif__name__=='__main__':2.4文件在Python量化交易的过程中,价格、指数等可以存储文件,方便数据存储、管理和检索。Python代码如下:#定义一个一维价格列表
price_list1=[5.78,5.80,5.81,5.82,5.85,5.87,5.80]df1=pd.Series(data=price_list1)print(df1)df1.to_excel('wenjian-01.xlsx')2.4文件在Python量化交易的过程中,价格、指数等可以存储文件,方便数据存储、管理和检索。Python代码如下:#定义一个二维价格列表
price_list2=[[5.78,5.83,5.77,5.82],[5.78,5.83,5.77,5.82],[5.72,5.80,5.71,5.82]]df2=pd.DataFrame(data=price_list2)print(df2)df2.to_excel('wenjian-02.xlsx')2.4文件在Python量化交易的过程中,价格、指数等可以存储文件,方便数据存储、管理和检索。Python代码如下:#定义一个价格字典
stock_price1={'stock_A':5.8,'stock_B':5.9,'stock_C':6.8,'stock_D':4.9}df3=pd.Series(data=stock_price1)print(df3)df3.to_excel('wenjian-03.xlsx')2.4文件在Python量化交易的过程中,价格、指数等可以存储文件,方便数据存储、管理和检索。Python代码如下:#定义一个字典
stock_price2={'stock_A':[5.78,5.83,5.77,5.82],'stock_B':[5.78,5.83,5.77,5.82],'stock_C':[5.72,5.80,5.71,5.82],'stock_D':[5.76,6.80,6.71,8.82]}df4=pd.DataFrame(data=stock_price2)print(df4)df4.to_excel('wenjian-04.xlsx')四个价格类别分别存储四个Excel文档。2.5面向对象程序设计在量化交易中,通过面向对象的思想对交易策略进行设计,可以使得交易策略更加规范和易于扩展。很多量化交易策略是一个抽象的概念,一个基于双均线原理并没有设定参数的具体的策略是一个实例化的对象。1.类与对象#创建一个类classStrategy():
#类变量
strategy_name=‘CTA策略’2.5面向对象程序设计classStrategy():
#类变量
strategy_name=‘CTA策略’
#构造函数
def__init__(self,parameter):#实例变量
self.parameter=parameter#创建实例化对象s1s1=Strategy(100)print(Strategy.strategy_name)2.5面向对象程序设计#创建实例化对象s1s1=Strategy(100)print(Strategy.strategy_name)print(s1.parameter)#输出运行结果CTA策略1002.5面向对象程序设计#创建实例化对象s2s2=Strategy(120)print(Strategy.strategy_name)print(s2.parameter)#输出运行结果CTA策略1202.5面向对象程序设计2.封装设计一个策略,通过内部一些变量的计算获得当前交易时机的判断,如果这些变量被直接调用和修改,会导致计算结果错误,产生决策错误。需要把这些关键、隐私的变量设置为私有变量,保留用于外部调用的函数。通过将变量名前加入“__”,设置私有变量。2.5面向对象程序设计#创建一个类classStrategy():
#类变量
strategy_name='CTA策略'#构造函数
def__init__(self,parameter):#实例变量
self.parameter=parameterdeftrading(self,current_price):#定义私有变量2.5面向对象程序设计deftrading(self,current_price):#定义私有变量
self.__target_price=1000ifcurrent_price>self.__target_price:print('买入')#创建实例化对象ss=Strategy()s.__target_price=100#输出运行结果空白行没有输出结果。2.5面向对象程序设计3.继承一个策略类用于股票交易,股票通常只能做多和平多。期货交易,既可以做多和平多,也可以做空和平空。代码如下:#创建一个父类classStrategy():
#类变量
strategy_name=‘CTA策略’
#构造函数
def__init__(self,parameter):2.5面向对象程序设计classStrategy():
#类变量
strategy_name=‘CTA策略’
#构造函数
def__init__(self,parameter):
#实例变量
self.parameter=parameterdeflong(self,price):print(‘在价位’,price,‘进行做多’)2.5面向对象程序设计#创建一个子类classStrategy_Future(Strategy):defshort(self,price):print(‘在价位’,price,‘进行做空’)defcover(self,price):print(‘在价位’,price,‘进行平空’)#创建子类实例化s=Strategy_Future(100)2.5面向对象程序设计#创建子类实例化s=Strategy_Future(100)#调用父类方法s.long(1000)#调用子类方法s.short(2000)#输出运行结果在价位1000进行做多在价位2000进行做空2.5面向对象程序设计4.多态例如,父类是一个策略基类,是抽象了很多策略的基本属性和方法,子类可以是针对CTA的策略、价差交易的策略或高频交易的策略。代码如下:#定义一个父类classStrategy():#构造函数
def__init__(self):print('Strategy')defbuy(self,price):print('在价位',price,'买入')2.5面向对象程序设计#定义价差交易策略子类classSpreadTradingStrategy():#构造函数
def__init__(self):print('SpreadTradingStrategy')#定义高频交易策略子类classHighFreStrategy():#构造函数
def__init__(self):print('HighFrequencyStrategy')2.5面向对象程序设计子类继承父类,子类直接调用父类的方法。当父类的方法无法满足需求,子类继承父类的同名方法,并进行重写。代码如下:#定义一个父类classStrategy():#构造函数
def__init__(self):print('Strategy')defbuy(self,price):print('在价位',price,'买入')2.5面向对象程序设计#定义CTA策略子类classCTAStrategy():#构造函数
def__init__(self):print('CTAStrategy')2.5面向对象程序设计defbuy(self,price,type=’long’):
iftype=='long':print('在价位',price,'买入')
eliftype==‘short’:print('在价位',price,'做空')
else:print('error')2.6金融数据数学分析2.6.1
金融数据获取在量化策略的研究和开发过程中,首先是获取历史数据,只有得到历史数据,才能基于此开展进一步的研究,所以历史数据的获取对于量化研究是必不可少的阶段。Tushare是一个免费、开源的Python财经数据库,主要实现对股票等金融数据从数据采集、清洗加工到数据存储的过程,可以为金融量化分析人员提供快速、整洁和多样的便于分析的数据。在AnacondaPrompt中通过pip进行安装:pipinstalltushare。2.6金融数据数学分析#Tushare获取股票历史行情数据#导入tushare库importtushareasts#设置tokents.set_token('2bb1c458404dfda61f46adbc5ee576503cb9f61b99dc31e7d1581b41')#初始化pro接口pro=ts.pro_api()#数据接口获取数据,贵州茅台6005192.6金融数据数学分析#数据接口获取数据,贵州茅台600519fxyy=pro.daily(ts_code='600519.SH',start_date='2018-01-01',end_date='2023-12-31')fxyy=pd.DataFrame(fxyy).sort_values(by=['trade_date'])fxyy.to_excel('gzmt600519.xlsx')#输出数据集索引print('fxyy_index=',fxyy.index)2.6金融数据数学分析fxyy_index=Int64Index([1214,1213,1212,1211,1210,1209,1208,1207,1206,1205,...9,8,7,6,5,4,3,2,1,0],dtype='int64',length=1215)print('fxyy_columns=',fxyy.columns)fxyy_columns=Index(['ts_code','trade_date','open','high','low','close','pre_close','change','pct_chg','vol','amount'],dtype='object')2.6金融数据数学分析另外,tusharepro财经数据接口,也可以下载期货、现货、财务、债券、外汇、指数、公募基金、港股、美股等其它历史数据,用于投资决策分析。2.6.2NumPy金融数据操作NumPy库中的数组Ndarry,数组大小固定,元组类型相同,有效进行向量或矩阵运算。在量化交易中,Ndarry数组主要用于收益率的计算、滑动窗口的实现、10日和20日均线的计算。2.6金融数据数学分析1.收益率的计算对金融数据进行分析,不单单只分析资产的价格,还分析资产的收益率。资产的收益率可以体现资产的投资机会,收益率比价格更易处理,具有更好的统计性质。收益率有两种形式,一种是简单收益率,另一种是对数收益率。简单收益率是指两个相邻价格之间的差值,对数收益率是所有价格取对数之后的差值。定义一个数组表示股票收盘价的价格序列,通过np.diff()函数对传入的数组进行计算,默认返回一个由相邻数组元素的差值构成的数组,所以得到的结果比原先的数组长度少一个。2.6金融数据数学分析importnumpyasnp#定义价格序列close_price=np.array([10.81,10.85,10.92,10.75,10.59,10.86,11.02,11.13,11.34])#计算简单收益率sim_return_rate=np.diff(close_price)#输出结果print('sim_return_rate=',sim_return_rate)2.6金融数据数学分析sim_return_rate=[0.040.07-0.17-0.160.270.160.110.21]#计算对数收益率log_return_rate=np.diff(np.log(close_price))#输出结果print('log_return_rate=',log_return_rate)log_return_rate=[0.003693450.00643089-0.01569022-0.014995590.025176150.014625490.009932360.01869213]2.6金融数据数学分析2.滑动窗口的实现滑动窗口(SlidingWindow)主要用在金融衍生品数据分析、建立回测模型。先指定一定长度的窗口,然后将这个窗口应用于大量的数据,尤其是流式数据,之后的分析是基于窗口中的数据,每个窗口的数据分析结束,窗口再继续位移一个单位,如图2-4所示。2.6金融数据数学分析滑动窗口可以极大减少内存消耗,对数据的当前特征进行分析。指标计算、机器学习模型预测都需要用到滑动窗口。通过一个函数的形式,实现一个滑动窗口的功能。代码如下:#定义滑动窗口defcal_sliding_window(series,size):#定义一个数组存储每个滑动窗口
windows_arr=np.zeros(shape=(len(series)-size+1,size))2.6金融数据数学分析#遍历序列
foriinrange(len(series)-size+1):#截取窗口
windows=series[i:i+size]
windows_arr[i]=windowsreturnwindows_arr#调用上面的函数windows=cal_sliding_window(close_price,3)2.6金融数据数学分析#输出结果print(windows)[[10.8110.8510.92][10.8510.9210.75][10.9210.7510.59][10.7510.5910.86][10.5910.8611.02][10.8611.0211.13][11.0211.1311.34]]2.6金融数据数学分析函数名为cal_sliding_window,传入两个参数,一个是滑动窗口的序列series,一个是指定滑动窗口大小的size;定义一个数组windows_arr,它的shape是len(series)-size+1行size列,例如一个长度为9的序列,滑动窗口大小是3,即len(series)=9,size为3,滑动窗口有9-3+1=7,每个窗口有3个数据,即一个7×3的二维数组;通过for循环遍历,索引是从0到len(series)-size,共有len(series)-size+1个数据;每次通过滑动窗口截取序列数据中长度为size的数据,赋值windows_arr数组。2.6金融数据数学分析3.10日和20日均线的计算在股票市场中,10日均线(MA10)和20日均线(MA20)作为两种技术指标,用来判断当前市场的趋势情况。因此,很多均线策略例如CTA策略都会依赖均线作为买卖的信号。均线计算的代码如下:#计算均线defcal_MA(series,period=10):#定义数组存储MAma_arr=np.zeros(shape=len(series)-period+1)2.6金融数据数学分析
#先将数据转换为滑动窗口
windows=cal_sliding_window(series,period)foriinrange(len(windows)):ma_arr[i]=np.mean(windows[i])returnma_arr#定义价格序列price=np.random.normal(loc=10,scale=1,size=20)#计算MA指标ma_arr=cal_MA(price)2.6金融数据数学分析#输出结果print(ma_arr)[9.816248929.635762829.674116889.850087999.831875159.55058869.6109719.419707269.400034249.283984799.37485182]函数名为cal_MA,传入两个参数,一个是计算MA指标的series序列,一个是计算MA周期的参数period,默认值是10,默认计算MA10指标;2.6金融数据数学分析定义一个数组ma_arr,长度是len(series)-period+1,用于存储MA指标,因为一个长度为len(series)的序列在指定周期为period的前提下,得到MA指标序列的长度为len(series)-period+1;之后计算MA指标需要滑动窗口,直接调用函数计算滑动窗口;通过for循环遍历每个滑动窗口,通过np.mean()计算滑动窗口均值,赋值ma_arr数组。2.6金融数据数学分析2.6.3Pandas金融数据分析Pandas是一个数据分析库,在NumPy基础上实现,所以也具有数据运算功能。包含两种数据结构Series和DataFrame主要用于数据表示,Pandas丰富的函数库主要用于数据处理和分析。Series可以看做一维数组,具有数据标签;DataFrame可以看做二维数组,具有行索引和列索引。在分析金融衍生品数据时,不仅仅根据现有数据进行分析和推断,还需要对现有数据进一步计算,从而得到更具有直观性、价值性的数据。技术指标合成和多周期K线数据合成是Pandas经典的金融应用教学案例。2.6金融数据数学分析1.技术指标合成如何通过Pandas对金融衍生品数据计算一些常用的技术指标,并整合到先前的数据中。RSI(RelativeStrengthIndex)相对强弱指标,表示市场一定时期的景气程度。RSI可以用来评估多空力量的强弱程度,可以作为一种超买超卖指标,已经成为技术分析中最为广泛的技术指标之一。下面以RSI指标为例,将RSI指标整合到原数据中。2.6金融数据数学分析RSI指标的计算方法,是根据N日收盘涨幅与涨跌幅度之间的比率,即N日RSI=(N日收盘涨幅)/(N日涨跌幅),或通过简单平均值的方式进行计算,公式如下:
2.6金融数据数学分析MA(U,N)表示N日收盘涨幅的移动平均值,MA(D,N)表示N日跌幅的移动平均值。根据上面的计算方法,先实现一个函数用于计算RSI指标,代码如下:defcal_RSI(close,periods):#序列的长度length=len(close)#定义序列
rsies=[np.nan]*lengthiflength<=periods:returnrsies2.6金融数据数学分析
#平均上涨幅度
up_avg=0#平均下降幅度
down_avg=0#计算第一个周期内的RSI指标
first_t=close[:periods+1]foriinrange(1,len(first_t)):iffirst_t[i]>=first_t[i-1]:
up_avg+=first_t[i]-first_t[i-1]else:
down_avg+=first_t[i-1]-first_t[i]2.6金融数据数学分析up_avg=up_avg/periodsdown_avg=down_avg/periods
rs=up_avg/down_avgrsies[periods]=100-100/(1+rs)2.6金融数据数学分析
#计算后面的RSI指标
forjinrange(periods+1,length):
ifclose[j]>=close[j-1]:up=close[j]-close[j-1]down=0
else:up=0down=close[j-1]
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 湿地生态恢复治理施工方案及技术措施
- 湿法除尘器电气故障应急预案演练脚本
- 2025年中级经济师考试《人力资源管理专业知识与实务》试题及答案
- 环保先锋于心间小学主题班会课件
- 设备交付时间通知函4篇
- 产房辐射泄漏应急疏散预案演练脚本
- 幼儿园教师资格证笔试真题和参考答案25年
- 建筑施工企业安全生产管理人员安全生产考试4试题及答案
- ICU病房术后感染应急救援预案演练脚本
- 2025浙江宁波奉化溪巷里商业运营管理有限公司招聘及笔试历年参考题库附带答案详解
- 《电脑城里的鼠精灵》说课稿
- 部编版七年级下册历史期末复习知识点提纲
- 农民工 合同模板
- PiCCO-监测技术操作管理
- DL-T5153-2014火力发电厂厂用电设计技术规程
- TCEA 0050-2023 电梯导轨型钢
- GA/T 2095-2023危险化学品道路运输通行路线规划指南
- 客户之声(VOC)收集与应用
- 突发性耳聋教学查房
- 2021新苏教版小学科学四年级下册教学与实验计划
- 全国优质课一等奖高中语文《蜀道难》教学设计
评论
0/150
提交评论