天天看點

《建構實時機器學習系統》一3.3 利用 Pandas 分析實時股票報價資料

熟悉一項軟體的最好方法就是通過示例來親自使用它。這裡将會通過分析蘋果公司 2015 年 8 月 3 日秒級股票價格的資料來熟悉 Pandas 的用法。建議通過Python 筆記本或互動式視窗的方法來進行下面的操作。

首先,需要導入相關的子產品,在導入Pandas子產品的同時,我們還用到了Datetime子產品。Datetime子產品的主要功能是對時間、日期等資料進行處理,導入指令如下:

這裡将會導入 2015 年 8 月 3 日蘋果公司的秒級股票交易資料,不過,相應的原始資料需要稍做清理才能使用,而這正好符合本章的學習要點。

首先,用Pandas 的read_csv 子產品直接從 csv 檔案中導入資料。原始資料一共有六列,分别存有原始時間戳、每秒開盤價、最高價、最低價、收盤價和成交量資訊。可以通過names 參數将這些名字賦給處理好的資料,導入指令如下:

上面的type(data)可以列印出目前資料對象的類。可以看到,這裡data 對象的類名為DataFrame,是 Pandas 中最基本的資料形态。

導入資料之後,當然還要看看我們最感興趣的資料長什麼樣,在互動視窗中列印前 5 行和後 5 行。這裡需要用到DataFrame 的head 和tail 函數,指令如下:

可以注意到記錄中的股價數值為原始股價乘以 10000。

原始資料中的時間記錄為每天距離格林威治标準時間的秒數乘以 1000,為增加可讀性,需要将資料先還原。這裡先将data 對象的索引變為處理後的時間标記,并調用 DataFrame.index 域,示例代碼如下:

這個時候timestamp_raw 一列将不再有用,可以删掉它。這裡調用了DataFrame.drop()函數來實作該功能:

導入資料并做初步清理之後,可以調用 DataFrame 對象的函數對其進行各種基本的修改和描述。DataFrame的很多操作都是通過調用對象的函數來進行的,具體有哪些函數呢?可以通過如下dir()指令來檢視:

經過檢視可以得知,大多數的常用函數都已經包含在内了,如 mean(均值)、max(最大值)、min(最小值)。例如,為了求得該資料集每一列的均值,我們可以進行如下操作,求最大值、最小值的操作也與此類似:

同時還可以調用 describe 函數直接産生常用的描述性統計量,指令如下:

我們進行資料分析時,往往需要對資料的假設進行檢驗。例如美股交易時間是從美國東部時間的早上 9:30 到下午 3:30,但是很多主流股票還具有盤前和盤後交易。盤前和盤後交易時間中估價波動較大,成交量較小,對此本書不進行研讨。在進行其他分析之前,我們需要檢視一下所有資料記錄的時間範圍。上面的統計量操作也可以在 data.index 上執行。這裡DataFrame.index 相當于一個 Series 對象,指令如下:

可以看到,交易時間其實包括了盤前和盤後的大量時間。在實際交易政策中,我們往往隻會在正常交易時間進行交易,是以需要對資料按照時間進行拆分,隻保留正常交易時間的資料,完成該項操作非常容易,指令如下:

進行了簡單的資料清理之後,就可以開始進行可視化操作了,首先通過目測的方式來檢視資料的分布。Pandas 進行可視化操作需要依賴于 Matplolib 子產品,這裡首先導入對應的子產品,導入指令如下:

Matplotlib 自帶的畫圖風格比較僵硬,需要改改,同時為了向 R 緻敬,這裡設定畫圖風格為 R ggplot 風,設定指令如下:

畫圖檢視每一秒的收盤價。這裡隻需要對 Series 類的變量調用plot 函數,即可得到

圖3-1所示的股價走勢圖,調用指令如下:

《建構實時機器學習系統》一3.3 利用 Pandas 分析實時股票報價資料

同時,也有人可能對成交量感興趣。根據格蘭傑因果檢驗等研究,成交量對股價變化也有影響。每秒成交量是什麼樣的分布?可以通過下面的指令做出直方圖。隻需要調用 Series 類對象的plot.hist 函數即可:

直方圖畫出來之後,讀者将會發現大多數觀測集中在了較小的範圍之内,但是有若幹秒的交易量是其他時候的數倍。為了更深入地研究,可以畫出時序圖做進一步的觀察,畫時序圖的指令如下,得到的圖形如圖3-2所示。

《建構實時機器學習系統》一3.3 利用 Pandas 分析實時股票報價資料

果然正如我們所假設的,中午時分有大單交易發生。

當然,對于實時量化交易,我們最感興趣的還是每秒的變化率。那麼下面我們就來看看股價變化的分布情況。為了到相鄰時間點股價的變化率,我們可以通過調用diff 函數來實作,得到的變化率序列也是一個 Series 類對象。就如3.3.3節一樣,我們可以将變化率可視化,得到圖3-3。調用diff 函數的指令如下:

《建構實時機器學習系統》一3.3 利用 Pandas 分析實時股票報價資料

現在回到出發點,我們分析和可視化資料是為了在後文中發掘出可能的量化交易政策。我們常常聽說股價會追漲殺跌,在這種模式中的股價會按照趨勢繼續上漲或下跌。我們也聽說過可能會均值反轉,在這種模式中的股價會在具有了大幅波動之後回歸平均值。那麼,秒級資料又有什麼樣的趨勢模式呢?可以通過shift 函數對時間序列進行錯位,并且通過corr 函數計算兩個時間序列之間的相關性系數。絕對值較大的相關性系數代表前後時間中股價變化的相關程度較高;絕對值近乎為 0則代表前後時間中股票變化相關線性程度低。shift 函數指令如下:

通過圖3-4可以看到,前後一秒股價變化率的相關性系數為 -0.167,這樣的相關性對于金融資料來說已經非常顯著了。但是這一相關性在兩秒的間隔之後迅速衰減到了-0.034,是以這就要求我們的實時交易政策系統必須具有非常低的延遲,才能抓住這樣的先機,得到超額的收益。

其實,在時間序列研究中,已經有了一套比較完備的描述性統計量,自相關性(auto-correlation)就是這樣一個例子。MatplotLib 的 acorr 函數可以自動對時間序列做出自相關圖,acorr 函數的指令如下:

《建構實時機器學習系統》一3.3 利用 Pandas 分析實時股票報價資料

圖3-4所示為AAPL 股價變化率自相關系數柱狀圖,其橫軸的每個刻度均代表時間序列的錯位大小,1 表示時間序列與錯位 1 秒的自身進行相關性計算;2表示時間序列與錯位 2 秒的自身進行相關性計算。以此類推。該圖縱軸代表計算的相關性系數大小。在錯位為 0 時,時間序列和自身完美相關,這裡的相關性系數為 1。

從圖3-4可以看出,蘋果公司當天股價變化率的自相關性随着時間錯位的增加而遞減。前一秒股價變化率和後一秒股價呈負相關關系,這暗示我們在短期股票交易中,股價變化具有均值回歸的模式。在均值回歸模式中,如果股票出現大幅上漲或下跌,那麼在後面的短時間内,可能會出現反向的股價波動,以減弱前期的變化。