??本文是利用python來分析金融數(shù)據(jù)的一個入門教程蒲拉,同時也是數(shù)據(jù)分析利器pandas
的一個實戰(zhàn)教程。文中將利用pandas
來分析中國A股歷史交易數(shù)據(jù),數(shù)據(jù)來源為tushare
。
??由于大數(shù)據(jù)、人工智能技術(shù)的快速發(fā)展蜻势,國內(nèi)外許多金融機(jī)構(gòu)早就不僅僅專耕于金融領(lǐng)域,并且在大數(shù)據(jù)分析鹉胖、自動化策略等方面投入了大量的精力握玛,因為數(shù)據(jù)科學(xué)與計算機(jī)技術(shù)的發(fā)展不僅可以大幅提高傳統(tǒng)交易模式的速度,提高準(zhǔn)確度甫菠,并且能夠自動化管理更大的數(shù)據(jù)量挠铲,尤其在國外,利用數(shù)據(jù)分析和自動化交易技術(shù)早已經(jīng)成為了主流淑蔚。
??下面將數(shù)據(jù)處理的代碼貼在下面市殷,代碼中主要涉及的知識點如下:
- DataFrame和Series的基本結(jié)構(gòu)
- DataFrame的行、列選取方式和規(guī)范
- 時間索引的基礎(chǔ)和切片
- 滑動窗口和移動平均數(shù)
- 數(shù)據(jù)按時間周期的重采樣
??具體的講解請查看代碼中的注釋刹衫,直接看注釋不直觀醋寝?需要清晰搞挣、直觀的體驗點擊這里!
??通過tushare獲取的數(shù)據(jù)為pandas.DataFrame格式音羞,可以保存在本地
# coding: utf-8
import tushare as ts
df = ts.get_hist_data('000001')
df.to_csv('./000001.csv')
??然后可以通過直接讀取本地文件來導(dǎo)入數(shù)據(jù), read_csv函數(shù)的詳細(xì)介紹查看這里
import pandas as pd
df = pd.read_csv('./000001.csv', header=0, index_col='date')
df.index = pd.DatetimeIndex(df.index) # 將普通字符型索引傳化為時間索引
??DataFrame是一個二維表囱桨,類似于excel的一個sheet中的內(nèi)容,也類似于數(shù)據(jù)庫中的表的概念嗅绰。 讀入數(shù)據(jù)后舍肠,可以通過許多DataFrame內(nèi)置的函數(shù)來對數(shù)據(jù)進(jìn)行一個整體的查看
df.head(10) # 查看前10行數(shù)據(jù)
df.describe() # 查每一列的行數(shù)、期望窘面、各個分位數(shù)等
df.shape # 查看數(shù)據(jù)表的大小
??對DataFrame的整體有一個初步的認(rèn)識之后翠语,下面是對其行和列的選取操作
df['open'] # 可以選取DataFrame的對應(yīng)的列
df.iloc[0] # 通過此方式來選取數(shù)據(jù)的行
df.loc['2016-09-27'] # 可以通過索引選取對應(yīng)的行
df[['open', 'close', 'high']] # 選取多個列
df.iloc[0:3] # 選取多個行
df['2016-09'] # 按照時間索引選取所有的9月數(shù)據(jù),只有在索引類型為時間索引時才可以這么操作
df[0:-1:2]
# 從前往后每隔兩個數(shù)據(jù)取一個數(shù)據(jù)财边,第一個數(shù)為開始行數(shù)肌括,第二個數(shù)為結(jié)束行數(shù)(選取到此行之前)
# 第三個數(shù)為間隔數(shù)目
??可以通過DataFrame內(nèi)置的plot函數(shù)來進(jìn)行畫圖,其內(nèi)部是利用了matplotlib實現(xiàn)的酣难。為了畫圖的美觀谍夭,首先設(shè)置一些畫圖的參數(shù):
import matplotlib.pyplot as plt
plt.style.use('seaborn-darkgrid') # 設(shè)置畫圖的風(fēng)格
plt.rc('font', family='SimHei', size=6) #設(shè)置圖中字體和大小
plt.rc('figure', figsize=(4,3), dpi=200) # 設(shè)置圖的大小
??將其中一列畫折線圖
df.open.plot() # 索引為時間后,會在圖上的x軸以合理的間隔顯示
??原始數(shù)據(jù)中憨募,所有的價格都是實際值紧索,實際情況下,我們可能需要價格的變化值菜谣,或者是價格的變化率
df.open.diff() # 后一天減去前一天的差值
df.close.pct_change() # 后一天對比前一天的變化率
??我們可以對變化率進(jìn)行初步的統(tǒng)計分析珠漂,看看收盤價變化率的概率分布情況
df.close.pct_change().hist(bins=30) # hist函數(shù)用于查看一個序列的直方圖,bins參數(shù)表示將數(shù)據(jù)分為多少段
??可以為DataFrame和Series設(shè)置一個指定長度的滑動窗口葛菇,然后在窗口長度內(nèi)進(jìn)行數(shù)據(jù)操作甘磨,例如求mean橡羞,max眯停,min等
df.open.rolling(5).mean() # 以5個數(shù)據(jù)作為一個數(shù)據(jù)滑動窗口,在這個5個數(shù)據(jù)上取均值
df.open.rolling(5).max() # 以5個數(shù)據(jù)作為一個數(shù)據(jù)滑動窗口卿泽,在這個5個數(shù)據(jù)上取最大值
# 將原始數(shù)據(jù)和5日莺债、20日均線畫到一個圖上,由于需要讓數(shù)據(jù)從時間最遠(yuǎn)處開始,所以將實際數(shù)據(jù)倒序
df.open.plot()
df[::-1].open.rolling(5).mean().plot()
df[::-1].open.rolling(20).mean().plot()
??對于時間序列數(shù)據(jù)签夭,除了求移動平均值等常用操作之外齐邦,還有一個常用的操作就是對時間數(shù)據(jù)進(jìn)行重采樣(resample)。
??例如上面的示例數(shù)據(jù)是每日的交易數(shù)據(jù)第租,我們需要按周來查看開盤價措拇,即需要對數(shù)據(jù)按周進(jìn)行重采樣。
??需要注意的是慎宾,重采樣時候DataFrame或Series的索引必須為時間索引丐吓。
df.open.resample('W').max() # 按周為采樣規(guī)則浅悉,每周內(nèi)取最大值
??常用采樣參數(shù):B:工作日; D:天; W:周; M:月; SM:半月
??詳情點擊查看
df.open.plot()
df.open.resample('7D').max().plot()
寫在最后:
??文中的代碼,以及具體的分析過程券犁,可以點擊這里查看和下載