最近開始學(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)站
R的網(wǎng)頁搜索引擎,能查找各種函數(shù)、R郵件列表歸檔中的討論和博客文章:http://rseek.org
R主要的博客社區(qū):http://www.r-bloggers.com
統(tǒng)計(jì)之都:http://cos.name/
Github:http://github.com/
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干貨。