我今天要介紹用R 來寫 SMA5 和SMA 30 的交易策略
quantmod 和 TTR 是R裡面用來 進行量化分析的兩個好的套件
install.packages("quantmod")
install.packages("TTR")
基本上直接安裝就可以了
稍微介紹一下 他可以用getSymbols 函數直接來抓股價 非常方便
例如
#獲取台積電2015至今的股價資料
TWdata=getSymbols("2330.tw",from="2015-01-01",auto.assign = FALSE)
出來的結果是長這樣的
注意: 有一欄是寫 Adjuseted 是指還原權值 的股價 這對分析是很有幫助的
你可以看到 屬性是屬於 xts
這樣的話 有些矩陣阿 數值阿 的函數是不能直接套用的喔~~
例如 : mean(TWdata[,4])
另外 因為有些特殊情況的交易日 他會塞NA (例如 颱風假)
所以 簡單的處理是把NA 直接刪除
stk<-na.omit(TWdata) ## 刪除NA 值
下面再講幾個函數 Cl 和 SMA 及 embed
stkclose<-Cl(stk) ## 另外 量化分析上常常用 收盤價 所以 直接打Cl() 就可以拿到收盤價了
#計算sma5
sma5<-SMA(Cl(stk),5)
length(sma5)
#計算sma30
sma30<-SMA(Cl(stk),30)
接下來我們用用embed() 函數
#embed 是這樣的 他可以幫你 多生一欄 lag 的資料
# 你可以不用重新生成 挺方便的
SMA5<-embed(sma5,2)
SMA30<-embed(sma30,2)
head(SMA5)
挺特別的~~~ 用embed() 函數後 SMA5 又變成 matrix了 真神奇@@
好拉 因為怕文章寫得 太長 以下我認為簡單的部分就直接貼上囉!!
#合併長短期sma
smaLS<-cbind(SMA5,SMA30)
#轉換xts
smaLS<-xts(smaLS,order.by = index(sma5[-1]))
smaLs<-na.omit(smaLS)
colnames(smaLS)<-c("sma5","lagsma5","sma30","lagsma30")
head(smaLS)
也就是說我建立了 SMA5 和SMA5 前一期 / SMA30 和 SMA30 前一期
這跟底下的函數是呼應的
#建構向上突破點函數
Upcross<-function(x){ ifelse(x[2]<x[4]&x[1]>x[3],1,0) }
#建構向下突破點函數
Downcross<-function(x){ ifelse(x[2]>x[4]&x[1]<x[3],-1,0) }
簡單來說 我設了兩個 FUNCTION 他分別要去 找出向上突破 和向下突破
用一個我自己畫得很醜的圖來解釋這個邏輯
當我前一期的SMA30 > SMA5 而且 當期的 SMA 5 > SMA30 => 短線向上突破
接著新手小白 用apply() 這個函數把 Upcross 套用在每一筆日期
Upsig<-apply(smaLS,1,Upcross) #找出所有短線向上突破長線日期
Upsig<-xts(Upsig,order.by = index(smaLS)) #再轉為xts檔
!!!! 注意喔 上面是找出買進訊號的日期
!!!! 但是你要買進的時間應該是後一天吧~~ 所以下面用了一個 lag() 函數
他話讓你的資料往後一項
例如:
UpBuy<-lag(Upsig)
那麼結果如下
使用 lag 前 使用 lag 後
#查詢所有買入點
UpBuy[UpBuy==1]
#根據 新手小白岡社的FUN 買點就是1囉
#找出賣出點的方式就一樣囉~~
Downsig<-apply(smaLS,1,Downcross)
Downsig<-xts(Downsig,order.by = index(smaLS))
DownSell<-lag(Downsig)
DownSell[DownSell==-1]
以上就是今天新手小白想告訴大家的
怎麼用R去寫一策略 並執行 (找出買賣點)
下一次新手小白 先預告一下 我們要來談談
用這樣子寫出的策略 來進行回測績效囉~~
感謝大家收看