- R語言金融分析與建模
- 嚴玉星
- 3444字
- 2021-10-27 17:08:58
第1篇 R語言基礎
第1章 R簡介
在本章中,我們簡單介紹一下如何下載及安裝R,如何啟動和退出R,R是否區分大小寫,以及如何為變量賦值。簡言之,我們假定讀者是R初學者,如金融專業的學生,對R一無所知。對于有一定R基礎的學員,他們可以快速地瀏覽本章的內容,或直接跳到下一章。在本章中,我們將討論為變量賦值的不同方法。在本章末尾,我們還討論了將R應用到金融學上的優勢及阻礙。實際上,最大的阻礙是金融相關專業的學生對學習計算機編程的內在恐懼。為此,在本書中,我們從最簡單的方法入手,主要的目的是消除這些學生內在的恐懼,以增強他們的信心。我堅信在不遠的將來,用一門計算機語言編程是每個金融系的學生所必備的能力之一。
1.1 下載和安裝R
為安裝R,我們有以下5個步驟。
第1步:訪問R官網。
第2步:單擊“Download R”。
第3步:選擇一個靠近你的地址。
第4步:選擇適當的軟件(PC、Mac)。
第5步:單擊“base”。
安裝完畢后,R圖標將出現在你的計算機桌面上,如圖1-1所示。
圖1-1 R圖標
1.2 啟動和退出R
若要啟動R,請雙擊計算機桌面上R圖標(見圖1-1)。若要退出R,只需鍵入q()即可。
> q() # 第一種方法退出R
以上語句中,#標志是指注釋句的開始。
# 這是一個注釋行 # > 這左邊的大于號是 R 的命令提示符
當退出時,R軟件將詢問你“是否保存工作空間映像”(見圖1-2)。這實際上是問你是否“要保持所生成的變量及自編函數以供將來使用”。此階段對新手而言,只需回答否(No),即選擇圖1-2中的第2個選項。
圖1-2 詢問用戶是否保存工作空間映像
還有另一種方式可以退出R,即通過單擊R軟件菜單上的“File”,再單擊“Exit”即可。在退出R且不想保存我們的一些已賦值的變量和自寫函數時,可以使用q("no")的命令。
> q("no") # 退出R不保存生成的變量和函數 > q("yes") # 退出R保持生成的變量和函數
1.3 R的基本概念和功能
為變量賦值,可以使用<?、=或?>。
> x <-10 # 為 x 賦值10 > y = 20 # 為 y 賦值20 > 30 -> z # 為 z 賦值30 > word <-"Hello " # word 是一字符變量(字符串)
若要顯示變量的值,只需鍵入它的變量名即可。
> x<-10 > x [1] 10
對R軟件而言,我們不需要單獨定義一個變量而可以直接為它賦值。
> fv <-100
R是區分大小寫的,這意味著大寫的和小寫的
代表不同的變量。
> x <-10 > X Error: object 'X' not found
以上的出錯信息是指(大寫的)'X'沒能找到,原因是我們沒有為其賦值。若要把幾個R命令放在一起(同一行),可以使用分號(;)將它們隔開。
> fv <-10;pv <-100;n <-10;rate <-0.05
將一系列的值分配給一個向量,可以使用c()指令,這里c可理解為一列(英文為column)。
> x<-c(1,2.5,3.4,6.2)
如果向量內各個值之間的增量為1,起始值和終止值為和
,我們可以使用
:
。
> y <-1:50
此時,意味著給y賦值為“1,2,3…,49,50”。
我們也可以顛倒其順序。
> z <-10:1
此時,意味著給z賦值為“10,9,8…,2,1”。
請嘗試使用以下代碼和打印以查看其值。
> x <-1.5: 10
1.4 ls()函數和rm()函數
有時我們需要列出所有變量。此時,可以使用ls()函數。
> ls()
當不再需要一個變量時,我們可以從內存中刪除它。
> rm(x) # 刪除x變量
若要同時刪除多個變量時,我們用逗號來分隔它們。
> rm(x,y,pv) # 同時刪除 x、 y 及 pv
若要刪除所有變量,我們有以下代碼。
> rm(list=ls()) # 刪除所有變量
還有另一方法來刪除所有對象(變量),即[單擊]R 菜單上的"Misc",然后選擇 "Remove all objects…"。
若要在屏幕上打印字符變量(字符串),我們可以使用cat()或print()函數。記住要把句子用雙引號或單引號包括起來。在下面的語句中,\n為換行符號。
> cat("Hello World!\n\n\n") Hello World! >
然而,對print()函數而言,另起一行的符號"\n"是無效的,見下例。
> print("Hello R\n") [1] "Hello R\n" >
我們也可以打印已賦值的變量。
> x<-'this is great' > print(x) [1] "this is great" >
1.5 換行符號(+)及R提示符
當一個命令占用多行時,我們會看到+符號。假設我們打算將1~10賦值給x。
> x <-1:10 # 將1,2,......到 10賦值給 x
出于某些原因,在完成整個命令之前,我們不小心按下了回車鍵。這時+符號將顯示。換句話說,我們使用了兩行來完成該語句。
> x <-1: # 我們不小心按下回車鍵 + 10 # 繼續鍵入其余的命令 >
在編程時,往往會按錯鍵,如雙引號或單引號不匹配等。對初學者而言,尤其如此。很多時候,我們并不想弄清楚問題在哪里,因為找錯可能比重新鍵入語句更為費時。我們只想回到R提示符并重新打入該命令。在這種情況下,按Esc鍵即可返回到R的提示符(<)。Esc鍵在鍵盤的左上角。
> x <-9"(999asdfklj + # 使用 Esc 重新回到 R 的提示符 >
1.6 尋求幫助
我們有幾種方法來找到有關特定函數的信息。如果我們想查找均值函數(mean)的信息,我們可用“?mean”“help(mean)”或“example(mean)”。
>?mean
help(mean)的命令可達到和“?mean”命令相同的目的。
> help(mean)
若要獲取一個特定函數的有關實例,我們可使用example()函數。
> example(mean)
為了尋求幫助,我們也可以使用R菜單上的Help功能,即單擊“Help”,然后選擇“FAQ on R”。
FAQ的英文全拼為Frequently Asked Questions,意思為“常問的問題”。圖1-3顯示了單擊R菜單上的“Help”后所顯示的所有條目。
圖1-3 Help菜單
當不確定函數的拼法時,可以使用apropos()函數。
> apropos("sd") [1] ".F_dqrrsd" ".isMethodsDispatchOn" [3] "assignClassDef" "completeClassDefinition" [5] "getClassDef" "isClassDef" [7] "isdebugged" "makePrototypeFromClassDef" [9] "sd" "SSD" [11] "superClassDepth" "tsdiag" [13] "TukeyHSD" "UScitiesD" >
若想我們的關鍵字(字母)在一詞的開始時出現,我們使用“^關鍵字”,如apropos("^col")。若希望其在詞尾出現用“關鍵字$”,如apropos("col$")。
> apropos("col$") [1] "col" "max.col" "ncol" "NCOL" > apropos("^col") [1] "col" "col2rgb" "colMeans" [4] "colnames" "colnames<-" "colorConverter" [7] "colorRamp" "colorRampPalette" "colors" [10] "colorspaces" "colours" "colSums" > apropos("col$") [1] "col" "max.col" "ncol" "NCOL" >
此外,為顯示長度為3的所有函數,我們有以下指令:apropos("^.{3}$")。
> apropos("^.{3}$") [1] "$<-" "%*%" "%/%" "%o%" "%x%" ".gt" ":::" "@<-" "[<-" "<<-" [11] "abs" "acf" "AIC" "all" "any" "aov" "Arg" "ave" "BIC" "bmp" [21] "BOD" "box" "bxp" "cat" "ccf" "co2" "CO2" "col" "cor" "cos" [31] "cov" "cut" "det" "dim" "dir" "end" "exp" "fft" "fix" "for" [41] "get" "glm" "hat" "hcl" "hsv" "IQR" "lag" "lcm" "log" "mad" [51] "Map" "max" "min" "Mod" "new" "nlm" "nls" "npk" "Ops" "par" [61] "pdf" "pie" "png" "ppr" "raw" "rep" "rev" "rgb" "rle" "row" [71] "rug" "seq" "sin" "SSD" "stl" "str" "sub" "sum" "svd" "svg" [81] "tan" "tar" "try" "tsp" "unz" "url" "var" "x11" "X11" "xor" [91] "zip" >
在此階段對于新手而言,無須理解("^.{3}$")的確切含義。我們會在以后章節中對該語句作詳細的講解。
1.7 使用R作為一個普通計算器
R可以用作一個簡單的計算器。原因是通過R,我們可以調用許多內存函數。例如,mean()是求平均值的函數。
> x <-1:50 > mean(x) [1] 25.5
大家可以嘗試其他的函數:max()、min()、median()、sd()和var()等。
> x <-1:50 > max(x) [1] 50 > min(x) [1] 1 > median(x) [1] 25.5 > sd(x) [1] 14.57738
1.8 找回以前的命令
當我們要重新顯示已執行的命令并修改它時,可以按鍵盤上的向上鍵。
> x <-1:5 > x <-1:500
發出一組命令行后,我們可以反復使用向上鍵和向下鍵來“召回”并糾正“老”的命令。這對檢查和修改我們的代碼非常方便,原因是你總能找回前一命令并對其做少許的修改。
1.9 比較ls()函數和dir()函數
我們不應混淆dir()和ls()的區別。dir()可以列出我們當前的工作目錄或指定目錄(如使用絕對路徑法)下的文件,如程序、輸入數據文件、輸出數據文件、輸入數據集和輸出數據集等。ls()可以列出在我們當前的工作空間所包含的R對象(objects)。
> ls() # 列出當前工作空間包含的所有對象
R對象包括我們定義的變量、數據表、數據框、向量、數組和函數。在此階段,如果你不了解數據表、數據框、向量和數組等的定義,不必擔心。因為在后面的章節中,我們將仔細討論這些概念。
> ls(pat='test') # 顯示包含 'text' 的所有對象
另一種方式來顯示所有的目標是使用objects()函數
> objects() # 第二種方式來顯示所有的對象
我們用rm()函數從內存中刪除不必要的變量、函數及數據。
> rm(x) # 刪除 x > rm(x,y) # 刪除 x 和 y
有幾種方法可以刪除所有對象,如下所示。
# rm(list=ls((all=TRUE))) # 刪除所有對象 (方法 1) # rm(list=ls()) # 簡單一點的方法來刪除所有對象
通過R軟件的菜單,也可以刪除所有對象,即單擊R菜單上的“Misc”,然后選擇“Remove all objects…”
另外,如果想要從我們當前的工作目錄或指定目錄下刪除一個文件,可以使用file.remove()函數。
> file.remove('test.R') # 相對路徑法 > file.remove ('datas/test2.R') # 絕對路徑法
1.10 R的精度
在大多數情況下,大多數研究人員并不在意R軟件的精度。然而,知道如何找到它對將來可能有益,因為我們可能會遇到有關的問題。
> .Machine $ double.eps [1] 2.220446e-16
1.11 列出當前工作目錄下的文件
dir()函數用來列出所有的程序、數據集和其他存在于當前的工作目錄下的文件。
> dir() # 顯示當前工作目錄中下的所有程序等
當我們想要顯示某一類文件時,可以使用以下代碼。
> dir(pattern="ratio") # 顯示文件名中含有"ratio" 的文件
如果我們打算檢查非當前工作目錄下的文件,則需添加path="our_path_here",這就是所謂的絕對途徑法。
> dir(path="datas/",pattern="t.R")
1.12 改變當前的工作目錄
為顯示當前的工作目錄,我們使用getwd()函數。
> getwd() [1] "C:/Users/yyan/Documents"
在做項目時,我們往往會生成專門的文件目錄(檔案),以包含所有的數據、程序和其他相關的文件。在啟動R后,我們通常希望那個與項目相關聯的目錄成為當前工作目錄。第1種改變當前工作目錄的方式是使用R菜單欄,即通過單擊“File”,然后選擇“Change dir…”。
第2種方式是使用setwd()函數來改變當前的工作目錄。
> setwd("datas") # 改變當前的工作目錄 > getwd() # 查看當前的工作目錄 [1]"datas"
在上述語句中,getwd()用于顯示當前目錄。上面我們用該函數來確認已經改變了的工作目錄。
1.13 改變啟動R時的工作目錄
如我們在下面3個月將用R完成一個項目。在啟動R時,我們希望R直接將有關的目錄設置為當前工作目錄。為此,我們將按下面的步驟設置。第1步,在R軟件的圖標上單擊鼠標右鍵;第2步,選擇“屬性”;第3步,在彈出窗口的“起始位置”選項處,填入我們指定的工作目錄。
例如,如果你打算在啟動R時,直接將c:\test_R\作為工作目錄,那就可以按照上面的方法去做。
1.14 R在金融建模中的優勢與障礙
本書的主要目的是將R應用在金融學上面將R應用在金融領域方面的優勢,這里就不再贅述了。我們只是將金融學的學生學習R的優點用表給出。表1.1列出在財務入門課程中引入R軟件的優勢。
表1.1 R軟件在金融學上使用的優勢
靈活性意味著,用戶可以選取他們自己最喜歡的函數。例如,我們知道可以寫很簡單的一行的R程序來計算未來值的現值。有關公式為:
在公式(1-1)中,是現值,
是未來值,
是資本的期貼現率(折現率),
是周期數。
pv_f<-function(fv,r,n) fv/(1+r)^n
在后面我們將仔細講解該函數的構造。對上述的pv_f的函數而言,用戶可以為其重命名為pv_function或my_PV_function等。如果你仍想保持原有的函數,可以添加另一個函數。請參閱下面的示例。
> my_PV_function(fv,r,n) pv_f(fv,r,n)
在上面的程序中,my_PF_function()的功能和我們原有的pv_f()函數一樣。當一名本科學生申請碩士學位時,R的知識會給她/他許多優勢。使用R的知識和技能會為想去華爾街工作的畢業生增加一定的分量。因為很多金融機構都是使用S+。S+可以認為是R的表姐妹。表1.2給出了R在金融學上使用的障礙。
表1.2 R在金融學上使用的障礙
1.15 練習題
(1)使用R軟件的優點和阻礙有哪些?
(2)就R而言,如何將一個值分配給一個新的變量?
(3)R區分大小寫嗎?如何獲取有關特定函數的幫助?
(4)使用R時,如何添加注釋?R編譯器編譯它嗎?
(5)空格在R中有無作用?
(6)如何下載與R相關的手冊?
(7)我們需要先定義一個變量,例如整數或字符,然后再使用它嗎?
(8)函數ls()和rm()之間的區別有哪些?
(9)為某個向量賦值,起始值為?2.45,終止值為10,相同的增值為2.25。共有多少值?
(10)x的輸入值范圍1~100和202~300。
(11)反轉上題中的輸入值。
(12)如何列出所有文件?
(13)函數ls()和dir()有何區別?
(14)如何發現有關sd()函數的有用信息?
(15)如何發現所有5個字母的內在函數?
(16)對非計算機系的學生而言,如何克服學習編程的恐懼?
(17)生成一系列數字:1、2、3、5、8及10并計算他們的均值及方差。
(18)R中的零是如何定義的?