面向金融的R语言——Lecture9
2018年11月27日 软微 金融信息服务 刘旭德 周慧文
收益率的计算
安装某个软件包
install.packages("packages_name") # 联网安装
install.packages("pach_to_packages") # 从本地路径安装软件包
载入某个软件包
library(my_packages)
利用 quantmod 软件获取 AAPL 一段时间内的股票行情
# 载入 quantmod 软件包
library(quantmod)
# 获取数据
getSymbols("AAPL", source = "YAHOO",
from = "2015-01-01", to = "2016-01-01")
# 第一行的数据
AAPL[1, ]
# 对 AAPL 数据进行统计
str(AAPL)
length(time(AAPL))
# 数据的维数
dim(AAPL)
# 画时序图
chartSeries(AAPL)
时序图

另一种方法来获取 AAPL 一段时间内的股票行情
# 如果没有安装 tseries 软件包, 还需要用 install 安装
library(tseries)
res <- get.hist.quote(instrument = "AAPL",
start = "2015-01-01", end = "2018-01-01")
res
head(res)
# 将 res 数据复制到 dat2中
dat2 <- as.data.frame(res)
# 向 dat2 添加 data 列
dat2$data <- time(res)
head(dat2)
读写 csv 文件
dat1 <- as.data.frame(AAPL)
dat1$date <- time(AAPL)
# 查看纵坐标标头
colnames(dat1)
# 将 dat1 写入 AAPL.csv文件
write.csv(dat1, file = "AAPL.csv")
# 读取文件
AAPL2 <- read.csv("AAPL.csv")
dim(AAPL2)
AAPL2[1, ]
# 求该列的平均值
mean(as.numeric(AAPL2$AAPL.Close))
# 画出收盘股价图
chartSeries(AAPL)
对股票的收益率进行对比
毛收益率: r ( t ) = s ( t ) / s ( t − 1 ) r(t) = s(t) / s(t - 1) r(t)=s(t)/s(t−1)
简单收益率: r ( t ) = ( s ( t ) − s ( t − 1 ) ) / s ( t − 1 ) r(t) = (s(t) - s(t - 1))/s(t - 1) r(t)=(s(t)−s(t−1))/s(t−1)
对数收益率: r ( t ) = l o g ( 1 + r ( t ) ) = l o g ( s ( t ) ) − l o g ( s ( t − 1 ) ) r(t) = log(1 + r(t)) = log(s(t)) - log(s(t - 1)) r(t)=log(1+r(t))=log(s(t))−log(s(t−1))
# 将收盘价提成一个一维数据
AAPL.close <- as.numeric(AAPL2$AAPL.Close)
# 毛收益率
gross.returns <- AAPL.close[2:length(AAPL.close)]/AAPL.close[1:(length(AAPL.close) - 1)]
# 简单收益率
# diff 是求差分的意思
simple.returns <- diff(AAPL.close)/AAPL.close[1 : (length(AAPL.close) - 1)]
# 对数收益率
log.returns <- diff(log(AAPL.close))
# 将三个收益率画到一张表上
par(mfcol = c(3, 1))
plot(gross.returns, xlab = "data", ylab = "gross returns", type = "l")
plot(simple.returns, xlab = "data", ylab = "simple returns", type = "l")
plot(log.returns, xlab = "data", ylab = "log returns", type = "l")
# 进行 t 检验
t.test(log.returns)
收益率对比图
债券价值及其模拟
债券贴现
不包括已经付过的利息
如果每年付息一次,求债券在某期的价值
# 定义一个求债券到期收益贴现的函数,每年支付一次
# P 是 票面值, C 是每期支付的利息, r 是年利率,t是开始日期, T 是总期限
BV_prime <- function(P, C, r, t, T){
tmat <- T - t
if (tmat != 0){
i <- seq(1 ,tmat)
sum(C / (1 + r)^i) + P/(1 + r)^(tmat)
}else
P/(1 + r)^(tmat)
}
# 票面价值是1000
# 每年付息 20
P <- 1000
C <- 20
# 求现值
BV_prime(P, C, r = 0.06, t = 0, T = 20)
# 求第 3 期的价值
BV_prime(P, C, r = 0.06, t = 3, T = 20 )
# 求第 20 期的价值
BV_prime(P, C, r = 0.06, t = 20, T = 20)
out
> # 求现值
> BV_prime(P, C, r = 0.06, t = 0, T = 20)
[1] 541.2032
> # 求第 3 期的价值
> BV_prime(P, C, r = 0.06, t = 3, T = 20 )
[1] 580.9096
> # 求第 20 期的价值
> BV_prime(P, C, r = 0.06, t = 20, T = 20)
[1] 1000
如果每年付息两次,求债券在某期的价值,只需要在 function 函数中做更改便可以。
# 定义一个求债券到期收益贴现的函数,半年支付一次
# P 是 票面值, C 是每期支付的利息, r 是年利率,t是开始日期, T 是总期限
BV_prime <- function(P, C, r, t, T){
tmat <- T - t
if (tmat != 0){
i <- seq(1 , 2 * tmat)
sum(C / (1 + r/2)^i) + P/(1 + r/2)^(2*tmat)
}else
P/(1 + r/2)^(2 * tmat)
}
# 票面价值是1000
# 每年付息 20
P <- 1000
C <- 20
# 求现值
BV_prime(P, C, r = 0.06, t = 0, T = 20)
# 求第 3 期的价值
BV_prime(P, C, r = 0.06, t = 3, T = 20 )
# 求第 20 期的价值
BV_prime(P, C, r = 0.06, t = 20, T = 20)
out
# 求现值
> BV_prime(P, C, r = 0.06, t = 0, T = 20)
[1] 768.8523
> # 求第 3 期的价值
> BV_prime(P, C, r = 0.06, t = 3, T = 20 )
[1] 788.6816
>