2018年10月29日 星期一

簡易外匯分析

(本篇文章利用R語言實作)

這一篇文章的課題是:

當我們拿到一份外匯資料時
應該如何了解及處理這一份資料

這次主要完成的問題有:

(1)繪製走勢圖
(2)計算報酬率的平均數、中位數、標準差
(3)繪製報酬率的機率密度圖

先來看看這一份資料的樣貌

setwd('C:\\Users\\user1\\Desktop\\資料分析')

首先需要設定根目錄的位置

設置根目錄的目的是讓你匯入匯出資料都可以直接從這邊動作
可以免去每次都要宣告檔案位置的麻煩
而設置根目錄時有一個需要注意的地方
就是他並無法辨認windows系統常用的反斜線(\)
這在各個程式語言中都是轉義字元的意思
有興趣的同學可以另外去研究
所以必須以兩個反斜線(\\)或是改成斜線(/)才行

FX <-  read.csv('FX.csv', header = T, encoding = 'UTF-8', stringsAsFactors = F)
col_name <- c('期間', '匯率(NT/US)')
names(FX) <- col_name

接著匯入資料就需要用到read.csv這個函數了

輸入的第一個參數是檔案名稱(記得加附檔名)
第二個是告訴R資料的第一行是不是欄位名稱(因此在某些函數是使用colname=T)
第三個參數則比較麻煩了
因為這一份資料的編碼方式R無法直接辨識(通常有中文比較會有這樣的情況)
因此需要加上這一個參數表示 讓R讀懂
最後一個參數則是不要讓R把變數當作因素向量來讀
以後若有機會再來聊聊資料結構吧!
另外兩行則是改變這份的資料的變數名稱囉

先來畫畫走勢圖吧!

因為資料的長相不佳(ex:1990M04)
所以必須先經過一定的處理
讓R能辨識他是時間

year <- c()
for (i in 1:length(FX$期間)) {
  year[i] <- strsplit(FX[i, 1], 'M')[[1]][1]
}

month <- c()
for (i in 1:length(FX$期間)) {
  month[i] <- strsplit(FX[i, 1], 'M')[[1]][2]
}

FX = cbind(FX, year, month)
FX$期間 <- paste0(FX$year, '/', FX$month, '/01')
FX$期間 <- as.Date(FX$期間)

上面利用strsplit來把1990M03等的東西切開

把M當作中間點取出在他之前跟在他之後的東西
因此這邊是先創造一個空的向量year, month
在讓年份依序存入year
月份依序存入month
最後獲得year跟month後把他們跟FX合起來
由於as.Date只能辨識有年月日的格式
因此在將獲得的年月利用paste0與"/01"黏起來
其中paste與paste0的差別只有黏起來的時候中間會不會有空格
藉著就能利用as.Date將資料轉為時間了~

library(ggplot2)
ggplot(FX, aes(x=FX$期間, y=FX$`匯率(NT/US)`))+
  geom_line()

載入ggplot2套件

沒有的同學要先安裝喔

install.packages('ggplot2')

就可以輕鬆畫出走勢圖囉~


接著來計算報酬率的平均數、中位數、標準差吧


lret <- diff(log(FX$`匯率(NT/US)`))
lret <- c(NA, lret)
FX <- cbind(FX, lret)

計算這筆資料的log return(lret)

就是先取log再讓前後項相減
而使用log return的原因是因為
比起一般的報酬率計算方式(後期-前期/前期)
他在計算連續的報酬率時更精準

接著由於這樣做出來會少一項(n項東西中間共有n-1個空格)
而第一期沒有投資因此不會有報酬率
所以在最前面加入NA
最後把利用cbind(column bind)把lret放入資料FX中
ret_mean <- mean(FX$lret, na.rm = T)
ret_med <- median(FX$lret, na.rm = T)
ret_sd <- sd(FX$lret, na.rm = T)
FX_summary <- t(data.frame(ret_mean, ret_med, ret_sd))

接著就是用lret計算平均、中位、標準差啦

只要呼叫mean, median以及sd即可
相信這三個東西應該是不需要由我幫大家複習的啦~
其中資料中因為有NA
所以跑出來會是NA
必須呼叫na.rm來把NA值忽略才能跑出結果
最後我利用data.frame把東西整合到一個資料表格中

已經到了最後一步了
繪製報酬率的機率密度圖
hist(FX$lret, prob = T, ylim = c(0, 50))
lines(density(FX$lret, na.rm = T))

利用hist函數可以繪製直方圖

其中prob=T是繪製機率而不是頻率
所以想繪製頻率圖的可以不要放置這個參數喔
再利用lines在圖上加上線圖 就完成囉!

所以在這一次我們學習到了:

用了一些簡單的技巧處理資料
利用迴圈完成自動化的整理
用R內建的繪圖及ggplot2繪製圖片

之後也會陸續整理其他的資料分析實例給大家囉~

3 則留言: