Python期貨量化交易中常用的數據類型有哪些?
1 常用內置常量
Python解釋器在啟動時會創建None、True、False三個常量,None表示“無”,True表示“真”,False表示“假”。
None是NoneType類型的唯一值,表示缺少值或空值,例如,當函數沒有返回值時會默認返回None值。
因為Python用“有”和“無”來表示“真”和“假”,“有”為真,“無”為假,所以None、0、空字符串、空列表、空字典都是假,非“空”數據則為真。
True和False是bool類型的值,True和False除了表示真和假,其本身也有值,True的值為1,False的值為0,可以與數值做計算。例如,5+True結果為6,3*False結果為0,1==True結果為True,1 is True結果為False,以上示例說明True的值為1,但True在內存中的地址和整數1的地址不同。
None、True、False這三個常量在量化策略中會經常用到。還有Ellipsis常量與省略號的字面含義相同,常用在注釋當中。
2 整型
在計算交易手數時需要用到整型,如1、2、3、4。
Python可以直接用整數進行計算,當在Python代碼中輸入整數數值時,Python會自動把輸入的數值創建為整型。
當然,你也可以用整型類int()創建整數,給整型類int()傳遞數值參數,int()便會把數值參數轉換為整型。例如,int(5.89)的結果是5,轉換時只保留了整數部分;int('123')的結果是123,把字符串類型轉換成了整數類型。
我們可能需要從本地文件中讀取數據,比如保存在本地的成交數據,所讀取的數據通常是字符串類型,要把字符串類型轉換成整型才能參與相關計算。
整型可以是正數也可以是負數,如3和?3。在量化策略中可定義凈持倉pos=3,表示凈多頭3手;定義pos= -3,表示凈空頭3手。
3 浮點型
價格、保證金等屬于浮點型數值,浮點型數值是帶有小數點的小數。
類似于整型,Python可以直接用浮點型數值計算,也可以用浮點型類float()創建浮點型數值。例如,float(5)結果是5.0,在轉換整數時增加了一個小數位;float('5.999')結果是5.999,把字符串轉換成了浮點型數值。
整型和浮點型相加減,結果會轉換成浮點型。如果在計算中想要保留兩位小數,可以用round()函數,例如,a=5.946326598,round(a,2)結果是5.95,經過四舍五入之后保留兩位小數。
4 字符串類型
字符串是由一對英文單引號、一對英文雙引號、一對英文三單引號或一對英文三雙引號包圍的字符,交易品種、賬號、密碼等都是字符串類型。例如,'賬號'、"123456"、'''密碼'''、"""jkl"""都是合法的字符串。
字符串是序列類型的數據,字符串的字符有位置(索引)屬性,從左到右字符的位置序號為0、1、2、3、4、5、6……從右到左的位置序號為?1、?2、?3、?4、?5、?6……
通常,字符串用一對英文單引號或一對英文雙引號定義,英文三單引號或三雙引號則用于多行注釋。
如果一個字符串里需要有英文單引號,則應用英文雙引號定義;如果一個字符串里需要有英文雙引號,則應用英文單引號定義。此時的英文單引號和雙引號為字符,而不是字符串的標識,例如,"ad'cd"、'ef"gh',英文雙引號或單引號組成一對,成為字符串的標識,字符串中的引號則作為字符以有別于字符串標識,不會出現“含義”沖突。
字符串中可以有空格,因為空格也是字符。Python用“有”和“無”來表示“真”和“假”,沒有任何字符的字符串為假,有字符的字符串為真。例如,“沒有字符,為假;”有空格字符,為真。
Python可以直接處理代碼中的字符串,把字符串創建在內存中并保存為字符串類型,也可以用字符串類str()創建字符串。例如,str(123)結果為'123',把數值123轉換成了字符串'123'。
如果要在字符串中包含控制字符或有特殊含義的字符,就需要使用轉義字符,常用的轉義字符如表2-1所示。
表2-1
例如,print("abc\"de")輸出abc"de,中間的英文雙引號被\轉義成字符,不會再與第一個英文雙引號組成字符串標識。
當在字符串前加上r或R,此時字符串為原始字符串,字符串中的“\”便不再是轉義字符,而是“\”本身。但字符串的最后一個字符不能是“\”,原始字符串主要用在文件路徑中。
代碼如下:
>>> print(r'C:\new\T0002\export\MA.csv')
C:\new\T0002\export\MA.csv
>>> print(r'C:\new\T0002\export\')
File "<stdin>", line 1
print(r'C:\new\T0002\export\')
^
SyntaxError: EOL while scanning string literal
5 結構數據類型
Python語言有許多的結構數據類型,最常用的有列表、元組、字典,列表和元組是序列類型,它們的元素有位置(索引)屬性,而字典是集合類型,其元素沒有位置屬性。
5.1 列表
列表是以方括號“[ ]”包圍的數據集合,不同元素間以英文逗號“,”隔開,列表的元素可以是任意數據類型,也可以是列表,例如,[1]、[1,]、[1, 2, 'a', [1,3], 'bcd']都是合法的列表。
列表的元素有位置屬性,從左到右元素的位置序號為0、1、2、3、4、5、6……從右到左的位置序號為?1、?2、?3、?4、?5、?6……
Python可以直接處理代碼中的列表,Python會自動創建列表,也可以用列表類list()創建列表。例如,a=list()創建空列表,給list()傳遞的參數必須是可迭代的,list()會按照參數的元素創建列表。例如,list('adffgghjj')結果是['a', 'd', 'f', 'f', 'g', 'g', 'h', 'j', 'j'],字符串的每個字符被創建為列表的元素。
列表是可變的數據類型,對列表中的元素進行修改時會直接修改原列表,而不是生成一個新列表。
5.2 元組
元組可看成特殊的列表,元組是以小括號“( )”包圍的數據集合,不同元素間以英文逗號“,”隔開,元組的元素可以是任意數據類型,也可以是元組,例如,(1,)、(1, 2, 'a', (1,3), 'bcd')都是合法的元組。當元組的元素只有一個時也不能省略英文逗號,否則小括號便不是元組的標識,而是語句運算,例如,(1,)是元組,而(1)則是數值1。
同列表一樣,元組的元素有位置屬性,元素從左到右的位置序號為0、1、2、3、4、5、6……從右到左的位置序號為?1、?2、?3、?4、?5、?6……
Python可以直接處理代碼中的元組,Python也會把以英文逗號隔開的對象創建為元組,代碼如下:
>>> 1,2,3,4,5
(1, 2, 3, 4, 5)
Python也可以用元組類tuple()創建元組,例如,a=tuple()創建空元組,給tuple()傳遞的參數必須是可迭代的。tuple()會按照參數的元素創建元組,例如,tuple(['a', 'd', 'f', 'f', 'g'])的結果是('a', 'd', 'f', 'f', 'g'),把列表轉換成了元組。
元組是不可變數據類型,對元組中的元素進行修改會創建一個新的元組,而不是直接修改原來的元組。若需要創建一組不可變的數據對象,可用元組創建。
元組主要用在變量定義中,代碼如下:
>>> a,b,c=1,2,3
>>> a;b;c
1
2
3
在上述代碼中,等號右邊的“1,2,3”是元組,Python會自動按位置順序把1賦值給a,把2賦值給b,把3賦值給c。
5.3 字典
字典是以大括號“{ }”包圍起來的數據集合,數據以“鍵:值”對的形式存在,“值”可以是任意類型的數據,但“鍵”必須是不可變數據。不可變數據又稱為可哈希的數據,可哈希數據具有唯一性,能產生唯一映射關系,因此,字典中元素的“鍵”都是不同的,可以通過“鍵”來訪問字典中的元素。例如,{'a':1,'b':2,3:'c'}和{'a':1,'b':2,c:[1,2]}都是合法的字典。
Python可以直接處理代碼中的字典,也可以用字典類dict()創建字典,因為字典的元素是以“鍵:值”對的形式存在,所以傳給dict()的參數應是關鍵字形式,代碼如下:
>>> dict(h=1,i=2,j=3,k=4)
{'h': 1, 'i': 2, 'j': 3, 'k': 4}
字典是集合類型,因此字典中的元素沒有位置屬性,元素是無序的,可以通過元素的鍵訪問元素,不能通過位置訪問元素。字典是可變的數據類型,修改元素的值或增刪元素會直接改變原字典。
本文摘自《Python期貨量化交易》