R语言金融分析与建模
上QQ阅读APP看书,第一时间看更新

第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和小写的x代表不同的变量。

> 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,起始值和终止值为n_1n_2,我们可以使用n_1:n_2

> y <-1:50

此时,意味着给y赋值为“1,2,3…,49,50”。

我们也可以颠倒其顺序。

> z <-10:1

此时,意味着给z赋值为“10,9,8…,2,1”。

请尝试使用以下代码和打印x以查看其值。

> 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是现值,FV是未来值,R是资本的期贴现率(折现率),n是周期数。

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中的零是如何定义的?