Python初探
近年來(lái)这揣,量化投資日漸盛行悬槽,聽(tīng)上去是有些高大上的感覺(jué)怀吻,但入門(mén)后又會(huì)發(fā)現(xiàn),其實(shí)量化投資并沒(méi)有太多高深難懂的玄機(jī)初婆,不過(guò)是為投資者提供了一套蓬坡,將投資想法與實(shí)踐相結(jié)合的便捷工具而已。
做量化投資磅叛,目前最流行的編程語(yǔ)言非Python莫屬渣窜。相對(duì)于商用軟件Matlab,Python不僅可免費(fèi)使用宪躯,而且具有非常多的乔宿、功能強(qiáng)大的擴(kuò)展庫(kù),對(duì)于非計(jì)算機(jī)專(zhuān)業(yè)的投資者來(lái)說(shuō)访雪,相對(duì)優(yōu)勢(shì)非常明顯详瑞。
配置運(yùn)行環(huán)境
要運(yùn)行Python,首先要去https://www.python.org/download/ 下載安裝臣缀。網(wǎng)站上有2.7.x和3.6.x兩個(gè)系列的版本坝橡,做金融分析目前用2.7就好,對(duì)各種庫(kù)的兼容會(huì)好些精置。
由于后面還需要安裝Numpy计寇、Pandas等庫(kù)用于金融數(shù)據(jù)分析,有個(gè)簡(jiǎn)便的環(huán)境配置方法脂倦,就是安裝Canopy或者Anaconda番宁。這兩個(gè)集成安裝軟件能方便我們對(duì)各種庫(kù)進(jìn)行管理。下面我們以Anoconda為例進(jìn)行展開(kāi)赖阻。
Anaconda是一個(gè)用于科學(xué)計(jì)算的Python發(fā)行版蝶押,支持Linux, Mac, Windows, 包含了眾多流行的科學(xué)計(jì)算、數(shù)據(jù)分析的Python包火欧。其安裝包如果直接從官網(wǎng)上下載棋电,速度會(huì)非常慢,幸好清華大學(xué)開(kāi)源軟件鏡像站上可以下載到苇侵。跳轉(zhuǎn)過(guò)去點(diǎn)這里
下載好后赶盔,點(diǎn)幾次“下一步”就安裝完成了。
Python基礎(chǔ)知識(shí)
- 萬(wàn)物皆對(duì)象
對(duì)象與變量是編程活動(dòng)最基本的處理單元榆浓,在Python中于未,可以說(shuō)萬(wàn)物皆為對(duì)象。對(duì)象的類(lèi)型有很多,比如整數(shù)沉眶、浮點(diǎn)數(shù)打却、字符串、列表谎倔、元組柳击、字典、集合等片习,甚至連函數(shù)捌肴、模塊等都可以作為對(duì)象,為其賦予變量的標(biāo)簽藕咏。
對(duì)于每個(gè)對(duì)象状知,可從三個(gè)緯度進(jìn)行描述,分別是地址孽查、類(lèi)型和值饥悴。舉個(gè)例子:
關(guān)于對(duì)象“8"
查看對(duì)象“8”的值
In [1]:8
Out[1]:8
查看對(duì)象“8”的內(nèi)存地址
In [2]:id(8)
Out[2]:31684784L
查看對(duì)象“8”的類(lèi)型
In [3]:type(8)
Out[3]:Int
- 變量貼標(biāo)簽
在Python中,等號(hào)“=”并不是數(shù)學(xué)意義上的等號(hào)盲再,而是賦值的意思西设。比如說(shuō):
In [4]:a=8
print a
8
a=8意味著將對(duì)象“8”的值賦給變量a,然后“打印”a的結(jié)果就是整數(shù)8答朋。對(duì)象屬于常量贷揽,是不可變的,而變量則不然梦碗,可以在程序的運(yùn)行過(guò)程中不斷被賦予新的值禽绪。比如說(shuō):
In [5]:a=8
a=10
a
Out[5]:10
- 數(shù)字的類(lèi)型
關(guān)于對(duì)象的類(lèi)型,可用內(nèi)置函數(shù)type()進(jìn)行查看洪规。僅對(duì)數(shù)字而言印屁,其類(lèi)型主要有5種,分別是整數(shù)型Int淹冰、長(zhǎng)整型Long库车、浮點(diǎn)型Float、布爾型Bool(判斷真假1為真0為假)以及復(fù)數(shù)型Complex樱拴。比如說(shuō):
整數(shù)型Int | 長(zhǎng)整型Long | 浮點(diǎn)型Float | 布爾型Bool | 復(fù)數(shù)型Complex |
---|---|---|---|---|
1 | 888888888888L | 1.02 | True | 4+3j |
-1 | 323242343L | 4.3 | False | -2+9j |
- 三種引號(hào)
“”和‘’都可以括住字符串,但當(dāng)一個(gè)句子中含有引號(hào)洋满,則需要分別用“”和‘’來(lái)做區(qū)分晶乔,方便Python識(shí)別。例如先要輸出this is an “apple”.
牺勾,就需要輸入print 'this is an “apple”.'
當(dāng)需要輸出多行字符串時(shí)正罢,可用三引號(hào)進(jìn)行頭尾標(biāo)注,例如:
In [6]:a='''you
are
beautiful'''
print a
?
you
are
beautiful
- 轉(zhuǎn)義符
轉(zhuǎn)義符用斜杠“\”表示驻民,用于消除字符本身的含義翻具。例如要輸出It's an apple.
履怯,不能直接打print 'It's an apple.'
, 而是需要在句子中的’前加上一個(gè)\。
In [7]:print 'It\'s an apple.'
It's an apple.
- 自然字符串
通過(guò)在字符串前面加上r或R裆泳,即可將字符串的內(nèi)容原封不動(dòng)地輸出叹洲,即使內(nèi)部含有命令語(yǔ)句,Python也不會(huì)執(zhí)行工禾。比如說(shuō)可以用\n來(lái)進(jìn)行換行运提,若輸入print 'It's an apple. \n'
,程序輸出的結(jié)果便是It's an apple. \n
闻葵。
- 字符串格式變換
- 將字符串變成大寫(xiě)民泵,用upper()函數(shù)。但是槽畔,由于字符串不可變栈妆,即使用了upper()函數(shù),a也還是那個(gè)a厢钧,唯有將a.upper()賦予一個(gè)新的變量b签钩,才能將其顯示。
In [8]:a="Hello world"
b=a.upper()
print a
print b
Hello world
HELLO WORLD
函數(shù)istitle()可判斷字符串中所有首字母是否為大寫(xiě)坏快,其他字母為小寫(xiě)铅檩,若是則返回True,否則為False莽鸿。
函數(shù)isupper() 可判斷字符串中所有字母是否為大寫(xiě)昧旨,若是則返回True,否則為False祥得。
按字母將字符串分割為列表兔沃,用split("")函數(shù)。
-
關(guān)于切片级及,若要選取字符串中某一個(gè)字母乒疏,可以用
a[0]
這種格式。0代表第一個(gè)字母饮焦,如此類(lèi)推怕吴。跟Java的表示方式一樣。倒選也可以县踢,最后一個(gè)字母是a[-1]转绷,倒數(shù)第二個(gè)字母是a[-2]。值得注意的是硼啤,如果要抽取多個(gè)字母议经,如2個(gè)字母,則需寫(xiě)成a[0:2],到2結(jié)束煞肾,不包括2咧织,Python列表、元組籍救、字符串等都是包前不包后的习绢!
想偷懶的話,0可不寫(xiě)钧忽,默認(rèn)是從0開(kāi)始毯炮,或到最后結(jié)束。a[:2]相當(dāng)于a[0:2]耸黑,a[-2:]則表示最后兩個(gè)字母桃煎。
另外,還可以用循環(huán)結(jié)構(gòu)跳著切大刊,比如:
In [9]:a="beautiful"
[a[i] for i in (1,4,8)]
Out[9]:['e', 't', 'l']
- 字符串可用運(yùn)算符为迈,比如“+”則表示兩個(gè)字符串的連結(jié),又比如要打印“Hello world”10遍缺菌,則可用“*”號(hào):
In [10]: print "Hello world\n" *10
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
但要注意葫辐,不同類(lèi)型的字符串不能相加,會(huì)導(dǎo)致Python報(bào)錯(cuò)伴郁。如果需要將整數(shù)型數(shù)字和字符串連結(jié)起來(lái)耿战,則可以用str()函數(shù)將數(shù)字變成字符串的類(lèi)型,再進(jìn)行連結(jié)焊傅。也可以在print的時(shí)候用反引號(hào)``將數(shù)字變量變?yōu)樽址兞俊?/p>
- 關(guān)于列表
列表用[]來(lái)表示剂陡,里面可以有序地放一堆東西。每個(gè)單獨(dú)項(xiàng)稱(chēng)作元素狐胎,元素加起來(lái)就是數(shù)組鸭栖,存儲(chǔ)一連串元素的容器就是列表。
- 查看列表序列的長(zhǎng)度可以用len()函數(shù)握巢,比如:
In[11]:a=['apple', 'banana', 'orange']
len(a)
Out[11]:3
- 列表的內(nèi)容是可變的晕鹊,也就是說(shuō)列表中的元素可通過(guò)賦值來(lái)實(shí)現(xiàn)替換。一旦作出修改暴浦,原來(lái)的列表就不復(fù)存在溅话,只剩下修改后的新列表了。
In [12]:a=['apple', 'banana', 'orange']
a[0]='boat'
print a
?
['boat', 'banana', 'orange']
- 列表的函數(shù)
作為最基本的數(shù)據(jù)結(jié)構(gòu)肉渴,我們可以用函數(shù)對(duì)列表進(jìn)行處理公荧。當(dāng)忘記函數(shù)具體名稱(chēng)的時(shí)候,可以輸入list.+tab鍵進(jìn)行查詢(xún)同规。
- 若要追加元素進(jìn)列表,可使用list.append(x), 將x追加進(jìn)list中。比如:
In [13]:a=['apple', 'banana', 'orange']
print a
a.append('strawberry')
print a
['apple', 'banana', 'orange']
['apple', 'banana', 'orange', 'strawberry']
若追加的不僅僅是一個(gè)元素券勺,而是一個(gè)列表绪钥,則可以用list.append(x)或者list.extend(x)。兩者的區(qū)別在于关炼,append是整個(gè)x列表作為一個(gè)新元素追加進(jìn)原列表中程腹,而extend則是將x列表中的元素逐個(gè)加入到原列表中。
若要計(jì)算元素出現(xiàn)的頻率儒拂,則可用list.count(x)函數(shù)
若要?jiǎng)h除某個(gè)元素寸潦,則可用list.remove(x)函數(shù)。當(dāng)使用此函數(shù)時(shí)社痛,Python僅會(huì)刪除第一x见转,后面的x則保留。
若要對(duì)列表的元素進(jìn)行排序蒜哀,則用list.sort()函數(shù)斩箫,默認(rèn)從小到大排列。若要從大到小排列撵儿,則用list.sort(reverse=true)函數(shù)乘客。若列表的元素是字符串,也能用此函數(shù)進(jìn)行排序淀歇,排序的規(guī)則是字符串的字母順序易核。
- 關(guān)于元組
與列表的用途類(lèi)似,列表用[]表示浪默,而元組用()表示牡直。兩者的區(qū)別在于列表可修改,而元組一旦設(shè)立就只能讀取浴鸿。目的是防止用戶亂改源代碼的內(nèi)容井氢。
- 關(guān)于集合
集合可以用作運(yùn)算,求交集岳链,求并集花竞,求差集等。我們可以用set()函數(shù)將列表變成集合掸哑,比如:
In [14]:a=['apple', 'banana', 'orange']
set(a)
Out[14]:{'apple', 'banana', 'orange'}
也可以用list()函數(shù)把集合變回列表约急,比如:
In [15]:a={'apple', 'banana', 'orange'}
a=list(set(a))
a.sort()
a
Out[15]:['apple', 'banana', 'orange']
- 集合的運(yùn)算非常便捷,比如說(shuō)去重:
In [16]:a={'apple', 'banana', 'orange','banana', 'orange','apple','banana'}
print a
set(['orange', 'banana', 'apple'])
比如說(shuō)求交集苗分,可用“&”表示:
In [17]:a={'apple', 'banana', 'orange','banana', 'orange','apple','banana'}
b={'apple', 'banana', 'watermalon'}
c=a&b
print c
set(['banana', 'apple'])
比如說(shuō)求并集厌蔽,可用“|”表示:
In [18]:a={'apple', 'banana', 'orange','banana', 'orange','apple','banana'}
b={'apple', 'banana', 'watermalon'}
c=a|b
print c
set(['watermalon', 'apple', 'orange', 'banana'])
比如說(shuō)求差集,可用“-”表示:
In [19]:a={'apple', 'banana', 'orange','banana', 'orange','apple','banana'}
b={'apple', 'banana', 'watermalon'}
c=a-b
print c
set(['orange'])
- 關(guān)于字典
想想新華字典摔癣,查找到某個(gè)字奴饮,然后后面就會(huì)有該字的內(nèi)涵解釋纬向。Python的字典亦是如此,我們用大括號(hào)將字典的內(nèi)容括起來(lái)戴卜,然后字典內(nèi)部的每個(gè)元素都有兩個(gè)部分組成逾条,一個(gè)是字,一個(gè)是內(nèi)涵解釋投剥。正式的叫法是一個(gè)key师脂,一個(gè)value。
再打個(gè)比方江锨,有本字典包含了身份證上的所有信息吃警,包括姓名、性別啄育、出生年月酌心、地址。若我們想調(diào)取某一元素的信息灸撰,只需print key的值即可谒府,表現(xiàn)形式如下:
In [20]:a={"姓名":"張三",'性別':'男','出身年月':'1999/01/01','地址':'火星'}
print a['姓名']
張三
- 要往字典里添加信息也很方便,直接定義即可:
In [21]:a={"name":"Zhangsan",'gender':'male','DOB':'1999/01/01','address':'Mars'}
a['id number']=123456789
print a
{'DOB': '1999/01/01', 'gender': 'male', 'id number': 123456789, 'name': 'Zhangsan', 'address': 'Mars'}
查看一下字典里有什么key浮毯,可用dict.keys()函數(shù)完疫。
查看一下字典里有什么value,可用dict.values()函數(shù)债蓝。
若要?jiǎng)h除某個(gè)key壳鹤,則可用dict.pop('key')函數(shù),刪除后該函數(shù)會(huì)返回已被刪除的value值饰迹。
結(jié)語(yǔ)
以上便是Python的入門(mén)知識(shí)芳誓。雖然目前看來(lái),上述內(nèi)容與金融數(shù)據(jù)分析還沒(méi)出現(xiàn)明顯的關(guān)系啊鸭,但掌握好這些基礎(chǔ)知識(shí)锹淌,日后寫(xiě)代碼或閱讀代碼時(shí)才能有效提高效率。
第一篇文章就寫(xiě)到這里赠制,下一篇將會(huì)講述Python的運(yùn)算方式赂摆,敬請(qǐng)期待。
刺猬偷腥
2017年9月22日
to be continued.