2018年1月3日 星期三

[Data Science 到底是什麼從一個完全外行角度來看][16]用R來看股票,透過quantmod了解R的強大

image
圖片來源: https://pixabay.com/en/books-spine-colors-pastel-1099067/https://pixabay.com/en/math-blackboard-education-classroom-1547018/

在上篇([15]R是什麼?準備開發R的環境 - RStudio介紹)了解了R的歷史和準備好了接下來的開發環境之後,就可以開始用R來做分析了。

一般來說,在學新的語言都會先看看所謂的Hello World,了解整個語言的Syntax和感覺。

不過R不是一般型的程式語言,是給統計學家用的語言。因此,個人覺得如果只是看Hello World好像看不出來R特別的地方,不過如果直接學語法又太無聊。

因此,這邊透過安裝和使用quantmod這個套件,並且用它來簡單分析股票作為R的入門介紹。

quantmod是什麼?

quantmod是一個R的套件,全稱是Quantitative Financial Modelling and Trading Framework for R ,它是一個套件用來做股票相關分析。

接下來將會用quantmod來分析google的股票。

用quantmod分析google股票

接下來會分幾個階段進行:

  1. 安裝和載入quantmod套件
  2. 取得google股票資訊和分析得出內容
  3. 畫出走勢
  4. 畫出黃金和死亡交叉線

安裝和載入quantmod套件

第一個指令是:library("quantmod")

可以直接放在左上角的script裡面,或者左下角的console執行。

在之後只要看到R的script裡面有出現:library,或者require,表示要載入套件到目前的session

舉例來說,如果看到library("quantmod")表示需要套件quantmod,這個時候如果沒有這個套件就記得要安裝

安裝方式有兩種:

  1. 透過指令 - install.packages
  2. 透過gui
嚴格來說只有一種方式,就是指令,因為gui其實也是呼叫指令。

使用GUI的話,有幾種做法:

  1. 選擇右下角的 install
  2. 在package名稱輸入 quantmod - 這邊會注意到會有auto complete的效果
  3. 最後按下安裝
image
用gui安裝package

實際上,這個動作同等於在console呼叫install.packages("quantmod"),這邊有件事情要注意一下,安裝的時候會出現紅色的字,那個不是錯誤,只是在這個theme的情形下的訊息。

image
安裝的畫面

取得google股票資訊和分析得出內容

在這個部分的指令如下:

# 取得google的股票,並且看看前6筆資料
getSymbols("GOOG")
head(GOOG)
                    

這邊用了兩個指令:

getSymbols
這個是quantmod提供的方法,GOOG是google的股票代號,這個資料是從yahoo股市來。
head

這個是r base(核心)的方法,表示看前6筆的資料。

這個會很常看到,當拿到Data不知道是什麼的時候,就會呼叫head看一下內容。

image
執行結果

head出來的結果看到有6個欄位:

  1. GOOG.Open - 就是開盤價
  2. GOOG.High - 最高價
  3. GOOG.Low - 最低價
  4. GOOG.Close - 收盤價
  5. GOOG.Volime - 成交量
  6. GOOG.Adjusted - 還原權值

每一列是一個日期,換句話說就是每一天。

還記得之前提到Data Science的3個圈圈嗎?其中一塊就是Domain Knowledge。如果不懂股票,那麼剛剛那些數值其實沒有任何意義。 接下來也沒有辦法做分析。

畫出走勢

看股票的就知道,會看一個所謂的走勢圖,quantmod讓畫這個走勢圖非常的簡單,只需要呼叫:chartSeries(GOOG)

image
畫出走勢圖,從20070103到20180102
可以把這張圖放大(放大鏡 Zoom)或者另存(圖片Export)

這個的區間可能非常長,可能看不太清楚,因此可以限制變成只分析進3個月的資料: chartSeries(GOOG["2017-11-03::2018-01-03",])

還記得整個資料像是一個table的樣子,那麼等於我們在限制row(列)的部分,因為每一列是日期。
image
只顯示3個月
這個是國外的軟體,所以綠色代表漲紅色代表跌。又是另外一個Domain Knowledge。

畫出黃金和死亡交叉線

有了資料和走勢,接下來是做一些分析。

在股票來說,有個所謂的黃金交叉新死亡交叉線

基本上有個概念叫做移動平均數(Moving Average MA),例如如果計算3天均數就是把三天的價加總算出平均。那這個會隨著天數移動,因此叫做移動平均數。

如果一個長期的MA(例如60日季線)屬於下降然後短期的MA(例如20日月線)屬於上升並且交叉,就稱之為黃金交叉,原因是整個趨勢屬於上漲。

死亡交叉是一樣概念,只是反過來。短期的MA屬於下降,然後長期屬於上升,兩者交叉的時候就是死亡交叉

還是要強調,Domain Knowledge的重要,小弟我不懂股票,了解這個概念也是花了一點時間。

有了這個概念之後,來執行以下語法:

# 計算 20日和60日均線
ma20<-runMean(GOOG[,4],n=20)
ma60<-runMean(GOOG[,4],n=60)
head(ma20, 25)

# 畫上線
chartSeries(GOOG["2017-01-03::2018-01-03",], theme = "white")
addTA(ma20,on=1,col="blue")
addTA(ma60,on=1,col="red")

這邊用了一個新的方法,但是大部分都是quantmod的方法,因此不介紹了,不過有三個地方做一下說明:

runMean(GOOG[,4], n=20)

重點在GOOG[,4]

這邊有兩個部分:

  1. 還記得MA的計算是用收盤價,所以我們要用所有的資料,因此逗點前面是空白,剛好和剛剛過濾日期是顛倒
  2. 這邊用的是第四個欄位,也就是收盤價的欄位。R裡面的index是從1開始,而不是像一般從0開始
指令:head(ma20,25)
這邊指的是看前25筆,由於是20日均線,所以前20筆是NA因為不夠計算。
指令:chartSeries(GOOG["2017-01-03::2018-01-03",], theme = "white")
之前只顯示前3個月沒辦法很好的畫,所以把整個時間拉長到1年,並且改成白色比較方便畫線。
image
畫上均線

結語

希望透過透過這個範例可以看出R的一些特點:不管在過濾列的資料和欄的資料都可以用簡單array的感覺來做到,並且在繪圖上面和呈現非常方便。

不過要注意的是,這邊很多指令都是和quantmod這個套件有關,因此在一般其他的Exploratory analysis比較沒辦法使用到。

因此在接下來將會在下一篇([17]R語言基礎 上篇 - 語言特性和資料形態)介紹R的特性,和其他語言差別在哪別和一些特色。

參考資料

quantmod官網
官網資料使用範例
第一次使用R語言做回測:六分鐘,就上手!

這篇基本參考了這個部落格裡面內容做介紹,部落格還有延伸一些預測會賺多少的介紹。

http://www.bituzi.com/2014/12/Rbacktest6mins.html

2 則留言 :

  1. 取得台灣股票在計算均線時,可能會發生錯誤
    是因為有些日期沒值,變成NA,導致計算錯誤
    可以用下列語法移除NA資料
    ind <- apply(stock, 1, function(x) all(is.na(x)))
    stock <- stock[!ind,]

    回覆刪除
    回覆
    1. 抱歉回的晚了,最近都沒時間注意部落格
      感謝 小賴大大的補充

      中間會有NA是因為yahoo那邊資料的問題,所以如果要分析臺股建議還是從台灣的證交所網站parse資料回來
      就不會有這個問題。

      如果有機會在和大家介紹。

      刪除