R语言金融市场量化交易:布林带、价差策略、RSI交易策略,回测COMP 226

我们将利用每日数据制定简单的交易策略 我们将涵盖以下内容。

 

由Kaizong Ye,Liao Bao撰写

 一个简单的介绍性交易。

它每天只根据前一天的价格行为做出交易决定 – 我们用这个例子来介绍前瞻性的偏见

×

R语言在金融领域提供了很多的金融计算框架和工具,当你具备金融理论知识和市场经验,你可以利用这些第三方提供的技术框架来构建自己的金融模型。我们可以从CRAN上找到各种的金融项目,访问R的官方网站 (https://cran.r-project.org/),找到Task Views 菜单里的 Finance标签。

金融领域涉及得非常广,包括银行业,保险业,信托业,证劵业务,租赁业务。

金融行业都具有指标性,垄断性,高风险性,效益依赖性以及高负债经营性的特点。量化投资是证劵投资一个很细分的专业领域,涉及到的金融工具包其实并不是很多。其实把这些包研究好了,就可以很方便的做量化模型和交易了。

如果构建自己的量化交易系统,需要用到5各方面的工具:数据管理,指标计算,回测交易,投资组合,风险管理。

  • 数据管理
    包括数据的抓取,存储,读取,时间序列,数据处理。涉及的R包有:
    zoo(时间序列对象), xts(时间序列处理), timeSeries(Rmetrics系时间序列对象) timeDate(Rmetrics系时间序列处理), data.table(数据处理), quantmod(数据下载和图形可视化), RQuantLib(QuantLib数据接口), WindR(Wind数据接口), RJDBC(数据库访问接口), rhadoop(Hadoop访问接口), rhive(Hive访问接口), rredis(Redis访问接口), rmongodb(MongoDB访问接口), SparkR(Spark访问接口),fImport(Rmetrics系数据访问接口)等。

  • 指标计算:包括金融市场的技术指标的各种计算方法,涉及R包有 TTR(技术指标), TSA(时间序列计算), urca(单位根检验), fArma(Rmetrics系ARMA计算), fAsianOptions(Rmetrics系亚洲期权定价), fBasics(Rmetrics系计算工具), fCopulae(Rmetrics系财务分析), fExoticOptions(Rmetrics系期权计算), fGarch(Rmetrics系Garch模型), fNonlinear(Rmetrics系非线模型), fOptions(Rmetrics系期权定价), fRegression(Rmetrics系回归分析), fUnitRoots(Rmetrics系单位根检验) 等。

  • 回测交易:包括金融数据建模,并验证用历史数据验证模型的可靠性,涉及R包有 FinancialInstrument(金融产品), quantstrat(策略模型和回测), blotter(账户管理), fTrading(Rmetrics系交易分析)等。

  • 投资组合:对多策略或多模型进行管理和优化,涉及R包有 PortfolioAnalytics(组合分析和优化), stockPortfolio(股票组合管理), fAssets(Rmetrics系组合管理)等

  • 风险管理:对持仓进行风险指标的计算和风险提示,涉及R包有 PerformanceAnalytics(风险分析),fPortfolio(Rmetrics系组合优化), fExtremes(Rmetrics系数据处理)等。



布林线是一个使用移动平均线(和移动标准差)的标准技术分析指标的例子 

  • 一个使用布林线的简单的均线回复型交易策略 指标作为策略的构件(但与之不同)。 路径依赖性。止损、盈利目标和持有期是引入路径依赖的交易策略构建的例子。 
  • 滑点–我们回顾一下什么是滑点,我们探讨在交易策略中考虑滑点的问题 – 使用价差的策略,它是两个价格时间序列的线性组合  

简单的策略:模仿

策略

– 如果收盘价高于开盘价,则在第二天买入

– 否则,在第二天卖出

我们希望这个策略在什么时候能发挥作用?

– 如果有连续多日价格向同一方向移动的情况

– 每一天的方向与之前的变化不同,对该策略来说都是亏损的一天,所以这样的日子不应该有大的价格波动。

测试该策略

从现在开始,我们将重复使用实用工具脚本 “utilities.R “中的函数。在这种情况下,我们将使用。

– getLogReturns(prices),从调整后的价格中计算出对数回报。

– getEquityLog(log_ret,pos),从对数收益和仓位向量中计算出股权曲线。

实用功能

getLogReturns <- function(prices) {
 # 返回调整后价格的对数收益
 # 假设输入中存在调整后的价格列
 log_ret <- ROC(Ad(prices),type='continuous')
 log_ret[1] <- 0
 return(log_ret)
} 
getEquityCurve <- function(returns,pos,type='log') {
 #  股票曲线的简单回报

 if (type=='log')
 return(exp(cumsum(returns*pos)) - 1)
 else
 cat ('Type not supported','\n')
} 

视频

随机波动率SV模型原理和Python对标普SP500股票指数时间序列波动性预测

探索见解

去bilibili观看

探索更多视频

股票曲线 

 我们使用滞后函数将时间序列移动一个位置,因此我们使用前一天的价格来做决定

pos <- ifelse(Cl(prices)-Op(prices)>0,1,-1)
pos <- Lag(pos)
pos[1] <- 0

Python配对交易策略Pairs Trading统计套利量化交易分析股票市场

阅读文章


交换位置 

 注意到这个策略在所有四个股票上都表现不佳,但在其中三个股票上表现特别差。这表明对策略进行了明显的改变:做完全相反的事情,即交换多头和空头交易,如下所示

pos <- ifelse(Cl(prices)-Op(prices)>0,1,-1)

切换式股票曲线


随时关注您喜欢的主题


移动标准差和布林带

类似于移动平均线,我们现在引入移动(滚动)标准差

我们使用移动平均线和移动标准差来定义布林带,然后将在我们的下一个交易策略示例中使用

图表系列

> library(quantmod)
> getSymbols('AAPL')

这使用包中的BBands函数TTR quantmod在chartSeries中结合了xts和TTR功能

策略代码

我们将使用与相同的循环、收益和权益曲线计算

  • 改变的是位置向量的计算
pos <- long + short
pos <- lag(pos)

参数

这个策略的参数是什么?

bbands <- BBands(prices,n=50,sd=2)

两个明显的数字参数是。 

  •  n是回溯期,和 
  •  sd是标准偏差的乘数 

 例子

plot(equity,main='Equity curve')

该策略需要一个参数,即持有期。 当且仅当持有期过后,我们退出交易 

 通过在计数小于持有期时留在交易中来实现。


run <- function(prices,n,sd,hold) {
 bbands <- lag(BBands(prices,n=n,sd=sd))
 pos <- rep(0,length=nrow(prices)) # all zeroes


下一个例子 – 止损

– 止损限制了某项交易的损失

– 我们将衡量一笔交易的简单回报

– 如果它太负,我们将退出交易 

getTradeReturn <- function(prices,entry,exit,short=FALSE) {
 prices <- as.numeric(prices)

> prices
 Adjusted
1970-01-02 100
1970-01-03 110
1970-01-04 100
1970-01-05 150
1970-01-06 200
1970-01-07 100
> getTradeReturn(prices,entry=1,exit=2)
[1] 0.1
> getTradeReturn(prices,entry=1,exit=2,short=T)
[1] -0.09090909
> getTradeReturn(prices,entry=1,exit=4)
[1] 0.5

 titStr <- paste("stoploss=", stoploss,":",sum(stopOuts),"stop outs")
 plotEquity(prices,pos,stopOuts,titStr); return(pos)
}

利差

– 两个系列的加权组合(通常是差异)。

策略可以尝试利用价差中的均值反转;对于一对股票,这被称为成对交易

– 与协整理论有关

价差例子

我们将看一下标准普尔500指数和道琼斯工业指数

pdf('different_screens.pdf')
plot.zoo(prices,col=cols,xlab=xlab,ylab=paste(tickers,ylab),main="")
dev.off()

现在,惊人的相似性是显而易见的 

例子:寻找权重

lookback <- 50

spread <- close1 - positionRatio*close2

– 点差 = x – positionRatio * y

– 当我们卖出y的仓位比例单位时,买入一个单位的x

点差例子

plot.zoo(cbind(spread,0,0.5,-0.5),screen=c(2,2,2,2),main="Spread")

一个价差策略

创建价差的目的是创建一个平稳的时间序列,也就是一个具有恒定平均值和标准差的时间序列。

如果我们成功了,我们就可以在价差远远低于其平均值时买入价差(做多廉价产品,做空昂贵产品),在价差高于其平均值时卖出价差。

连续积分理论正是处理平稳的时间序列的线性组合,但我们不会去研究数学。

接下来我们将看到一个简单的基于布林线的价差交易策略想法。

例子:RSI策略

– RSI是一个标准的指标,在TTR软件包中实现。

– 它的数值在0到100之间,较高(较低)的数值表示市场最近在上升(下降)。

# RSI 策略

 pos <- long + short 
 pos <- Lag(pos); pos[is.na(pos)] <- 0
 return(pos)
}

样本内和样本外回测

resultsIn <- backtest(prices[startIn:endIn,],params) # in-sample
resultsOut <- backtest(prices[startOut:endOut,],params) # out-of-sample

绘制图

#dev.new(width=10, height=5) # prevent elongation of plots
grid.arrange(plot1,plot2,ncol=2)
dev.off()

– 从样本内结果中挑选参数并不总是容易的 

 – 数据集的漂移可能导致良好的参数组合在样本内和样本外期间有所不同  


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498

关注有关新文章的微信公众号


永远不要错过任何见解。当新文章发表时,我们会通过微信公众号向您推送。

技术干货

最新洞察

This will close in 0 seconds