??本文是利用python來分析金融數(shù)據(jù)的一個入門教程,同時也是數(shù)據(jù)分析利器pandas的一個實戰(zhàn)教程。文中將利用pandas來分析中國A股歷史交易數(shù)據(jù),數(shù)據(jù)來源為tushare。
??由于大數(shù)據(jù)、人工智能技術(shù)的快速發(fā)展,國內(nèi)外許多金融機構(gòu)早就不僅僅專耕于金融領(lǐng)域,并且在大數(shù)據(jù)分析、自動化策略等方面投入了大量的精力,因為數(shù)據(jù)科學(xué)與計算機技術(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ù)進行一個整體的查看
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ù)來進行畫圖,其內(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() # 后一天對比前一天的變化率
??我們可以對變化率進行初步的統(tǒng)計分析,看看收盤價變化率的概率分布情況
df.close.pct_change().hist(bins=30) # hist函數(shù)用于查看一個序列的直方圖,bins參數(shù)表示將數(shù)據(jù)分為多少段

??可以為DataFrame和Series設(shè)置一個指定長度的滑動窗口,然后在窗口長度內(nèi)進行數(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ù)進行重采樣(resample)。
??例如上面的示例數(shù)據(jù)是每日的交易數(shù)據(jù),我們需要按周來查看開盤價,即需要對數(shù)據(jù)按周進行重采樣。
??需要注意的是,重采樣時候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()

寫在最后:
??文中的代碼,以及具體的分析過程,可以點擊這里查看和下載