刺猬教你量化投資(一) :Python入門就這樣

image.png

Python初探

近年來,量化投資日漸盛行,聽上去是有些高大上的感覺,但入門后又會(huì)發(fā)現(xiàn),其實(shí)量化投資并沒有太多高深難懂的玄機(jī),不過是為投資者提供了一套,將投資想法與實(shí)踐相結(jié)合的便捷工具而已。

做量化投資,目前最流行的編程語(yǔ)言非Python莫屬。相對(duì)于商用軟件Matlab,Python不僅可免費(fèi)使用,而且具有非常多的、功能強(qiáng)大的擴(kuò)展庫(kù),對(duì)于非計(jì)算機(jī)專業(yè)的投資者來說,相對(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)行展開。

Anaconda是一個(gè)用于科學(xué)計(jì)算的Python發(fā)行版,支持Linux, Mac, Windows, 包含了眾多流行的科學(xué)計(jì)算、數(shù)據(jù)分析的Python包。其安裝包如果直接從官網(wǎng)上下載,速度會(huì)非常慢,幸好清華大學(xué)開源軟件鏡像站上可以下載到。跳轉(zhuǎn)過去點(diǎn)這里

下載好后,點(diǎn)幾次“下一步”就安裝完成了。

Python基礎(chǔ)知識(shí)

  1. 萬物皆對(duì)象

對(duì)象與變量是編程活動(dòng)最基本的處理單元,在Python中,可以說萬物皆為對(duì)象。對(duì)象的類型有很多,比如整數(shù)、浮點(diǎn)數(shù)、字符串、列表、元組、字典、集合等,甚至連函數(shù)、模塊等都可以作為對(duì)象,為其賦予變量的標(biāo)簽。

對(duì)于每個(gè)對(duì)象,可從三個(gè)緯度進(jìn)行描述,分別是地址、類型和值。舉個(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”的類型
In [3]:type(8)
Out[3]:Int
  1. 變量貼標(biāo)簽

在Python中,等號(hào)“=”并不是數(shù)學(xué)意義上的等號(hào),而是賦值的意思。比如說:

In [4]:a=8
print a
8

a=8意味著將對(duì)象“8”的值賦給變量a,然后“打印”a的結(jié)果就是整數(shù)8。對(duì)象屬于常量,是不可變的,而變量則不然,可以在程序的運(yùn)行過程中不斷被賦予新的值。比如說:

In [5]:a=8
a=10
a
Out[5]:10
  1. 數(shù)字的類型

關(guān)于對(duì)象的類型,可用內(nèi)置函數(shù)type()進(jìn)行查看。僅對(duì)數(shù)字而言,其類型主要有5種,分別是整數(shù)型Int、長(zhǎng)整型Long、浮點(diǎn)型Float、布爾型Bool(判斷真假1為真0為假)以及復(fù)數(shù)型Complex。比如說:

整數(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
  1. 三種引號(hào)

“”和‘’都可以括住字符串,但當(dāng)一個(gè)句子中含有引號(hào),則需要分別用“”和‘’來做區(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
  1. 轉(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.
  1. 自然字符串

通過在字符串前面加上r或R,即可將字符串的內(nèi)容原封不動(dòng)地輸出,即使內(nèi)部含有命令語(yǔ)句,Python也不會(huì)執(zhí)行。比如說可以用\n來進(jìn)行換行,若輸入print 'It's an apple. \n',程序輸出的結(jié)果便是It's an apple. \n

  1. 字符串格式變換
  • 將字符串變成大寫,用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()可判斷字符串中所有首字母是否為大寫,其他字母為小寫,若是則返回True,否則為False。

  • 函數(shù)isupper() 可判斷字符串中所有字母是否為大寫,若是則返回True,否則為False。

  • 按字母將字符串分割為列表,用split("")函數(shù)。

  • 關(guān)于切片,若要選取字符串中某一個(gè)字母,可以用a[0]這種格式。0代表第一個(gè)字母,如此類推。跟Java的表示方式一樣。倒選也可以,最后一個(gè)字母是a[-1],倒數(shù)第二個(gè)字母是a[-2]。

    值得注意的是,如果要抽取多個(gè)字母,如2個(gè)字母,則需寫成a[0:2],到2結(jié)束,不包括2,Python列表、元組、字符串等都是包前不包后的!

    想偷懶的話,0可不寫,默認(rèn)是從0開始,或到最后結(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

但要注意,不同類型的字符串不能相加,會(huì)導(dǎo)致Python報(bào)錯(cuò)。如果需要將整數(shù)型數(shù)字和字符串連結(jié)起來,則可以用str()函數(shù)將數(shù)字變成字符串的類型,再進(jìn)行連結(jié)。也可以在print的時(shí)候用反引號(hào)``將數(shù)字變量變?yōu)樽址兞俊?/p>

  1. 關(guān)于列表

列表用[]來表示,里面可以有序地放一堆東西。每個(gè)單獨(dú)項(xiàng)稱作元素,元素加起來就是數(shù)組,存儲(chǔ)一連串元素的容器就是列表。

  • 查看列表序列的長(zhǎng)度可以用len()函數(shù),比如:
In[11]:a=['apple', 'banana', 'orange']
len(a)
Out[11]:3
  • 列表的內(nèi)容是可變的,也就是說列表中的元素可通過賦值來實(shí)現(xiàn)替換。一旦作出修改,原來的列表就不復(fù)存在,只剩下修改后的新列表了。
In [12]:a=['apple', 'banana', 'orange']
a[0]='boat'
print a
?
['boat', 'banana', 'orange']
  1. 列表的函數(shù)

作為最基本的數(shù)據(jù)結(jié)構(gòu),我們可以用函數(shù)對(duì)列表進(jìn)行處理。當(dāng)忘記函數(shù)具體名稱的時(shí)候,可以輸入list.+tab鍵進(jì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ī)則是字符串的字母順序。

  1. 關(guān)于元組

與列表的用途類似,列表用[]表示,而元組用()表示。兩者的區(qū)別在于列表可修改,而元組一旦設(shè)立就只能讀取。目的是防止用戶亂改源代碼的內(nèi)容。

  1. 關(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)算非常便捷,比如說去重:
In [16]:a={'apple', 'banana', 'orange','banana', 'orange','apple','banana'}
print a
set(['orange', 'banana', 'apple'])

比如說求交集,可用“&”表示:

In [17]:a={'apple', 'banana', 'orange','banana', 'orange','apple','banana'}
b={'apple', 'banana', 'watermalon'}
c=a&b
print c

set(['banana', 'apple'])

比如說求并集,可用“|”表示:

In [18]:a={'apple', 'banana', 'orange','banana', 'orange','apple','banana'}
b={'apple', 'banana', 'watermalon'}
c=a|b
print c

set(['watermalon', 'apple', 'orange', 'banana'])

比如說求差集,可用“-”表示:

In [19]:a={'apple', 'banana', 'orange','banana', 'orange','apple','banana'}
b={'apple', 'banana', 'watermalon'}
c=a-b
print c

set(['orange'])
  1. 關(guān)于字典

想想新華字典,查找到某個(gè)字,然后后面就會(huì)有該字的內(nèi)涵解釋。Python的字典亦是如此,我們用大括號(hào)將字典的內(nè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的入門知識(shí)。雖然目前看來,上述內(nèi)容與金融數(shù)據(jù)分析還沒出現(xiàn)明顯的關(guān)系,但掌握好這些基礎(chǔ)知識(shí),日后寫代碼或閱讀代碼時(shí)才能有效提高效率。

第一篇文章就寫到這里,下一篇將會(huì)講述Python的運(yùn)算方式,敬請(qǐng)期待。



刺猬偷腥
2017年9月22日


to be continued.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • http://python.jobbole.com/85231/ 關(guān)于專業(yè)技能寫完項(xiàng)目接著寫寫一名3年工作經(jīng)驗(yàn)的J...
    燕京博士閱讀 7,785評(píng)論 1 118
  • 一、python 變量和數(shù)據(jù)類型 1.整數(shù) Python可以處理任意大小的整數(shù),當(dāng)然包括負(fù)整數(shù),在Python程序...
    績(jī)重KF閱讀 1,997評(píng)論 0 1
  • 本節(jié)要介紹的是Python里面常用的幾種數(shù)據(jù)結(jié)構(gòu)。通常情況下,聲明一個(gè)變量只保存一個(gè)值是遠(yuǎn)遠(yuǎn)不夠的,我們需要將一組...
    小黑y99閱讀 65,571評(píng)論 0 9
  • Python 簡(jiǎn)介Python 是一個(gè)高層次的結(jié)合了解釋性、編譯性、互動(dòng)性和面向?qū)ο蟮哪_本語(yǔ)言。Python 的設(shè)...
    在暴風(fēng)雨中逆襲閱讀 1,898評(píng)論 0 12
  • 記得以前看過一本書,大致說:“那些喜歡鬧的人從某一方面來說心里一般都很孤獨(dú),他們的面前總會(huì)有一個(gè)鏡子,如果不做點(diǎn)兒...
    初久_ice閱讀 809評(píng)論 0 1

友情鏈接更多精彩內(nèi)容