1、R財務分析與互動式介面教學實務經驗分享,明新科技大學教師社群,2017.05.10,田慧君 于昌永 靜宜大學財務與計算數學系,Financial data Analysis System,靜宜大學 財務與計算數學系,1.隨著巨量資料分析發展,使用R語言將成為重要的基本能力。2.REXER ANALYTICS調查顯示,R為資料分析師使用比例最高的工具。3.GOOGLE、輝瑞藥廠、美國銀行、洲際酒店集團、殼牌石油皆等使用R。4.ORACLE、MICROSOFT與IBM將R做為其產品中的主要資料分析工具。,R軟體的特色免費的自由軟體、開放源碼且應用廣泛有效的資料處理及存取能力 (可與C, C+和Fo
2、rtran等程式連結)方便的矩陣操作與運算能力完整而連貫的資料分析能力(有大量套件程式可用)強大的視覺化工具(繪圖功能)跨平臺,可在Windows、UNIX和MacOS執行,WHY R?,R 與 財務金融,完整的財金功能套件多樣方便的財務資料取得方式容易上手的財務資料分析方式不斷推陳出新的財金與各式各樣套件R for trading strategy develop and testing algorithm trading https:/ for finance time series data analysis,R-財務金融相關套件,Quantmod 、 Quantstrat 、 Port
3、folioAnalytics 、 PerformanceAnalytics.,https:/cran.r-project.org/web/views/Finance.html,RStudio下載安裝: download R之後 執行RStudio-XXX.exe,R下載安裝: download R之後 執行R-XXX-win.exe,R與 Rstudio 安裝及使用簡介,1. R 與 RSstudio安裝完成後,可在應用程式檔案系統Rstudio圖形點選 ,即可啟動RStudio,2.安裝與執行套件範例:若要安裝shiny套件PackagesInstall shiny若要執行shiny,在右邊
4、shiny對應的方框中直接打勾,Rstudio是個好用的IDE革新套件讓R在三方面有開創性改變網頁伺服器RStudio server互動式網頁Shiny互動式文件Rmarkdown資料整理工具dplyr tidyr繪圖介面ggplot2 ggvis,整合式開發環境 RStudio,R與財務資料分析-教材範例,範例: 2016.07 夏日大學教材,主單元: R_fundamental I, x a-male # char字串,變數及資料型態: 將資料儲存於變數物件內,方便重複使用及分析,1.資料常用型態:numeric數值、integer整數、char字串、factor因數、Boolean邏輯2
5、.變數物件命名:變數名稱只能以字母或.開頭變數名稱大小寫是不同的 3.指派(儲存)資料給變數:使用 b=factor(male) # factor因子 a1 male b1 male Levels: male # factor呈報資料時,無,主單元: R_fundamental I,常用運算: 算數操作、邏輯操作、if(條件式)、for迴圈,#算數操作 10 + 20 #加法 10 * a #乘法 x/20 #除法,邏輯操作 與 關係比較= Equal toGreater than&Logical AND|Logical OR!Logical NOT 10=91 TRUE,#if(條件式) 執
6、行程式指令#只有條件式為真(TRUE)才會執行#例子:袋子裡原本有四元,如果不足十元# (小於十元)再加入五元,結果是9元x=4if(x x=c(-4,5,10,-1,6,2,33,44,55) #產生向量變數,常用c() z=c(mary,John,Ellen) x3 #使用 位置指標 取得元素,利用指定元素位置 xc(1,4,2) #取得第1、4、2個元素1 -4 -1 5,儲存複雜資料常用結構:vector: 同類型資料matrix:同類型資料,同長度data.frame:不同類型資料,同長度list : 不同類型資料,不同長度特殊結構:不同R套件,設計特定儲存資料結構如:zoo、xts
7、(常用於財務交易數據),vector向量:將多個存在一維向量內, a=matrix(x,nrow=3,ncol=3) #產生矩陣變數 a ,1 ,2 ,3 1, -4 -1 33 2, 5 6 44 3, 10 2 55,matrix矩陣:將多個同類型向量資料,存在矩陣內,以R提供的內建資料集為範例 data() #查看有那些內建資料集 data(esoph) #載入esoph資料集- esophagealcancer(食道癌) #載入後,產生esoph的data.frame物件 str(esoph) #查看esoph資料集的結構 View(esoph) # V大寫,將esoph資料集內容顯示
8、于編輯區,data.frame資料框: 處理資料最常用的結構,將多組長度一致的向量(欄) (不同向量內的資料類型可不同)存在data.frame內 與Matrix最大不同在於允許不同column有相異型別,主單元: R_fundamental II,#在help中,輸入esoph查看此資料集詳細說明# A data frame with records for 88 age/alcohol/tobacco combinations(法國)#共5個欄位,88筆資料agegp年齡(Age group): factor 6個level : 25-34 35-44 45-54 55-64 65-74
9、75+ yearsalcgp 酒精(Alcohol consumption): factor 4個level: 0-39 4079 80119 120+ gm/dayTobgp抽煙(Tobacco consumption): factor 4個level: 0-9 10-19 20-29 30+ gm/dayNcases癌症人數(Number of cases): numericncontrols未罹癌人數(Number of control):numeric#可發現此5個欄位中,有4種資料,前3個欄位雖然皆是factor,#但其level構造不同,屬於不同資料。後2個欄位皆為numeric。
10、,主單元: R_fundamental II, x=c(-4,5,10,-1,6,2,33,44,55) #產生向量變數 xx3# boolean取值,取得所有大於3的元素 max(x) #選取x中最大元素 min(x) #選取x中最小元素 sum(x) # x中所有元素作和 mean(x) # x中所有元素之平均值 sd(x) # x元素之標準差,處理及初步觀察資料時常用指令: boolean取值、max、sum、mean、sd,資料缺失值檢查與處理:缺失值NA:“Not Available”常出現在許多資料中:char、numeric、factor, x=c(NA,1,2) sum(x)
11、#有NA,在套用函數時,可能導致結果為NA 1 NA is.na(x) #檢驗變數是否有NA 1 TRUE FALSE FALSE, y sum(y) #去除NA後,再套用函數 1 3 which(is.na(x) #檢查NA在那裡 1 1,注意:1.雖然NA是空值,但也有其代表意義,例如:溫度記錄temp=c(36.5,36.2, 37, NA, 37)2.許多財務資料中都會有NA值,務必以is.na()、which(is.na()先檢查,並進行適當處理,如na.omit(),主單元: R_fundamental II, x= x=c(-4,5,10,-1,6,2,33,44,55) # 產
12、生數值向量變數 summary(x) # 依資料型態 回傳x的大致資訊Min. 1st Qu. Median Mean 3rd Qu. Max. -4.00 2.00 6.00 16.67 33.00 55.00 fivenum(x)#用於數值資料 minimum, lower-hinge, median, upper-hinge, maximum 1 -4 2 6 33 55,處理資料後初步結果顯示: summary、fivenum、table、hist、plot,hist():畫出數值分佈的長條圖,提供觀察依據plot():依資料型態畫圖提供觀察依據, hist(table(esoph$a
13、gegp),data.frame數據框基本分析,$: 取欄位(column)table():將factor數據依level進行分群,然後對每一群資料資料筆數進行統計, 結果組合成一個比較表格返回aggregate() :群集函數,將按指定栏位的factor資料進行分群, 然後對每一群資料的某特定欄位資料套用指定函數, 最後把結果組合成一個比較表格返回, data() #查看有那些內建資料集 data(esoph) #載入esoph資料集- esophageal cancer(食道癌)載入後,產生data.frame物件 head(esoph) #查看esoph內前6筆資料,對資料內容有概念 w
14、hich(is.na(esoph) #查看esoph內是否有NA值 integer(0) #查無NA值,以R提供的內建資料集為分析範例,它首先將資料依factor level進行分組,然後對每一組資料資料筆數進行統計,最後把結果組合成一個比較表格返回,可瞭解資料资料笔数分佈,table()函數, table(esoph$agegp) # esoph$agegp取出欄位值,$是data.frame取欄位值符號 # table()可針對指定欄位,依factor level,彙整資料筆數table(esoph$agegp,esoph$alcgp)# table(x,y)可彙集x,y two-way
15、table,結果分析1.數據資料筆數均勻分布在年龄的各level 2.數據資料筆數分佈在年齡及酒精組合的各level也頗均勻,data.frame数据框基本分析,data.frame數據框基本分析, aggregate(cbind(ncases,ncontrols) alcgp,esoph,sum),cbind(ncases,ncontrols) alcgp 表示使用 alcgp 的factor,分成多個資料群,對ncases、 ncontrols 數據都各自進行sum()操作,結果分析:1. 酒精消耗量,得到有/無食道癌人數2. 酒精消耗量愈大的群體, 得食道癌比例明顯愈高 可進一步以統計檢
16、定Note:由此看出 前一頁中僅以人數觀察容易誤導, 應該看比例較正確,人數:75人 比例:75/355 (21%),人數:45人 比例:45/67 (67%),quantmod是應用在財務方面的R語言套件。 quantmod套件提供許多功能:搜集金融資料、繪畫歷史股價、計算報酬率 資料分析:價格趨勢、風險估測、投資組合及其他財務應用,下載及安裝 quantmod套件, install.packages(quantmod) # 下載quantmod套件 library(quantmod)# 安裝quantmod套件,透過網路,由yahoo finance 取得股票交易數據, tw2330 tw
17、2330.DF View(tw2330)#檢視資料,主單元:quantmod套件與財務資料分析,主單元:quantmod套件與財務資料分析,計算交易報酬率,相關指令如下:dailyReturn、weeklyReturn、monthlyReturn、quarterlyReturn、yearlyReturn, re.2330=monthlyReturn(2330.TW) #計算2330.TW股票月報酬 head(re.2330) #顯示月報酬的前6筆資料 plot(re.2330)# plot()畫時間序列圖,觀察各時期的月報酬率變化 hist(re.2330)# hist()畫出報酬率分佈的長條
18、圖,觀察報酬率分佈,结果分析:1.20082009年,金融海嘯期間,月報酬率波動幅度較大2.長條圖顯示,正報酬機率較高 需進一步以統計檢定,主單元:quantmod套件與財務資料分析,技術分析圖型,財務常用圖形:candles、matches、bars和lines。技術分析基本函數: addMACD()、addRSI()、addSMA()、addTA(), chartSeries(2330.TW,subset=2007:2008-01,theme=white,name=台積電) # subset=2007:2008-01股價走勢圖的時間起始點設定在2007年2008-01年 # theme=w
19、hite股價走勢圖的背景設定為白色 # name=台積電股價走勢圖的標頭名稱設定為台積電,畫出股價走勢圖後,可以再加上技術指標, addMACD() addRSI() addSMA(n = 5, col = red) addSMA(n = 20, col = blue),1.5日均線向下穿越20日均線-轉弱賣出訊號2.RSI 買進訊號,主單元:quantmod套件與財務資料分析,自行操作及練習,Exercise 3-1: 1.透過網路,由yahoo finance取得某上市公司股票交易資料 2.計算此上市公司股票投資月報酬率並以plot及hist畫圖Exercise 3-2: 畫出此上市公司股
20、價走勢圖,的時間起始點設定在2008年2015年,並加上20日均線與250日均線,主單元: shiny互動式網頁,1.shiny是一個可製作互動式網頁的R套件,在Rstudio上執行,由Rstudio擔任網頁伺服器2.製作互動式網頁程式由2個函數負責:ui與server,library(shiny)library(quantmod),ui-fluidPage( titlePanel(stock input), sidebarLayout( sidebarPanel( textInput(stock, label = h3(Stock Symbol), value = 2330.TW), dat
21、eRangeInput(time,start = 2008-01-01,end =2012-06-01, label = h3(Time), fluidRow( column(4,checkboxInput(D5, label = 5D, value = TRUE), column(4,checkboxInput(D20, label = 20D, value = TRUE), column(4,checkboxInput(D240, label = 240D, value = TRUE) ) ), mainPanel( plotOutput(chart) ) ) ),輸入參數stocktim
22、eD5D20D240,輸出網頁畫面,送到server抓數據、畫圖,再將圖chart送回來由ui的plotOutput()呈現在網頁上,ui負責網頁畫面版面、輸入、輸出,主單元: shiny互動式網頁,shiny製作互動式網頁由2個函數負責:ui與server,ui輸入參數stock、timeD5、D20、D240由input物件携带至server函数,送到server抓數據、畫圖,再將圖chart送回來由plotOutput()呈現在網頁上,依input$time參數確定資料日期區間,用getSymbol() 依input$stock參數抓資料,畫chartSeries圖依參數input$D5
23、 input$D20 input$D240決定是否加上移動平均線,server由output$chart將圖送回ui,server負責所有的運算、資料處理與畫圖(後臺)ui負責頁面呈現與參數接收 (前臺),學習R的障礙與重點,1.資料類型與結構很複雜 使用R提供的功能前, 一定要確認此功能要求的是何種物件: factor 、char、data.frame、xts. R裡面為此需求,有很多as.XXX函數可呼叫 例: 檢查: is.factor()、is.character()、is.data.frame()、is.xts() 轉換:as.factor()、as.character()、as.data.frame()、as.xts()2.R有超過6000個package 使用package各式各樣功能前, 最好download提供的documentation R-project官方網站:http:/www.r-project.org/提供相當多參考文件、套件的說明及下載3. 遇到的問題 google別人的程式或到官網及論壇發問4.要持之以恆,經常 寫/測試/用R解決問題,謝謝聆聽歡迎指教,