[R][語法練習]向量運算 vs 迴圈運算

R支援向量運算,可以大量減少程式內的迴圈使用,在計算統計分析中需要把資料結構拉成水平的去觀察,

筆記Lession 2: 向量運算。

 

上一篇我們利用Quantmod library取得的vix波動率指數,今天我們來計算台股股王大立光過去10年每天報酬率的常態分配:

首先我們需要簡單的財金與統計知識:

報酬率的常態分配  = 今日收盤股價除以前日收盤股價 取log函數

 

*常態分配: (Normal Distribution)

 

1.首先我們先取出股王大立光股票代號3008的資料

  從yahoo finance取出來的資料是xts object,需要轉換為data.frame再取出obs使用。

library(quantmod)
getSymbols("3008.TW")
price <- as.data.frame(`3008.TW`[,6])[,1]

View(price) 檢視變數內容

 

2.先用迴圈的方式取出每日報酬率的常態分配

#取得開始時間
st = Sys.time();
re1 <- numeric(length(price) -1) 
for(i in 2 : length(price)) 
{ 
  re1[i-1] <- log(price[i]/price[i-1]) 
}
#取得結束時間
ed = Sys.time();
#計算執行時間
print(ed-st)

執行結果:

3.利用向量運算的方式計算常態分配

 第一排  2,3,4...  n

 第二排  1,2,3,4.. ,n-1  兩排數據對除

#取得開始時間
st = Sys.time();
#利用向量運算取得每日報酬率
re <- log(price[2:length(price)] / price[1:(length(price) -1)])
#re2 <- diff(log(price)) 
#取得結束時間
ed = Sys.time();
#計算執行時間
print(ed-st)

執行結果:

比較一下兩個方法的結果: 結果都是2413筆,值的部分也相符!

但執行時間可以看出向量運算效能較好!

方法 時間(秒)
迴圈運算 0.25秒
向量運算 0.16秒(較快)

 

4.來畫一下簡單的常態分配圖表:

利用plot來畫

plot(density.default(x = re))
qqnorm(re)

快速的看出常態分配的分佈,圖表就交給專業的來解釋(分析師),越來越期待在SQL Server 2016 跑R了。

小結:

投資有一定風險!股票投資有賺有賠! 申購前應詳閱散戶血淚說明書.