构建基于R的交易系统(3)TTR
写在前边的一些话:投资有风险,交易要谨慎。
风险各种各样。就我所写的这个来说,这里很多工具仍然是在发展中的,而且我也不能保证我的用法是一定正确的。因此在任何意义上这只是探讨软件的使用方法,而不构成投资的意见或者建议。望各位读者小心使用。您要是因为这个有损失我可赔不起。
3.技术分析指标:TTR
TTR包的目的是在R当中构造技术分析和其它技术交易规则的函数。TTR可在CRAN中找到,目前的版本号是0.22(更新2013-3-18)。
TTR目前的功能是提供了一些常见的技术分析指标的函数,可以分为下面几类:
移动平均
趋势检测和强度
震荡指标
波动率指标
成交量分析
具体函数参见附录函数索引。
TTR包的优点是
(1)灵活;支持多种时序数据格式;指标计算方法比较多样。
(2)计算速度比较快
(3)可以处理高频数据(tick frequency data)
这些优点可参考:http://www.rinfinance.com/agenda/2010/JoshUlrich.pdf
这一节的重点还是结合quantmod的图形表现讨论一些常见的技术指标的使用。
(1)移动平均Moving Averages
均线可以说是最简单也使用最普遍的技术指标了。 在TTR包里包括多种种可选的均线,如 SMA,简单均线 EMA,指数加权平均 VWMA,成交量加权移动平均等等
下面一个简单的例子,5日均线上穿30日均线买入。
library(quantmod)
getSymbols("^SSEC", from = "2010-01-01", src = "yahoo")
fastMA <- SMA(Cl(SSEC["2013-04-20/2013-05-31"]), n = 5)
slowMA <- SMA(Cl(SSEC["2013-03-01/2013-05-31"]), n = 30)
signal1 <- fastMA >= slowMA
x <- which(signal1["2013-05-01/2013-05-31", ])[1]
chartSeries(SSEC, subset = "2013-05-01/2013-05-31", theme = "white", TA = "addSMA(n=5,col=\"red\");addSMA(n=30,col=\"blue\")")
ss <- SSEC["2013-05-01/2013-05-30"]
addTA(ss[x, "SSEC.Low"] - 10, pch = 17, type = "p", col = "red", on = 1)
(2)布林线(带)Bollinger Bands
由John Bollinger发明,可以用来比较一段时间内价格的水平与波动性。
布林线包括三条,中线是典型价格的20天简单移动平均,这里的典型价格指最高-最低-收盘,可以用quantmod包的HLC()从载入的价格中取出。上下两条线分别是移动平均加上或减去标准差的倍数(一般为2倍)。
TTR函数为BBands
BBands(HLC, n = 20, maType, sd = 2, …) n是移动平均的期数,sd为标准差,maType为要调用的函数名 输出值 dn下线mavg移动平均线(中线)up上线 pctB 也就是%B 计算方法是(收盘-下线)/(上线-下线),表示当前价格在布林线中的相对位置。
b <- BBands(HLC = HLC(SSEC["2013"]), n = 20, sd = 2)
b[20:30, ]
## dn mavg up pctB
## 2013-01-31 2243 2308 2373 1.0770
## 2013-02-01 2239 2314 2390 1.0912
## 2013-02-04 2233 2322 2410 1.1044
## 2013-02-05 2233 2329 2426 0.9947
## 2013-02-06 2234 2337 2440 0.9722
## 2013-02-07 2239 2344 2449 0.8402
## 2013-02-08 2249 2353 2456 0.8737
## 2013-02-18 2256 2360 2463 0.8258
## 2013-02-19 2260 2363 2467 0.6512
## 2013-02-20 2267 2367 2468 0.6054
## 2013-02-21 2275 2370 2465 0.3317
chartSeries(SSEC, TA = "addBBands();addBBands(draw=\"width\");addVo()", subset = "2013", theme = "white")
绘图的时候,draw=p这个参数表示绘出pctB ,还可以选width(布林带宽)
(3)指数平滑异同移动平均线MACD
这是一个常用的震荡指标,由 Gerald Appel发明。用序列的快速移动平均线减去慢速移动平均线,可用来识别市场趋势。
TTR函数MACD MACD(x, nFast = 12, nSlow = 26, nSig = 9, maType, percent = TRUE, …) 计算方法: MACD=EMA(Close,12) − EMA(Close,26) Signal=EMA(MACD line,9) MACD histogram=MACD − Signal
输出结果为MACD和Signal
macd <- MACD(Cl(SSEC["2013"]), nFast = 12, nSlow = 26, nSig = 9, maType = "EMA")
tail(macd)
## macd signal
## 2013-08-23 0.3771 0.3493
## 2013-08-26 0.4608 0.3716
## 2013-08-27 0.5481 0.4069
## 2013-08-28 0.6013 0.4457
## 2013-08-29 0.6203 0.4807
## 2013-08-30 0.6324 0.5110
chartSeries(SSEC, TA = "addSMA(n=5,col='blue');addMACD()", subset = "2013",
theme = "white")
说明兼吐槽: TTR包是一个发展中的工具集合,这里边的工具不一定就是完全正确的,比如一个长期的问题唐奇安通道(见下面的讨论)。而且无论技术分析本身还是技术分析的具体指标及其参数选择在实践中都是有争议的。所以在使用这个包的时候,要更多了解作者采用什么样的指标方法来写函数以及这些函数是如何写成的。同时在使用技术指标的时候,也无需一定拘泥于历史因袭下来的参数或者教条解释。 我对金融市场的看法是这是一个复杂的适应性系统,可以从多个不同的角度来接近市场的本质。正所谓八仙过海,各显神通。
参考: TTR作者的博客Foss trading还是很有料的。 http://blog.fosstrading.com/
关于各种技术指标的细节不难在各种交易书籍或者网站上找到。比如这个 http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators
附: 唐奇安通道的问题
这是名噪一时的海龟交易法则所用的指标。唐奇安通道指标是由Richard Donchian提出的一个由三条线组成的通道指标,这三条线分别是过去n日的最高价、过去n日的最低价以及过去n日最高价和最低价的均值。
TTR的唐奇安通道函数DonchianChannel曾经有一个问题,就是计算的时候把本期值计入了。按照经典的唐奇安通道的用法,当股价向上突破20日唐奇安通道值时采取买入策略,如果计算时包含了本期值,就不会有向上突破的可能。修正这个问题只要对唐奇安通道值取滞后即可。 TTR在目前的版本中,对这个问题打了个补丁,就是在函数DonchianChannel中引入了一个参数include.lag,选TRUE就会得滞后一期的值。
ssec.h <- Hi(SSEC["2013"])
ssec.l <- Lo(SSEC["2013"])
ssec.hl <- cbind(ssec.h, ssec.l)
ssec.dc <- DonchianChannel(ssec.hl, n = 20) #修正前
ssec.dcm <- DonchianChannel(ssec.hl, n = 20, include.lag = TRUE) #修正后
ssec.dc[30:40, ]
## high mid low
## 2013-02-21 2445 2365 2286
## 2013-02-22 2445 2366 2287
## 2013-02-25 2445 2366 2287
## 2013-02-26 2445 2366 2287
## 2013-02-27 2445 2366 2287
## 2013-02-28 2445 2367 2288
## 2013-03-01 2445 2367 2290
## 2013-03-04 2445 2352 2259
## 2013-03-05 2445 2352 2259
## 2013-03-06 2445 2352 2259
## 2013-03-07 2445 2352 2259
ssec.dcm[30:40, ]
## high mid low
## 2013-02-21 2445 2360 2276
## 2013-02-22 2445 2365 2286
## 2013-02-25 2445 2366 2287
## 2013-02-26 2445 2366 2287
## 2013-02-27 2445 2366 2287
## 2013-02-28 2445 2366 2287
## 2013-03-01 2445 2367 2288
## 2013-03-04 2445 2367 2290
## 2013-03-05 2445 2352 2259
## 2013-03-06 2445 2352 2259
## 2013-03-07 2445 2352 2259
chartSeries(SSEC, subset = "2013", theme = "white")
addTA(ssec.dcm[, "high"], type = "l", on = 1, col = "red")
addTA(ssec.dcm[, "low"], type = "l", on = 1, col = "green")
addTA(ssec.dcm[, "mid"], type = "l", on = 1, col = "blue")
风险各种各样。就我所写的这个来说,这里很多工具仍然是在发展中的,而且我也不能保证我的用法是一定正确的。因此在任何意义上这只是探讨软件的使用方法,而不构成投资的意见或者建议。望各位读者小心使用。您要是因为这个有损失我可赔不起。
3.技术分析指标:TTR
TTR包的目的是在R当中构造技术分析和其它技术交易规则的函数。TTR可在CRAN中找到,目前的版本号是0.22(更新2013-3-18)。
TTR目前的功能是提供了一些常见的技术分析指标的函数,可以分为下面几类:
移动平均
趋势检测和强度
震荡指标
波动率指标
成交量分析
具体函数参见附录函数索引。
TTR包的优点是
(1)灵活;支持多种时序数据格式;指标计算方法比较多样。
(2)计算速度比较快
(3)可以处理高频数据(tick frequency data)
这些优点可参考:http://www.rinfinance.com/agenda/2010/JoshUlrich.pdf
这一节的重点还是结合quantmod的图形表现讨论一些常见的技术指标的使用。
(1)移动平均Moving Averages
均线可以说是最简单也使用最普遍的技术指标了。 在TTR包里包括多种种可选的均线,如 SMA,简单均线 EMA,指数加权平均 VWMA,成交量加权移动平均等等
下面一个简单的例子,5日均线上穿30日均线买入。
library(quantmod)
getSymbols("^SSEC", from = "2010-01-01", src = "yahoo")
fastMA <- SMA(Cl(SSEC["2013-04-20/2013-05-31"]), n = 5)
slowMA <- SMA(Cl(SSEC["2013-03-01/2013-05-31"]), n = 30)
signal1 <- fastMA >= slowMA
x <- which(signal1["2013-05-01/2013-05-31", ])[1]
chartSeries(SSEC, subset = "2013-05-01/2013-05-31", theme = "white", TA = "addSMA(n=5,col=\"red\");addSMA(n=30,col=\"blue\")")
ss <- SSEC["2013-05-01/2013-05-30"]
addTA(ss[x, "SSEC.Low"] - 10, pch = 17, type = "p", col = "red", on = 1)
![]() |
(2)布林线(带)Bollinger Bands
由John Bollinger发明,可以用来比较一段时间内价格的水平与波动性。
布林线包括三条,中线是典型价格的20天简单移动平均,这里的典型价格指最高-最低-收盘,可以用quantmod包的HLC()从载入的价格中取出。上下两条线分别是移动平均加上或减去标准差的倍数(一般为2倍)。
TTR函数为BBands
BBands(HLC, n = 20, maType, sd = 2, …) n是移动平均的期数,sd为标准差,maType为要调用的函数名 输出值 dn下线mavg移动平均线(中线)up上线 pctB 也就是%B 计算方法是(收盘-下线)/(上线-下线),表示当前价格在布林线中的相对位置。
b <- BBands(HLC = HLC(SSEC["2013"]), n = 20, sd = 2)
b[20:30, ]
## dn mavg up pctB
## 2013-01-31 2243 2308 2373 1.0770
## 2013-02-01 2239 2314 2390 1.0912
## 2013-02-04 2233 2322 2410 1.1044
## 2013-02-05 2233 2329 2426 0.9947
## 2013-02-06 2234 2337 2440 0.9722
## 2013-02-07 2239 2344 2449 0.8402
## 2013-02-08 2249 2353 2456 0.8737
## 2013-02-18 2256 2360 2463 0.8258
## 2013-02-19 2260 2363 2467 0.6512
## 2013-02-20 2267 2367 2468 0.6054
## 2013-02-21 2275 2370 2465 0.3317
chartSeries(SSEC, TA = "addBBands();addBBands(draw=\"width\");addVo()", subset = "2013", theme = "white")
![]() |
绘图的时候,draw=p这个参数表示绘出pctB ,还可以选width(布林带宽)
(3)指数平滑异同移动平均线MACD
这是一个常用的震荡指标,由 Gerald Appel发明。用序列的快速移动平均线减去慢速移动平均线,可用来识别市场趋势。
TTR函数MACD MACD(x, nFast = 12, nSlow = 26, nSig = 9, maType, percent = TRUE, …) 计算方法: MACD=EMA(Close,12) − EMA(Close,26) Signal=EMA(MACD line,9) MACD histogram=MACD − Signal
输出结果为MACD和Signal
macd <- MACD(Cl(SSEC["2013"]), nFast = 12, nSlow = 26, nSig = 9, maType = "EMA")
tail(macd)
## macd signal
## 2013-08-23 0.3771 0.3493
## 2013-08-26 0.4608 0.3716
## 2013-08-27 0.5481 0.4069
## 2013-08-28 0.6013 0.4457
## 2013-08-29 0.6203 0.4807
## 2013-08-30 0.6324 0.5110
chartSeries(SSEC, TA = "addSMA(n=5,col='blue');addMACD()", subset = "2013",
theme = "white")
![]() |
说明兼吐槽: TTR包是一个发展中的工具集合,这里边的工具不一定就是完全正确的,比如一个长期的问题唐奇安通道(见下面的讨论)。而且无论技术分析本身还是技术分析的具体指标及其参数选择在实践中都是有争议的。所以在使用这个包的时候,要更多了解作者采用什么样的指标方法来写函数以及这些函数是如何写成的。同时在使用技术指标的时候,也无需一定拘泥于历史因袭下来的参数或者教条解释。 我对金融市场的看法是这是一个复杂的适应性系统,可以从多个不同的角度来接近市场的本质。正所谓八仙过海,各显神通。
参考: TTR作者的博客Foss trading还是很有料的。 http://blog.fosstrading.com/
关于各种技术指标的细节不难在各种交易书籍或者网站上找到。比如这个 http://stockcharts.com/school/doku.php?id=chart_school:technical_indicators
附: 唐奇安通道的问题
这是名噪一时的海龟交易法则所用的指标。唐奇安通道指标是由Richard Donchian提出的一个由三条线组成的通道指标,这三条线分别是过去n日的最高价、过去n日的最低价以及过去n日最高价和最低价的均值。
TTR的唐奇安通道函数DonchianChannel曾经有一个问题,就是计算的时候把本期值计入了。按照经典的唐奇安通道的用法,当股价向上突破20日唐奇安通道值时采取买入策略,如果计算时包含了本期值,就不会有向上突破的可能。修正这个问题只要对唐奇安通道值取滞后即可。 TTR在目前的版本中,对这个问题打了个补丁,就是在函数DonchianChannel中引入了一个参数include.lag,选TRUE就会得滞后一期的值。
ssec.h <- Hi(SSEC["2013"])
ssec.l <- Lo(SSEC["2013"])
ssec.hl <- cbind(ssec.h, ssec.l)
ssec.dc <- DonchianChannel(ssec.hl, n = 20) #修正前
ssec.dcm <- DonchianChannel(ssec.hl, n = 20, include.lag = TRUE) #修正后
ssec.dc[30:40, ]
## high mid low
## 2013-02-21 2445 2365 2286
## 2013-02-22 2445 2366 2287
## 2013-02-25 2445 2366 2287
## 2013-02-26 2445 2366 2287
## 2013-02-27 2445 2366 2287
## 2013-02-28 2445 2367 2288
## 2013-03-01 2445 2367 2290
## 2013-03-04 2445 2352 2259
## 2013-03-05 2445 2352 2259
## 2013-03-06 2445 2352 2259
## 2013-03-07 2445 2352 2259
ssec.dcm[30:40, ]
## high mid low
## 2013-02-21 2445 2360 2276
## 2013-02-22 2445 2365 2286
## 2013-02-25 2445 2366 2287
## 2013-02-26 2445 2366 2287
## 2013-02-27 2445 2366 2287
## 2013-02-28 2445 2366 2287
## 2013-03-01 2445 2367 2288
## 2013-03-04 2445 2367 2290
## 2013-03-05 2445 2352 2259
## 2013-03-06 2445 2352 2259
## 2013-03-07 2445 2352 2259
chartSeries(SSEC, subset = "2013", theme = "white")
addTA(ssec.dcm[, "high"], type = "l", on = 1, col = "red")
addTA(ssec.dcm[, "low"], type = "l", on = 1, col = "green")
addTA(ssec.dcm[, "mid"], type = "l", on = 1, col = "blue")
![]() |
signal1 <- fastMA >= slowMA,均线的上穿和下穿是不一样的,单纯的比较大小应该不能区分吧,R中有没有函数区分呢?
自己设置一个indicator就行了 我就是这么弄的
> 我来回应