R語言自學日記(6) - 移動平均(MA)與常見股票圖表繪製

Edward Tung
R 語言自學系列
7 min readJul 19, 2018

前言

資訊視覺化是連結資料分析部門與前端執行部門或甚至客戶一個非常實用的窗口,實際上這已經成為獨立的一門學科,比如在美國會有 Information Design 或是 Design Strategy 的碩士學位,可以說複雜的資訊在經過設計之後,往往可以扮演連結多個部門/Function的角色。專門的資訊設計公司也開始相繼出現,比如像最近越來越紅的數據可視化決策平台,就被許多公司拿來做客製化並廣泛地應用在商業領域。

北京數字冰雹公司開發之數據可視化決策平台

當然,我們並不需要如此複雜的資訊呈現,對於時間序列資料來說,我們在乎的通常是折線圖等可以觀察時間變化的資訊,因此,本章節就要以MA,也就是股價的移動平均線,並練習如何繪製我們常見的K線圖為主。

導入ggplot2套件包

我們在開始前要先透過install.package('ggplot2')來實現,並使用library(ggplot)來導入該模塊包,以下先附上cheat sheet:

ggplot的邏輯基本上是先建立好一個繪圖區塊,包含像資料集、指定資料欄位之後,透過"+"的符號來指定圖表類型,以及一些更細部的參數,舉例來說如果我想要使用ggplot建立股價的折線圖以及成交量的長條圖資訊,我的代碼會像這樣:

ggplot(data = , aes() )是必要的argument,最後再透過加上圖表類型、位置調整參數等方式去調整圖表內容,除了刻度調整、座標軸標題、圖例等常見資訊以外,還能夠支援Zoom In, Zoom Out等調整。

*BTW,請記得將ggplot2更新到最新版本唷!

繪製股價價量圖表 - 疊圖技巧

接下來我們要講講如何做出價量圖表,也就是如何在ggplot上面實現疊圖與副座標軸,將折線圖與成交量的長條圖疊在一起,並加上一些簡單的美工。

步驟稍微複雜了一點,但非常的彈性靈活,邏輯基本上都是屬於建立資料集、指定圖表類型、細調座標軸與刻度等在進行,因此繪圖起來並不會非常困難,有了這個疊圖技巧以後,我們可以進行更複雜的圖表繪製:

計算並繪製移動平均線(Moving Average)

移動平均線被廣泛地使用在技術分析判讀上,背後蘊含的其實是趨勢判斷的意思,舉例來說我們比較每日價格變化與其過去二十日的平均價格,我們就可以判斷出短期的價格趨勢是不是比二十日的長期價格趨勢,而移動平均的計算方式並不複雜:

我們來透過R語言計算20、60與120天的移動平均線看看:

tseries與forecast提供了非常簡便的參數方便我們計算移動平均,省去了不少寫for迴圈的時間,當然你也可以透過filter(data,rep(1/n,n))的方式去做篩選,但由於邏輯比較麻煩,這邊也就不多作介紹。從上圖我們可以很明顯的看到長短期趨勢變化,當紫色的線突破紅色與藍色的長期均線時,我們可以說短期有很強的上升走勢,其他可以依此類推,如果想要了解更多的朋友可以參考CMoney寫的簡介,網址如下:

移動平均線:http://www.cmoney.tw/learn/course/technicals/topic/485

K線圖是甚麼

有在玩股票的朋友鐵定對這個圖表很熟悉,在國外的翻譯是Candlestick Chart,因為長得很像蠟燭的緣故。這張圖表原先是由日本人發明的,我們可以很清晰地從圖表中判讀開收盤價格以及最高最低價格資訊,進而有人就研發各式各樣的判讀圖表方法,諸如判斷買賣方勢力拉鋸、判斷成交單量與價格的關係等等,以下是K線的簡單介紹:

Source:Moneydj

我們可以看到,從顏色就可以很輕鬆看出漲跌,上漲線是白色(紅色)而下跌線是黑色(綠色),整個K線由兩部分組成,第一是開盤價與收盤價組成的類似長條圖的實體部分,第二則是最高最低價組成的影線部分,組成基本上不難,但繪製稍嫌麻煩一點,以下

Step1分組:原始資料並沒有準確地指出今天的價格是上漲還是下跌,為了待會上色,我們先花一個步驟將分組完成,建立一個判斷式來判斷開盤價與收盤價的高低關係,並分別標上rise與fall的標籤。

Step2建立上下影線:我們使用最低與最高價來繪圖,可以使用ggplot中的errorbar(),會自動創建一個由最小值與最大值組成的區間段,代碼如下:

Step3建立實體部分:這次擷取開盤價與收盤價兩個部分來做出實體線,代碼如下:

注意,順序很重要,必須先建立影線否則你的實體部分就會被蓋過去!另外,可以看到剛才建立的欄位Group派上用場,繪圖的時候根據上漲或是下跌自動幫我們著色,下一步則是要作微調。

Step4加工一下:這邊我們加上適當的顏色以及圖表資訊

這樣基本上可以算是大功告成,當然如果你嫌不夠好看你大可以調整背景顏色或做任何你想做的美工,而目前的圖表看起來十分模糊,但這是因為資料量太大,我們可以擷取區段來看一下情況:

有捷徑當然要走 — R語言套件包 Quantmod

上面搞了這麼久,作為統計軟體的R難道沒有更快速一點的方式嗎?當然有,而且作圖還很好看,我們引入Quantmod套件(如果在Python你可以嘗試使用Q Quant套件,效果非常類似)並使用預設的繪圖函數chartSeries(),但在這之前我們要先把資料轉換成xts格式,此外,記得資料格式必須正確,可以參考Yahoo Finance的資料:

可以看到比起我們剛才累得要死,quantmod只需要一行代碼就可以做出更精緻的圖表,除此之外,quantmod作為一個強大的財務計量軟體,還有其他許多功能如我們剛才說的繪製移動平均線:

美到窒息,最後再介紹一個常見的功能,剩下的留給大家慢慢去挖掘,這個功能就是addBBands(),這個函數會自動繪製布林通道,這個通道是用來判斷股價與其標準差偏離的程度,好判斷股價反彈的機率,詳情可參考:

布林通道:https://www.cmoney.tw/notes/note-detail.aspx?nid=17738

Quantmod繪製技術分析指標

總結

資料視覺化不論在數據分析、計量分析的行業都絕對是重頭戲,直覺上就能幫助分析師省下不少時間。下一篇我們將會介紹常用的資料預處理方法,這並非直接跟時間序列相關,但是在很多情況下是非常通用的,一樣如果喜歡我的文章,還請下面按個Clap囉!

--

--

Edward Tung
R 語言自學系列

Columbia Student || 2 yrs of data scientist and 1 yr of business consultant experience