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

image.png

Python初探

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

做量化投資,目前最流行的編程語言非Python莫屬。相對于商用軟件Matlab,Python不僅可免費使用,而且具有非常多的、功能強大的擴展庫,對于非計算機專業(yè)的投資者來說,相對優(yōu)勢非常明顯。

配置運行環(huán)境

要運行Python,首先要去https://www.python.org/download/ 下載安裝。網站上有2.7.x和3.6.x兩個系列的版本,做金融分析目前用2.7就好,對各種庫的兼容會好些。

由于后面還需要安裝Numpy、Pandas等庫用于金融數(shù)據(jù)分析,有個簡便的環(huán)境配置方法,就是安裝Canopy或者Anaconda。這兩個集成安裝軟件能方便我們對各種庫進行管理。下面我們以Anoconda為例進行展開。

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

下載好后,點幾次“下一步”就安裝完成了。

Python基礎知識

  1. 萬物皆對象

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

對于每個對象,可從三個緯度進行描述,分別是地址、類型和值。舉個例子:

關于對象“8"

查看對象“8”的值
In [1]:8
Out[1]:8

查看對象“8”的內存地址
In [2]:id(8)
Out[2]:31684784L

查看對象“8”的類型
In [3]:type(8)
Out[3]:Int
  1. 變量貼標簽

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

In [4]:a=8
print a
8

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

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

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

整數(shù)型Int 長整型Long 浮點型Float 布爾型Bool 復數(shù)型Complex
1 888888888888L 1.02 True 4+3j
-1 323242343L 4.3 False -2+9j
  1. 三種引號

“”和‘’都可以括住字符串,但當一個句子中含有引號,則需要分別用“”和‘’來做區(qū)分,方便Python識別。例如先要輸出this is an “apple”.,就需要輸入print 'this is an “apple”.'

當需要輸出多行字符串時,可用三引號進行頭尾標注,例如:

In [6]:a='''you
are
beautiful'''
print a
?
you
are
beautiful
  1. 轉義符

轉義符用斜杠“\”表示,用于消除字符本身的含義。例如要輸出It's an apple.,不能直接打print 'It's an apple.', 而是需要在句子中的’前加上一個\。

In [7]:print 'It\'s an apple.'
It's an apple.
  1. 自然字符串

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

  1. 字符串格式變換
  • 將字符串變成大寫,用upper()函數(shù)。但是,由于字符串不可變,即使用了upper()函數(shù),a也還是那個a,唯有將a.upper()賦予一個新的變量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ù)。

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

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

    想偷懶的話,0可不寫,默認是從0開始,或到最后結束。a[:2]相當于a[0:2],a[-2:]則表示最后兩個字母。

    另外,還可以用循環(huán)結構跳著切,比如:

In [9]:a="beautiful"
[a[i] for i in (1,4,8)]
Out[9]:['e', 't', 'l']
  • 字符串可用運算符,比如“+”則表示兩個字符串的連結,又比如要打印“Hello world”10遍,則可用“*”號:
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

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

  1. 關于列表

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

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

作為最基本的數(shù)據(jù)結構,我們可以用函數(shù)對列表進行處理。當忘記函數(shù)具體名稱的時候,可以輸入list.+tab鍵進行查詢。

  • 若要追加元素進列表,可使用list.append(x), 將x追加進list中。比如:
In [13]:a=['apple', 'banana', 'orange']
print a
a.append('strawberry')
print a

['apple', 'banana', 'orange']
['apple', 'banana', 'orange', 'strawberry']
  • 若追加的不僅僅是一個元素,而是一個列表,則可以用list.append(x)或者list.extend(x)。兩者的區(qū)別在于,append是整個x列表作為一個新元素追加進原列表中,而extend則是將x列表中的元素逐個加入到原列表中。

  • 若要計算元素出現(xiàn)的頻率,則可用list.count(x)函數(shù)

  • 若要刪除某個元素,則可用list.remove(x)函數(shù)。當使用此函數(shù)時,Python僅會刪除第一x,后面的x則保留。

  • 若要對列表的元素進行排序,則用list.sort()函數(shù),默認從小到大排列。若要從大到小排列,則用list.sort(reverse=true)函數(shù)。若列表的元素是字符串,也能用此函數(shù)進行排序,排序的規(guī)則是字符串的字母順序。

  1. 關于元組

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

  1. 關于集合

集合可以用作運算,求交集,求并集,求差集等。我們可以用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']
  • 集合的運算非常便捷,比如說去重:
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. 關于字典

想想新華字典,查找到某個字,然后后面就會有該字的內涵解釋。Python的字典亦是如此,我們用大括號將字典的內容括起來,然后字典內部的每個元素都有兩個部分組成,一個是字,一個是內涵解釋。正式的叫法是一個key,一個value。

再打個比方,有本字典包含了身份證上的所有信息,包括姓名、性別、出生年月、地址。若我們想調取某一元素的信息,只需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ù)。

  • 若要刪除某個key,則可用dict.pop('key')函數(shù),刪除后該函數(shù)會返回已被刪除的value值。

結語

以上便是Python的入門知識。雖然目前看來,上述內容與金融數(shù)據(jù)分析還沒出現(xiàn)明顯的關系,但掌握好這些基礎知識,日后寫代碼或閱讀代碼時才能有效提高效率。

第一篇文章就寫到這里,下一篇將會講述Python的運算方式,敬請期待。



刺猬偷腥
2017年9月22日


to be continued.

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

相關閱讀更多精彩內容

友情鏈接更多精彩內容