Getting Started with R

最近開始學(xué)習(xí)用R做數(shù)據(jù)分析與量化投資,于是寫了一篇R語言的入門教程,希望能幫助大家快速上手。我的知乎|簡書|CSDN|微信公眾號(hào)PurePlay 會(huì)不定期分享量化投資與R干貨, 歡迎大家關(guān)注!

文章目錄

  • 1.1 安裝
  • 1.2 獲取幫助
  • 1.3 工作空間
  • 1.4 R文件的輸入/輸出
  • 1.5 變量
  • 1.6 運(yùn)算符
  • 1.7 數(shù)據(jù)容器
  • 1.8 plot()繪圖
  • 1.9 函數(shù)
  • 1.10 控制結(jié)構(gòu)
  • 1.11 實(shí)例:下載指定股票價(jià)格數(shù)據(jù),計(jì)算收益率相關(guān)性

1. R語言

R是一種開源的解釋型腳本語言,多年來在統(tǒng)計(jì)學(xué)家,數(shù)據(jù)科學(xué)從業(yè)人員和學(xué)者中非常流行。 它本質(zhì)上是一種函數(shù)式編程語言( functional programming language),同時(shí)支持面向?qū)ο蠛兔钍骄幊谭独?/strong>。 R具有數(shù)以千計(jì)的附加統(tǒng)計(jì)和分析庫可供下載,在定量金融和學(xué)術(shù)領(lǐng)域非常受歡迎。

R中的所有內(nèi)容(包括函數(shù))都是一個(gè)對(duì)象,可以直接傳遞給其他函數(shù)。

1.1 安裝

1.1.1 R安裝

進(jìn)入官網(wǎng):http://www.r-project.org/。 單擊“Getting Started”部分中的下載R鏈接,或者單擊左側(cè)菜單中的“ CRAN”鏈接。 選擇最接近目標(biāo)計(jì)算機(jī)所在位置的適當(dāng)鏡像站點(diǎn)。 有關(guān)安裝R的更多詳細(xì)說明。

推薦的R代碼編輯器:Rstudio,VScode

1.1.2 擴(kuò)展包安裝和載入

R擴(kuò)展包官方匯總鏈接:https://mirrors.tuna.tsinghua.edu.cn/CRAN/

(1)安裝擴(kuò)展包

  • R與Rstuidio窗口操作均可完成安裝,以Rsudio為例:點(diǎn)擊Rstudio界面右下角文件區(qū)的Packages,點(diǎn)擊Install,在彈出對(duì)話框中 , 填入需要安裝的包
  • 命令安裝
# 獲取R存放已經(jīng)安裝的包的位置,默認(rèn)位置是R的安裝路徑下的library文件夾
.libPaths()

# 安裝:擴(kuò)展包名稱需要加引號(hào)
# destdir:指定下載的二進(jìn)制zip文件存放的位置,默認(rèn)是臨時(shí)會(huì)話的downloaded_packages文件夾下
# lib:指定下載的二進(jìn)制zip軟件包被解壓后的安裝位置,默認(rèn)值的是.libPaths()獲取的路勁
install.packages("ggplot2")
install.packages("ggplot2",
                 destdir="D:/Download/Package/R",
                 lib="D:/Program Files/R/R-3.6.1/library")

(2)載入擴(kuò)展包

  • Rstudio界面:點(diǎn)擊Rstudio界面右下角文件區(qū)的 Packages,找到你要載入的包 , 在
    前面的方框中打上勾
  • R界面:點(diǎn)擊R界面上方的“程序包”,點(diǎn)擊 加載程序包,在彈出的窗口中選擇需要,載入的包
  • 命令載入
# 擴(kuò)展包名稱可以不加引號(hào)
library("ggplot2")
library("ggplot2", lib.loc="C:/Program Files/R/R3.2.2/library")

(3)量化常用擴(kuò)展包

  • 數(shù)據(jù)管理:包括數(shù)據(jù)集抓取、存儲(chǔ)、讀取、時(shí)間序列、數(shù)據(jù)處理等,涉及的R包有zoo(時(shí)間序列對(duì)象)、xts(時(shí)間序列處理)、timeSeries(Rmetrics系時(shí)間序列對(duì)象)、timeDate(Rmetrics系時(shí)間序列處理)、data.table(數(shù)據(jù)處理)、quantmod(數(shù)據(jù)下載和圖形可視化)、RQuantLib(QuantLib數(shù)據(jù)接口)、WindR(Wind數(shù)據(jù)接口)、RJDBC(數(shù)據(jù)庫訪問接口)rhadoop(Hadoop訪問接口)、rhive(Hive訪問接口)、rredis(Redis訪問接口)、rmongodb(MongoDB訪問接口)、SparkR(Spark訪問接口)、fImport(Rmetrics系數(shù)據(jù)訪問接口)等

  • 指標(biāo)計(jì)算:包括金融市場的技術(shù)指標(biāo)的各種計(jì)算方法,涉及的R包有TTR(技術(shù)指標(biāo))、TSA(時(shí)間序列計(jì)算)、urca(單位根檢驗(yàn))、fArma(Rmetrics系A(chǔ)RMA計(jì)算)、fAsianOptions(Rmetrics系亞洲期權(quán)定價(jià))、fBasics(Rmetrics系計(jì)算工具)、fCopulae(Rmetrics系財(cái)務(wù)分析)、fExoticOptions(Rmetrics系期權(quán)計(jì)算)、fGarch(Rmetrics系Garch模型)、fNonlinear(Rmetrics系非線模型)、fOptions(Rmetrics系期權(quán)定價(jià))、fRegression(Rmetrics系回歸分析)、fUnitRoots(Rmetrics系單位根檢驗(yàn))等

  • 回測交易:包括金融數(shù)據(jù)建模,并驗(yàn)證歷史數(shù)據(jù)驗(yàn)證模型的可靠性,涉及的R包有FinancialInstrument(金融產(chǎn)品)、quantstrat(策略模型和回測)、blotter(賬戶管理)、fTrading(Rmetrics系交易分析)等

  • 投資組合:對(duì)多策略或多模型進(jìn)行管理和優(yōu)化,涉及的R包有PortfolioAnalytics(組合分析和優(yōu)化)、stockPortfolio(股票組合管理)、fAssets(Rmetrics系組合管理)等。

  • 風(fēng)險(xiǎn)管理:對(duì)持倉進(jìn)行風(fēng)險(xiǎn)指標(biāo)的計(jì)算和風(fēng)險(xiǎn)提示,涉及的R包有Performance-Analytics(風(fēng)險(xiǎn)分析)、fPortfolio(Rmetrics系組合優(yōu)化)、fExtremes(Rmetrics系數(shù)據(jù)處理)

1.2 獲取幫助

1.2.1 幫助文檔

(1)Rstudio界面

點(diǎn)擊Rstudio界面右下角文件區(qū)的 Help選項(xiàng),在最后的搜索框中輸入想了解的R包或者函數(shù)

(2)R界面

點(diǎn)擊R界面的“幫助”,開啟一個(gè)幫助網(wǎng)頁

(3)輸入命令

# 獲取擴(kuò)展包信息
help("readr")
? readr

# 獲取函數(shù)信息
help(read_csv)
? read_csv

#搜索與關(guān)鍵詞read_csv相關(guān)的幫助文檔的信息
help.search('ggplot2')
?? ggplot2

# 獲取函數(shù)ggplot的使用例子  
example("ggplot") 

# 給出有關(guān)鍵詞ggplot的所有函數(shù)  
apropos("ggplot",mode="function")

# 打開搜索首頁
RSiteSearch("") 

# 搜索有關(guān)鍵詞ggplot的所有文檔和郵件列表存檔 
RSiteSearch("ggplot")
RSiteSearch("empirical")   
 
# 獲取函數(shù)源代碼
read_csv

# 列出當(dāng)前已加載包中所含有的所有可用示例數(shù)據(jù)集
data()

1.2.2 實(shí)用網(wǎng)站

1.3 工作空間

工作空間就是當(dāng)前R的工作環(huán)境

# 獲取當(dāng)前工作空間
getwd()

# 設(shè)定工作空間
# 路徑用雙引號(hào)或者單引號(hào),必須完整,斜杠為\\或者/
# 文件夾必須存在,如果不存在,可以用dir.create()函數(shù)先創(chuàng)建,但文件夾需要逐個(gè)建立。
dir.create('D:/Workfiles/Finance/Quants/R')
setwd('D:/Workfiles/Finance/Quants/R')

list.dirs("D:/Workfiles/Finance/Quants/R") #列出當(dāng)前工作目錄下的文件夾
list.files("D:/Workfiles/Finance/Quants/R") #列出當(dāng)前工作目錄下的文件
ls()  #列出當(dāng)前工作空間中的對(duì)象 
rm(x) #移除(刪除)一個(gè)或者多個(gè)對(duì)象 
history(num) #顯示最近使用過的num個(gè)命令(默認(rèn)值為25) 
savehistory(“aaa”)   #保存命令歷史到當(dāng)前路徑下文件aaa中(默認(rèn)值為.Rhistory) 
loadhistory(“aaa”)   #載入一個(gè)命令歷史文件aaa(默認(rèn)值為.Rhistory) 
options()  ###顯示或設(shè)置當(dāng)前選項(xiàng) 
q() #退出R或者Rstudio

1.4 R文件的輸入/輸出

1.4.1 保存文件

利用Rstudio/R界面保存腳本文件;保存其他文件代碼如下:

# 將運(yùn)行結(jié)果保存成.R或者.txt文件,相對(duì)/絕對(duì)路徑均可
sink("D:/Workfiles/Finance/Quants/R/try.R")
...program
sink()

# 將工作空間里的對(duì)象(結(jié)果、變量等)保存成.Rdata
save.image('try.RData')

# 圖形文件保存:可輸出成pdf/png/jpeg/bmp,方法類似
pdf('xxx.pdf') 
...program
dev.off()

1.4.2 打開文件

(1)利用Rstudio/R界面
(2)輸入命令

# 打開.R文件/R的腳本文件
file.edit("D:/Workfiles/Finance/Quants/R/1.4如何獲得幫助.R",fileEncoding = "UTF-8") 

# 運(yùn)行R腳本文件
source("xxx.R",encoding = "UTF-8")

# 打開.Rdata文件
load('try.RData')

1.5 變量

變量為我們提供了我們的程序可以操作的命名存儲(chǔ)。 變量名稱由字母(區(qū)分大小寫),數(shù)字和點(diǎn)或下劃線字符組成,不允許使用空格或特殊字符。 變量名以字母或不以數(shù)字后跟的點(diǎn)開頭。

變量名 合法性 原因
var_name2. 有效 有字母,數(shù)字,點(diǎn)和下劃線
VAR_NAME% 無效 有字符'%'。只有點(diǎn)(.)和下劃線允許的。
2var_name 無效 以數(shù)字開頭
.var_name, var.name 有效 可以用一個(gè)點(diǎn)(.),但啟動(dòng)點(diǎn)(.),不應(yīng)該后跟一個(gè)數(shù)字。
.2var_name 無效 起始點(diǎn)后面是數(shù)字使其無效。
_var_name 無效 開頭_這是無效的

可以使用向左,向右和等于運(yùn)算符來為變量賦值:

# 等號(hào)賦值
var1 = c(0,1,2,3)           
# 左賦值
var2 <- c("learn","R")   
# 右賦值  
c(TRUE,1) -> var3           

在R語言中,數(shù)據(jù)類型有:數(shù)值型Numeric,整型Integer,復(fù)數(shù)型Complex,字符串Character,邏輯型Logical,原型Raw。R中的變量不必聲明變量類型,R將動(dòng)態(tài)地找出運(yùn)行時(shí)變量的類型。

展示工作空間中的變量:

# 展示工作空間中的所有變量
ls()
# 展示工作空間中變量名包含“var”的變量
ls(pattern = "var")
# 以點(diǎn)(.)開頭的變量默認(rèn)被隱藏,設(shè)置“all.names = TRUE”參數(shù)列出
ls(all.name = TRUE)

刪除變量:

# 刪除指定變量
rm(var1)
# 刪除所有變量
rm(list = ls())

1.6 運(yùn)算符

R語言中擁有如下幾種運(yùn)算符類型:算術(shù)運(yùn)算符,關(guān)系運(yùn)算符,邏輯運(yùn)算符,賦值運(yùn)算符等。

1.6.1 算術(shù)運(yùn)算符

下表顯示了R語言支持的算術(shù)運(yùn)算符。 操作符對(duì)向量的每個(gè)元素起作用。

運(yùn)算符 描述
+ 兩個(gè)向量相加
- 兩個(gè)向量相減
* 兩個(gè)向量相乘
/ 將第一個(gè)向量與第二個(gè)向量相除
%% 兩個(gè)向量求余
%/% 兩個(gè)向量相除求商
^ 將第二向量作為第一向量的指數(shù)

1.6.2 關(guān)系運(yùn)算符

下表顯示了R語言支持的關(guān)系運(yùn)算符。 將第一向量的每個(gè)元素與第二向量的相應(yīng)元素進(jìn)行比較。 比較的結(jié)果是布爾值。

運(yùn)算符 描述
> 檢查第一個(gè)向量的每個(gè)元素是否大于第二向量的相應(yīng)元素。
< 檢查第一個(gè)向量的每個(gè)元素是否小于第二個(gè)向量的相應(yīng)元素。
== 檢查第一個(gè)向量的每個(gè)元素是否等于第二個(gè)向量的相應(yīng)元素。
<= 檢查第一個(gè)向量的每個(gè)元素是否小于或等于第二向量的相應(yīng)元素。
> = 檢查第一個(gè)向量的每個(gè)元素是否大于或等于第二向量的相應(yīng)元素。
!= 檢查第一個(gè)向量的每個(gè)元素是否不等于第二個(gè)向量的相應(yīng)元素。

1.6.3 邏輯運(yùn)算符

下表顯示了R語言支持的邏輯運(yùn)算符。 它只適用于邏輯,數(shù)字或復(fù)雜類型的向量。 所有大于1的數(shù)字被認(rèn)為是邏輯值TRUE。
將第一向量的每個(gè)元素與第二向量的相應(yīng)元素進(jìn)行比較。 比較的結(jié)果是布爾值。

運(yùn)算符 描述
& 它被稱為元素邏輯AND運(yùn)算符。 它將第一向量的每個(gè)元素與第二向量的相應(yīng)元素組合,并且如果兩個(gè)元素都為TRUE,則給出輸出TRUE。
| 它被稱為元素邏輯或運(yùn)算符。 它將第一向量的每個(gè)元素與第二向量的相應(yīng)元素組合,并且如果元素為真,則給出輸出TRUE。
! 它被稱為邏輯非運(yùn)算符。 取得向量的每個(gè)元素,并給出相反的邏輯值。

邏輯運(yùn)算符&&和|| 只考慮向量的第一個(gè)元素,給出單個(gè)元素的向量作為輸出。

運(yùn)算符 描述
&& 邏輯AND運(yùn)算符。 取兩個(gè)向量的第一個(gè)元素,并且只有兩個(gè)都為TRUE時(shí)才給出TRUE。
|| 邏輯OR運(yùn)算符。 取兩個(gè)向量的第一個(gè)元素,如果其中一個(gè)為TRUE,則給出TRUE。

1.6.4 賦值運(yùn)算符

這些運(yùn)算符用于向量賦值。

運(yùn)算符 描述
<?=<<? 左分配
->->> 右分配

1.6.5 其他運(yùn)算符

這些運(yùn)算符用于特定目的,而不是一般的數(shù)學(xué)或邏輯計(jì)算。

運(yùn)算符 描述
: 冒號(hào)運(yùn)算符。 它為向量按順序創(chuàng)建一系列數(shù)字。
%in% 此運(yùn)算符用于標(biāo)識(shí)元素是否屬于向量。
%*% 此運(yùn)算符用于將矩陣與其轉(zhuǎn)置相乘。

1.7 數(shù)據(jù)容器

數(shù)據(jù)容器data container:向量Vectors,因子Factors,列表Lists,矩陣Matrices,數(shù)據(jù)幀Data Frames,數(shù)組Arrays,

1.7.1 向量Vectors

向量類似一維數(shù)組,僅保存類型相同的數(shù)據(jù), 如果將數(shù)字與字符混合,R會(huì)將任何數(shù)值的類型轉(zhuǎn)換為字符。運(yùn)算符c()用于創(chuàng)建存儲(chǔ)數(shù)字,字符或布爾值的向量。

first_vector <- c(1,2,3,4,5,6)
second_vector <- c('a', 'b', 'c','d')
third_vector <- c('a', 1, 2, 3)
# 向量合并
new_vector <- c(first_vector,second_vector)

向量索引:

vector <- c(1,2,3,4,5,6,7,8,9)
# 獲取向量第四個(gè)元素
vector[4]
# 獲取第四和第八個(gè)元素
# vector[4,8]是錯(cuò)誤的
vector[c(4,8)]
# 獲取第四到第八個(gè)元素
# 第四和第八個(gè)元素都會(huì)被取出
vector[4:8]

向量化允許我們同時(shí)對(duì)所有元素執(zhí)行相同的操作。

vector <- c(1,2,3,4,5,6,7,8,9)
# 向量中所有元素除以3,并保留兩位小數(shù)
round(vector/3,2)

1.7.2 列表Lists

列表可以同時(shí)包含不同類型的元素,如數(shù)字、字符串、向量、列表、矩陣、函數(shù)等。

myList <- list(a = c(1,2,3,4,5),
              b = matrix(1:10, nrow = 2, ncol = 5),
              c = data.frame(price = c(89.3, 98.2, 21.2),
              stock = c("MOT", "IBM", "CSCO"))
              )

通過位置或者元素名索引:

# 返回元素列表
list1 <- myList[1]
list2 <- myList[c(1,3)]
# 返回單個(gè)元素
element1 <- myList[[1]]
element2 <- myList[["b"]]

1.7.3 矩陣Matrix

矩陣類似一維數(shù)組,只能保存類型相同的數(shù)據(jù)。

# 按列排列
mat1 <- matrix(c(1,2,3,4,5,6),
              nrow=2, ncol=3) 

# 按行排列
mat2 <- matrix(c(1,2,3,4,5,6),
              nrow=2, ncol=3, byrow=TRUE)

# 定義行名和列名
dimnames(mat2) <- list(c('one','two'),
                      c('col1','col2','col3'))

# 展示矩陣的特征
attributes(mat2)

索引方法與向量類似,需要增加一個(gè)維度

mat2[1,3]
mat2[c(1,2),3]
mat2[1:2,2:3]
mat2[,2:3]

矩陣操作也是向量化的:

# 元素服從標(biāo)準(zhǔn)正太分布的100*10矩陣
mat <- matrix(rnorm(1000),nrow=100)
# 保留三位小數(shù),展示前9行
head(round(mat,3),9)

1.7.4 數(shù)據(jù)框Dataframe

數(shù)據(jù)框是一個(gè)混合的二維數(shù)據(jù)容器,可以包含數(shù)字,字符,布爾值和因子類型。每當(dāng)從外部環(huán)境將數(shù)據(jù)讀入R時(shí),結(jié)果對(duì)象最終都可能是 一個(gè)數(shù)據(jù)幀,格式類似于一個(gè)Excel表格。

df1 <- data.frame(price = c(89.2, 23.2, 21.2),
                symbol = c('MOT','AAPL','IBM'),
                action = c('Buy','Sell','Buy'))

數(shù)據(jù)框索引[,], $

df1[1,1]
# dataframe_name $ column_name
df1$symbol

創(chuàng)建數(shù)據(jù)框時(shí),字符向量將自動(dòng)轉(zhuǎn)換為因子,它是離散變量的向量。 為了禁止將任何字符向量轉(zhuǎn)換為因子,我們可以使用stringsAsFactors = FALSE參數(shù)。

df2 <- data.frame(price = c(89.2, 23.2, 21.2),
                symbol = c('MOT','AAPL','IBM'),
                action = c('Buy','Sell','Buy'),
                stringsAsFactors = FALSE)
df1$symbol
## [1] MOT  AAPL IBM 
## Levels: AAPL IBM MOT
df2$symbol
## [1] "MOT"  "AAPL" "IBM" 
class(df1$symbol)
## [1] "factor"
class(df2$symbol)
## [1] "character"

1.7.5 環(huán)境Environment

創(chuàng)建環(huán)境空間,定義環(huán)境空間中的變量:

env <- new.env()
# [[]]與$均可實(shí)現(xiàn)環(huán)境空間中的變量定義
env[["first"]] <- 5
env[["second"]] <- 6
env$third <- 7

查看環(huán)境空間

env
# 查看環(huán)境空間中的變量名
ls(env)
# 獲取環(huán)境空間中的某一變量
get("first", envir = env)

刪除環(huán)境空間中的變量

rm("second", envir = env)
ls(env)

環(huán)境空間的存儲(chǔ)特征:不按值存儲(chǔ)對(duì)象,而是將對(duì)象位置的地址存儲(chǔ)在內(nèi)存中。 由于較大的對(duì)象不必在每次傳遞時(shí)都進(jìn)行復(fù)制,因此可以使用更有效的代碼。

env1 <- env
env1$third <- 42
get("third", envir = env)

1.8 plot()繪圖

R提供了許多高級(jí)的繪圖擴(kuò)展包,如ggplot2, ggvis, rCharts, rgi等,此處只介紹最基本的plot()函數(shù)繪圖。

x <- c(1,2,3.2,4,3,2.1,9,19)
plot(x) # 散點(diǎn)圖
plot(x, type = "l") # 折線圖

?plot # 查看更多圖表類型

繪制一個(gè)有標(biāo)題、橫縱軸名稱、基本網(wǎng)格的圖

plot(rnorm(100), # 正太分布隨機(jī)數(shù)
     main = "Some Returns", # 圖標(biāo)題
     cex.main = 0.9, 
     xlab = "Time",# x軸標(biāo)題
     ylab = "Returns", # y軸標(biāo)題
    )
# 添加基本網(wǎng)格
grid()
# 添加水平線與垂直線
abline(v = 40, # x = 40處繪制垂直線
      lwd = 2, # 線寬
      lty = 1, # 線型
      )
abline(h = 1, # y = 1處繪制水平線
      lwd = 3, 
      lty = 3)
# 添加額外的文本
mtext("Some text at the bottom", side = 1)
# 添加圖例
legend(50, -1, "A legend")

繪制子圖

# 設(shè)定2行,2列子圖格式
par(mfrow = c(2, 2))
# 第一張圖
plot(rnorm(100), main = "Graph 1")
# 第二張圖
plot(rnorm(100), main = "Graph 2", type = "l")
# 第三張圖
plot(rnorm(100), main = "Graph3", type = "s")
abline(v = 50, lwd = 4)
# 第四張圖
plot(rnorm(100), type = "h", main = "Graph4")
# 重置繪圖窗口
par(mfrow = c(1,1))

查看繪圖所用參數(shù)

# 法一
?plot.default
# 法二
formals(plot.default)

1.9 函數(shù)

R支持命令式、函數(shù)式、面向?qū)ο缶幊獭?/p>

1.9.1 內(nèi)置函數(shù)

R語言具有大量內(nèi)置函數(shù),以下展示一些常用內(nèi)置函數(shù)

# 創(chuàng)建標(biāo)準(zhǔn)正態(tài)分布隨機(jī)數(shù)
x <- rnorm(100, mean = 0, sd = 1)
# 返回向量長度
length(x)
# 計(jì)算均值、方差、中位數(shù)
mean(x)
sd(x)
median(x)
# 計(jì)算變量值域
range(x)
# 求和/累計(jì)求和
sum(x)
cumsum(x)
# 展示前3個(gè)元素
head(x, 3)
# 獲取描述統(tǒng)計(jì)結(jié)果
summary(x)
# 將x從大到小排序
sort(x, decreasing = TRUE)
# 計(jì)算一階差分
diff(x)
# 以1為步長創(chuàng)建1至10序列
seq(1, 10, 1)
# 打?。鹤⒁鈨煞N打印的區(qū)別
cat("hello\n")
print("hello\n")
# 展示最近輸入的10行命令
history(10)
# 數(shù)值計(jì)算
sqrt(2)
exp(1)
cos(1)
sin(1)
# 求函數(shù)積分
integrand <- function(x) 1/((x+1)*sqrt(x))
integrate(integrand, lower=0, upper=Inf)

1.9.2 自定義函數(shù)

自定義函數(shù)的基本語法如下

function_name <- function(arg_1, arg_2, ...) {
    Function body
    return value
}

函數(shù)的不同部分

  • 函數(shù)名稱:作為具有此名稱的對(duì)象存儲(chǔ)在R環(huán)境中。
  • 參數(shù) :當(dāng)函數(shù)被調(diào)用時(shí),需要傳遞具體值到參數(shù)。 參數(shù)是可選的,一個(gè)函數(shù)可能不包含參數(shù);參數(shù)可以有默認(rèn)值。
  • 函數(shù)體 :函數(shù)體包含定義函數(shù)的功能語句集合。
  • 返回值 :返回值即函數(shù)的輸出。

1.10 控制結(jié)構(gòu)

1.10.1 分支

x = 1
if(x) {
    print("true")
} else {
    print("false")
}

1.10.2 循環(huán)

for(i in 1:5) {
    cat(i, "\n")
}

1.11 實(shí)例:下載指定股票價(jià)格數(shù)據(jù),計(jì)算收益率相關(guān)性

過濾無效的股票代碼:

FiltSymbols <- function(symbols) {
  # 將小寫字母轉(zhuǎn)換為大寫
  symbols <- toupper(symbols)
  # 正則表達(dá)式驗(yàn)證證券代碼是否有效
  valid <- regexpr("^[A-Z]{2,4}$", symbols)
  #返回
  return(sort(symbols[valid == 1]))
}

symbols <- FiltSymbols(c("xom", "aapl", "cvx","ibm", "GS","600000HS" ))
cat(symbols)

下載股票價(jià)格數(shù)據(jù):

library("quantmod")
getPrices <- function(symbols) {
  # 輸入:向量類型的股票代碼
  # 輸出:dataframe,包含多只股票的價(jià)格數(shù)據(jù)
  for (i in 1:length(symbols)) {
    if (i != 1) {
      # 獲取第i支股票的價(jià)格數(shù)據(jù)
      tempData <- getSymbols(symbols[i], src="yahoo", 
                    from="2007-01-01",to="2017-08-31",
                    auto.assign = FALSE)
      # 將收盤價(jià)合并到prices中
      prices <- cbind(prices, tempData[,4])
      cat(paste("第", i, "支股票下載完成…\r"))
    } else {
      # 獲取第一支股票的價(jià)格數(shù)據(jù)
      data <- getSymbols(symbols[i], src="yahoo", 
                          from="2007-01-01",to="2017-08-31",
                          auto.assign = FALSE)
      # 僅保留收盤價(jià)
      prices <- data[,4]
      cat("第1支股票下載完成…\r")
    }
  }
  return(prices)
}

prices <- getPrices(symbols)
print(prices, max = length(symbols)*5)

計(jì)算股票收益率相關(guān)性:

showCorrelations <- function(prices) {
  # 輸入:dataframe,股票價(jià)格數(shù)據(jù)
  # 輸出:相關(guān)系數(shù)矩陣,兩兩散點(diǎn)圖矩陣
  
  # 將股價(jià)轉(zhuǎn)換為對(duì)數(shù)收益率,參數(shù)2表示對(duì)列進(jìn)行計(jì)算
  returns <- apply(prices, 2, function(x) diff(log(x)))
  # 計(jì)算相關(guān)系數(shù)矩陣
  print(cor(returns, use = "complete.obs"))
  # 繪制兩兩散點(diǎn)圖矩陣
  pairs(returns, main = "Pairwise Return Scatter Plot")
}
showCorrelations(prices)


歡迎關(guān)注我的知乎|簡書|CSDN|微信公眾號(hào)PurePlay , 會(huì)不定期分享量化金融與R干貨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容