- Python量化交易
- 张杨飞
- 2772字
- 2020-08-27 20:54:58
2.2 数据
数据分为字符串、数字、容器、布尔值和空值5种类型。在代码里,数据是用变量存放的,而数据又有5种类型,所以在给变量取名时,建议用“变量名称+数据类型”的形式,而且要记住数字不能放在变量名称的开头,Python是区分大小写的。
2.2.1 字符串
字符串(String)是由数字、字母、下画线组成的一串字符,用单引号(')或者双引号(")括起来。字符串是不可改变类型的。
需要注意的是,Python 2默认的编码格式是ASCII格式,只有在文件开头加入“# encoding: UTF-8”,修改编码格式才能正确地打印汉字,否则在读取中文时会报错。而Python 3源码文件默认使用UTF-8编码,所以可以正常解析中文。
# 合约类型常量 PRODUCT_EQUITY=u'股票' PRODUCT_FUTURES=u'期货' PRODUCT_OPTION=u'期权' PRODUCT_INDEX=u'指数' PRODUCT_COMBINATION=u'组合' PRODUCT_FOREX=u'外汇' PRODUCT_UNKNOWN=u'未知' PRODUCT_SPOT=u'现货'
Python支持使用反斜杠(\)转义特殊字符,如表2-1所示。
表2-1 转义特殊字符
在实际操作中,例如导入Excel表时,Excel表里的数据其实是字符串(String),必须转换成数字数据类型才能进行下一步的数据分析。
2.2.2 数字
数字(Number)数据类型用于存储数值。指定一个值时,Number对象就会被创建。数字数据类型一旦改变就会被分配一个新的对象。
数字数据类型分为两种。
1.整数(int)
在32位系统上,整数的位数为32位,取值范围为-231~231-1,即-2147483648~2147483647。在64位系统上,整数的位数为64位,取值范围为-263~263-1,即-9223372036854775808~9223372036854775807。
2.浮点数(float)
浮点数用来处理实数,即带有小数的数字。类似于C语言中的double类型,占8个字节(64位),其中52位表示底,11位表示指数,剩下的一位表示符号。
#数据类型 EMPTY_INT=0 #浮点型 EMPTY_FLOAT=0.0 #整数型 #交易所推送过来的TICK行情K线数据中,高开低收为浮点型,成交量为整数型 open=EMPTY_FLOAT #开盘价 high=EMPTY_FLOAT #最高价 low=EMPTY_FLOAT #最低价 close=EMPTY_FLOAT #收盘价 volume=EMPTY_INT # 成交量 openInterest=EMPTY_INT # 持仓量
2.2.3 容器
容器把不同的数据类型放在一起方便使用,根据用途不同可分为4种,分别是列表、元组、集合和字典。
1.列表
列表(List)可以完成大多数集合类的数据结构所实现的工作。列表中元素的类型可以不同,支持数字、字符串甚至可以包含列表(所谓嵌套)。列表是写在方括号“[ ]”之间、用逗号分隔开的元素列表。和字符串一样,列表同样可以被索引和截取,列表被截取后返回一个包含所需元素的新列表。
# 参数列表,保存了参数的名称 paramList=['name', 'className', 'author', 'vtSymbol'] # 变量列表,保存了变量的名称 varList=['inited', 'trading', 'pos'] # 同步列表,保存了需要保存到数据库的变量名称 syncList=['pos']
列表的基本操作包括查询列表长度,增加、删除和修改元素,以及进行正序和倒序查询等。举例说明如下。
(1)定义5个元素的列表。
foodList=['肠粉’ , '糯米鸡' , ‘马蹄糕’,’双皮奶‘,'鹌鹑蛋烧卖'] 正序 0 1 2 3 4 倒序 -5 -4 -3 -2 -1
(2)通过正序和倒序来查询列表元素。
foodList=['肠粉’ , '糯米鸡' , ‘马蹄糕’,’双皮奶‘,'鹌鹑蛋烧卖'] foodList[4] #查询第5个元素 >> '鹌鹑蛋烧卖' foodList[-1] #查询倒数第1个元素 >> '鹌鹑蛋烧卖'
(3)查询列表长度,增加、删除和修改元素。
# 1.查询列表长度 Len=len(foodList) Len >> 5 # 2.列表操作:增加元素 foodList.append('艇仔粥') foodList >> ['肠粉', '糯米鸡', '马蹄糕', '双皮奶', '鹌鹑蛋烧卖', '艇仔粥'] # 3.列表操作:删除元素 del foodList[2] #删除第3个元素 foodList >> ['肠粉', '糯米鸡', '双皮奶', '鹌鹑蛋烧卖', '艇仔粥'] # 4.列表操作:修改元素 foodList[0]='豆浆' #修改第1个元素为’豆浆’ foodList >> ['豆浆', '糯米鸡', '双皮奶', '鹌鹑蛋烧卖', '艇仔粥']
(4)切片访问,分别访问前3个元素和后3个元素。
# 1.访问前3个元素 foodList[0:3] >> ['豆浆', '糯米鸡', '双皮奶'] # 2.简化版访问前3个元素 foodList[:3] >> ['豆浆', '糯米鸡', '双皮奶'] # 3.访问后3个元素 foodList[-3:] >> ['双皮奶', '鹌鹑蛋烧卖', '艇仔粥']
2.元组
元组(Tuple)是一系列不可变的Python对象。元组是一种序列,就像列表一样。元组和列表之间的主要区别是元组不能像列表那样改变元素的值,可以简单地理解为“只读列表”。需要注意的是,元组使用小括号“( )”,而列表使用方括号“[ ]”,对比如下:
# a.列表 foodList=['肠粉’ , '糯米鸡' , ‘马蹄糕’,’双皮奶‘,'鹌鹑蛋烧卖'] # b.元组 foodTup=('肠粉’ , '糯米鸡' , ‘马蹄糕’,’双皮奶‘,'鹌鹑蛋烧卖')
3.集合
集合是一个无序不重复元素的序列。之前说的列表可以包括重复的元素,而集合是没有重复元素的容器,用花括号“{ }”来表示集合,其操作如下:
#定义集合,交易所 ExchangeSets={'中金所','上期所','郑商所','大商所','上交所','深交所'} print (ExchangeSets) >> {'上期所', '深交所', '郑商所', '上交所', '中金所', '大商所'}
集合的基本功能是进行成员关系的测试,以及删除重复元素,可以使用大括号“{ }”或者set()函数来创建,注意:定义一个空集合必须用set(),而不是“{ }”,因为“{ }”是用来创建一个空字典的。集合的基本操作举例说明如下。
# 1.定义一个空的集合 BitcoinExchangeSets=set() # 2.使用update来增加一个元素 BitcoinExchangeSets.update (['OKCOIN比特币交易所','火币比特币交易所','LBANK比特币交 易所']) print (BitcoinExchangeSets) >> {'OKCOIN比特币交易所', 'LBANK比特币交易所', '火币比特币交易所'} # 3.使用discard来删除一个元素 BitcoinExchangeSets.discard('OKCOIN比特币交易所') print (BitcoinExchangeSets) >> {'LBANK比特币交易所', '火币比特币交易所'} # 4.使用in查询关键字 txBool='火币比特币交易所' in BitcoinExchangeSets print (txBool) >> True # 5修改集合内的元素 #第一步,删除 BitcoinExchangeSets.discard('火币比特币交易所') #第二步,增加 BitcoinExchangeSets.update(['OKEX比特币交易所']) print (BitcoinExchangeSets) >> {'LBANK比特币交易所', 'OKEX比特币交易所'}
4.字典
字典是另一种可变容器模型,可存储任意类型的对象。字典的每个键值对“key=>value”用冒号“:”分隔,每个对之间用逗号“,”分隔,整个字典包括在花括号“{ }”中,格式为d={key1 : value1, key2 : value2 }。键必须是唯一的,且是不可变的,但值则不必唯一,可取任何数据类型,如字符串、数字或元组。字典的基本操作举例说明如下。
(1)创建新的字典。
# 创建新的字典 ExchangeDict={'中金所':'CFFEX', '上期所':'SHFE', '郑商所':'CZCE', '大商所':'DCE', '国际能源交易中心':'INE'}
(2)增加、删除、查询和修改元素。
# 1. 增加元素 ExchangeDict['上金所']=['SGE'] ExchangeDict >> {'上期所': 'SHFE', '上金所': ['SGE'], '中金所': 'CFFEX', '国际能源交易中心': 'INE', '大商所': 'DCE', '郑商所': 'CZCE'} # 2. 删除元素 del ExchangeDict['上金所'] ExchangeDict >> {'上期所': 'SHFE', '中金所': 'CFFEX', '国际能源交易中心': 'INE', '大商所': 'DCE', '郑商所': 'CZCE'} # 3. 查询元素,根据交易所名称查询交易所代码 ExchangeDict['中金所'] >> 'CFFEX' # 4.修改元素 print ('修改前,上期所代码:',ExchangeDict['上期所']) ExchangeDict['上期所']=['SQS'] print ('修改后,上期所代码:', ExchangeDict['上期所']) >> 修改前,上期所代码:SHFE 修改后,上期所代码:['SQS']
2.2.4 布尔值
在Python中布尔值(Bool)通过常量“True”和“False”来表示。比较运算符如“<”“ >”“==”等返回的类型就是布尔类型;布尔类型通常在if和while语句中应用。应该注意的是,布尔是int的子类(继承int),故判断如True==1 False==0时,其返回结果是True。
布尔值的应用举例说明如下。导入金融库TA-Lib的简单均线函数SMA,定义新的函数sma,若array=True,则输出一系列均线,反之,若array=False,则输出最新的一条均线数据。
import talib def sma(self, n, array=False): """简单均线""" result=talib.SMA(self.close, n) if array=True: return result return result[-1]
一般情况下,“if array:”已经是默认“if array=True:”,所以函数可以进一步简化,如下:
def sma(self, n, array=False): """简单均线""" result=talib.SMA(self.close, n) if array: return result return result[-1]
2.2.5 空值
空值(None)是Python语言里一个特殊的值,表示的是一个空对象,但不能将其理解为0,因为0是有意义的。None既可以被赋值给任何变量,也可以将任何变量赋值给None。所以None常用于初始化。
self.datetime=None # python的datetime时间对象