前言

我們通常會利用dplyr套件搭配TTR套件的SMA函數來計算移動平均線指標。舉例來說,我們要計算5日、10日及20日移動平均線,則在R裡面的寫法為:

但上述的寫法有一個缺點,如果我們計算更多不同天期的移動平均線,例如10日、20日、30日…至100日移動平均線,這樣就需要寫10行的SMA函數才行。程式碼會變得很複雜,而且使用者還要一直複製貼上程式碼,並修改參數,這顯然是很麻煩的事情。

這篇文章主要是來解決上述問題,我們可以透過eval函數來處理這個問題。

eval函數

eval函數是R軟體的內建函數,主要是將一段文字以命令的方式讓程式去執行,以下我們做一個簡單的範例。假設說我們想要產生一個變數叫做a,並且指派數值1給a。

上述的兩個不同方法,其結果都會讓變數a為1。由於eval函數將文字變成命令送到程式,因此我們可以透過修改字串的方式,並搭配迴圈,來計算不同天期的移動平均線。

資料來源

資料來源部分,我們使用tidyqunat套件,這個套件整合quantmode套件與tidyverse套件。利用此套件的tq_get函數至Yahoo Finance下載台股大盤股價資料,做為此次的範例資料集。

以下為sockData的資料內容,我們只取出日期及收盤價資訊:

## # A tibble: 2,647 x 2
##    date       close
##    <date>     <dbl>
##  1 2010-01-04 8208.
##  2 2010-01-05 8211.
##  3 2010-01-06 8328.
##  4 2010-01-07 8237.
##  5 2010-01-08 8281.
##  6 2010-01-11 8324.
##  7 2010-01-12 8309.
##  8 2010-01-13 8197.
##  9 2010-01-14 8290.
## 10 2010-01-15 8357.
## # ... with 2,637 more rows

快速計算MA

假設我們要計算5日、10日、20日、60日及90日移動平均線,則寫法為:

可以看到evalCommand的文字內容,就是在執行mutate函數搭配SMA函數計算移動平均線指標。而SMA函數內的日數參數,則變為for迴圈的對象,因此每次for迴圈就會去新增一個新的移動平均線欄位。

執行上述程式碼後,即會得到各天期的移動平均線:

## # A tibble: 2,647 x 7
##    date       close   MA5  MA10  MA20  MA60  MA90
##    <date>     <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
##  1 2010-01-04 8208.   NA    NA     NA    NA    NA
##  2 2010-01-05 8211.   NA    NA     NA    NA    NA
##  3 2010-01-06 8328.   NA    NA     NA    NA    NA
##  4 2010-01-07 8237.   NA    NA     NA    NA    NA
##  5 2010-01-08 8281. 8253.   NA     NA    NA    NA
##  6 2010-01-11 8324. 8276.   NA     NA    NA    NA
##  7 2010-01-12 8309. 8296.   NA     NA    NA    NA
##  8 2010-01-13 8197. 8270.   NA     NA    NA    NA
##  9 2010-01-14 8290. 8280.   NA     NA    NA    NA
## 10 2010-01-15 8357. 8295. 8274.    NA    NA    NA
## # ... with 2,637 more rows

只要將想要計算的移動平均線日數放入maDays向量,透過for迴圈及eval函數運作就可解決我們的問題,不用寫太多相似的程式碼。

範例完整程式碼