程序代写代做 R 语言第 1 次小组作业 下发日期 2020 年 4 月 26 日

R 语言第 1 次小组作业 下发日期 2020 年 4 月 26 日
1 作业要求
本次作业按组完成,讨论仅限于本组成员。请各组负责人在 5 月 12 日上课前,将
报告上传至课堂派。报告文件的标题和第一段需要注明组员姓名和学号。
2 案例背景和问题
技术分析是证券投资分析中的一支重要流派,至今仍然大量被投资者采用。本案例 要求使用 10 家美国上市公司在最近 500 个交易日的原始交易数据 (收盘价) 计算部分经 典技术分析指标,并对指标的预警功能做出直观的评判。
请按顺序完成以下分析任务:
(1) 设置工作目录,将文件名为 D10USListedFirms.sqlite 的数据库文件存放在当前工 作目录下。运行第 1 至 32 行代码。保证正确安装相关的包,且程序正确运行不报 错。执行完代码之后键入 ls() 列出在全局环境中已有的对象:
> ls()
[1] “DataPool” “driver” “ind10daily”
请打印出数据框 ind10daily 的前 10 行如下: date TICKER PRC RET VOL
1 19640102
2 19640102
3 19640102
4 19640102
5 19640102
6 19640102
7 19640102
8 19640102
9 19640102
10 19640102
KO 114.12500 -0.012973 1600
DD 240.50000 0.003128 3900
GE 86.75000 -0.004304 15100
IBM 517.00000 0.019724 16300
MO 73.50000 -0.005076 2200
PG 78.87500 -0.012520 2900
BA 36.75000 0.024390 6700
PFE 50.50000 0.025381 4500
MMM 65.25000 0.009671 6100
AA 68.25000 -0.007273 3600
1

这里的 PRC 代表价格 (price), RET 代表收益率 (return), VOL 代表成交手数 (vol- ume)。经过审阅原始数据,我们发现数据框中给出的是 10 家美国上市公司的日度交 易数据,其股票代码1分别为
[1] “AA” “BA” “DD” “GE” “IBM” “KO” “MMM” “MO” “PFE” “PG” 请用一行代码打印出数据框 ind10daily 每列的类型如下:
date TICKER PRC RET VOL
“character” “character” “character” “character” “character”
我们发现并不是所有的变量都是数值型的,为此你需要将 PRC, RET, VOL 转换成数 值型。(提示:你可能需要使用置换函数完成此项操作,例如
ind10daily[, -c(1, 2)] <- .... ) 转换成功后每列的类型如下: date TICKER PRC RET VOL "character" "character" "numeric" "numeric" "numeric" (2) 下一步,将数据框 ind10daily 按公司的 ticker 拆分,并转换成一个由 10 个子列表 构成的列表。为此请先把 ind10daily 中的 ticker 转换成因子 (factors),然后使 用 split() 函数。( 提示:这一步可以参考 ind10daily <- split(x = ind10daily, f = ind10daily$TICKER) 你也可以使用函数 by()。如果你还不清楚这些函数用法的话,可以参考我发的课件, 或者查看帮助文档。) 请打印这个列表的名称如下: > names(ind10daily)
[1] “AA” “BA” “DD” “GE” “IBM” “KO” “MMM” “MO” “PFE” “PG”
1 相对应的公司名称:
• AA:美国铝业
• BA:British Airline
• DD:杜邦
• GE:General Electric
• IBM: 国际商用机器公司
• KO:可口可乐
• MMM:3M 公司
• MO:菲利普莫瑞斯
• PFF:辉瑞制药
• PG:宝洁

KO
1970 1980 1990
Date
KO
1970 1980 1990
Date
KO
1970 1980 1990
Date
2000
2000
2000
2010
2010
2010
1970
1970
1970
1980
1980
1980
MO
1990 2000 2010
Date
MO
1990 2000 2010
Date
MO
1990 2000 2010
Date
0e+00 4e+07
8e+07
−0.2 0.0
0.2
40 80 120 160
0e+00 3e+07
6e+07
−0.2 0.0
0.1
−100 0 100
VOL
RET
PRC
VOL
RET
PRC
图 1: KO 和 MO 的收盘价、收益率和成交手数序列
(3) 接下来请自定义一个函数名叫做 toZoo 的函数,将给定的数据框中的 PRC, RET,
VOL 转换成 zoo 对象。函数体可以参考2以下代码: x <- unique(x, incomparables = FALSE) x <- zoo(x[, -c(1, 2)], order.by = as.Date(x[, "date"], format = "%Y%m%d")) (4) 请使用高阶函数 lapply(),对 ind10daily 中所有的子列表调用 toZoo() 函数,并 重新赋值给对象 ind10daily。之后打印各子列表的数据类型如下: > sapply(ind10daily, class)
AA BA DD GE IBM KO MMM MO PFE PG
“zoo” “zoo” “zoo” “zoo” “zoo” “zoo” “zoo” “zoo” “zoo” “zoo”
(5) 完成以上步骤后,你可以作图了。请照着图1,画出 PG 和 IBM 的收盘价、收益率 和成交手数。
(6) 请正确安装并加载 TTR 这个包。
(7) 请自定义一个函数,函数名为 addIndicators。该函数只有一个参数 x;函数体的
编写可以参考以下代码
# RSI
2 “参考”不等于照搬。

2012 2013 2014
Index
图 2: BA 公司的三根均线数据
rsi <- RSI(x$PRC , n = 14, maType = "EMA") # MACD macd <- MACD(x$PRC, nFast = 12, nSlow = 26, nSig = 9, maType="EMA" ) # Simple moving averages ma5 <- SMA(x$PRC, n = 5) ma14 <- SMA(x$PRC, n = 14) ma21 <- SMA(x$PRC, n = 21) 这些代码实现了相对强弱指数 (RSI), MACD 线,和 5 日、14 日、21 日均线的计算。 (8) 请使用高阶函数 lapply(),对 ind10daily 中所有的子列表调用 addIndicators() 函数,并重新赋值给对象 ind10daily。 (9) 请参考图2中 BA 公司的三条均线的画法,画出 AA 公司的三条均线: (10) 请自定义一个函数,函数名为 markBSpoints。这个函数用于识别是否均线倒挂。该 函数只有一个参数 x;函数体的编写可以参考以下代码: sig <- x[, "ma5"] > x[, “ma14”] & x[, “ma14”] > x[, “ma21”]
merge(x, sig)
对 ind10daily 中所有的子列表调用 markBSpoints() 函数,并重新赋值给对象 ind10daily。
ind10daily[[2]][, “ma5”]
70 80 90 100 110 120 130

2012 2013 2014
Index
2012 2013 2014
Index
图 3: AA 公司的价格序列和买卖信号序列
如图3,请画出 AA 公司的价格序列和买卖信号序列。请评估这些买卖信号的预测效
果。
(11) 请问还有更多的其它更好的信号吗?(这是一个开放性问题,你可以结合之前计算的 RSI,和 MACD 线来讨论。)
ind10daily[[“AA”]][, “sig”] ind10daily[[“AA”]][, “PRC”]
0.0 0.4 0.8 8.0 9.0 10.0